Vyberte si compileSdkVersion, minSdkVersion, a targetSdkVersion

Ian Lake

Sledovat

6. ledna, 2016 – 5 minut čtení

V závislosti na ročním období může být nová verze systému Android oznámena až několik měsíců po vydání aplikace. Co to však znamená pro vaši aplikaci – rozbije se všechno?“

Jistě vás potěší, že na dopřednou kompatibilitu je v systému Android kladen velký důraz – stávající aplikace vytvořené proti předchozím SDK by se neměly rozbít, když uživatel aktualizuje na novou verzi systému Android. Zde přicházejí na řadu compileSdkVersion, minSdkVersion a targetSdkVersion: řídí, jaká API jsou k dispozici, jaká je požadovaná úroveň API a jaké režimy kompatibility se použijí, v tomto pořadí.

compileSdkVersion je způsob, jak říci Gradle, s jakou verzí Android SDK má zkompilovat vaši aplikaci. Použití nové verze Android SDK je podmínkou pro použití některého z nových API přidaných v této úrovni.

Je třeba zdůraznit, že změna compileSdkVersion nemění chování za běhu. Při změně compileSdkVersion se sice mohou objevit nová varování/chyby kompilátoru, ale compileSdkVersion není součástí APK: používá se výhradně v době kompilace. (Tato varování byste však měli opravdu opravit – byla přidána z nějakého důvodu!)

Důrazně proto doporučujeme, abyste vždy kompilovali s nejnovější verzí SDK. Získáte tak všechny výhody nových kompilačních kontrol stávajícího kódu, vyhnete se nově zastaralým API a budete připraveni používat nová API.

Poznamenejte, že pokud používáte podpůrnou knihovnu, je kompilace s nejnovějším SDK podmínkou pro používání nejnovějších vydání podpůrné knihovny. Chcete-li například používat podpůrnou knihovnu 23.1.1, musíte mít kompilaciSdkVersion alespoň 23 (ta první čísla musí souhlasit!). Obecně platí, že nová verze Support Library je vydávána společně s novou verzí platformy a poskytuje předstupně kompatibility s nově přidanými rozhraními API i novými funkcemi.

minSdkVersion

Pokud compileSdkVersion nastavuje nejnovější dostupná rozhraní API, minSdkVersion je spodní hranice pro vaši aplikaci. MinSdkVersion je jedním ze signálů, které obchod Google Play používá k určení, na které z uživatelských zařízení lze aplikaci nainstalovat.

Hraje také důležitou roli při vývoji: ve výchozím nastavení se proti vašemu projektu spouští funkce lint, která vás varuje, pokud používáte nějaké rozhraní API nad hodnotou minSdkVersion, a pomáhá vám tak vyhnout se problémům při pokusu o volání neexistujícího rozhraní API za běhu. Kontrola verze systému za běhu je běžnou technikou při používání rozhraní API pouze na novějších verzích platformy.

Mějte na paměti, že knihovny, které používáte, například některá z podpůrných knihoven nebo služeb Google Play, mohou mít vlastní minSdkVersion – minSdkVersion vaší aplikace musí být alespoň tak vysoká, jako minSdkVersion vašich závislostí – pokud máte knihovny, které vyžadují 4, 7 a 9, vaše minSdkVersion musí být alespoň 9. Ve výjimečných případech, kdy chcete nadále používat knihovnu s vyšší minSdkVersion než vaše aplikace (a vypořádat se se všemi okrajovými případy/zajistit, aby se knihovna používala pouze na novějších verzích platformy), můžete použít značku tools:overrideLibrary, ale nezapomeňte ji důkladně otestovat!

Při rozhodování o minSdkVersion byste měli vzít v úvahu statistiky na ovládacích panelech, které poskytují globální pohled na všechna zařízení, která navštívila obchod Google Play v předchozích 7 dnech – to je vaše potenciální publikum při umístění aplikace na Google Play. Je to nakonec obchodní rozhodnutí, zda podpora dalších 3 % zařízení stojí za čas potřebný k vývoji a testování, abyste zajistili co nejlepší zážitek.

