Sestavování balíčků APK specifických pro ABI
Tento dokument popisuje, jak vytvořit APK, který bude cílit na jeden ABI pomocí Xamarin.Android.
Přehled
V některých situacích může být výhodné, aby aplikace měla více sad APK – každý SOUBOR APK je podepsaný se stejným úložištěm klíčů a sdílí stejný název balíčku, ale je zkompilován pro konkrétní zařízení nebo konfiguraci Androidu. Tento přístup není doporučený – je mnohem jednodušší mít jeden APK, který může podporovat více zařízení a konfigurací. V některých situacích může být vytváření více sad API užitečné, například:
Zmenšete velikost APK - Google Play ukládá omezení velikosti 100 MB u souborů APK. Vytvoření souboru APK specifického pro zařízení může zmenšit velikost APK, protože stačí zadat pouze podmnožinu prostředků a prostředků pro aplikaci.
Podpora různých architektur procesoru – Pokud má vaše aplikace sdílené knihovny pro konkrétní procesory, můžete distribuovat pouze sdílené knihovny pro tento procesor.
Několik sad APK může komplikovat distribuci – problém, který řeší Google Play. Google Play zajistí, aby se správný soubor APK doručil do zařízení na základě kódu verze aplikace a dalších metadat obsažených v AndroidManifest.XML. Konkrétní podrobnosti a omezení týkající se toho, jak Google Play podporuje více apk pro aplikaci, najdete v dokumentaci Společnosti Google k více podpoře APK.
V této příručce se dozvíte, jak skriptovat vytváření více apkcí pro aplikaci Xamarin.Android, přičemž každý apk cílí na konkrétní ABI. Bude se zabývat následujícími tématy:
- Vytvořte jedinečný kód verze pro APK.
- Vytvořte dočasnou verzi AndroidManifest.XML , která bude použita pro tento soubor APK.
- Sestavte aplikaci pomocí AndroidManifest.XML z předchozího kroku.
- Připravte soubor APK na uvolnění podepsáním a zazipováním.
Na konci této příručky je návod, který předvede, jak pomocí Rake skriptovat tyto kroky.
Vytvoření kódu verze pro APK
Google doporučuje konkrétní algoritmus pro kód verze, který používá sedmimístný kód verze (viz část Použití schématu kódu verze v dokumentu podpory Více APK). Rozšířením tohoto schématu kódu verze na osm číslic je možné do kódu verze zahrnout některé informace ABI, které zajistí, aby Google Play distribuoval správný SOUBOR APK do zařízení. Následující seznam vysvětluje tento osmimístný formát kódu verze (indexovaný zleva doprava):
Index 0 (červeně v následujícím diagramu) – celé číslo pro ABI:
- 1 –
armeabi
- 2 –
armeabi-v7a
- 6 –
x86
- 1 –
Index 1–2 (oranžový v následujícím diagramu) – minimální úroveň rozhraní API podporovaná aplikací
Index 3–4 (modrý v diagramu níže) – Podporované velikosti obrazovky:
- 1 – malý
- 2 – normální
- 3 – velký
- 4 – xlarge
Index 5–7 (zelený v diagramu níže) – jedinečné číslo pro kód verze. To nastavuje vývojář. Měla by se zvýšit pro každou veřejnou verzi aplikace.
Následující diagram znázorňuje pozici každého kódu popsaného v předchozím seznamu:
Google Play zajistí, že se do zařízení na základě versionCode
konfigurace a konfigurace APK doručí správný SOUBOR APK. Apk s kódem nejvyšší verze se doručí do zařízení. Aplikace může mít například tři sady API s následujícími kódy verzí:
- 11413456 – ABI je
armeabi
; cílí na rozhraní API úrovně 14; malé až velké obrazovky; s číslem verze 456. - 21423456 – ABI je
armeabi-v7a
; cílí na rozhraní API úrovně 14; normální a velké obrazovky; s číslem verze 456. - 61423456 – ABI je
x86
; cílí na rozhraní API úrovně 14; normální a velké obrazovky; s číslem verze 456.
Pokud chcete pokračovat v tomto příkladu, představte si, že byla opravena chyba specifická pro armeabi-v7a
. Verze aplikace se zvyšuje na 457 a nový APK je sestaven se android:versionCode
sadou 21423457. Kódy verzí pro verze armeabi
a x86
verze by zůstaly stejné.
Teď si představte, že verze x86 přijímá některé aktualizace nebo opravy chyb, které cílí na novější rozhraní API (úroveň 19 rozhraní API), což z této verze 500 aplikace dělá. Nová versionCode
změna se změní na 61923500, zatímco armeabi/armeabi-v7a zůstane beze změny. V tuto chvíli by kódy verzí byly:
- 11413456 – ABI je
armeabi
; cílení na úroveň rozhraní API 14; malé až velké obrazovky; s názvem verze 456. - 21423457 – ABI je
armeabi-v7a
; cílí na rozhraní API úrovně 14; normální a velké obrazovky; s názvem verze 457. - 61923500 – ABI je
x86
; cílí na rozhraní API úrovně 19; normální a velké obrazovky; s názvem verze 500.
Ruční údržba těchto kódů verzí může být pro vývojáře významnou zátěží. Proces výpočtu správného android:versionCode
souboru a následného sestavení APK by měl být automatizovaný.
Příklad toho, jak to udělat, se bude probít v návodu na konci tohoto dokumentu.
Vytvoření dočasného AndroidManifest.XML
I když to není nezbytně nutné, vytvoření dočasného AndroidManifest.XML pro každou službu ABI může pomoci zabránit problémům, které mohou vzniknout s únikem informací z jednoho APK do druhého. Například je důležité, aby android:versionCode
atribut byl pro každý soubor APK jedinečný.
Postup závisí na používaném skriptovacím systému, ale obvykle zahrnuje pořízení kopie manifestu Androidu, který se používá při vývoji, úpravě a následném použití tohoto manifestu během procesu sestavení.
Kompilace APK
Vytvoření APK na ABI je nejlepší pomocí příkazu nebo xbuild
msbuild
jak je znázorněno na následujícím ukázkovém příkazovém řádku:
/Library/Frameworks/Mono.framework/Commands/xbuild /t:Package /p:AndroidSupportedAbis=<TARGET_ABI> /p:IntermediateOutputPath=obj.<TARGET_ABI>/ /p:AndroidManifest=<PATH_TO_ANDROIDMANIFEST.XML> /p:OutputPath=bin.<TARGET_ABI> /p:Configuration=Release <CSPROJ FILE>
Následující seznam vysvětluje jednotlivé parametry příkazového řádku:
/t:Package
– Vytvoří android APK podepsaný pomocí ladicího úložiště klíčů./p:AndroidSupportedAbis=<TARGET_ABI>
– To je ABI, na který se má zaměřit. Musí mít jeden zarmeabi
,armeabi-v7a
nebox86
/p:IntermediateOutputPath=obj.<TARGET_ABI>/
– Jedná se o adresář, který bude obsahovat zprostředkující soubory vytvořené jako součást sestavení. V případě potřeby Xamarin.Android vytvoří adresář pojmenovaný za ABI, napříkladobj.armeabi-v7a
. Doporučujeme pro každou službu ABI použít jednu složku, protože tím zabráníte problémům, které způsobí únik souborů z jednoho sestavení do druhého. Všimněte si, že tato hodnota je ukončena oddělovačem adresáře (/
v případě OS X)./p:AndroidManifest
– Tato vlastnost určuje cestu k souboru AndroidManifest.XML , který se použije během sestavení./p:OutputPath=bin.<TARGET_ABI>
– Toto je adresář, který bude umístěn konečný APK. Xamarin.Android vytvoří adresář s názvem za ABI, napříkladbin.armeabi-v7a
./p:Configuration=Release
– Proveďte sestavení verze APK. Ladicí buildy se nemusejí nahrát do Google Play.<CS_PROJ FILE>
– Toto je cesta k.csproj
souboru projektu Xamarin.Android.
Sign and Zipalign The APK
Před distribucí prostřednictvím Google Play je nutné podepsat APK. To lze provést pomocí jarsigner
aplikace, která je součástí sady Java Developer's Kit. Následující příkazový řádek ukazuje, jak se používá jarsigner
na příkazovém řádku:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore <PATH/TO/KEYSTORE> -storepass <PASSWORD> -signedjar <PATH/FOR/SIGNED_JAR> <PATH/FOR/JAR/TO/SIGN> <NAME_OF_KEY_IN_KEYSTORE>
Před spuštěním na zařízení musí být všechny aplikace Xamarin.Android zarovnané do souboru ZIP. Toto je formát příkazového řádku, který se má použít:
zipalign -f -v 4 <SIGNED_APK_TO_ZIPALIGN> <PATH/TO/ZIP_ALIGNED.APK>
Automatizace vytváření APK pomocí Rake
Ukázkový projekt OneABIPerAPK je jednoduchý projekt Pro Android, který předvede, jak vypočítat konkrétní číslo verze ABI a sestavit tři samostatné APK pro každou z následujících ABI:
- armeabi
- armeabi-v7a
- x86
Soubor rakefile v ukázkovém projektu provede každý z kroků popsaných v předchozích částech:
Vytvořte android:versionCode pro APK.
Napište android:versionCode do vlastního AndroidManifest.XML pro tento APK.
Zkompilujte build verze projektu Xamarin.Android, který bude shodně cílit na ABI a pomocí AndroidManifest.XML vytvořeného v předchozím kroku.
Podepište APK pomocí úložiště produkčních klíčů.
Zipalign apk.
Pokud chcete sestavit všechny sady API pro aplikaci, spusťte build
úlohu Rake z příkazového řádku:
$ rake build
==> Building an APK for ABI armeabi with ./Properties/AndroidManifest.xml.armeabi, android:versionCode = 10814120.
==> Building an APK for ABI x86 with ./Properties/AndroidManifest.xml.x86, android:versionCode = 60814120.
==> Building an APK for ABI armeabi-v7a with ./Properties/AndroidManifest.xml.armeabi-v7a, android:versionCode = 20814120.
Po dokončení úkolu rake bude k dispozici tři bin
složky se souborem xamarin.helloworld.apk
. Následující snímek obrazovky ukazuje jednotlivé složky s jejich obsahem:
Poznámka:
Proces sestavení popsaný v této příručce může být implementován v jednom z mnoha různých systémů sestavení. I když nemáme předem napsaný příklad, mělo by to být také možné s PowerShell / psake nebo Fake.
Shrnutí
Tato příručka poskytla několik návrhů, jak vytvořit android APK, který cílí na určení ABI. Také probralo jedno možné schéma pro vytvoření android:versionCodes
, které identifikuje architekturu procesoru, pro kterou je APK určen. Návod obsahoval ukázkový projekt, který má skriptovaný sestavení pomocí Rake.