Mobilní aplikace nativně nenativně
26.04.2017
Mobilní aplikace nativně nenativně
​​Jednou jsem došel k tomu, že by bylo fajn napsat aplikaci pro mobilní telefon. A to aplikaci nativní, nejen tenkého klienta v prohlížeči. Jenže nativní vývoj je poměrně drahý a složitý. 

Nativn​​​í vývoj
 

Posuďte sami: Pro Android se píše obvykle v​ Javě, která se překládá pro ART respektive Dalvik. Pro iOS se obvykle vyvíjí ve Swiftu nebo ObjectiveC. A potřebujete na to Mac. Pro Windows P​hone uplatníte C# a pro další platformy (používá se ještě Blackberry bez Androidu?) ještě jinak. Z toho mi vychází, že nativnímu vývoji se věnovat nebudu, protože učit se pro každou platformu něco jiného nechci, ale nutno říci, že co se výsledné aplikace týče, je to stále nejlepší možná cesta.  
 

Hledám dál. 

Umím docela obstojně Javu a uměl jsem i jiné věci. Musí tedy být nějaká cesta, jak takovou aplikaci udělat bez toho, aby to stálo nekonečně mnoho úsilí a ještě bych ji musel psát pro každou platformu zvlášť. A abych si musel kupovat licenci nebo framework. A tak jsem se do problematiky zahloubal a vynaložil tak onu časovou investici, kterou tak určitě ušetřím vám. 

HTML5 /CSS/Java​​​​Script 

Pak je tady možnost psát html5/CSS/JavaScript s použitím Cordova případně nadstaveb. 

Přes všechny výhody, které javascript a html nese, jsou zde také nevýhody stran výkonu a security. Na jednoduché GUI aplikace je to asi vhodné řešení, ale používání nativních služeb je eufemisticky řečeno nekomfortní. 

A krom toho já prostě nejsem tak úplně webař. Takže tomu se věnovat taky nebudu. 

Nástroje pro vývoj tlustých ap​likací 

Chceme-li psát tlusté mobilní aplikace, které mají jeden zdrojový kód a běží přitom na různých mobilních platformách (primárně Android a iOS), máme zase více možností. Popíšu tady  tři cesty (tři je dobré číslo), v pořadí od pro mě nejméně zajímavého, po nejzajímavější řešení. 

JavaFXPorts​​​ (Gl​​uon) ​

javafxports.png První framework, který umožňuje psát aplikace v Javě a pak je deployovat a pouštět na Androidu a iOSu, je JavaFXPort. Do JavaFX aplikace v gradlu stačí přidat plugin a hned se objeví tasky pro testování případně výstup buildu pro nativní platformu. Na grafiku se využívá JavaFX, na ostatní Java SE. Jdou použít dokonce další knihovny dostupně jako jary pomocí maven artefaktů. 

Pro Android to funguje tak, že JavaFXPorts plugin s pomocí retrolabdy a dalších nástrojů připraví sadu tasků pro Android Build Tools, tak, aby na konci vypadlo apk spustitelné v Androidu. 

Pro iOS se použijí stejná api a celé se to přebalí RoboVM. Pro balení pro iOS je třeba v souladu s podmínkami Applu Mac. Další platformy se neřeší.   

Zásadní výhodou je, že se vývojář znalý JavaFX nemusí moc nového učit. Nevýhod to má celou řadu. Například to, že je to postavené na JavaFX, která by byla výborným frameworkem, kdyby se ho rozhodl Oracle náležitě rozvíjet. Takhle jí k dokonalosti spousta věcí chybí. 

​Q​​​t​​ 

Q-T.pngDalo by se říct, že Qt do tohoto srovnání ani nepatří, protože staví na C++ a ne na Javě. Na druhou stranu většina vývojářů znalých Javy nějaké povědomí a C++ má a Qt už dnes umožňuje napsat kompletní aplikace v QML. 

Qt má duální licenci, s tím, že většina opensource částí je vydávána pod LGPL, což podle většiny výkladů znamená, že když se linkuje dynamicky (náš případ), lze vyvíjet i proprietální aplikace s náležitým informováním o podmínkách. 

Pro Android a jiné VM, Qt vytvoří sadu nativních knihoven a ty pak spouští pomocí JNI. ​

Pro iOS vytváří nativní aplikaci (opět je třeba mac) stejně jako pro další platformy. 

Qt počítá s deploymentem do jednotlivých app storů včetně nějakých možností monetizace (in app nákupy, reklama). Krom toho, lze Qt použít i pro vývoj na desktopu, ze kterého vzešlo. 

Code​​na​​me One 

codenameone.pngPoslední cesta vede přes Codename One. Jedná se o nad Javou postavenou platformu, která využívá vlastní sady knihoven. To s sebou nese jen omezenou podmnožinu komerčně nejzajímavějších vlastností. 

Aplikace vyvíjená v Codename One se pro nativní testování nebo release odešle na buildservery Codename One a následně si vývojář stáhne hotový instalační balíček (případně nainstaluje aplikaci na zařízení přes QR kód). Tento přístup přináší některé zajímavé výhody. Například, že není třeba mít Mac pro vývoj na iOS (část, kde je třeba Mac, probíhá na build serverech Codename One). Nese to ale i některé nevýhody - třeba závislost na Codename One. Pokud Codename One servery vypne, tak už aplikaci pro platformy nezbuildíte. 

Kolem build serverů je stavěna i cenová politika, kdy v rámci jednotlivých subscribtion programů je předplacen určitý počet buildů (na některé platformy méně než na jiné - třeba onen drahý Mac). Existuje i free subcribtion, kde lze buildit pro všechno krom desktopu a ne moc často. Na druhou stranu jsem od jejich podpory na přímý dotaz, zda je v pořádku postup, že si koupím drahou subscription pouze na měsíc, kdy budu produkt releasovat, a následně ji snížím, dostal odpověď, že zcela. 

Obsahuje nástroje pro monetizaci, podepisování aplikací a všechno další, co by člověk potřeboval.

Srovná​ní 

Celkově mi z toho vyšlo, že všechny tři varianty vývoje multiplatformích nativních aplikací mají své užití. 

JavaFXPorts je výborná, pokud máte aplikaci v JavaFX, kterou budete portovat. Nebo rozsáhlé znalosti JavaFX. Možnost využití Java 3rd party Java knihoven pak jen pomáhá tomu, že Java SE vývojář se musí učit/měnit na své aplikaci minimum, aby mohl vyvinout aplikaci pro mobilní platformu. 

Qt je rozsáhlý a vyzkoušený ekosystém pro vývoj aplikací. Pro spoustu Java vývojářů ho ale spolehlivě zabíjí C++ re​sp. QML. Pokud jste ochotni tohle překonat, poskytne vám pro vývoj mobilních aplikací vše potřebné. 

Codename One je pak platforma umožňující vyvíjet cokoliv s minimálním nákladem a silnou podporou pro mobilní vývoj, která je navíc plně v Javě. Nevýhodou je plná závislost na online build servech pro každý release. Další výše nezmíněnou stinnou stránkou je pak určitá omezenost dostupných knihoven třeba oproti Qt (já jsem třeba narazil na to, že v Codename One není podpora UDP).   ​

Martin Koníř