AAPT2

AAPT2 (Android Asset Packaging Tool), Android Studio ve Android Gradle eklentisinin uygulamanızın kaynaklarını derlemek ve paketlemek için kullandığı bir derleme aracıdır. AAPT2, kaynakları ayrıştırır, dizine ekler ve Android platformu için optimize edilmiş bir ikili biçimde derler.

Android Gradle eklentisinin 3.0.0 ve sonraki sürümlerinde AAPT2 varsayılan olarak etkindir. Genellikle aapt2 öğesini kendiniz çağırmanız gerekmez. Ancak 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ında komut satırından hata ayıklayabilirsiniz. Bunu yapmak için Android SDK Derleme Araçları 26.0.2 ve sonraki sürümlerinde AAPT2'yi bağımsız bir araç olarak bulun.

Android SDK Build Tools'u komut satırından indirmek için sdkmanager'u kullanın ve aşağıdaki komutu çalıştırın:

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

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

Android SDK Build Tools'un düzeltilmiş sürümleri sık yayınlanmadığından SDK Build Tools'unuzda bulunan AAPT2 sürümü en son sürüm olmayabilir. AAPT2'nin en yeni sürümünü edinmek için Google Maven'den AAPT2'yi indirin.

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

AAPT2, artımlı derlemeyi etkinleştirerek kaynakların daha hızlı derlenmesini destekler. Artımlı derleme için kaynak işleme iki adıma ayrılır:

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

Bu ayrım, artımlı derlemelerin performansını artırmaya yardımcı olur. Örneğin, tek bir dosyada değişiklik varsa yalnızca o dosyayı yeniden derlemeniz gerekir.

AAPT2'yi Google Maven'den indirme

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

  1. Depo dizininde com.android.tools.build > aapt2'ye 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 ekleyin ve 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 üzere şu bağlantıyı kullanın: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/ 3.2.0-alpha18-4804415/aapt2-3.2.0-alpha18-4804415-windows.jar

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

  5. Yeni indirdiğiniz JAR dosyasını açın.

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

Derleme

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

AAPT2, dizinlerin tamamı iletilirken yalnızca 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 iletebilseniz de bu şekilde artımlı kaynak derlemesinin avantajlarından yararlanamazsınız.

Çıkış dosyası türleri, derleme için sağladığınız girişe göre farklılık gösterebilir. Bu durum aşağıdaki tabloda gösterilmiştir:

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

Giriş Çıkış
res/values/ dizininde bulunan 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ılı 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'nin çıkardığı dosyalar yürütülebilir dosyalar değildir ve APK oluşturmak için bu ikili dosyaları daha sonra bağlantı aşamasında giriş olarak eklemeniz gerekir. Ancak, oluşturulan APK dosyası DEX dosyaları içermediği ve imzalanmadığı için hemen bir Android cihaza dağıtabileceğiniz bir yürütülebilir dosya değildir.

Söz dizimini derleme

compile kullanımıyla ilgili genel söz dizimi aşağıdaki gibidir:

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ı giriş dosyasının adına ve üst dizininin adına bağlıdır.

Giriş olarak strings.xml dosyasının kullanıldığı önceki örnekte, aapt2 çıkış dosyasını otomatik olarak values-en_strings.arsc.flat şeklinde adlandırır. Ancak, drawable dizininde depolanan derlenmiş drawable dosyası drawable_img.png.flat olarak adlandırılır.

Derleme seçenekleri

Tablo 2'de gösterildiği gibi, compile komutuyla kullanabileceğiniz çeşitli seçenekler vardır:

Tablo 2. Derleme komutu seçenekleri

Option Açıklama
-o path

Derlenen kaynakların çıkış yolunu belirtir.

AAPT2'nin derlenmiş kaynakları çıkış olarak verebileceği ve depolayabileceği bir dizinin yolunu belirtmeniz gerektiğinden bu zorunlu bir işarettir.

--dir directory

Kaynaklar için taranacak dizini belirtir.

Bu işareti birden fazla kaynak dosyasını tek bir komutla derlemek için kullanabilirsiniz ancak bu, artımlı derlemenin avantajlarını devre dışı bırakır. Bu nedenle, bu işaret büyük projelerde 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çeneğin etkinleştirilmesi, yürütme hızını artırır ancak çıkış dosyasının boyutunu büyütür.

