Vyvíjíme pro Android – úvod

image00

Tento článek vyšel nejprve na webu abclinuxu.cz. Jde o první díl ze série článků o vývoji pro platformu Android. Z důvodu zaměření serveru abclinuxu.cz je text psán spíše pro vývojáře používající linux. Rozdíly ve vývoji na jiných platformách jsou ale minimální, převážně se týkají názvů různých nástrojů v SDK. Zmiňované programy nebo příkazy mají na Windows ekvivalenty s koncovkami .exe nebo .bat. V případě jiných odlišností je text doplněn poznámkou.

Úvod

Operační systém Android se na trhu mobilních telefonů objevil teprve nedávno. Od té doby zaznamenal raketový růst a dnes je jedním z nejpoužívanějších operačních systémů pohánějících chytré telefony. Spolu s rozšířením systému roste také poptávka po zajímavých aplikacích. V krátkém seriálu si ukážeme základy programování aplikací pro Android.

V tomto dílu si nejprve krátce povíme něco o samotném systému, představíme si vývojové nástroje a řekneme si něco o principech, na jakých OS Android funguje.

Co je to Android a trocha historie

Android je open source platforma pro mobilní zařízení, která je založená na pozměněném linuxovém jádře. Systém byl původně vyvíjen firmou Android Inc., kterou v roce 2005 koupil Google. V roce 2007 pak byla založena Open Handset Alliance skládající se z několika desítek firem – kromě Googlu jsou to převážně výrobci mobilních telefonů, polovodičových součástek a také mobilní operátoři. OHA zastřešuje vývoj otevřených standardů pro mobilní zařízení a má za úkol kooperovat vývoj operačního systému Android.

Vnitřnosti Androidu

Platforma se kromě linuxového jádra skládá z řady C/C++ knihoven – např. systémová libc, knihovny pro práci s médii, knihovny enginu webového prohlížeče, knihovny grafického enginu, SQLite knihovny a mnoho dalších.

Systém dále obsahuje Dalvik Virtual Machine, který slouží pro vykonávání bytecodu, na kterém jsou postaveny vyšší vrstvy systému. Dalvik Virtual Machine ale není Java Virtual Machine a používaný bytecode není Java bytecode. Přesto, jak mnozí vědí, se pro Android programuje primárně v Javě. Jak to? Android SDK (které rozebírám dále) obsahuje nástroj dx pro převod Javovských .class souborů do Dalvikovských .dex souborů. Při převodu se mimo jiné konvertuje Java bytecode do Dalvik bytecode. Měl bych ještě zdůraznit, že převod není stoprocentní, ne vše z Javy lze použít na Androidu, aplikace se tedy neprogramují v plnohodnotné Javě.
Systémové aplikační rozhraní, které aplikacím zprostředkovává nejrůznější API, je pak už stavěno nad virtual machine. Součástí platformy je také řada už hotových aplikací – např. správce kontaktů, prohlížeč nebo samotná aplikace pro telefonování.

Vývoj a dostupné nástroje

Na oficiální vývojářské stránce na http://developer.android.com je pro vývoj dostupná řada nástrojů, dokumentace a další zdroje. Nejdůležitější je zde SDK, bez kterého nic nevytvoříte. Díky vřelému vztahu Googlu k Linuxu je dostupné pro všechny hlavní platformy – Linux, Mac i Windows. SDK v základu obsahuje pouze některé vývojové nástroje, další části se doinstalovávají jako komponenty. Jednotlivé komponenty a další nástroje obsažené v SDK si rozebereme dále.

Pro vývoj aplikací, jejichž odezva je kriticky důležitá (především pro hry), lze využít Android NDK, což je balík pro vývoj Android aplikací v C/C++. Vývoj aplikací využívajících NDK je pokročilejší téma a nebudeme se jím zde zabývat.

