Tworzenie pakietów APK specyficznych dla interfejsu ABI
W tym dokumencie omówiono sposób tworzenia pakietu APK, który będzie przeznaczony dla pojedynczego interfejsu ABI przy użyciu platformy Xamarin.Android.
Omówienie
W niektórych sytuacjach korzystne może być posiadanie wielu zestawów APKs przez aplikację — każdy plik APK jest podpisany przy użyciu tego samego magazynu kluczy i ma tę samą nazwę pakietu, ale jest kompilowany dla określonego urządzenia lub konfiguracji systemu Android. Nie jest to zalecane podejście — znacznie prostsze jest posiadanie jednego pakietu APK, który może obsługiwać wiele urządzeń i konfiguracji. Istnieją pewne sytuacje, w których tworzenie wielu zestawów API może być przydatne, na przykład:
Zmniejszenie rozmiaru pakietu APK - Google Play nakłada limit rozmiaru 100 MB na pliki APK. Tworzenie konkretnych plików APK dla urządzenia może zmniejszyć rozmiar pakietu APK, ponieważ wystarczy podać podzbiór zasobów i zasobów dla aplikacji.
Obsługa różnych architektur procesora CPU — jeśli aplikacja ma udostępnione biblioteki dla określonych procesorów CPU, możesz dystrybuować tylko udostępnione biblioteki dla tego procesora CPU.
Wiele zestawów API może komplikować dystrybucję — problem, który został rozwiązany przez sklep Google Play. Sklep Google Play zapewni, że prawidłowy plik APK jest dostarczany do urządzenia na podstawie kodu wersji aplikacji i innych metadanych zawartych w AndroidManifest.XML. Aby uzyskać szczegółowe informacje i ograniczenia dotyczące obsługi wielu interfejsów API przez sklep Google Play dla aplikacji, zapoznaj się z dokumentacją firmy Google dotyczącą obsługi wielu plików APK.
W tym przewodniku opisano sposób tworzenia skryptów tworzenia wielu zestawów API dla aplikacji platformy Xamarin.Android, z których każdy apk jest przeznaczony dla określonego interfejsu ABI. Zostaną omówione następujące tematy:
- Utwórz unikatowy kod wersji dla pakietu APK.
- Utwórz tymczasową wersję AndroidManifest.XML , która będzie używana dla tego pakietu APK.
- Skompiluj aplikację przy użyciu AndroidManifest.XML z poprzedniego kroku.
- Przygotuj plik APK do wydania, podpisując go i dostosowując go do pliku zip.
Na końcu tego przewodnika przedstawiono przewodnik, który pokaże, jak wykonać skrypty w tych krokach przy użyciu aplikacji Rake.
Tworzenie kodu wersji dla pakietu APK
Firma Google zaleca określony algorytm dla kodu wersji, który używa siedmiocyfrowego kodu wersji (zobacz sekcję Korzystanie ze schematu kodu wersji w dokumencie obsługi wielu plików APK). Rozszerzając ten schemat kodu wersji do ośmiu cyfr, istnieje możliwość uwzględnienia niektórych informacji ABI w kodzie wersji, który zapewni, że sklep Google Play będzie dystrybuować prawidłowy plik APK do urządzenia. Poniższa lista zawiera opis tego ośmiocyfrowego formatu kodu wersji (indeksowany od lewej do prawej):
Indeks 0 (czerwony na diagramie poniżej) — liczba całkowita dla ABI:
- 1 –
armeabi
- 2 –
armeabi-v7a
- 6 –
x86
- 1 –
Indeks 1–2 (pomarańczowy na diagramie poniżej) — minimalny poziom interfejsu API obsługiwany przez aplikację.
Indeks 3–4 (niebieski na diagramie poniżej) — obsługiwane rozmiary ekranu:
- 1 – mały rozmiar
- 2 – normalne
- 3 — duży rozmiar
- 4 – xlarge
Indeks 5–7 (zielony na diagramie poniżej) — unikatowy numer kodu wersji. Jest to ustawiane przez dewelopera. Powinna ona być zwiększana dla każdej publicznej wersji aplikacji.
Na poniższym diagramie przedstawiono położenie każdego kodu opisanego na powyższej liście:
Sklep Google Play zapewni, że prawidłowy pakiet APK jest dostarczany do urządzenia na versionCode
podstawie konfiguracji i APK. Plik APK z najwyższym kodem wersji zostanie dostarczony do urządzenia. Na przykład aplikacja może mieć trzy zestawy API z następującymi kodami wersji:
- 11413456 — usługa ABI jest
armeabi
przeznaczona dla interfejsu API na poziomie 14; mały i duży ekran; z numerem wersji 456. - 21423456 — ABI jest
armeabi-v7a
przeznaczona dla interfejsu API poziom 14; normalny i duży ekran; z numerem wersji 456. - 61423456 — ABI to
x86
; przeznaczony dla interfejsu API poziom 14; normalny i duży ekran; z numerem wersji 456.
Aby kontynuować pracę z tym przykładem, wyobraź sobie, że usunięto usterkę specyficzną dla armeabi-v7a
elementu . Wersja aplikacji zwiększa się do 457, a nowy plik APK został skompilowany z zestawem android:versionCode
21423457. WersjeCode dla wersji armeabi
i x86
pozostaną takie same.
Teraz wyobraź sobie, że wersja x86 otrzymuje niektóre aktualizacje lub poprawki błędów przeznaczone dla nowszego interfejsu API (poziom 19 interfejsu API), dzięki czemu ta wersja 500 aplikacji. Nowa zmiana versionCode
zostanie zmieniona na 61923500, podczas gdy armeabi/armeabi-v7a pozostają niezmienione. W tym momencie kody wersji to:
- 11413456 — ABI to
armeabi
; ukierunkowanie na poziom 14 interfejsu API, mały do dużych ekranów; z nazwą wersji 456. - 21423457 — ABI to
armeabi-v7a
; przeznaczony dla interfejsu API poziom 14; normalny i duży ekran; z nazwą wersji 457. - 61923500 — ABI to
x86
; przeznaczony dla interfejsu API poziom 19; normalny i duży ekran; z nazwą wersji 500.
Ręczne utrzymywanie tych kodów wersji może być znaczącym obciążeniem dla dewelopera. Proces obliczania poprawnego android:versionCode
, a następnie tworzenia pakietu APK powinien zostać zautomatyzowany.
Przykład tego, jak to zrobić, zostanie omówiony w przewodniku na końcu tego dokumentu.
Tworzenie tymczasowego AndroidManifest.XML
Chociaż nie jest to absolutnie konieczne, utworzenie tymczasowego AndroidManifest.XML dla każdego ABI może pomóc w zapobieganiu problemom, które mogą wystąpić z wyciekiem informacji z jednego pakietu APK do drugiego. Na przykład ważne jest, aby android:versionCode
atrybut był unikatowy dla każdego pakietu APK.
To, jak to zrobić, zależy od używanego systemu skryptów, ale zazwyczaj wiąże się z pobraniem kopii manifestu systemu Android używanego podczas opracowywania, modyfikowania go, a następnie używania tego manifestu modyfikującego podczas procesu kompilacji.
Kompilowanie pakietu APK
Tworzenie pakietu APK na ABI najlepiej wykonać przy użyciu polecenia xbuild
lub msbuild
, jak pokazano w następującym przykładowym wierszu polecenia:
/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>
Poniższa lista zawiera opis każdego parametru wiersza polecenia:
/t:Package
— tworzy plik APK systemu Android podpisany przy użyciu magazynu kluczy debugowania/p:AndroidSupportedAbis=<TARGET_ABI>
— Jest to element docelowy ABI. Musi być jednym zarmeabi
elementów ,armeabi-v7a
lubx86
/p:IntermediateOutputPath=obj.<TARGET_ABI>/
— jest to katalog, w ramach którego będą przechowywane pliki pośrednie utworzone w ramach kompilacji. W razie potrzeby platforma Xamarin.Android utworzy katalog o nazwie po usłudze ABI, na przykładobj.armeabi-v7a
. Zaleca się użycie jednego folderu dla każdego usługi ABI, ponieważ zapobiega to problemom, które spowodują, że pliki "wyciekają" z jednej kompilacji do innej. Zwróć uwagę, że ta wartość jest zakończona separatorem katalogu (a/
w przypadku systemu OS X)./p:AndroidManifest
— Ta właściwość określa ścieżkę do pliku AndroidManifest.XML , który będzie używany podczas kompilacji./p:OutputPath=bin.<TARGET_ABI>
- To jest katalog, który będzie zawierać końcowy APK. Platforma Xamarin.Android utworzy katalog o nazwie po usłudze ABI, na przykładbin.armeabi-v7a
./p:Configuration=Release
— Wykonaj kompilację wydania pakietu APK. Kompilacje debugowania mogą nie być przekazywane do sklepu Google Play.<CS_PROJ FILE>
— jest to ścieżka do.csproj
pliku dla projektu Xamarin.Android.
Podpisywanie i zipalign apk
Konieczne jest podpisanie apk, zanim będzie można go rozpowszechnić za pośrednictwem Google Play. Można to wykonać przy użyciu jarsigner
aplikacji będącej częścią zestawu deweloperów języka Java. W poniższym wierszu polecenia pokazano, jak używać jarsigner
w wierszu polecenia:
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>
Aby można było uruchamiać je na urządzeniu, wszystkie aplikacje platformy Xamarin.Android muszą być wyrównane do pliku zip. Jest to format wiersza polecenia do użycia:
zipalign -f -v 4 <SIGNED_APK_TO_ZIPALIGN> <PATH/TO/ZIP_ALIGNED.APK>
Automatyzowanie tworzenia pakietu APK za pomocą rake
Przykładowy projekt OneABIPerAPK to prosty projekt systemu Android, który pokaże, jak obliczyć numer wersji specyficznej dla usługi ABI i utworzyć trzy oddzielne zestawy APK dla każdego z następujących elementów ABI:
- armeabi
- armeabi-v7a
- x86
Plik rakefile w przykładowym projekcie wykonuje każde z kroków opisanych w poprzednich sekcjach:
Utwórz plik android:versionCode dla pakietu APK.
Napisz plik android:versionCode do niestandardowego AndroidManifest.XML dla tego pliku APK.
Skompiluj kompilację wydania projektu platformy Xamarin.Android, która będzie kierować pojedynczo do usługi ABI i używając AndroidManifest.XML , która została utworzona w poprzednim kroku.
Podpisz plik APK przy użyciu produkcyjnego magazynu kluczy.
Spakuj plik APK.
Aby skompilować wszystkie zestawy API dla aplikacji, uruchom build
zadanie Rake z wiersza polecenia:
$ 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 zakończeniu zadania grabe będą dostępne trzy bin
foldery z plikiem xamarin.helloworld.apk
. Następny zrzut ekranu przedstawia każdy z tych folderów z ich zawartością:
Uwaga
Proces kompilacji opisany w tym przewodniku może zostać zaimplementowany w jednym z wielu różnych systemów kompilacji. Chociaż nie mamy wstępnie napisanego przykładu, powinno być również możliwe za pomocą psake programu Powershell / lub Fake.
Podsumowanie
Ten przewodnik zawiera sugestie dotyczące sposobu tworzenia pakietu APK systemu Android przeznaczonych dla określonego ABI. Omówił również jeden z możliwych schematów tworzenia android:versionCodes
, który określi architekturę procesora CPU przeznaczoną dla pakietu APK. Przewodnik zawierał przykładowy projekt, który zawiera skrypty kompilacji przy użyciu oprogramowania Rake.