--legacy AAPT'nin önceki sürümleri kullanılırken izin verilen hataları uyarı olarak değerlendirir.

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

-zip file file, kaynaklar için taranacak res dizinini içeren bir ZIP dosyasıdır.
-output-text-symbols file Belirtilen dosyadaki kaynak sembollerini içeren bir metin dosyası oluşturur.
-preserve-visibility-of-styleables Belirtilirse diğer tüm kaynaklar için kullanılan stil verilebilir öğeler için aynı görünürlük kurallarını uygular. Aksi takdirde, tüm stil verilebilir öğeler herkese açık hâle getirilir.
-visibility [public|private|default|] Derlenen kaynakların görünürlüğünü belirtilen düzeye ayarlar.
-trace-folder folder Belirtilen klasörde systrace JSON izleme parçası oluşturur.
-source-path path Derlenmiş kaynak dosyasının kaynak dosya yolunu path olarak ayarlar.
-h Araçlarla ilgili yardımı 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şlenmiş PNG dosyaları) birleştirir ve ardından dosyaları tek bir APK'da paketler. Ayrıca bu aşamada R.java ve ProGuard kuralları dosyaları gibi diğer yardımcı dosyalar da oluşturulabilir. Ancak oluşturulan APK, DEX bayt kodu içermiyor ve imzalanmamış. 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 Java bayt kodunu DEX bayt koduna derlemek için d8 ve APK'nızı imzalamak için apksigner gibi diğer komut satırı araçlarını kullanabilirsiniz.

link kullanımıyla ilgili 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 dosyayı (drawable_Image.flat ve values_values.arsc.flat) ve AndroidManifest.xml dosyasını birleştirir. AAPT2, sonucu android.jar dosyasına bağlar. Bu dosya, android paketinde tanımlanan kaynakları içerir:

 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ının çıkış yolunu belirtir.

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

--manifest file

Oluşturulacak Android manifest dosyasının yolunu belirtir.

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

-I

Platformun android.jar veya framework-res.apk gibi diğer APK'larının yolunu sağlar. Bu, özellik geliştirirken 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 dizini belirtir.

Bu dizini, orijinal ve işlenmemiş dosyaları depolamak için kullanabilirsiniz. Daha fazla bilgi edinmek için Orijinal dosyalara erişme başlıklı makaleyi inceleyin.

-R file .flat dosyasını <add-resource> etiketi olmadan overlay semantiğini kullanarak link'ye iletir.

Mevcut bir dosyanın üzerine yerleştirilen bir kaynak dosyası sağladığınızda, verilen 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ğerine eşit veya bu değerden büyük 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 arasındaki kimliklerdir (bu aralık dahil). --allow-reserved-package-id kullanarak ayrılmış paket kimlikleri aralığında yer alan kimlikler 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 öğesinin oluşturulacağı dizini belirtir.
--proguard proguard_options ProGuard kuralları için çıkış dosyasını oluşturur.
--proguard-conditional-keep-rules Ana DEX için ProGuard kurallarının çı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 çizilebilir öğelerin otomatik olarak sürüm oluşturulmasını devre dışı bırakır. Bu işareti yalnızca APK'nızı Vector Drawable Kitaplığı ile oluştururken kullanın.
--no-version-transitions Geçiş kaynaklarının otomatik olarak sürüm oluşturulmasını 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 yinelenen öğe kaldırma işlemini devre dışı bırakır.
--enable-sparse-encoding Kaynak girişlerinin seyrek kodlanmasını sağlar. Bu durum, APK boyutunda, bellek kullanımında ve başlatma gecikmesinde azalmaya, başlatma işleminden sonra tek tek kaynak arama süresinde ise küçük bir artışa neden olur.
-z "Önerilen" olarak işaretlenen dizelerin yerelleştirilmesi gerekir.
-c config Yapılandırmaların virgülle ayrılmış bir listesini sağlar.

Örneğin, birden fazla dil için çeviriler içeren destek kitaplığına 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 bir ISO 639-1 dil koduyla tanımlamanız gerekir. İsteğe bağlı olarak, küçük harfli "r" ile başlayan iki harfli bir ISO 3166-1-alpha-2 bölge kodu da ekleyebilirsiniz. Örneğin, en-rUS.

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

