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:
- APK için benzersiz bir sürüm kodu oluşturun.
- Bu APK için kullanılacak AndroidManifest.XML geçici bir sürümünü oluşturun.
- Önceki adımdaki AndroidManifest.XML kullanarak uygulamayı oluşturun.
- İ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
- 1 –
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:
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-v7a
bir 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-v7a
veya türlerindenarmeabi
biri 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ğinobj.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ğinbin.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:
APK için bir android:versionCode oluşturun.
Android:versionCode dosyasını bu APK için özel bir AndroidManifest.XML yazın.
APK'yi bir üretim anahtar deposuyla imzalayı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.apk
içeren üç bin
klasör olacaktır. Sonraki ekran görüntüsünde bu klasörlerin her biri içeriğiyle birlikte gösterilir:
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.