Aracılığıyla paylaş


ABI’ye Özgü APK’ları Derleme

Bu belge, Xamarin.Android kullanarak tek bir ABI'yi hedefleyecek bir APK'nın nasıl derlendiğini tartışacaktır.

Genel bakış

Bazı durumlarda, bir uygulamanın birden çok API'ye sahip olması avantajlı olabilir - her APK aynı anahtar deposuyla imzalanır ve aynı paket adını paylaşır, ancak belirli bir cihaz veya Android yapılandırması için derlenmiş olur. Bu önerilen yaklaşım değildir - birden çok cihazı ve yapılandırmayı destekleyebilecek bir APK'ya sahip olmak çok daha basittir. Birden çok API oluşturmanın yararlı olabileceği bazı durumlar vardır, örneğin:

  • APK boyutunu küçültme - Google Play APK dosyalarına 100 MB boyut sınırı uygular. Cihaza özgü APK'lar oluşturmak APK'nın boyutunu azaltabilir çünkü uygulama için varlıkların ve kaynakların yalnızca bir alt kümesini sağlamanız gerekir.

  • Farklı CPU mimarilerini destekleme - Uygulamanızın belirli CPU'lar için paylaşılan kitaplıkları varsa, bu CPU için yalnızca paylaşılan kitaplıkları dağıtabilirsiniz.

Birden çok API, Google Play tarafından giderilen bir sorun olan dağıtımı karmaşıklaştırabilir. Google Play, uygulamanın sürüm koduna ve AndroidManifest.XML içeren diğer meta veriler temelinde bir cihaza doğru APK'nın teslim edilmesini sağlar. Google Play'in bir uygulama için birden çok API'yi nasıl desteklediğine ilişkin belirli ayrıntılar ve kısıtlamalar için, Birden çok APK desteğiyle ilgili Google belgelerine bakın.

Bu kılavuzda, her APK belirli bir ABI'yi hedefleyen bir Xamarin.Android uygulaması için birden çok API'nin nasıl betik oluşturacağı ele alınacaktır. Bu bölümde aşağıdaki konular ele alınacaktır:

  1. APK için benzersiz bir sürüm kodu oluşturun.
  2. Bu APK için kullanılacak AndroidManifest.XML geçici bir sürümünü oluşturun.
  3. Önceki adımdaki AndroidManifest.XML kullanarak uygulamayı oluşturun.
  4. İmzalayıp zip ile hizalayarak APK'yı yayına hazırlayın.

Bu kılavuzun sonunda, Rake kullanarak bu adımların nasıl betik yazılacağını gösteren bir kılavuz yer alır.

APK için Sürüm Kodu Oluşturma

Google, yedi basamaklı bir sürüm kodu kullanan sürüm kodu için belirli bir algoritma önerir (Lütfen Birden Çok APK destek belgesindeki Sürüm kodu şeması kullanma bölümüne bakın). Bu sürüm kodu düzenini sekiz basamağı genişleterek, Google Play'in doğru APK'yı bir cihaza dağıtmasını sağlayacak bazı ABI bilgilerini sürüm koduna eklemek mümkündür. Aşağıdaki listede bu sekiz basamaklı sürüm kodu biçimi (soldan sağa dizinlenmiş) açıklanmaktadır:

  • Dizin 0 (aşağıdaki diyagramda kırmızı) – ABI için bir tamsayı:

    • 1 – armeabi
    • 2 – armeabi-v7a
    • 6 – x86
  • Dizin 1-2 (aşağıdaki diyagramda turuncu) – Uygulama tarafından desteklenen en düşük API düzeyi.

  • Dizin 3-4 (aşağıdaki diyagramda mavi) – Desteklenen ekran boyutları:

    • 1 – küçük
    • 2 – normal
    • 3 – büyük
    • 4 – xlarge
  • Dizin 5-7 (aşağıdaki diyagramda yeşil) – Sürüm kodu için benzersiz bir sayı. Bu, geliştirici tarafından ayarlanır. Uygulamanın her genel sürümü için artmalıdır.