Uygulamanızda kullanabileceğiniz çeşitli piksel yoğunluğu niteleyicileri (ör. ldpi, hdpi ve xhdpi) 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ğunlukları kaldırır.

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

Bu işareti kullanırken herhangi bir hata alırsanız Android SDK Derleme Araçları 28.0.0 veya sonraki bir sürüme yükselterek bu hataları çözebilirsiniz.

--min-sdk-version min-sdk-version AndroidManifest.xml için kullanılacak varsayılan minimum SDK sürümünü ayarlar.
--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 AndroidManifest.xml yoksa içine yerleştirilecek sürüm kodunu belirtir.
--version-name version-name Hiçbiri yoksa AndroidManifest.xml içine eklenecek sürüm adını belirtir.
--revision-code revision-code Hiçbiri yoksa dosyaya eklenecek düzeltme kodunu belirtir. AndroidManifest.xml
--replace-version --version-code, --version-name veya --revision-code belirtilirse bu değerler, manifestte bulunan tüm değerlerin yerini alır. Manifest bu özellikleri zaten tanımlıyorsa varsayılan olarak 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 Hiçbiri 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şturmak için bundletool giriş olarak uygundur.

--non-final-ids Son olmayan kaynak kimlikleriyle R.java oluşturur. Uygulamanın kodundaki kimliklere yapılan referanslar, kotlinc veya javac derlemesi sırasında satır içi olarak eklenmez.
--emit-ids path Kaynak türlerinin adlarının ve kimlik eşlemelerinin listesini içeren bir dosyayı belirtilen yola gönderir. Bu, --stable-ids ile kullanıma uygundur.
--stable-ids outputfilename.ext Kaynak türlerinin adlarının ve bunlara atanan kimliklerin listesini içeren --emit-ids ile oluşturulan dosyayı kullanır.

Bu seçenek, bağlama sırasında yeni kaynaklar ekleseniz veya mevcut kaynakları silseniz bile atanan kimliklerin sabit kalmasını sağlar.

--custom-package package_name R.java altında 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 JavaDoc ek açıklaması ekler.
--output-text-symbols path Belirtilen dosyadaki R sınıfının kaynak sembollerini içeren bir metin dosyası oluşturur.

Çıkış dosyasının yolunu belirtmeniz gerekir.

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

Yapılandırma grubuyla birlikte çıkış APK'sının yolunu belirtmeniz gerekir.

