AAPT2

AAPT2 (Android Öğe Paketleme Aracı), Android Studio ve Android Gradle Eklentisi'nin uygulamanızın kaynaklarını derlemek ve paketlemek için kullandığı bir derleme aracıdır. AAPT2, kaynakları Android platformu için optimize edilmiş bir ikili biçimde ayrıştırır, dizine ekler ve derler.

Android Gradle Plugin 3.0.0 ve sonraki sürümler AAPT2'yi varsayılan olarak etkinleştirir. Genellikle aapt2 yöntemini sizin çağırmanız gerekmez. Bununla birlikte, Android Studio yerine terminalinizi ve kendi derleme sisteminizi kullanmayı tercih ederseniz komut satırından AAPT2'yi kullanabilirsiniz. Ayrıca, AAPT2 ile ilgili derleme hatalarını komut satırından ayıklayabilirsiniz. Bunun için AAPT2'yi, Android SDK Derleme Araçları 26.0.2 ve sonraki sürümlerinde bağımsız bir araç olarak bulun.

Komut satırından Android SDK Derleme Araçları'nı indirmek için sdkmanager aracını kullanın ve aşağıdaki komutu çalıştırın:

sdkmanager "build-tools;build-tools-version"

SDK Derleme Araçları'nı indirdikten sonra android_sdk/build-tools/version/ konumunda AAPT2'yi bulun.

Android SDK Derleme Araçlarının düzeltmeleri sık sık yayınlanmadığından SDK Derleme Araçlarınıza dahil olan AAPT2 sürümü en yeni sürüm olmayabilir. AAPT2'nin en son sürümünü edinmek için Google Maven'den AAPT2'yi indirin.

Linux veya Mac'te komut satırından AAPT2'yi kullanmak için aapt2 komutunu çalıştırın. Windows'da aapt2.exe komutunu çalıştırın.

AAPT2, artımlı derlemeye olanak tanıyarak kaynakların daha hızlı derlenmesini destekler. Kaynak işleme, artımlı derlemeyi gerçekleştirmek için iki adıma ayrılır:

  • Derle: Kaynak dosyaları ikili biçimlerde derler.
  • Bağlantı: Derlenen tüm dosyaları birleştirir ve tek bir pakette paketler.

Bu ayırma, artımlı derlemelerin performansını iyileştirmeye yardımcı olur. Örneğin, tek bir dosyada değişiklikler varsa yalnızca o dosyayı yeniden derlemeniz gerekir.

Google Maven'den AAPT2'yi indirin

Derleme araçlarında paketlenmeyen en yeni AAPT2 sürümünü edinmek için Google'ın Maven deposundan aşağıdaki şekilde AAPT2'yi indirin:

  1. Depo dizininde com.android.tools.build > aapt2 bölümüne gidin.
  2. AAPT2'nin en son sürümünün adını kopyalayın.
  3. Kopyaladığınız sürüm adını aşağıdaki URL'ye ekleyip hedef işletim sisteminizi belirtin: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/ aapt2-version/aapt2-aapt2-version- [windows | linux | osx].jar

    Örneğin, Windows için 3.2.0-alpha18-4804415 sürümünü indirmek için şu adresi kullanın: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/ 3.2.0-alpha18-4804415/aapt2-3.2.580-alpha18-jar

  4. Bir tarayıcıda URL'ye gidin. AAPT2 kısa süre içinde indirilmeye başlayacak.

  5. Az önce indirdiğiniz JAR dosyasının paketini açın.

    JAR dosyası, yürütülebilir aapt2 dosyası ve yürütülebilir dosyanın bağlı olduğu bazı kitaplıklar içermelidir.

Derle

AAPT2, çizimler ve XML dosyaları gibi tüm Android kaynak türlerinin derlenmesini destekler. Derleme için AAPT2'yi çağırdığınızda, her çağrı için giriş olarak tek bir kaynak dosyası iletin. AAPT2 daha sonra dosyayı ayrıştırır ve .flat uzantısına sahip ara bir ikili dosya oluşturur.

AAPT2, dizinlerin tamamını geçirirken yalnızca tek bir kaynak değişmiş olsa bile dizindeki tüm dosyaları yeniden derler. --dir işaretini kullanarak birden fazla kaynak dosyası içeren kaynak dizinlerini AAPT2'ye iletebilirsiniz. Ancak bu şekilde, artımlı kaynak derlemenin avantajlarından yararlanamazsınız.