Aşağıdaki diyagramda, yukarıdaki listede açıklanan her kodun konumu gösterilmektedir:

Renge göre kodlanmış sekiz basamaklı sürüm kod biçiminin diyagramı

Google Play, ve APK yapılandırmasına göre cihaza doğru APK'nın versionCode teslim edilmesini sağlayacaktır. En yüksek sürüm koduna sahip APK cihaza teslim edilecek. Örneğin, bir uygulamanın aşağıdaki sürüm kodlarına sahip üç API'si olabilir:

  • 11413456 - ABI, armeabi API düzeyi 14'e; küçük ve büyük ekranlara; sürüm numarası 456 olan hedefleniyor.
  • 21423456 - ABI, armeabi-v7a sürüm numarası 456 olan API düzeyi 14;normal ve büyük ekranları hedefler.
  • 61423456 - ABI; x86 456 sürüm numarasına sahip API düzeyi 14;normal ve büyük ekranları hedefler.

Bu örneğe devam etmek için, öğesine özgü armeabi-v7abir hatanın düzeltildiğini düşünün. Uygulama sürümü 457'ye yükseltilir ve 21423457 olarak ayarlanmış yeni bir APK oluşturulur android:versionCode . ve x86 sürümleri için armeabi versionCodes aynı kalır.

Şimdi x86 sürümünün daha yeni bir API'yi (API düzeyi 19) hedefleyen bazı güncelleştirmeler veya hata düzeltmeleri aldığını ve bu da uygulamanın bu sürümünü 500 yaptığını düşünün. versionCode Yeni 61923500 olarak değişirken armeabi/armeabi-v7a değişmeden kalır. Bu noktada sürüm kodları şöyle olacaktır:

  • 11413456 - ABI; armeabi 456 sürüm adıyla API düzeyi 14'e; küçük ve büyük ekranlara yöneliktir.
  • 21423457 - ABI, armeabi-v7a sürüm adı 457 olan API düzeyi 14;normal ve büyük ekranları hedefler.
  • 61923500 - ABI, x86 SÜRÜM adı 500 olan API düzeyi 19;normal ve büyük ekranları hedefler.

Bu sürüm kodlarını el ile korumak geliştirici için önemli bir yük olabilir. Doğru android:versionCode hesaplama ve ardından APK'ları oluşturma işlemi otomatik olmalıdır. Bunun nasıl yapıldığını gösteren bir örnek, bu belgenin sonundaki kılavuzda ele alınacaktır.

Geçici AndroidManifest.XML oluşturma

Kesinlikle gerekli olmasa da, her ABI için geçici bir AndroidManifest.XML oluşturmak, bir APK'dan diğerine bilgi sızıntısıyla ortaya çıkabilecek sorunları önlemeye yardımcı olabilir. Örneğin, özniteliğin android:versionCode her APK için benzersiz olması çok önemlidir.

Bunun nasıl yapıldığı, ilgili betik sistemine bağlıdır, ancak genellikle geliştirme sırasında kullanılan Android bildiriminin bir kopyasını almayı, değiştirmeyi ve ardından derleme işlemi sırasında bu değişiklik bildirimini kullanmayı içerir.

APK'yi derleme

ABİ başına APK oluşturma işlemi, aşağıdaki örnek komut satırında gösterildiği gibi veya msbuild kullanılarak xbuild en iyi şekilde gerçekleştirilir:

/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>

