26.6.2013

Pokud chcete vyrábět vážně myšlené aplikace pro Android, měli by jste vědět jak nastavit minimální podporovanou verzi SDK, stejně jako umět ošetřit dopřednou kompatibilitu aplikace. Právě k tomu slouží v nadpisu zmíněné parametry v Android manifestu.

Všechny tři lze nastavit v rámci tagu API Level a která verze systému je vybavena jakým API levelem.

minSDKVersion

Začneme těmi jednoduššími kousky. Tento parametr nastaví minimální API Level, na kterém aplikace půjde nainstalovat. Pokud jej nastavíte například na 14 (Android 4.0), zařízení s nižší verzí mají smůlu.

Pozor: výchozí hodnota tohoto atributu je 1, tedy aplikace půjde nainstalovat na všechny verze Androidu. Věřte, že to není to co chcete, jak si ještě povíme níže.

maxSDKVersion

O tomto atributu jenom krátce. Pro většinu z Vás nebude nikterak užitečný. Můžete jím totiž pouze omezit maximální verzi systému, na kterém vaše aplikace může běžet. To je ale potřeba jenom ve velmi vyjímečných případech, protože všechny aplikace odladěné pro starší verzi systému by měli běžet i na novějších verzích. Jak dosáhnout dopředné kompatibility si řekneme hned pod následujícím nadpisem.

minSDKVersion, maxSDKVersion

targetSDKVersion

Říká, pro jakou verzi systému je Vaše aplikace odladěná, tedy na které bude bez problémů fungovat. Tento parametr nijak neomezuje výčet zařízení, na která půjde aplikace nainstalovat, od toho tu máme předchozí dva. Jeho jediným (ale důležitým) úkolem je docílení dopředné kompatibility aplikací, tedy že i stará aplikace půjde spustit na novějších verzích systému.

Způsob jakým se to zařídí je velice jednoduchý a přímočarý, systém zkrátka bude emulovat funkčnost svého mladšího bratříčka (čti předchozí verze systému) a aplikace si vůbec nevšimne, že už běží na systému novém.

Výchozí hodnotou atributu je minSDKVersion, níže si povíme proč je mnohem lepší nastavit hodnotu co nejvyšší.

minSDKVersion, targetSDKVersion

Project Build Target

Nastavuje se ve vývojovém prostředí a říká jakou verzí kompilátoru se proženou vaše zdrojové kódy. Pokud jej nastavíte na nižší verzi platformy, nebudete mít k dispozici třídy a metody přidané až v novějších verzích, při jejich použití selže kompilace.

Pozor si musíte dávat, pokud nastavíte Project Build Target na vyšší verzi, než minSDKVersion v manifestu. Pokud například nastavím Project Build Target na API level 14 a minSDKVersion na 8ku, kompilátor mi dovolí použít třídy a metody z API 14, ale aplikace půjde nainstalovat i na zařízení s API pouze 8, kde pak bude aplikace na voláních z novějších API samozřejmě padat.

Jak se to dělá v praxi?

Jak nastavit správně tyto parametry u reálné aplikace?

minSDKVersion

Nastavení tohoto parametru je asi nejkomplikovanější, ale není to žádná velká hrůza. Je potřeba zjistit, jaký minimální API level potřebuje aplikace a její knihovny. Obecně lze doporučit začít co nejníže a potom případně během vývoje zvedat, pokud narazíme na kritické komponenty, které aplikace pro svůj běh potřebuje.

Tento parametr vždy nastavte, výchozí hodnota je totiž 1, tedy aplikace půjde nainstalovat na všechny verze systému a to v praxi nikdy nechcete už jenom proto, že API Levely menší než 4 se prakticky nedostali k reálným uživatelům.

targetSDKVersion

Tento parametr vždy nastavte a vždy na nejvyšší dostupné SDK, prakticky neexistují důvody nastavit něco jiného.

Výchozí hodnotou atributu je minSDKVersion, což by se na první pohled mohlo zdá jako ideální volba, zkrátka vyrobím aplikaci pro co nejnižší verzi systému a na novějších si nechám emulovat prostředí tak, abych nemusel pro novější verze systému nic ladit. Tenhle přístup sice bude „fungovat“, ale aplikace na novějších verzích systému bude notně týrat uživatele. Tady je pár příkladů toho, co se stane, když targetSDKVersion nastavíme na verzi nižší, než je verze systému:

  • od Androidu 3.0 bude na telefonech bez hardwarového menu tlačítka zobrazeno menu tlačítko softwarové, které jednak nemá na těchto verzích systému už co dělat a druhak může zbytečně zabírat místo na displayi, pokud pro danou aktivitu není žádné menu definované
  • na Androidech 3.0 a novějších se neaplikuje Holo theme a aplikace bude vypadat tak jako za starých časů

Nastavení správné (tedy nejvyšší možné) targetSDKVersion způsobí i některé méně příjemné věci na které je potřeba si dát pozor:

  • od verze 3.2 se budou AsyncTasky spouštět sériově za sebou, tedy pokud spustím AsyncTask A a dříve než doběhne spustím AsyncTask B, B bude čekat než doběhne A a až potom se spustí, dříve mohli běžet paralelně
  • od verze 3.0 se nám aplikuje Holo theme (to chceme) pro které musíme aplikaci odladit (to už nás těší míň, ale děláme to přeci pro uživatele!)
  • od verze 3.0 nám aplikace spadne, pokud se nezavolá v rámci aktivity super.onPause()

To je tedy pár něpříjemností, ale těmi se určitě nenechte odradit a tento parametr nastavujte na nejvyšší aktuálně známý API Level, nebo nejvyšší na kterém jste schopni aplikaci otestovat a odladit.

maxSDKVersion

Pokud nemáte nějaký opravdu dobrý důvod, tak tento parametr vůbec nenastavujte. Zbytečně tím omezíte zařízení na kterých může Vaše aplikace běžet. Díky targetSDKVersion by měla bez problémů běžet i na verzích systému, které ještě neexistují a není proto důvod nastavovat maxSDKVersion.

Závěrem

Pokud nechcete štvát majitele nových zařízení, pravidelně vydávejte aktualizace, kde zvýšíte targetSDKVersion, když už nastavíte minSDKVersion na nějakou hodnotu, tak to na této verzi API také pořádně otestujte, ať aplikace zbyteně neapadá. No a maxSDKVersion se vyněte obloukem a nenastavujte ji, pokud se nechcete připravit o uživatele nových telefonů. Kompatibilitě zdar!

Vladislav Skoumal
SKOUMAL CEO