Çıkış dosyası türleri, aşağıdaki tabloda gösterildiği gibi, derleme için sağladığınız girdilere göre farklılık gösterebilir:

Tablo 1. Derleme için giriş ve çıkış dosyası türleri,

Giriş Çıkış
res/values/ dizininde yer alan String ve Style gibi XML kaynak dosyaları Uzantısı *.arsc.flat olan kaynak tablosu.
Diğer tüm kaynak dosyalar.

res/values/ dizini altındaki dosyalar dışındaki tüm dosyalar, *.flat uzantısına sahip ikili XML dosyalarına dönüştürülür.

Ayrıca, tüm PNG dosyaları varsayılan olarak sıkıştırılır ve *.png.flat uzantılarını kullanır. PNG'leri sıkıştırmamayı tercih ederseniz derleme sırasında --no-crunch seçeneğini kullanabilirsiniz.

AAPT2 çıkışları yürütülebilir dosyalar değildir ve daha sonra, APK oluşturmak için bu ikili dosyaları bağlantı aşamasında giriş olarak eklemeniz gerekir. Ancak, oluşturulan APK dosyası DEX dosyası içermediği ve imzalanmadığı için hemen bir Android cihaza dağıtabileceğiniz yürütülebilir bir dosya değildir.

Söz dizimi derleme

compile kullanımı için genel söz dizimi şöyledir:

aapt2 compile path-to-input-files [options] -o output-directory/

Aşağıdaki örnekte AAPT2, values.xml ve myImage.png adlı kaynak dosyalarını ayrı ayrı derler:

aapt2 compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/
aapt2 compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/

Tablo 1'de gösterildiği gibi, çıkış dosyasının adı, girilen dosya adına ve üst dizininin adına bağlıdır.

Giriş olarak strings.xml dosyasının bulunduğu önceki örnekte aapt2, çıkış dosyasını otomatik olarak values-en_strings.arsc.flat şeklinde adlandırır. Ancak, çekilebilir dizinde saklanan derlenmiş çekilebilir dosyanın adı drawable_img.png.flat şeklindedir.

Derleme seçenekleri

Tablo 2'de gösterildiği gibi, compile komutuyla kullanabileceğiniz birkaç seçenek vardır:

Tablo 2. Komut derleme seçenekleri

Option Açıklama
-o path

Derlenen kaynaklar için çıkış yolunu belirtir.

AAPT2'nin derlenen kaynakları üretip depolayabileceği bir dizine giden yol belirtmeniz gerektiğinden bu, zorunlu bir işarettir.

--dir directory

Kaynaklar için taranacak dizini belirtir.

Bu işareti tek bir komutla birden fazla kaynak dosyasını derlemek için kullanabilirsiniz, ancak artımlı derlemenin avantajlarını devre dışı bırakır. Bu nedenle, bu işaret büyük projeler için kullanılmamalıdır.

--pseudo-localize en-XA ve en-XB gibi varsayılan dizelerin sözde yerelleştirilmiş sürümlerini oluşturur.
--no-crunch PNG işlemeyi devre dışı bırakır.

PNG dosyalarını zaten işlediyseniz veya dosya boyutunun küçültülmesini gerektirmeyen hata ayıklama derlemeleri oluşturuyorsanız bu seçeneği kullanın. Bu seçenek etkinleştirildiğinde yürütme işlemi daha hızlı yapılır ancak çıkış dosyasının boyutu artar.

--legacy AAPT'nin önceki sürümlerini uyarı olarak kullanırken izin verilen hataları ele alır.

Bu işaret, beklenmedik derleme zamanı hataları için kullanılmalıdır. AAPT2 kullanılırken oluşabilecek bilinen davranış değişikliklerini çözmek için AAPT2 kullanılırken davranış değişiklikleri başlıklı makaleyi okuyun.

-zip file file, kaynakların taranacak res dizinini içeren bir ZIP dosyasıdır.
-output-text-symbols file Belirtilen dosyada kaynak simgelerini içeren bir metin dosyası oluşturur.
-preserve-visibility-of-styleables Belirtilirse diğer tüm kaynaklarda kullanılan stil verilebilir öğeler için de aynı görünürlük kurallarını uygular. Aksi takdirde, tüm stil özellikleri herkese açık hale getirilir.
-visibility [public|private|default|] Derlenen kaynakların görünürlüğünü belirtilen düzeye ayarlar.
-trace-folder folder Belirtilen klasör için bir systrace JSON iz parçası oluşturur.
-source-path path Derlenen kaynak dosyasının kaynak dosyası yolunu path olarak ayarlar.
-h Araçlar yardımını gösterir.
-v Ayrıntılı günlük kaydını etkinleştirir.