Aşağıdaki listede her komut satırı parametresi açıklanmaktadır:

  • /t:Package – Hata ayıklama anahtar deposu kullanılarak imzalanan bir Android APK oluşturur

  • /p:AndroidSupportedAbis=<TARGET_ABI> – Hedef abi bu. , armeabi-v7aveya türlerinden armeabibiri olmalıdırx86

  • /p:IntermediateOutputPath=obj.<TARGET_ABI>/ – Bu, derlemenin bir parçası olarak oluşturulan ara dosyaları barındıracak dizindir. Gerekirse, Xamarin.Android ABI'den sonra adlı bir dizin oluşturur, örneğin obj.armeabi-v7a. Bir derlemeden diğerine dosya "sızıntısı" ile sonuç veren sorunları önlediğinden, her ABI için bir klasör kullanmanız önerilir. Bu değerin bir dizin ayırıcısı (OS X örneğinde) / ile sonlandırıldığına dikkat edin.

  • /p:AndroidManifest– Bu özellik, derleme sırasında kullanılacak AndroidManifest.XML dosyasının yolunu belirtir.

  • /p:OutputPath=bin.<TARGET_ABI> – Bu, son APK'yi barındıracak dizindir. Xamarin.Android, ABI'nin adını taşıyan bir dizin oluşturur, örneğin bin.armeabi-v7a.

  • /p:Configuration=Release – APK'nın Yayın derlemesini gerçekleştirin. Hata ayıklama derlemeleri Google Play'e yüklenmeyebilir.

  • <CS_PROJ FILE> – Bu, Xamarin.Android projesi için dosyanın yoludur .csproj .

APK İşareti ve Zipalign

Google Play aracılığıyla dağıtılmadan önce APK'yi imzalamak gerekir. Bu, Java Geliştirici Seti'nin bir parçası olan uygulama kullanılarak jarsigner gerçekleştirilebilir. Aşağıdaki komut satırı, komut satırında nasıl kullanılacağını jarsigner gösterir:

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>

Tüm Xamarin.Android uygulamalarının bir cihazda çalıştırılabilmesi için önce zip ile hizalanması gerekir. Bu, kullanılacak komut satırının biçimidir:

zipalign -f -v 4 <SIGNED_APK_TO_ZIPALIGN> <PATH/TO/ZIP_ALIGNED.APK>

Tırmık ile APK Oluşturmayı Otomatikleştirme

OneABIPerAPK örnek projesi, ABI'nin belirli bir sürüm numarasını hesaplamayı ve aşağıdaki ABI'nin her biri için üç ayrı APK oluşturmayı gösteren basit bir Android projesidir:

  • armeabi
  • armeabi-v7a
  • x86

Örnek projedeki rakefile, önceki bölümlerde açıklanan adımların her birini gerçekleştirir:

  1. APK için bir android:versionCode oluşturun.

  2. Android:versionCode dosyasını bu APK için özel bir AndroidManifest.XML yazın.

  3. Xamarin.Android projesinin ABI'yi tek başına hedefleyecek ve önceki adımda oluşturulan AndroidManifest.XML kullanacak bir yayın derlemesini derleyin.

  4. APK'yi bir üretim anahtar deposuyla imzalayın.

  5. APK'yı sıkıştırın .

Uygulamanın tüm API'lerini oluşturmak için komut satırından build Rake görevini çalıştırın:

$ 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.

Tırmık görevi tamamlandıktan sonra dosyasını xamarin.helloworld.apkiçeren üç bin klasör olacaktır. Sonraki ekran görüntüsünde bu klasörlerin her biri içeriğiyle birlikte gösterilir:

xamarin.helloworld.apk içeren platforma özgü klasörlerin konumları

Not

Bu kılavuzda özetlenen derleme işlemi birçok farklı derleme sisteminden birinde uygulanabilir. Önceden yazılmış bir örneğimiz olmasa da, PowerShell / psake veya Fake ile de mümkün olmalıdır.

Özet

Bu kılavuzda, belirli bir ABI'yi hedefleyen Android APK'lerinin nasıl oluşturulacağı konusunda bazı öneriler sağlanmıştır. Ayrıca, APK'nın amaçlandığı CPU mimarisini belirleyecek bir olası oluşturma android:versionCodes şeması da ele alınmıştı. İzlenecek yol, Rake kullanılarak betik olarak derlenen örnek bir proje içeriyordu.