Kromě SDK a NDK si lze stáhnout oficiální ADT plugin pro Eclipse, který značně usnadňuje vývoj a ladění aplikací. Protože je Eclipse díky svému pluginu primárním IDE, ve kterém se pro Android vyvíjí, budu ho dále v průběhu seriálu používat při tvorbě kódu a některé popisy a screenshoty se k němu budou vztahovat.

Pokud ovšem nejste fanouškem tohoto IDE, jsou tu i jiná řešení. Pro NetBeans existuje plugin pro vývoj Android aplikací, více o něm naleznete na http://kenai.com/projects/nbandroid/. V Intellij IDEA je od verze 10 také možné vyvíjet aplikace pro Android, více informací naleznete na http://www.jetbrains.com/idea/features/google_android.html.

Obsah SDK

Holé SDK obsahuje pouze několik programů v adresáři tools. Asi nejdůležitější položkou je program android, kterým se spouští Android SDK and AVD Manager. Přes něj se stahují jednotlivé komponenty SDK – různé verze platformy Android a další rozšíření.

Android SDK mimo jiné obsahuje emulátor Androidích zařízení. Emulátor je samostatná desktopová aplikace umožňující testování aplikací bez mobilního zařízení. Pomocí Android SDK a AVD Manageru lze vytvářet a spouštět Android Virtual Devices – nakonfigurované instance emulátoru. Lze si tak velice přesně vymodelovat vlastnosti konkrétního zařízení. Pokud je to pro ladění potřeba, lze spouštět více instancí emulátoru zároveň, jednotlivá AVD ovšem nelze spustit vícekrát současně. Pro spouštění instancí emulátoru lze také použít příkaz emulator, který má širokou škálu parametrů sloužících k další úpravě konfigurace AVD.

Dalším důležitým programem v SDK je ddms, jenž spouští Dalvik Debug Monitor – nástroj s jehož pomocí lze ladit aplikace. Program umí komunikovat jednak s běžícími instancemi emulátoru, ale také s připojenými telefony. Pro ladění aplikací přímo v telefonu je nutné v nastavení telefonu povolit ladění přes USB (přepínač naleznete v sekci Aplikace -> Vývoj). Dále je ještě nutné nastavit počítač, aby zařízení rozpoznal – konkrétně v Ubuntu je třeba:

  • jako root vytvořit soubor /etc/udev/rules.d/51-android.rules
  • do tohoto souboru přidat řádky ve tvaru:
    SUBSYSTEM=="usb", SYSFS{idVendor}=="18d1", MODE="0666" 

    • místo “18d1” uveďte příslušné id výrobce telefonu – to zjistíte na počítači po připojení zařízení např. pomocí příkazu lsusb (hodnota “18d1” je pro Google Nexus One)
  • přidat souboru práva pro čtení:
    chmod a+r /etc/udev/rules.d/51-android.rules