Bağlantı aşamasında AAPT2, derleme aşamasının oluşturduğu tüm ara dosyaları (ör. kaynak tabloları, ikili XML dosyaları ve işlenen PNG dosyaları) birleştirir ve daha sonra dosyaları tek bir APK'da paketler. Bu aşamada, R.java ve ProGuard kural dosyaları gibi diğer yardımcı dosyalar da oluşturulabilir. Ancak, oluşturulan APK DEX bayt kodu içermez ve imzasızdır. Bu APK'yı bir cihaza dağıtamazsınız.

Uygulamanızı komut satırından oluşturmak için Android Gradle eklentisini kullanmıyorsanız APK'nızı imzalamak için Java bayt kodunu DEX bayt kodu olarak derlemek üzere d8 ve apksigner gibi diğer komut satırı araçlarını kullanabilirsiniz.

link kullanımı için genel söz dizimi aşağıdaki gibidir:

aapt2 link path-to-input-files [options] -o
outputdirectory/outputfilename.apk --manifest AndroidManifest.xml

Aşağıdaki örnekte AAPT2, iki ara dosya olan drawable_Image.flat ve values_values.arsc.flat ile AndroidManifest.xml dosyasını birleştirir. AAPT2, sonucu android paketinde tanımlanan kaynakları barındıran android.jar dosyasına bağlar:

 aapt2 link -o output.apk
 -I android_sdk/platforms/android_version/android.jar
    compiled/res/values_values.arsc.flat
    compiled/res/drawable_Image.flat --manifest /path/to/AndroidManifest.xml -v

link komutuyla aşağıdaki seçenekleri kullanabilirsiniz:

Tablo 3. Bağlantı komutu seçenekleri

Option Açıklama
-o path

Bağlı kaynak APK'sı için çıkış yolunu belirtir.

Bağlı kaynakları barındırabilecek çıkış APK'sının yolunu belirtmeniz gerektiğinden bu, zorunlu bir işarettir.

--manifest file

Derlenecek Android manifest dosyasının yolunu belirtir.

Manifest dosyası, paket adı ve uygulama kimliği gibi uygulamanızla ilgili önemli bilgileri içerdiğinden bu zorunlu bir işarettir.

-I

Platformun android.jar veya diğer APK'larına (ör. framework-res.apk) giden yolu sağlar. Bu da özellik oluştururken faydalı olabilir.

Kaynak dosyalarınızda android ad alanına sahip özellikler kullanıyorsanız bu işaret zorunludur.
-A directory APK'ya dahil edilecek bir öğe dizinini belirtir.

Bu dizini, orijinal, işlenmemiş dosyaları depolamak için kullanabilirsiniz. Daha fazla bilgi edinmek için Orijinal dosyalara erişme bölümünü okuyun.

-R file <add-resource> etiketini kullanmadan overlay semantiği kullanarak tek bir .flat dosyasını link öğesine geçirir.

Mevcut bir dosyanın yer aldığı bir kaynak dosyası sağladığınızda, belirtilen son çakışan kaynak kullanılır.

--package-id package-id Uygulamanız için kullanılacak paket kimliğini belirtir.

Belirttiğiniz paket kimliği, --allow-reserved-package-id ile birlikte kullanılmadığı sürece 0x7f değerinden büyük veya buna eşit olmalıdır.

--allow-reserved-package-id

Ayrılmış paket kimliğinin kullanılmasına izin verir.

Ayrılmış paket kimlikleri, normalde paylaşılan kitaplıklara atanan ve 0x02 ile 0x7e dahil olmak üzere 0x7e aralığındaki kimliklerdir. --allow-reserved-package-id kullanarak ayrılmış paket kimlikleri aralığına denk gelen kimlikleri atayabilirsiniz.

Bu seçenek yalnızca min-sdk sürümü 26 veya daha düşük olan paketler için kullanılmalıdır.

