pondělí 21. prosince 2015

Jak převést aplikaci pro Android na iPhone a iPad

Jak možná víte, náš herní engine GameStylus odstartoval jako aplikace pro Android (v Javě) a na počátku vývoje jsme neměli tušení, jestli a případně jak jej budeme portovat na jinou platformu. Ale po několika měsících bylo rozhodnuto - rozhodně chceme engine portovat na iOS (a Objective-C). Ale jak? Pokud se snažíte najít odpověď na stejnou otázku, možná tento text s popisem našich kroků bude pro vás aspoň trochu užitečný.

Jak zkonvertovat aplikaci pro Android do iOS, z Java do Objective-C

Pravděpodobně nebudete potřebovat představivost úspěšného romanopisce, aby vám bylo jasné, jak jsme začali: Ano, na Google.com. Spousta vyhledávání, spousta klíčových slov a co jsme dostali? Mnoho lidí tvářících se jako experti, kteří tvrdili, že to prostě není možné. Tedy - není to možné bez spousty ruční práce. Operační systémy (Android, iOS) jsou velmi odlišné, víte, Android užívá Java Virtual Machine, problémy s licencemi, Apple má speciální API, jsou tu unikátní uživatelská rozhraní iPhone a iPadu... A Java je velmi, velmi odlišná od Objective-C... Znáte to: spousta bla, bla, bla...
Pak tam byly jiné rady, většinou doporučující používat projekt j2objc od Google. Ale většinou jen teoretické rady, žádné skutečné zkušenosti.
Pokud nevíte, co j2objc je, pak tedy: j2objc je open source projekt od společnosti Google, který umí převést kód v jazyce Java do Objective-C (nebo, v krátkosti, Obj-C). A výsledný kód by měl být velmi dobrý - tak dobrý, že jej můžete prostě vzít a zkompilovat jej. Zní to příliš dobře, aby to byla pravda?
Google slibuje, že tento nástroj umožňuje kódu v Javě stát se doslova součástí aplikací pro iOS, žádná editace vytvořených souborů není nutná. Myšlenka je tato: Vytvoříte samostatné UI (uživatelské rozhraní) a příslušný kód UI pro obě platformy, ale aplikační logika a datové modely budou stejné - pro oba projekty. Ano, to zní dobře a my jsme to rozhodně museli zkusit...

Je j2objc tím pravým řešením pro překlad Javy do Obj-C?