(Poznámka: Na Windows je třeba nainstalovat ovladač pro dané zařízení. Na stránce http://developer.android.com/sdk/oem-usb.html naleznete seznam odkazů na stránky s drivery několika hlavních výrobců.)

Ještě pro úplnost dodám, že aby bylo možné aplikaci ladit je v ní třeba provést malou úpravu v manifestu, o kterém se zmíním později.

Dalvik Debug Monitor umí mimo jiné zobrazovat logy přicházející z celého systému, simulovat různé akce emulátoru nebo zobrazovat různé ladící informace z virtual machine. Aplikaci lze také využít pro získání screenshotů obrazovky – pro nerootované telefony je to prakticky jediný způsob, jak je vytvořit.

SDK komponenty

Nejdůležitějšími komponentami v SDK jsou platformy Androidu. Ty odpovídají produkčním platformám běžícím na skutečných zařízeních. Momentálně jsou dostupné verze 1.5, 1.6, 2.1, 2.2, 2.3.1, 2.3.3. a nově také verze 3.0. Každá platforma obsahuje systémové knihovny, systémový obraz, skiny emulátoru, ukázky kódu a jiné zdroje specifické pro platformu.

Android SDK Platform-tools je balík obsahující další vývojové nástroje, důležitý je zde především program adb – Android Debug Bridge. S ním lze např. na zařízení nahrávat soubory nebo aplikace. Program aapt slouží k vytváření a modifikaci aplikačních balíků.

Dalšími komponentami jsou balíky Google API, jenž jsou dostupné pro každou verzi platformy a obsahují knihovny Google map, které jinak nejsou základní součástí platformy. Pokud chcete vyvinout aplikaci využívající interně Google Mapy, budete tyto balíky potřebovat.

Market Licensing package obsahuje License Verification Library – knihovnu umožňující ověřování licence aplikace. Knihovna umí kontrolovat, zda byla běžící aplikace zakoupena a nejedná se o černou kopii. V SDK je též k dispozici komponenta GALAXY Tab Addon – emulátor Samsung Galaxy Tabu.

Další zdroje

Kromě oficiální stránky http://developer.android.com lze na internetu najít spoustu dalších zdrojů. Nejnovější inoformace ohledně Androidu naleznete na oficiálním blogu http://android-developers.blogspot.com/. A protože je Android open source, můžete si stáhnout i zdrojové soubory k celému systému na stránkách http://source.android.com/.

Aplikační principy

Android aplikace jsou zkompilované zdrojové soubory, které jsou společně s dalšími resourcy zabalené do ZIP balíku s koncovkou .apk – takzvaného Android package. Ten slouží k distribuci aplikací a jejich instalaci na zařízení.

Jak už bylo zmíněno, Androidí aplikace se programují v “Javě” a běží nad virtual machine, která běží na linuxovém jádře. Každá spuštěná aplikace má svou vlastní virtual machine.

Základní vlastností Androidu je možnost využít části jiných aplikací ve své aplikaci. Důvod k tomuto řešení byl prostý – zamezit opakovanému vytváření stejné funkcionality a usnadnit tak vývojářům práci. K tomuto účelu byly aplikace navrženy jako balíky několika komponent, které lze samostatně instanciovat. Existují čtyři typy komponent: activity, service, broadcast receiver a content provider, přičemž každá z těchto komponent slouží k jinému účelu. Postupně si je nyní projdeme.

Activity

Aktivita je základní vizuální komponenta – každá aktivita specifikuje jednu obrazovku aplikace. Představme si třeba e-mailového klienta, kde jedna aktivita zobrazuje seznam přijatých e-mailů, jiná aktivita zobrazuje obsah jednotlivých e-mailů a třetí slouží k jejich psaní. Samozřejmě by takovou aplikaci šlo také napsat jednou aktivitou s tím, že by se vždy kompletně změnil obsah. Takovou architekturu ale nelze doporučit, je to špatná a mnohem pracnější cesta. V čem je tedy kromě snazšího vývoje výhodná popisovaná struktura několika aktivit? Právě v možnosti jednotlivé kompenenty samostatně volat i z jiných aplikací. Například narazíme-li v prohlížeči na link odkazující nás na e-mailovou adresu, lze po kliku přejít do naší aktivity určené pro psaní e-mailů. K tomuto účelu stačí jen aktivitě předat požadovanou e-mailovou adresu.

Protože je aktivita vizuální komponentou, má okno, do kterého je možné kreslit. Okno aktivity typicky zaplňuje celou obrazovku, ale může být také menší – být jen plovoucím dialogem.
Obsah okna je specifikován pomocí views. View je vizuální prvek, na obrazovce mu odpovídá obdélníkový prostor. View se řadí do hierarchické struktury – rodičovské prvky, nazývané layouty, organizují rozložení vnitřních prvků. Typ layoutu určuje, jakým způsobem budou jeho podřízené view rozloženy v dostupném prostoru. Příklad základních view je třeba tlačítko nebo obrázek.

Service

Jiným typem komponenty je service (služba), která není uživatelsky viditelná a běží na pozadí. Příkladem je třeba komponenta určená k síťové komunikaci. V příkladu e-mailového klienta bychom mohli použít službu pro stahování a odesílání e-mailů na pozadí.

Broadcast receiver

Tato komponenta slouží k “poslouchání” broadcastových oznámení a k reakci na ně. Broadcast receivery nejsou, stejně jako služby, uživatelsky viditelné. Jako reakci na příchozí oznámení mohou například spustit jiné komponenty. Broadcasty mohou být jak systémové tak uživatelské – aplikace si mohou vytvářet své vlastní broadcasty.

Jednoduchým příkladem může být receiver reagující na systémový broadcast oznamující nízký stav baterie. Reakcí naší aplikace může být například uložení aktualního stavu a ukončení aplikace. Dalšími příklady mohou být receivery reagující na odpojení nebo připojení sd karty. Jiným příkladem může být receiver reagující na příchozí textovou zprávu tím, že spustí další aktivitu, která danou zprávu zobrazí.

Content provider

Poslední komponentou je content provider, který slouží ke zpřístupnění dat jiným aplikacím. Ty k datům přistupují pomocí instancí třídy ContentResolver. Data lze zpřístupnit ke čtení i k zápisu. Rozlišení toho, kdo může jen číst a kdo může i zapisovat, se provádí podle práv, jež aplikace mají a jež jsou vyžadována. Pomocí content resolveru lze přistupovat například k záznamům v adresáři telefonu, fotkám v galerii telefonu nebo záznamům o příchozích a odchozích hovorech.

Android manifest

Toto byly čtyři druhy stavebních kamenů aplikací určených pro operační systém Android. Aby mohlo vše fungovat jak má, je třeba nějak operačnímu systému sdělit, jaké komponenty jsou k dispozici. K tomu slouží Android manifest. Je to xml dokument, který specifikuje parametry aplikace – jednotlivé komponenty, požadovaná systémová práva a jiné požadavky na běh.

Volání komponent a běh aplikace

Jak už bylo zmíněno, jednotlivé komponenty aplikace mohou spouštět jiné komponenty, dokonce mohou spouštět i komponenty cizích aplikací. Všechny komponenty, mimo content providerů, se aktivují pomocí asynchronních zpráv tzv. intentů. Používání intentů je jednoduché, v příští části seriálu si ukážeme konkrétní příklady.

Task

Nyní bych měl zmínit ještě jeden důležitý a možná trochu matoucí pojem, a to je task. Task je zásobník instancí aktivit, které byly postupně spuštěny. V momentě, kdy jedna aktivita spustí nějakou jinou aktivitu (může to být i aktivita z jiné aplikace), je tato nová aktivita instanciována a vložena na zásobník. Uživatel komunikuje s instancí na vrcholu zásobníku aktivního tasku.

Například pokud chceme ze své aplikace odeslat e-mail, můžeme pomocí intentu spustit aktivitu e-mailového klienta. Tato aktivita se tedy instanciuje a vloží na vrchol zásobníku. Ačkoli přecházíme mezi aktivitami různých aplikací, z uživatelského hlediska se zdá, že jsme stále v jedné aplikaci. Uživatel nyní může odeslat e-mail, po odeslání lze očekávat ukončení aktivity. Na vrchol zásobníku se tak dostává zpět aktivita, která předtím aktivitu e-mailového klienta spustila.

Pro pohyb na zásobníku také slouží tlačítko zpět. Pomocí něj je možné smazat vrchol zásobníku a přejít na předchozí aktivitu.

Tasků může být v systému samozřejmě více – nový task vzniká např. spuštěním aplikace z menu operačního systému. Task lze opustit, a pokud nebyly instance v něm ukončeny, tak se do něj lze také vrátit. Z uživatelského hlediska je tedy task aplikací.

Závěr

V tomto díle jsme si řekli něco o tom, co je to Android, popsali si vývojové nástroje a zmínili základní principy a stavbu Androidích aplikací. Příště si ukážeme konkrétní ukázky kódu na jednodušší aplikaci.

Tomáš Kypta
O Autorovi - Tomáš Kypta

více o autorovi

Mohlo by vás zajímat

Komentáře (27)