--java directory R.java dosyasının oluşturulacağı dizini belirtir.
--proguard proguard_options ProGuard kuralları için çıkış dosyası oluşturur.
--proguard-conditional-keep-rules Ana DEX için ProGuard kuralları için çıkış dosyasını oluşturur.
--no-auto-version Otomatik stil ve düzen SDK sürümü oluşturmayı devre dışı bırakır.
--no-version-vectors Vektör çekilebilir öğelerinin otomatik olarak sürümlenmesini devre dışı bırakır. Bu işareti yalnızca APK'nızı Vektör Çekilebilir Kitaplığı ile derlerken kullanın.
--no-version-transitions Geçiş kaynakları için otomatik sürüm oluşturmayı devre dışı bırakır. Bu işareti yalnızca APK'nızı Transition Support kitaplığıyla oluştururken kullanın.
--no-resource-deduping Uyumlu yapılandırmalarda aynı değerlere sahip kaynakların otomatik olarak tekilleştirilmesini devre dışı bırakır.
--enable-sparse-encoding İkili arama ağacı kullanarak seyrek girişlerin kodlanmasını etkinleştirir. Bu, APK boyutunun optimizasyonu için faydalıdır ancak kaynak alma performansından ödün vermelidir.
-z "suggested" (önerilen) olarak işaretlenmiş dizelerin yerelleştirilmesini gerektirir.
-c config Yapılandırmaların virgülle ayrılmış bir listesini sağlar.

Örneğin, birden fazla dil için çeviri içeren destek kitaplığında bağımlılıklarınız varsa kaynakları yalnızca belirli bir dil yapılandırması (ör. İngilizce veya İspanyolca) için filtreleyebilirsiniz.

Dil yapılandırmasını iki harfli ISO 639-1 dil koduyla ve isteğe bağlı olarak ardından küçük harfle başlayan "r" harfini izleyen iki harfli ISO 3166-1-alpha-2 bölge koduyla tanımlamanız gerekir. Örneğin, en-rUS.

--preferred-density density AAPT2'nin, en yakın eşleşen yoğunluğu seçmesine ve diğerlerinin tümünü çıkarmasına olanak tanır.

Uygulamanızda kullanabileceğiniz ldpi, hdpi ve xhdpi gibi çeşitli piksel yoğunluğu niteleyicileri vardır. Tercih edilen bir yoğunluk belirttiğinizde AAPT2, kaynak tablosunda en yakın eşleşen yoğunluğu seçip depolar ve diğer tüm yoğunluğu kaldırır.

--output-to-dir APK içeriklerini -o tarafından belirtilen bir dizine çıkarır.

Bu işareti kullanırken hatalarla karşılaşırsanız bunları Android SDK Derleme Araçları 28.0.0 veya sonraki bir sürüme yükselterek çözebilirsiniz.

--min-sdk-version min-sdk-version AndroidManifest.xml için kullanılacak varsayılan minimum SDK sürümünü belirler.
--target-sdk-version target-sdk-version AndroidManifest.xml için kullanılacak varsayılan hedef SDK sürümünü ayarlar.
--version-code version-code Yoksa AndroidManifest.xml içine eklenecek sürüm kodunu belirtir.
--version-name version-name Herhangi bir sürüm yoksa AndroidManifest.xml öğesine eklenecek sürüm adını belirtir.
--revision-code revision-code Yoksa AndroidManifest.xml dosyasına eklenecek düzeltme kodunu belirtir.
--replace-version --version-code, --version-name veya --revision-code belirtilirse bu değerler, manifestte halihazırda bulunan tüm değerlerin yerine geçer. Varsayılan olarak, manifest bu özellikleri zaten tanımlıyorsa hiçbir şey değişmez.
--compile-sdk-version-nacodeme compile-sdk-version-name Yoksa AndroidManifest.xml dosyasına eklenecek sürüm kodunu belirtir.
--compile-sdk-version-name compile-sdk-version-name Yoksa AndroidManifest.xml dosyasına eklenecek sürüm adını belirtir.
--proto-format Protobuf biçiminde derlenmiş kaynaklar oluşturur.

Android App Bundle oluşturma işlemi için bundletool girişine uygundur.

--non-final-ids Nihai olmayan kaynak kimlikleriyle R.java oluşturur. kotlinc veya javac derlemesi sırasında, uygulamanın kodundan alınan kimliklere yapılan referanslar satır içine alınmaz.
--emit-ids path Belirtilen yolda, kaynak türlerinin adları ve kimlik eşlemeleriyle birlikte bir dosya yayınlar. Bu, --stable-ids ile kullanıma uygundur.
--stable-ids outputfilename.ext --emit-ids ile oluşturulan ve kaynak türlerinin adlarını ve atanmış kimliklerinin listesini içeren dosyayı tüketir.