Chcete-li použít j2objc (http://j2objc.org/), musíte jej stáhnout, rozbalit a použít tím správným způsobem - což znamená, že budete muset dát hlavičkové soubory a knihovny na to správné místo, aby je váš kompilátor našel - a používal je. A nastavit kompilátor, samozřejmě. Proč? Protože jakmile si přeložíte svůj projekt z Javy do Objective-C, kompilátor bude potřebovat tyto hlavičkové soubory a knihovny, aby vytvořil vaši finální aplikaci pro iOS.
Budeme zcela upřímní: Trvalo hodně času projít celou (zcela nedostatečnou) dokumentaci j2objc i rady jiných lidí, aby to aspoň trochu fungovalo, a když jsme se konečně dostali k přeloženému Objective-C kódu, nebyli jsme zdaleka tak šťastní, jak jsme očekávali. Protože kód není určen pro další změny. Metody jsou přejmenovány (názvy jsou srozumitelné, ale docela dlouhé), jiné metody přidány a celý výsledek je trochu nepřehledný.
Ale buďme spravedliví: Tohle není problém tohoto nástroje - to je náš problém. Měli jsme nějaká (nevhodná) očekávání a ta nebyla splněna. Naše představa byla přeložit kód z Javy do Obj-C a pak udělat nějaké změny a získat pěkný Obj-C kód, kde budeme moci dělat tolik změn, kolik bude dnes - nebo v budoucnu - potřeba. Ale to není účelem tohoto konvertovacího nástroj.
Trochu jsme si pak hráli s tímto nástrojem i s výsledným kódem. Není možné využít některé konverze a použít je pro náš účel? Znova trochu upřímnosti: Raději bychom nepoužívat žádné knihovny z Google (jako v každém kódu, i tam jsou nepochybně nějaké chyby a proč přidávat chyby Googlu k těm našim?). A chtěli jsme kód udělat srozumitelnějším. Ale v jednu chvíli to už bylo jasné: Ne, to není ten správný způsob, jak převést naši aplikaci pro Android do iOS.

Našli jsme ten správný nástroj pro převod

A pak jsme našli další open source nástroj, čtyři nebo pět let starý java2objc (https://code.google.com/p/java2objc/). Jméno může vypadat podobně, ale není to totéž jako j2objc. Tento kód je zveřejněna pod licencí Apache a jeho účel je jiný. Výsledný kód může být nedokonalý, ale je velmi dobře použitelný. Tento nástroj se zabývá jednotlivými zdrojovými soubory v Javě místo konkrétními třídami a pokusí se dle vlastní dokumentace vytvořit "dobře řemeslně vytvořený Objective C kód, jako by byl psaný člověkem". A velmi snadno se používá.
Nemusíte dělat žádné složité nastavení - stačí spustit: run xxx.java - z příkazové řádky, kde xxx.java je váš Java kód, který chcete přeložit do Objective-C. Java2objc je také velmi rychlý - po několika sekundách je přeložený kód ve výstupní složce - pojmenované output. Můžete přeložit všechny soubory jeden po druhém nebo více Java souborů najednou - a pak je použít v XCode. Bez jakéhokoliv zdlouhavého přepisování Javy do Objective-C vám tato aplikaci vytvoří zdrojový kód v Objective-C.

Zdokonalování kódu

V dokumentaci k java2objc si můžete přečíst, že výsledný kód pravděpodobně nebude fungovat podle očekávání - a pravděpodobně nebude ani zkompilován. Tak tomu bylo i v případě našeho kódu - ale bylo to pro nás naprosto OK. Vzhledem k tomu, že provést potřebné změny bylo docela snadné.
Jistě, je třeba změnit všechny věci, které mají co do činění s uživatelským rozhraním. Přepsali jsme grafickou knihovnu, což bylo docela snadné, protože metody grafiky v iOS API jsou jednodušší, než ty, které jsou v Androidu, hudební knihovnu (stejný případ), dotykové ovládání a vstupy/výstupy souborů.
Pak jsme museli opravit hlavně některé funkce/metody pro práci s řetězci a pole. Abychom si věci zjednodušili, rozhodli jsme se použít převážně standardní pole ve stylu jazyka C, která byla pro naše účely zcela dostačující. Jen jedna věc zde byla k řešení - dynamická pole v C neví, jak jsou velká, takže jsme si to museli pamatovat v dalších proměnných.
Celá struktura souborů je velmi podobná v Xcode iOS i v Androidu, takže pokud používáte architekturu Model-View-Controller na Androidu, je poměrně snadné znovu totéž stvořit se stejnými soubory na iOS. Pokud jde o assets, byla tam jen jedna věc, kterou jsme museli převést - běžné grafické formáty jsou stejné, ale v Apple iOS API není žádná podpora mid souborů a ogg souborů. Tak jsme převedli mid soubory do ogg (pomocí skvělého softwaru LMMS) a poté použili Audacity pro převod všech ogg souborů (zvuků i hudby) do aac souborů.

A to je vše... Díky java2objc celá konverze z Javy do kódu Objective-C trvala mnohem kratší dobu, než jsme předpokládali - a i když hned po konverzi bylo zobrazeno v XCode mnoho chyb, vyrovnali jsme se s nimi poměrně rychle. Doufejme, že stejná taktika může být dobrá i pro vaše projekty.

GameStylus tým
(GameStylus je herní engine a editor pro adventure hry, který může použít kdokoli. Zkuste to! Můžete tak snadno vytvářet hry pro Android a iOS.)

Žádné komentáře:

Okomentovat