Jestliže je nové rozhraní API klíčové pro celou vaši aplikaci, pak to diskusi o minSdkVersion docela usnadňuje. Jen nezapomeňte, že i 0,7 % z 1,4 miliardy zařízení je hodně zařízení.

targetSdkVersion

Nejzajímavější ze všech tří je však targetSdkVersion. targetSdkVersion je hlavní způsob, jak Android zajišťuje dopřednou kompatibilitu tím, že nepoužije změny chování, pokud není aktualizována targetSdkVersion. To vám umožňuje používat nová API (protože jste přece aktualizovali compileSdkVersion, že?) předtím, než se propracujete ke změnám chování.

Většina změn chování, které targetSdkVersion implikuje, je zdokumentována přímo ve VERSION_CODES, ale všechny krvavé detaily jsou také uvedeny v přehledech platforem jednotlivých verzí, které jsou pěkně propojeny v tabulce Úrovně API.

Například Android 6.2.2.2.0 hovoří o tom, jak cílení na API 23 převádí vaši aplikaci na model runtime oprávnění, a změny chování Androidu 4.4 podrobně popisují, jak cílení na API 19 nebo vyšší mění fungování budíků nastavených pomocí set() a setRepeating().

Protože některé změny chování jsou pro uživatele velmi viditelné (zastarání tlačítka menu, runtime oprávnění atd.), aktualizace na cílení na nejnovější SDK by měla být pro každou aplikaci vysokou prioritou. To neznamená, že musíte používat každou nově zavedenou funkci, ani byste neměli slepě aktualizovat targetSdkVersion bez testování – prosím, prosím, otestujte před aktualizací targetSdkVersion! Vaši uživatelé vám poděkují.

Verze Gradu a SDK

Takže nastavení správné compileSdkVersion, minSdkVersion a targetSdkVersion je důležité. Jak si asi umíte představit ve světě s Gradle a Android Studiem, tyto hodnoty jsou integrovány do systému nástrojů prostřednictvím začlenění do souboru build.gradle vašeho modulu (dostupného také prostřednictvím volby Project Structure v Android Studiu):

android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "com.example.checkyourtargetsdk"
minSdkVersion 7
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
}

CompileSdkVersion, jakožto věc v době kompilace (kdo by to byl řekl!), je jedním z nastavení Androidu spolu s verzí vašich nástrojů pro sestavení. Další dvě se trochu liší v tom, že jsou deklarovány na úrovni varianty sestavení – defaultConfig je základem pro všechny varianty sestavení a tam bys dal výchozí hodnoty pro ně, ale můžeš si představit složitější systém, kdy konkrétní verze tvé aplikace mají například jinou minSdkVersion.

minSdkVersion a targetSdkVersion se od compileSdkVersion liší také tím, že jsou zahrnuty ve vašem finálním APK – pokud byste se podívali na vygenerovaný AndroidManifest.xml, viděli byste značku jako:

<uses-sdk android:targetSdkVersion="23" android:minSdkVersion="7" />

Zjistíte, že pokud ji do manifestu vložíte ručně, bude při sestavování pomocí Gradle ignorována (ačkoli jiné sestavovací systémy mohou jistě počítat s tím, že tam bude).

Složení všeho dohromady

Pokud jste se prokousali tučně vyznačenými poznámkami, všimli jste si vztahu mezi těmito třemi hodnotami:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

Intuitivně to dává smysl – pokud je compileSdkVersion vaše „maximum“ a minSdkVersion vaše „minimum“, pak vaše maximum musí být alespoň stejně vysoké jako minimum a cíl musí být někde mezi.

Ve skutečnosti by vztah v ustáleném stavu vypadal spíše takto:

minSdkVersion (lowest possible) <= 
targetSdkVersion == compileSdkVersion (latest SDK)

Nízkou minSdkVersion zasáhnete největší publikum a budete vypadat a působit nejlépe, když budete cílit a kompilovat s nejnovější SDK – skvělý způsob, jak #BuildBetterApps.

Připojte se k diskusi v příspěvku na Google+ a sledujte Sbírku vývojových vzorů pro Android, kde najdete další informace!

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.