Bu seçenek, atanırken atanan kimliklerin, silinmesi veya yeni kaynaklar eklemeniz durumunda bile sabit kalmasını sağlar.

--custom-package package_name R.java oluşturulacak özel Java paketini belirtir.
--extra-packages package_name Aynı R.java dosyasını farklı paket adlarıyla oluşturur.
--add-javadoc-annotation annotation Oluşturulan tüm Java sınıflarına bir JavaDoc ek açıklaması ekler.
--output-text-symbols path Belirtilen dosyada R sınıfının kaynak simgelerini içeren bir metin dosyası oluşturur.

Çıkış dosyasının yolunu belirtmelisiniz.

--auto-add-overlay <add-resource> etiketi kullanılmadan yer paylaşımlarına yeni kaynaklar eklenmesine olanak tanır.
--rename-manifest-package manifest-package Paketi AndroidManifest.xml dosyasında yeniden adlandırır.
--rename-instrumentation-target-package instrumentation- target-package instrumentation için hedef paketin adını değiştirir.

Bu seçenek, --rename-manifest-package ile birlikte kullanılmalıdır.

-0 extension

Sıkıştırmak istemediğiniz dosyaların uzantılarını belirtir.

--split path:config[,config[..]] APK'nın farklı bir sürümünü oluşturmak için kaynakları bir dizi yapılandırmaya göre böler.

Çıkış APK'sının yolunu yapılandırma grubuyla birlikte belirtmeniz gerekir.