--proguard-main-dex file Ana DEX için oluşturulan ProGuard kurallarının çıkış dosyası.
--proguard-minimal-keep-rules Minimum sayıda ProGuard keep kuralı oluşturur.
--no-resource-removal Varsayılanı olmayan kaynakların otomatik olarak kaldırılmasını devre dışı bırakır. Bu seçeneği yalnızca çalışma zamanı kaynak yer paylaşımı paketleri oluştururken kullanın.
-x Paket tanımlayıcısı 0x01'in kullanımını belirten eski işaret.
--product products-list Korunacak ürün adlarının virgülle ayrılmış listesini belirtir.
--no-xml-namespaces XML ad alanı önekini ve URI bilgilerini AndroidManifest.xml dosyasından ve res/* içindeki XML ikililerinden 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 Tüm kitaplık kaynaklarını uygulamanın paketi altında birleştirir.
--no-proguard-location-reference ProGuard kural dosyalarının kaynak dosyaya referans vermesini engeller.
--private-symbols package-name package-name, özel semboller için R.java oluşturulurken kullanılacak paket adını belirtir. Belirtilmediği takdirde, herkese açık ve özel semboller uygulamanın paket adını kullanır.
--override-styles-instead-of-overlaying -R kaynaklarında tanımlanan stillerin, birleştirilmek yerine önceki tanımların yerini almasına neden olur.
--rename-resources-package package-name Kaynaklar tablosundaki paketi package-name olarak yeniden adlandırır.
--no-compress Kaynakları 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 grameri 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ğerleri hariç tutulur.
--debug-mode Manifestin uygulama düğümüne android:debuggable="true" ekler. Böylece uygulama, üretim cihazlarında bile hata ayıklanabilir hale gelir.
--strict-visibility Farklı görünürlük düzeylerine sahip yer paylaşımlarına izin vermez.
--exclude-sources Protobuf biçiminde kaynak oluştururken kaynak dosya bilgilerini serileştirmez.
--trace-folder folder Belirtilen folder için systrace JSON izleme parçası 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österir.
-v Çıkışın ayrıntı düzeyini artırır.

Döküm

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

Döküm söz dizimi

dump kullanımıyla ilgili genel söz dizimi aşağıdaki gibidir:

aapt2 dump sub-command filename.apk [options]

Aşağıdaki örnek, belirtilen APK'nın kaynak tablosundaki içeriği yazdırır:

aapt2 dump resources output.apk

Dump alt komutları

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

Tablo 4. Dump alt komutları

Alt komutAçıklama
apc Derleme sırasında oluşturulan AAPT2 Kapsayıcısı'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 yerleştirilebilir 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'sindeki dizeleri yazdırır.
xmltree APK'nın derlenmiş XML'sinin ağacını yazdırır.

Döküm seçenekleri

dump ile birlikte 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ı bastırır.
--file file APK'dan dökümü alınacak bir dosyayı bağımsız değişken olarak belirtir.
-v Çıkışın ayrıntı düzeyini artırır.

Fark

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

Fark söz dizimi

diff kullanımıyla ilgili genel söz dizimi aşağıdaki gibidir:

aapt2 diff first.apk second.apk

diff komutu için seçenek yoktur.

Optimizasyon yapın

optimize, birleştirilmiş kaynaklarda optimizasyon çalıştırmak ve resources.arsc 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 küçültebilir.

Söz dizimini optimize etme

optimize kullanımıyla ilgili genel söz dizimi aşağıdaki gibidir:

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

Aşağıdaki örnekte, input.apk içindeki kaynaklar optimize edilir ve output.apk içinde yeni, optimize edilmiş bir APK oluşturulur. Bu özellik, normal düz tablo gösteriminin yerini daha kompakt bir gösterimle alır. Bu sayede APK boyutu, bellek kullanımı ve başlatma gecikmesi azalır. Başlatma işleminden sonra kaynak arama süresinde ise küçük bir artış olur.

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ının çıkış yolunu belirtir.

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

-d directory Bölümler 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ır ve çıkar.
--target-densities density[,density[..]] APK'nın optimize edildiği ekran yoğunluklarının virgülle ayrılmış listesini belirtir. Belirli yoğunluktaki cihazlarda kullanılmayacak tüm kaynaklar APK'dan kaldırılır.
--resources-config-path path

Kaynak listesini ve her kaynağa yönelik direktifleri 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ış bir 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.

Yapılandırma grubuyla birlikte çıkış APK'sının yolunu belirtmeniz gerekir.

--keep-artifacts artifact[,artifact[..]] Saklanacak yapıtların virgülle ayrılmış listesini belirtir. Hiçbiri belirtilmezse tüm yapılar saklanır.
--enable-sparse-encoding Kaynak girişlerinin seyrek kodlanmasını sağlar. Bu durum, APK boyutunda, bellek kullanımında ve başlatma gecikmesinde azalmaya, başlatma işleminden sonra tek tek kaynak arama süresinde ise küçük bir artışa neden olur.
--collapse-resource-names Kaynak adlarını anahtar dize havuzunda tek bir değer olarak daraltır. Kaynaklar, --resources-config-path tarafından belirtilen bir dosyada no_collapse yönergesi kullanılarak muaf tutulur.
--shorten-resource-paths APK'daki kaynakların yollarını kısaltır.
--resource-path-shortening-map path Eski kaynak yollarının kısaltılmış yollara eşlendiği haritanın çıkış yolunu belirtir.
-v Çıkışın ayrıntı düzeyini artırır.
-h Araç yardımını gösterir.

Dönüştürme

Varsayılan olarak AAPT compile komutu, kaynakları APK'lar için uygun olan ikili biçimde derler. --proto-format belirterek AAB'ler için 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ürme

convert için genel söz dizimi aşağıdaki gibidir:

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

Aşağıdaki örnek, input.apk içindeki kaynakları dönüştürür ve output.apk içinde protobuf biçimli kaynakları içeren yeni bir APK oluşturur. Normal düz tablo gösteriminin yerini daha kompakt bir gösterim alarak APK boyutunda, bellek kullanımında ve başlatma gecikmesinde azalmaya, ayrıca küçük bir artışa neden olur.

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

Dönüştürme Seçenekleri

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

Tablo 7. Dönüştürme seçenekleri

OptionAçıklama
-o path

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

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

--output-format [proto|binary] Çıkışın biçimi. Kabul edilen değerler proto ve binary'dir. Ayarlanmadığında varsayılan olarak binary olur.
--enable-sparse-encoding Kaynak girişlerinin seyrek kodlanmasını sağlar. Bu durum, APK boyutunda, bellek kullanımında ve başlatma gecikmesinde azalmaya, başlatma işleminden sonra tek tek kaynak arama süresinde ise küçük bir artışa neden olur.
--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 2.19 sürümünde komut verme için daemon modu kullanıma sunuldu. Arka plan programı modu, tek bir AAPT oturumunda birden fazla komut girmenize olanak tanır.

Arka plan programı söz dizimi

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

aapt2 daemon

Daemon modu çalıştıktan sonra komut girebilirsiniz. Komutun her bağımsız değişkeni ayrı bir satırda olmalı ve komutun sonunda boş bir satır bulunmalıdır. Control+D yazarak daemon 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 programı 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 programı modu seçenekleri

Daemon modu için tek seçenek --trace-folder folder'dir. Bu seçenek, belirtilen folder için systrace JSON izleme parçası oluşturur.

Sürüm

version komutunu kullanarak 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şiklikleri

AAPT2'den önce AAPT, Android Asset Packaging Tool'un varsayılan sürümüydü ve artık desteği sonlandırıldı. AAPT2 eski projelerle hemen çalışsa da bu bölümde, bilmeniz gereken bazı davranış değişiklikleri açıklanmaktadır.

Android manifest dosyasındaki öğe hiyerarşileri

AAPT'nin önceki sürümlerinde, AndroidManifest.xml dosyasındaki yanlış düğümlere yerleştirilmiş öğeler yoksayılıyordu veya uyarıya neden oluyordu. Ö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ştirilmiş <action> etiketini yok sayıyordu.

AAPT2 ile şu hatayı alırsınız:

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

Sorunu çözmek için bildirim öğelerinizin doğru şekilde iç içe yerleştirildiğinden emin olun. Daha fazla bilgi için Uygulama manifestine genel bakış başlıklı makaleyi inceleyin.

Kaynak beyanı

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

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

Bir kaynak türünü bu şekilde bildirmek aşağıdaki derleme hatasına neden olur:

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

Bu hatayı çözmek için type="attr" kullanarak 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 bir 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ı simgelerinin yanlış kullanımı

AAPT2, kaynak referans simgelerini (@) atladığınızda veya yanlış yerleştirdiğinizde derleme hataları verir. Örneğin, bir stil özelliğini belirtirken simgeyi atlarsanı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şturulurken AAPT2 aşağıdaki derleme hatasını veriyor:

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

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

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

Modül oluşturulurken AAPT2 aşağıdaki derleme hatasını veriyor:

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

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

Uygulamanız, Android SDK Build Tools'un eski sürümleri kullanılarak oluşturulmuş bir üçüncü taraf kitaplığına bağımlıysa uygulamanız, çalışma zamanında herhangi bir hata veya uyarı göstermeden kilitlenebilir. Bu kilitlenme, kitaplık oluşturulurken R.java alanları final olarak tanımlandığı için meydana gelebilir. Sonuç olarak, tüm kaynak kimlikleri kitaplığın sınıflarına yerleştirilir.

AAPT2, uygulamanızı oluştururken kitaplık kaynaklarına kimlikleri yeniden atayabilmeye dayanır. Kitaplık, kimliklerin final olduğunu varsayıp bunları kitaplık DEX'ine yerleştirirse çalışma zamanında eşleşme olmaz.

Bu hatayı gidermek için kitaplığı Android SDK Build Tools'un en son sürümüyle yeniden oluşturması ve yeniden yayınlaması için kitaplığın yazarıyla iletişime geçin.