Prodej zařízení s Androidem nezadržitelně roste, tvorbě aplikací pro něj se věnuje stále více vývojářů a mít pro svou aplikaci nebo webovou službu androidího klienta už není nadšenecký výstřelek, ale nutnost. Alespoň tam, kde jeho existence má své opodstatnění. A tak jsme se i my rozhodli začlenit další perspektivní platformu do svého portfolia.

Díky rostoucí oblíbenosti lze už i na českém internetu najít dostatek návodů, jak s vývojem začít, vysvětlení základních principů apod. Po úvodním „Hello World“ jsme ale byli ponecháni napospas osudu a rady, jak vyvíjet větší aplikaci, aby člověk v kupce sena hledal.

Několikrát omílané základy tedy přenechám již napsaným článkům, např. z AbcLinuxu nebo Rootu. Pokud teprve začínáte, doporučuji nejprve jejich přečtení. V dalším textu předpokládám nainstalované SDK a Eclipse s ADT pluginem, pochopení základních kamenů – aktivit, intentů a service. K vývoji samotného UI jen doplním upozornění na užitečnou utilitu hierarchyviewer, díky které lze sledovat chování jednotlivých prvků za běhu aplikace. Při učení práce s layouty a hledání chyb může být neocenitelným pomocníkem.

Maven

Osobně si už nedovedu představit vývoj aplikace v Javě bez buildu a správy závislostí pomocí mavenu. Prvním krokem tedy bylo zprovoznit integraci s Eclipse, k tomu slouží  plugin m2eclipse-android-integration (od Eclipse verze 3.7 je podpora mavenu přepracovaná a místo něj se používá Android Connector). Díky nainstalovanému ADT zbývalo jen vytvořit projekt z archetypu android-quickstart a o samotný buildovací proces se stará přednastavený maven-android-plugin:

<plugin>
<groupid>com.jayway.maven.plugins.android.generation2</groupid>
<artifactid>maven-android-plugin</artifactid>
<version>3.0.0-alpha-2</version>
<configuration>
<androidmanifestfile>${project.basedir}/AndroidManifest.xml</androidmanifestfile>
<sdk>
<platform>7</platform>
</sdk>
<deleteconflictingfiles>true</deleteconflictingfiles>
<undeploybeforedeploy>true</undeploybeforedeploy>
</configuration>
<extensions>true</extensions>
</plugin>

Po vytvoření projektu nás čekal drobný chyták: předgenerovaná aktivita obsahuje odkaz na layout v „magické“ třídě R, ta se ale generuje až po úspěšně dokončené kompilaci. Nezkompilovatelný prakticky prázdný projekt může leckoho zaskočit – samozřejmě stačí inkriminovaný kód na chvíli zakomentovat, nechat proběhnout kompilaci a je vše v pořádku.

Spring

Další stálice v J2EE vývoji je Spring framework. Pro Android je ve vývoji verze s příznačným názvem Spring Android, v době psaní aktuální verze 1.0.0.M4 nabízí jen RestTemplate a autentizaci, takže se nejedná o plnohodnotný port. Zatím se tváří spíše jako konektor pro většího bratříčka. Uvidíme, kam se bude ubírat další vývoj.

U většiny androidích aplikací je ale REST natolik klíčová součást, že se ho vyplatí využít i tak. Jeho použití je stejné, jako ve „velkém“ Springu, i mapování do transportního formátu probíhá jak jsme zvyklí – například pro JSON stačí přidat knihovnu Jackson na classpath.

Databáze a ORM

V rámci SDK je integrovaná podpora pro SQLite, která pro naše využití nabídla vše potřebné. Nebyl tedy důvod dívat se po jiné. Pro ulehčení práce jsme se poohlédli po vhodném ORM. V prostředí s natolik omezenými prostředky jako jsou mobily a tablety snad ani nemá smysl uvažovat o plnohodnotných nástrojích jako je Hibernate. Naštěstí jsou k dispozici odlehčené alternativy, v souvislosti s využitím v Androidu jsou nejčastěji zmiňovány OrmLite a ActiveAndroid. Každý má své výhody a nevýhody.

ActiveAndroid je placený (cca $20/licence) a zabírá pouhých 18kB. Pro vývojáře se zkušenostmi z Ruby on Rails pak může být lákadlem velká podobnost s ActiveRecord. Co bych mu vytknul je porušení zapouzdření a separation of concerns, ale to je spíše subjektivní názor. Našim požadavkům neodpovídal, a tak jsme se jím dále nezabývali.

OrmLite je naproti tomu šířen jako opensource a bez jakýchkoliv omezení. Pro někoho může být nevýhodou poněkud větší velikost knihovny (řádově 200kB), což pro nás nebylo rozhodující. Následovalo tedy přidání do projektu pomocí mavenu:

<dependency>
<groupid>com.j256.ormlite</groupid>
<artifactid>ormlite-core</artifactid>
<version>4.22</version>
</dependency>
<dependency>
<groupid>com.j256.ormlite</groupid>
<artifactid>ormlite-android</artifactid>
<version>4.22</version>
</dependency>

Entitami jsou klasické POJO doplněné o anotace, jen musí vždy obsahovat bezparametrický konstruktor. Součástí knihovny je generický DaoManager pro práci s nimi, jeho použití je z dokumentace lehce pochopitelné.

Co odlišuje OrmLite od „dospělého“ ORM frameworku je práce s vazbami mezi objekty. Kaskádování řeší v minimální míře – při ukládání entity se uloží jen id cizí entity (pokud jde o vlastníka vazby), ale o její skutečné vytvoření/uložení se už nestará. Stejně tak dotahování entit – k dispozici je jen id navázaného objektu, pro dotažení ostatních atributů je nutné zavolat metodu refresh na příslušném dao.

Kontinuální integrace

Jako většina Javového světa, i my používáme Hudson (Jenkins, chcete-li). Po instalaci android pluginu je potřeba ještě SDK. V prostředí headless serveru lze do staženého SDK doinstalovat API pomocí příkazu:

./android update sdk -u

Narozdíl od GUI verze Vám nedá na výběr a stáhne všechna dostupná API, to může zabrat na disku až 3GB. Po nastavení cesty k SDK v Hudsonu už lze přidat build Android projektu jako jakýkoliv jiný.

Závěr

Předvedli jsme si integraci pokročilejších, ale pro vývoj v Androidu užitečných, technologií. Bylo by na místě rozebrat i možnosti testování, ale to zase příště, až nasbíráme dostatek praktických zkušeností.

Zdroje

* Oficiální stránky
* Seriál o vývoji na root.cz
* Seriál o vývoji na svetandroida.cz
* Google I/O
* Spring pro Android
* Příklady kódů
* Blog o Androidu
* Tipy&triky
* Testovací framework Robotium