--proguard-main-dex file Ana DEX için oluşturulan ProGuard kuralları için çıkış dosyası.
--proguard-minimal-keep-rules Minimal ProGuard saklama kuralları grubu oluşturur.
--no-resource-removal Kaynakların otomatik olarak kaldırılmasını varsayılan ayar olmadan devre dışı bırakır. Bu seçeneği yalnızca çalışma zamanı kaynak yer paylaşımı paketleri oluştururken kullanın.
-x 0x01 paket kimliğinin kullanımını belirten eski işaret.
--product products-list Saklanacak ürün adlarının virgülle ayrılmış listesini belirtir.
--no-xml-namespaces res/* içindeki AndroidManifest.xml dosyası ve XML ikili programlarından XML ad alanı önekini ve URI bilgilerini kaldırır.
--shared-lib Paylaşılan bir Android çalışma zamanı kitaplığı oluşturur.
--static-lib Statik bir Android kitaplığı oluşturur.
--no-static-lib-packages Uygulamanın paketi altındaki tüm kitaplık kaynaklarını birleştirir.
--no-proguard-location-reference ProGuard kural dosyalarının kaynak dosyaya referans içermesini engeller.
--private-symbols package-name package-name, özel simgeler için R.java oluşturulurken kullanılacak paket adını belirtir. Belirtilmezse herkese açık ve özel simgeler uygulamanın paket adını kullanır.
--override-styles-instead-of-overlaying -R kaynaklarında tanımlanan stillerin, birleştirilmek yerine önceki tanımları değiştirmesine neden olur.
--rename-resources-package package-name Kaynaklar tablosundaki paketi package-name olarak yeniden adlandırır.
--no-compress Hiçbir kaynağı sıkıştırmaz.
--keep-raw-values XML dosyalarındaki ham özellik değerlerini korur.
--no-compress-regex regular-expression regular-expression ile eşleşen uzantıları sıkıştırmaz. Satır sonu için $ simgesini kullanın. Büyük/küçük harfe duyarlı bir ECMAScript normal ifade dil bilgisi kullanır.
--warn-manifest-validation Manifest doğrulama hatalarını uyarı olarak değerlendirir.
--exclude-configs qualifier[,qualifier[..]] Yapılandırmaları belirtilen niteleyicileri içeren kaynakların değerlerini hariç tutar.
--debug-mode Manifest'in uygulama düğümüne android:debuggable="true" ekler. Böylece uygulama, üretim cihazlarında bile hata ayıklaması yapılabilir.
--strict-visibility Farklı görünürlük seviyelerine sahip yer paylaşımlarına izin verilmez.
--exclude-sources Protokol buf biçiminde kaynaklar oluştururken kaynak dosya bilgilerini serileştirmez.
--trace-folder folder Belirtilen folder öğesine systrace JSON iz parçasını oluşturur.
--merge-only Kaynak referanslarını doğrulamadan yalnızca kaynakları birleştirir. Bu işaret yalnızca --static-lib işaretiyle birlikte kullanılmalıdır.
-h Yardım menüsünü görüntüler.
-v Çıkışın ayrıntı düzeyini artırır.

Döküm

dump, link komutunu kullanarak oluşturduğunuz APK hakkında bilgileri yazdırmak için kullanılır.

Döküm söz dizimi

dump kullanımı için genel söz dizimi aşağıdaki gibidir:

aapt2 dump sub-command filename.apk [options]

Aşağıdaki örnekte, belirtilen APK'nın kaynak tablosundaki içerik yazdırılmaktadır:

aapt2 dump resources output.apk

Alt komutların dökümünü al

dump komutuyla aşağıdaki alt komutlardan birini belirtin:

Tablo 4. Alt komutların dökümünü al

Alt komutAçıklama
apc Derleme sırasında oluşturulan AAPT2 Container'ının (APC) içeriğini yazdırır.
badging APK'nın manifest dosyasından çıkarılan bilgileri yazdırır.
configurations APK'daki bir kaynak tarafından kullanılan her yapılandırmayı yazdırır.
overlayable APK'nın yer paylaşımlı kaynaklarını yazdırır.
packagename APK'nın paket adını yazdırır.
permissions APK'nın manifest dosyasından çıkarılan izinleri yazdırır.
strings APK'nın kaynak tablosu dize havuzunun içeriğini yazdırır.
styleparents APK'da kullanılan stillerin üst öğelerini yazdırır.
resources APK'nın kaynak tablosunun içeriğini yazdırır.
xmlstrings APK'nın derlenmiş XML'den dizeleri yazdırır.
xmltree APK'nın derlenmiş XML'sinin bir ağacını yazdırır.

Döküm seçenekleri

dump ile aşağıdaki seçenekleri kullanın:

Tablo 5. Döküm seçenekleri

OptionAçıklama
--no-values Kaynağı görüntülerken değerlerin çıkışını gizler.
--file file APK'dan döküm alınacak bağımsız değişken olarak bir dosyayı belirtir.
-v Çıkışın ayrıntı düzeyini artırır.

Fark

İki APK'yı karşılaştırmak ve bunlar arasındaki farkları belirlemek için diff uygulamasını kullanın.

Fark söz dizimi

diff kullanımı için genel söz dizimi aşağıdaki gibidir:

aapt2 diff first.apk second.apk

diff komutu için herhangi bir seçenek yok.

Optimizasyon yapın

optimize, birleştirilen kaynaklarda ve APK'ya paketlenmeden önce resources.arsc üzerinde optimizasyonlar çalıştırmak için kullanılır. Bu optimizasyon, kullanılan kaynakların boyutuna ve sayısına bağlı olarak APK boyutunu yaklaşık %1-3 oranında azaltabilir.

Söz dizimini optimize et

optimize kullanımı için genel söz dizimi aşağıdaki gibidir:

aapt2 optimize options file[,file[..]]

Aşağıdaki örnek, input.apk kaynaklarını optimize eder ve output.apk konumunda optimize edilmiş yeni bir APK oluşturur. Normal düz tablo gösterimini daha kompakt bir ikili arama ağacıyla değiştirir ve böylece alma performansı maliyetiyle daha küçük bir APK elde edilir:

aapt2 optimize -o output.apk --enable-sparse-encoding input.apk

Optimizasyon seçenekleri

optimize ile aşağıdaki seçenekleri kullanabilirsiniz:

Tablo 6. Optimizasyon seçenekleri

OptionAçıklama
-o path Bağlı kaynak APK'sı için çıkış yolunu belirtir.

Bağlı kaynakları barındırabilecek çıkış APK'sının yolunu belirtmeniz gerektiğinden bu, zorunlu bir işarettir.

-d directory Bölmeler için çıkış dizininin yolunu belirtir.
-x path XML yapılandırma dosyasının yolunu belirtir.
-p Çoklu APK yapılarını yazdırıp çıkar.
--target-densities density[,density[..]] APK'nın optimize edildiği ekran yoğunluklarının virgülle ayrılmış listesini belirtir. Belirtilen yoğunluktaki cihazlarda kullanılamayacak tüm kaynaklar APK'dan kaldırılır.
--resources-config-path path

Her bir kaynağa ait kaynakların ve yönergelerin listesini içeren resources.cfg dosyasının yolunu belirtir.

Biçim: type/resource_name#[directive][,directive]

-c config[,config[..]] Dahil edilecek yapılandırmaların virgülle ayrılmış listesini belirtir. Varsayılan olarak tüm yapılandırmalar kullanılır.
--split path:config[,config[..]] APK'nın farklı bir sürümünü oluşturmak için kaynakları bir dizi yapılandırmaya göre böler.

Çıkış APK'sının yolunu yapılandırma grubuyla birlikte belirtmeniz gerekir.

--keep-artifacts artifact[,artifact[..]] Saklanacak yapıların virgülle ayrılmış listesini belirtir. Hiçbiri belirtilmezse tüm yapılar korunur.
--enable-sparse-encoding İkili arama ağacı kullanarak seyrek girişlerin kodlanmasını etkinleştirir. Bu seçenek, APK boyutunun optimizasyonu için faydalıdır ancak kaynak alma performansından ödün vermelidir.
--collapse-resource-names Kaynak adlarını anahtar dizesi havuzundaki tek bir değere daraltır. Kaynaklar, --resources-config-path tarafından belirtilen bir dosyada no_collapse yönergesi kullanılarak muaf tutulur.
--shorten-resource-paths APK içindeki kaynakların yollarını kısaltır.
--resource-path-shortening-map path Eski kaynak yollarının haritasını kısaltılmış yollara çıkaracak yolu belirtir.
-v Çıkışın ayrıntı düzeyini artırır.
-h Araç yardımını gösterir.

Dönüştür

AAPT compile komutu, varsayılan olarak kaynakları APK'lara uygun ikili biçimde derler. --proto-format belirterek AAB'lere uygun olan protobuf biçimini de belirtebilirsiniz. convert komutu, APK'ları iki biçim arasında dönüştürür.

Söz dizimini dönüştür

convert için genel söz dizimi şöyledir:

aapt2 convert -o output-file options file[,file[..]]

Aşağıdaki örnek, input.apk kaynaklarını dönüştürür ve output.apk içinde proto tampon biçimi kaynakları içeren yeni bir APK oluşturur. Normal düz tablo gösterimini daha kompakt bir ikili arama ağacıyla değiştirir ve böylece alma performansı karşılığında daha küçük bir APK elde edilir:

aapt2 convert -o output.apk --output-format proto --enable-sparse-encoding input.apk

Seçenekleri Dönüştürme

convert ile aşağıdaki seçenekleri kullanın:

Tablo 7. Seçenekleri dönüştürme

OptionAçıklama
-o path

Bağlı kaynak APK'sı için çıkış yolunu belirtir.

Bağlı kaynakları barındırabilecek çıkış APK'sının yolunu belirtmeniz gerektiğinden bu, zorunlu bir işarettir.

--output-format [proto|binary] Çıkışın biçimi. proto ve binary değerleri kabul edilir. Ayarlanmadığında varsayılan olarak binary olur.
--enable-sparse-encoding İkili arama ağacı kullanarak seyrek girişlerin kodlanmasını etkinleştirir. Bu seçenek, APK boyutunun optimizasyonu için faydalıdır ancak kaynak alma performansından ödün vermelidir.
--keep-raw-values XML dosyalarındaki ham özellik değerlerini korur.
-v Çıkışın ayrıntı düzeyini artırır.
-h Araç yardımını gösterir.

Arka plan programı modu

AAPT sürüm 2.19, komut verme için arka plan modu modunu kullanıma sundu. Arka plan modu, tek bir AAPT oturumunda birden fazla komut girmenize olanak tanır.

Arka plan programı söz dizimi

Aşağıdaki komutla arka plan modunu başlatın:

aapt2 daemon

Arka plan modu çalışmaya başladıktan sonra komut girebilirsiniz. Komutun her bağımsız değişkeni, komutun sonunda boş bir satır olacak şekilde ayrı bir satırda yer almalıdır. Control+D tuşlarına basarak arka plan programı modundan çıkın.

Aşağıdaki bağımsız compile komutlarını göz önünde bulundurun:

aapt2 compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/
aapt2 compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/

Bu komutlar arka plan modunda şu şekilde girilebilir:

aapt2 daemon
Ready
compile
project_root/module_root/src/main/res/values-en/strings.xml
-o
compiled/

Done
compile
project_root/module_root/src/main/res/drawable/myImage.png
-o
compiled/

Done
^D
Exiting daemon

Arka plan modu seçenekleri

Arka plan modu için tek seçenek --trace-folder folder'dir. Bu mod, belirtilen folder öğesine bir systrace JSON izleme parçası oluşturur.

Sürüm

version komutuyla, kullandığınız AAPT2 sürümünü belirleyin:

aapt2 version
Android Asset Packaging Tool (aapt) 2.19-8678579

AAPT2 kullanılırken davranış değişir

AAPT2'den önce AAPT, Android Öğe Paketleme Aracı'nın varsayılan sürümü olup kullanımdan kaldırılmıştır. AAPT2'nin eski projelerle hemen çalışması gerekse de, bu bölümde farkında olmanız gereken bazı davranış değişiklikleri açıklanmaktadır.

Android manifestindeki öğe hiyerarşileri

AAPT'nin önceki sürümlerinde, AndroidManifest.xml dosyasında yanlış düğümlere iç içe yerleştirilmiş öğeler yoksayılıyor veya uyarıyla sonuçlanıyordu. Örneğin, aşağıdaki örneği inceleyin:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.myname.myapplication">
   <application
       ...
       <activity android:name=".MainActivity">
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
           <action android:name="android.intent.action.CUSTOM" />
       </activity>
   </application>
</manifest>

AAPT'nin önceki sürümleri, yanlış yerleştirilen <action> etiketini yoksayar.

AAPT2 ile aşağıdaki hatayı alırsınız:

AndroidManifest.xml:15: error: unknown element <action> found.

Sorunu çözmek için manifest öğelerinizin doğru şekilde iç içe yerleştirilmiş olduğundan emin olun. Daha fazla bilgi için Uygulama Manifest'e genel bakış konusunu okuyun.

Kaynakların beyanı

Artık name özelliğinden kaynak türünü belirtemezsiniz. Aşağıdaki örnekte bir attr kaynak öğesi yanlış tanımlanmaktadır:

<style name="childStyle" parent="parentStyle">
    <item name="attr/my_attr">@color/pink</item>
</style>

Bir kaynak türünün bu şekilde bildirilmesi aşağıdaki derleme hatasıyla sonuçlanır:

Error: style attribute 'attr/attr/my_attr (aka my.package:attr/attr/my_attr)'
not found.

Bu hatayı çözmek için type="attr" ile türü açıkça bildirin:

<style name="childStyle" parent="parentStyle">
  <item type="attr" name="my_attr">@color/pink</item>
</style>

Ayrıca, bir <style> öğesi bildirilirken üst öğesi de stil kaynak türü olmalıdır. Aksi takdirde, aşağıdakine benzer bir hata alırsınız:

Error: (...) invalid resource type 'attr' for parent of style

@ kaynak referans sembollerinin yanlış kullanımı

AAPT2, kaynak referans simgelerini (@) çıkardığınızda veya yanlış bir şekilde yerleştirdiğinizde derleme hataları bildirir. Örneğin, bir stil özelliğini belirtirken simgeyi çıkarırsanız:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  ...
  <!-- Note the missing '@' symbol when specifying the resource type. -->
  <item name="colorPrimary">color/colorPrimary</item>
</style>

Modülü oluştururken, AAPT2 aşağıdaki derleme hatasını verir:

ERROR: expected color but got (raw string) color/colorPrimary

Ayrıca, android ad alanından bir kaynağa erişirken simgeyi yanlış eklerseniz:

...
<!-- When referencing resources from the 'android' namespace, omit the '@' symbol. -->
<item name="@android:windowEnterAnimation"/>

Modülü oluştururken, AAPT2 aşağıdaki derleme hatasını verir:

Error: style attribute '@android:attr/windowEnterAnimation' not found

Kitaplıkların yanlış yapılandırılması

Uygulamanızın, Android SDK Derleme Araçları'nın eski sürümleri kullanılarak oluşturulmuş bir üçüncü taraf kitaplığa bağımlılığı varsa çalışma zamanında hiçbir hata veya uyarı görüntülemeden çökebilir. Bu kilitlenme, kitaplığın oluşturulması sırasında R.java alanlarının final olarak belirtilmesinden kaynaklanabilir. Sonuç olarak, tüm kaynak kimlikleri kitaplık sınıflarında satır içine alınır.

AAPT2, uygulamanızı oluştururken kimlikleri kitaplık kaynaklarına yeniden atayabilmeye dayanır. Kitaplık, kimliklerin final olduğunu varsayar ve bunları kitaplık DEX'ine satıra dahil ederse çalışma zamanı uyuşmazlığı vardır.

Bu hatayı düzeltmek için kitaplık yazarıyla iletişime geçerek Android SDK Derleme Araçları'nın en son sürümünü kullanarak kitaplığı yeniden oluşturun ve kitaplığı yeniden yayınlayın.