AAPT2

AAPT2 (Android Asset Packaging Tool) adalah alat build yang digunakan oleh Android Studio dan Plugin Android Gradle untuk mengompilasi dan memaketkan resource aplikasi Anda. AAPT2 mengurai, mengindeks, dan mengompilasi resource menjadi format biner yang dioptimalkan untuk platform Android.

Plugin Android Gradle 3.0.0 dan yang lebih tinggi mengaktifkan AAPT2 secara default. Anda biasanya tidak perlu memanggil aapt2 sendiri. Namun, jika lebih memilih untuk menggunakan sistem build dan terminal milik sendiri daripada Android Studio, Anda dapat menggunakan AAPT2 dari command line. Anda juga dapat men-debug error build yang terkait dengan AAPT2 dari command line. Untuk melakukannya, temukan AAPT2 sebagai alat mandiri di Android SDK Build Tools 26.0.2 dan yang lebih tinggi.

Untuk mendownload Android SDK Build Tools dari command line, gunakan sdkmanager dan jalankan perintah berikut:

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

Setelah mendownload SDK Build Tools, temukan AAPT2 di android_sdk/build-tools/version/.

Karena revisi Android SDK Build Tools tidak sering dirilis, versi AAPT2 yang disertakan dalam SDK Build Tools Anda mungkin bukan yang terbaru. Untuk mendapatkan versi terbaru AAPT2, download AAPT2 dari Maven Google.

Untuk menggunakan AAPT2 dari command line di Linux atau Mac, jalankan perintah aapt2. Di Windows, jalankan perintah aapt2.exe.

AAPT2 mendukung kompilasi resource yang lebih cepat dengan mengaktifkan kompilasi inkremental. Untuk menyelesaikan kompilasi inkremental, pemrosesan resource dipisahkan menjadi dua langkah:

  • Compile: mengompilasi file resource ke dalam format biner.
  • Link: menggabungkan semua file yang dikompilasi, lalu memaketkannya menjadi satu.

Pembagian ini akan membantu meningkatkan performa untuk build inkremental. Misalnya, jika ada perubahan dalam satu file, Anda hanya perlu menghimpun ulang file tersebut.

Mendownload AAPT2 dari Maven Google

Untuk mendapatkan versi terbaru AAPT2 yang tidak disertakan dalam alat build, download AAPT2 dari repositori Maven Google sebagai berikut:

  1. Di indeks repositori, buka com.android.tools.build > aapt2.
  2. Salin nama versi terbaru AAPT2.
  3. Masukkan nama versi yang Anda salin ke URL berikut dan tentukan sistem operasi target Anda: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/ aapt2-version/aapt2-aapt2-version- [windows | linux | osx].jar

    Misalnya, untuk mendownload versi 3.2.0-alpha18-4804415 untuk Windows, gunakan: 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. Buka URL di browser. AAPT2 akan segera didownload.

  5. Buka paket file JAR yang baru saja didownload.

    File JAR harus berisi file aapt2 yang dapat dieksekusi dan beberapa library yang dijadikan dependensi oleh file yang dapat dieksekusi tersebut.

Compile

AAPT2 mendukung kompilasi semua jenis resource Android, seperti file drawable dan file XML. Saat Anda memanggil AAPT2 untuk kompilasi, teruskan satu file resource sebagai input per pemanggilan. AAPT2 kemudian menguraikan file dan menghasilkan file biner perantara dengan ekstensi .flat.

Ketika Anda meneruskan seluruh direktori, AAPT2 akan mengompilasi ulang semua file dalam direktori tersebut meskipun hanya satu resource yang diubah. Meskipun Anda dapat meneruskan direktori resource yang berisi lebih dari satu file resource ke AAPT2 menggunakan flag --dir, Anda tidak akan mendapatkan manfaat dari kompilasi resource inkremental dengan cara ini.

Jenis file output dapat berbeda berdasarkan input yang Anda berikan untuk kompilasi, seperti ditunjukkan pada tabel berikut:

Tabel 1. Jenis file input dan output untuk kompilasi

Input Output
File resource XML, seperti String dan Style, yang terletak di direktori res/values/ Tabel resource dengan *.arsc.flat sebagai ekstensinya.
Semua file resource lainnya.

Semua file selain file pada direktori res/values/ akan dikonversi ke file XML biner dengan ekstensi *.flat.

Selain itu, semua file PNG dijalankan secara default dan menggunakan ekstensi *.png.flat . Jika memilih untuk tidak mengompresi PNG, Anda dapat menggunakan opsi --no-crunch saat kompilasi.

File yang dihasilkan oleh AAPT2 tidak dapat dieksekusi, dan nantinya Anda harus menyertakan file biner ini sebagai input dalam fase penautan untuk membuat APK. Namun, file APK yang dihasilkan tidak dapat dieksekusi dan dapat langsung di-deploy di perangkat Android, karena tidak berisi file DEX dan tidak ditandatangani.

Sintaksis Compile

Sintaksis umum untuk menggunakan compile adalah sebagai berikut:

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

Dalam contoh berikut, AAPT2 mengompilasi file resource dengan nama values.xml dan myImage.png secara terpisah:

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/

Seperti ditunjukkan dalam tabel 1, nama file output bergantung pada nama file input dan nama direktori induknya.

Untuk contoh sebelumnya dengan file strings.xml sebagai input, aapt2 secara otomatis menamai file output sebagai values-en_strings.arsc.flat. Namun, file drawable yang dikompilasi dan disimpan dalam direktori drawable dinamai drawable_img.png.flat.

Opsi Compile

Ada beberapa opsi yang dapat Anda gunakan dengan perintah compile, seperti ditunjukkan pada tabel 2:

Tabel 2. Opsi perintah Compile

Opsi Deskripsi
-o path

Menentukan jalur output untuk resource yang dikompilasi.

Ini adalah flag yang diperlukan karena Anda harus menentukan jalur ke direktori tempat AAPT2 dapat menghasilkan dan menyimpan resource yang dikompilasi.

--dir directory

Menentukan direktori yang akan dipindai untuk mencari resource.

Meskipun flag ini dapat digunakan untuk mengompilasi beberapa file resource dengan satu perintah, Anda tidak akan mendapatkan manfaat dari kompilasi inkremental. Oleh karena itu, flag ini tidak boleh digunakan untuk project besar.

--pseudo-localize Menghasilkan string default dalam versi yang dilokalkan secara semu, seperti en-XA dan en-XB.
--no-crunch Menonaktifkan pemrosesan PNG.

Gunakan opsi ini jika Anda telah memproses file PNG atau jika Anda membuat build debug yang tidak memerlukan pengurangan ukuran file. Mengaktifkan opsi ini akan mempercepat eksekusi, tetapi ukuran file output akan menjadi lebih besar.

--legacy Memperlakukan error yang diizinkan saat menggunakan versi AAPT yang lebih lama sebagai peringatan.

Flag ini harus digunakan untuk error waktu kompilasi yang tidak terduga. Untuk mengatasi perubahan perilaku umum yang mungkin terjadi saat menggunakan AAPT2, baca Perubahan perilaku saat menggunakan AAPT2.

-zip file file adalah file ZIP yang berisi direktori res untuk memindai resource.
-output-text-symbols file Menghasilkan file teks yang berisi simbol resource dalam file yang ditentukan.
-preserve-visibility-of-styleables Jika ditentukan, akan menerapkan aturan visibilitas yang sama untuk gaya yang dapat digunakan untuk semua resource lainnya. Jika tidak, semua gaya dapat diubah menjadi publik.
-visibility [public|private|default|] Menetapkan visibilitas resource yang dikompilasi ke tingkat yang ditentukan.
-trace-folder folder Menghasilkan fragmen rekaman aktivitas JSON systrace ke folder yang ditentukan.
-source-path path Menetapkan jalur file sumber dari file resource kompilasi ke path.
-h Menampilkan bantuan alat.
-v Mengaktifkan logging panjang.

Dalam fase penautan, AAPT2 akan menggabungkan semua file perantara yang dihasilkan oleh fase kompilasi, seperti tabel resource, file XML biner, dan file PNG yang diproses, kemudian memaketkan file tersebut menjadi satu APK. Selain itu, file tambahan lainnya, seperti file aturan R.java dan ProGuard, dapat dibuat selama fase ini. Namun, APK yang dihasilkan tidak berisi bytecode DEX dan tidak ditandatangani. Anda tidak dapat men-deploy APK ini ke perangkat.

Jika tidak menggunakan plugin Android Gradle untuk mem-build aplikasi dari command line, Anda dapat menggunakan alat command line lainnya seperti d8 untuk mengompilasi bytecode Java menjadi bytecode DEX danapksigner untuk menandatangani APK.

Sintaksis umum untuk menggunakan link adalah sebagai berikut:

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

Pada contoh berikut, AAPT2 menggabungkan dua file perantara, drawable_Image.flat dan values_values.arsc.flat, serta file AndroidManifest.xml. AAPT2 menautkan hasilnya ke file android.jar yang berisi resource yang ditentukan dalam paket android:

 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

Anda dapat menggunakan opsi berikut dengan perintah link:

Tabel 3. Opsi perintah link

Opsi Deskripsi
-o path

Menentukan jalur output untuk APK resource yang tertaut.

Flag ini diperlukan karena Anda harus menentukan jalur untuk APK output yang dapat menyimpan resource yang tertaut.

--manifest file

Menentukan jalur ke file manifes Android yang akan di-build.

Flag ini diperlukan karena file manifes menyimpan informasi penting tentang aplikasi Anda, seperti nama paket dan ID aplikasi.

-I

Memberikan jalur ke android.jar atau APK lain platform, seperti framework-res.apk, yang mungkin berguna saat mem-build fitur.

Flag ini diperlukan jika Anda menggunakan atribut dengan namespace android di file resource.
-A directory Menentukan direktori aset yang akan disertakan dalam APK.

Anda dapat menggunakan direktori ini untuk menyimpan file asli yang belum diproses. Untuk mempelajari lebih lanjut, baca Mengakses file asli.

-R file Meneruskan satu file .flat ke link, menggunakan semantik overlay tanpa menggunakan tag <add-resource>.

Saat Anda memberikan file resource yang menempatkan file yang sudah ada, resource terakhir yang mengalami konflik akan digunakan.

--package-id package-id Menentukan ID paket yang akan digunakan untuk aplikasi Anda.

ID paket yang Anda tentukan harus lebih besar atau sama dengan 0x7f, kecuali digunakan bersama --allow-reserved-package-id.

--allow-reserved-package-id

Mengizinkan penggunaan ID paket yang sudah dialokasikan.

ID paket yang sudah dialokasikan adalah ID yang biasanya ditetapkan ke library bersama dan berada dalam rentang 0x02 hingga 0x7e secara inklusif. Dengan menggunakan --allow-reserved-package-id, Anda dapat menetapkan ID yang berada dalam rentang ID paket yang sudah dialokasikan.

Opsi ini hanya boleh digunakan untuk paket dengan versi min-sdk 26 atau yang lebih rendah.

--java directory Menentukan direktori untuk menghasilkan R.java.
--proguard proguard_options Menghasilkan file output untuk aturan ProGuard.
--proguard-conditional-keep-rules Menghasilkan file output untuk aturan ProGuard bagi DEX utama.
--no-auto-version Menonaktifkan penetapan versi SDK gaya dan tata letak otomatis.
--no-version-vectors Menonaktifkan penetapan versi otomatis vektor drawable. Hanya gunakan flag ini ketika mem-build APK dengan Vector Drawable Library.
--no-version-transitions Menonaktifkan penetapan versi otomatis resource transisi. Gunakan flag ini hanya saat mem-build APK dengan Transition Support Library.
--no-resource-deduping Menonaktifkan de-duplikasi resource secara otomatis dengan nilai yang identik di seluruh konfigurasi yang kompatibel.
--enable-sparse-encoding Mengaktifkan encoding entri sparse menggunakan hierarki penelusuran biner. Opsi ini berguna untuk pengoptimalan ukuran APK, tetapi performa pengambilan resource harus dikorbankan.
-z Mewajibkan pelokalan string yang ditandai sebagai 'disarankan'.
-c config Memberikan daftar konfigurasi yang dipisahkan koma.

Misalnya, jika Anda memiliki dependensi di support library yang berisi terjemahan untuk berbagai bahasa), Anda dapat memfilter resource untuk konfigurasi bahasa yang ditentukan saja, seperti bahasa Inggris atau Spanyol.

Anda harus menentukan konfigurasi bahasa dengan kode bahasa ISO 639-1 dua huruf, yang secara opsional diikuti dengan kode wilayah ISO 3166-1-alpha-2 dua huruf yang diawali dengan huruf kecil 'r'. Misalnya, en-rUS.

--preferred-density density Mengizinkan AAPT2 memilih kepadatan yang paling cocok dan menghapus yang lainnya.

Ada beberapa penentu kepadatan piksel yang tersedia untuk digunakan dalam aplikasi, seperti ldpi, hdpi, dan xhdpi. Saat menentukan kepadatan yang diinginkan, AAPT2 akan memilih dan menyimpan kepadatan yang paling cocok dalam tabel resource dan menghapus yang lainnya.

--output-to-dir Menghasilkan konten APK ke direktori yang ditentukan oleh -o.

Jika mendapatkan error ketika menggunakan flag ini, Anda dapat mengatasinya dengan mengupgrade ke Android SDK Build Tools 28.0.0 atau yang lebih baru.

--min-sdk-version min-sdk-version Menetapkan versi SDK minimum default yang akan digunakan untuk AndroidManifest.xml.
--target-sdk-version target-sdk-version Menetapkan versi SDK target default yang akan digunakan untuk AndroidManifest.xml.
--version-code version-code Menentukan kode versi yang akan dimasukkan ke AndroidManifest.xml jika belum ada.
--version-name version-name Menentukan nama versi yang akan dimasukkan ke AndroidManifest.xml jika belum ada.
--revision-code revision-code Menentukan kode revisi yang akan dimasukkan ke file AndroidManifest.xml jika belum ada.
--replace-version Jika --version-code, --version-name, atau --revision-code ditentukan, nilai ini akan menggantikan nilai apa pun yang sudah ada dalam manifes. Secara default, tidak ada yang berubah jika manifes sudah menentukan atribut ini.
--compile-sdk-version-nacodeme compile-sdk-version-name Menentukan kode versi yang akan dimasukkan ke file AndroidManifest.xml jika belum ada.
--compile-sdk-version-name compile-sdk-version-name Menentukan nama versi yang akan dimasukkan ke file AndroidManifest.xml jika belum ada.
--proto-format Menghasilkan resource yang dihimpun dalam format Protobuf.

Cocok sebagai input ke bundletool untuk menghasilkan Android App Bundle.

--non-final-ids Menghasilkan R.java dengan ID resource non-final. Referensi ke ID dari kode aplikasi tidak akan disisipkan selama kompilasi kotlinc atau javac.
--emit-ids path Memberikan file di jalur yang ditentukan dengan daftar nama jenis resource dan pemetaan ID-nya. Ini cocok digunakan dengan --stable-ids.
--stable-ids outputfilename.ext Menggunakan file yang dihasilkan dengan --emit-ids yang berisi daftar nama jenis resource dan ID yang ditetapkan kepadanya.

Opsi ini memungkinkan ID yang ditetapkan menjadi tetap stabil meskipun Anda menghapus atau menambahkan resource baru pada saat penautan.

--custom-package package_name Menentukan paket Java kustom tempat R.java akan dibuat.
--extra-packages package_name Membuat file R.java yang sama tetapi dengan nama paket yang berbeda.
--add-javadoc-annotation annotation Menambahkan anotasi JavaDoc ke semua class Java yang dihasilkan.
--output-text-symbols path Menghasilkan file teks yang berisi simbol resource class R dalam file yang ditentukan.

Anda harus menentukan jalur ke file output.

--auto-add-overlay Memungkinkan penambahan resource baru dalam overlay tanpa menggunakan tag <add-resource>.
--rename-manifest-package manifest-package Mengganti nama paket dalam file AndroidManifest.xml.
--rename-instrumentation-target-package instrumentation- target-package Mengubah nama paket target untuk instrumentation.

Opsi ini harus digunakan bersama --rename-manifest-package.

-0 extension

Menentukan ekstensi file yang tidak ingin Anda kompresi.

--split path:config[,config[..]] Memisahkan resource berdasarkan suatu rangkaian konfigurasi untuk menghasilkan versi APK yang berbeda.

Anda harus menentukan jalur ke APK output beserta rangkaian konfigurasi.

--proguard-main-dex file File output untuk aturan ProGuard yang dihasilkan untuk DEX utama.
--proguard-minimal-keep-rules Menghasilkan sekumpulan aturan penyimpanan ProGuard minimal.
--no-resource-removal Menonaktifkan penghapusan otomatis resource tanpa setelan default. Gunakan opsi ini hanya saat mem-build paket runtime resource overlay.
-x Flag lama yang menentukan penggunaan ID paket 0x01.
--product products-list Menentukan daftar nama produk yang dipisahkan koma yang akan disimpan.
--no-xml-namespaces Menghapus awalan namespace XML dan informasi URI dari file AndroidManifest.xml dan biner XML di res/*.
--shared-lib Menghasilkan library Android runtime bersama.
--static-lib Menghasilkan library Android statis.
--no-static-lib-packages Menggabungkan semua resource library dalam paket aplikasi.
--no-proguard-location-reference Mencegah file aturan ProGuard memiliki referensi ke file sumber.
--private-symbols package-name package-name menentukan nama paket yang akan digunakan saat membuat R.java untuk simbol pribadi. Jika tidak ditentukan, simbol publik dan pribadi akan menggunakan nama paket aplikasi.
--override-styles-instead-of-overlaying Menyebabkan gaya yang ditentukan dalam resource -R menggantikan definisi sebelumnya dan bukan menggabungkannya.
--rename-resources-package package-name Mengganti nama paket dalam tabel resource menjadi package-name.
--no-compress Tidak mengompresi resource apa pun.
--keep-raw-values Mempertahankan nilai atribut raw dalam file XML.
--no-compress-regex regular-expression Tidak mengompresi ekstensi yang cocok dengan regular-expression. Gunakan simbol $ untuk akhir baris. Menggunakan tata bahasa ekspresi reguler ECMAScript yang peka huruf besar/kecil.
--warn-manifest-validation Memperlakukan error validasi manifes sebagai peringatan.
--exclude-configs qualifier[,qualifier[..]] Mengecualikan nilai resource yang konfigurasinya berisi penentu yang ditetapkan.
--debug-mode Menyisipkan android:debuggable="true" ke node aplikasi manifes, sehingga membuat aplikasi dapat di-debug, bahkan pada perangkat produksi.
--strict-visibility Tidak memungkinkan overlay dengan tingkat visibilitas berbeda.
--exclude-sources Tidak melakukan serialisasi informasi file sumber saat membuat resource dalam format Protobuf.
--trace-folder folder Menghasilkan fragmen rekaman aktivitas JSON systrace ke folder yang ditentukan.
--merge-only Hanya menggabungkan resource tanpa memverifikasi referensi resource. Flag ini hanya boleh digunakan dengan flag --static-lib.
-h Menampilkan menu bantuan.
-v Memungkinkan penambahan panjang output.

Dump

dump digunakan untuk mencetak informasi tentang APK yang Anda buat menggunakan perintah link.

Sintaksis Dump

Sintaksis umum untuk menggunakan dump adalah sebagai berikut:

aapt2 dump sub-command filename.apk [options]

Contoh berikut mencetak konten dari tabel resource APK yang ditentukan:

aapt2 dump resources output.apk

Sub-perintah Dump

Tentukan salah satu sub-perintah berikut dengan perintah dump:

Tabel 4. Sub-perintah Dump

Sub-perintahDeskripsi
apc Mencetak konten AAPT2 Container (APC) yang dibuat selama proses kompilasi.
badging Mencetak informasi yang diekstraksi dari manifes APK.
configurations Mencetak setiap konfigurasi yang digunakan oleh resource di APK.
overlayable Mencetak resource APK yang dapat ditempati overlay.
packagename Mencetak nama paket APK.
permissions Mencetak izin yang diekstrak dari manifes APK.
strings Mencetak konten gabungan string tabel resource APK.
styleparents Mencetak induk gaya yang digunakan di APK.
resources Mencetak konten tabel resource APK.
xmlstrings Mencetak string dari XML yang dikompilasi APK.
xmltree Mencetak hierarki XML yang dikompilasi APK.

Opsi Dump

Gunakan opsi berikut dengan dump:

Tabel 5. Opsi Dump

OpsiDeskripsi
--no-values Menekan output nilai saat menampilkan resource.
--file file Menentukan file sebagai argumen yang akan dibuang dari APK.
-v Menambah panjang output.

Diff

Gunakan diff untuk membandingkan dua APK dan mengidentifikasi perbedaan di antara keduanya.

Sintaksis Diff

Sintaksis umum untuk menggunakan diff adalah sebagai berikut:

aapt2 diff first.apk second.apk

Tidak ada opsi untuk perintah diff.

Optimize

optimize digunakan untuk menjalankan pengoptimalan pada resource yang digabungkan dan resources.arsc sebelum dikemas ke dalam APK. Pengoptimalan ini dapat mengurangi ukuran APK sekitar 1-3%, bergantung pada ukuran dan jumlah resource yang digunakan.

Sintaksis Optimize

Sintaksis umum untuk menggunakan optimize adalah sebagai berikut:

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

Contoh berikut mengoptimalkan resource di input.apk dan membuat APK baru yang dioptimalkan di output.apk. Ini menggantikan representasi tabel datar biasa dengan hierarki penelusuran biner yang lebih ringkas, sehingga menghasilkan APK yang lebih kecil dengan mengorbankan performa pengambilan:

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

Opsi Optimize

Anda dapat menggunakan opsi berikut dengan optimize:

Tabel 6. Opsi Optimize

OpsiDeskripsi
-o path Menentukan jalur output untuk APK resource yang tertaut.

Flag ini diperlukan karena Anda harus menentukan jalur untuk APK output yang dapat menyimpan resource yang tertaut.

-d directory Menentukan jalur ke direktori output untuk pemisahan.
-x path Menentukan jalur ke file konfigurasi XML.
-p Mencetak artefak multi-APK dan keluar.
--target-densities density[,density[..]] Menentukan daftar yang dipisahkan koma untuk kepadatan layar yang menjadi tujuan pengoptimalan APK. Semua resource yang tidak akan digunakan pada perangkat dengan kepadatan yang diberikan akan dihapus dari APK.
--resources-config-path path

Menentukan jalur ke file resources.cfg yang berisi daftar resource dan perintah untuk setiap resource.

Format: type/resource_name#[directive][,directive]

-c config[,config[..]] Menentukan daftar konfigurasi yang dipisahkan koma yang akan disertakan. Default-nya adalah semua konfigurasi.
--split path:config[,config[..]] Memisahkan resource berdasarkan suatu rangkaian konfigurasi untuk menghasilkan versi APK yang berbeda.

Anda harus menentukan jalur ke APK output beserta rangkaian konfigurasi.

--keep-artifacts artifact[,artifact[..]] Menentukan daftar artefak yang dipisahkan koma yang akan disimpan. Jika tidak ada yang ditentukan, semua artefak akan disimpan.
--enable-sparse-encoding Mengaktifkan encoding entri sparse menggunakan hierarki penelusuran biner. Opsi ini berguna untuk pengoptimalan ukuran APK, tetapi performa pengambilan resource harus dikorbankan.
--collapse-resource-names Menciutkan nama resource menjadi satu nilai dalam kumpulan string kunci. Resource dikecualikan menggunakan perintah no_collapse dalam file yang ditentukan oleh --resources-config-path.
--shorten-resource-paths Mempersingkat jalur resource di dalam APK.
--resource-path-shortening-map path Menentukan jalur untuk menampilkan peta jalur resource lama ke jalur yang disingkat.
-v Menambah panjang output.
-h Menampilkan bantuan alat.

Convert

Secara default, perintah compile AAPT mengompilasi resource ke dalam format biner yang sesuai untuk APK. Anda juga dapat menentukan format protobuf yang cocok untuk AAB dengan menentukan --proto-format. Perintah convert mengonversi APK di antara dua format.

Sintaksis Convert

Sintaksis umum untuk convert adalah sebagai berikut:

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

Contoh berikut mengonversi resource di input.apk dan membuat APK baru di output.apk yang berisi resource format protobuf. Ini menggantikan representasi tabel datar biasa dengan hierarki penelusuran biner yang lebih ringkas, sehingga menghasilkan APK yang lebih kecil dengan mengorbankan performa pengambilan:

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

Opsi Convert

Gunakan opsi berikut dengan convert:

Tabel 7. Opsi Convert

OpsiDeskripsi
-o path

Menentukan jalur output untuk APK resource yang tertaut.

Flag ini diperlukan karena Anda harus menentukan jalur untuk APK output yang dapat menyimpan resource yang tertaut.

--output-format [proto|binary] Format output. Nilai yang diterima adalah proto dan binary. Jika tidak ditetapkan, setelan defaultnya adalah binary.
--enable-sparse-encoding Mengaktifkan encoding entri sparse menggunakan hierarki penelusuran biner. Opsi ini berguna untuk pengoptimalan ukuran APK, tetapi performa pengambilan resource harus dikorbankan.
--keep-raw-values Mempertahankan nilai atribut raw dalam file XML.
-v Menambah panjang output.
-h Menampilkan bantuan alat.

Mode Daemon

AAPT versi 2.19 memperkenalkan mode daemon untuk mengeluarkan perintah. Mode daemon memungkinkan Anda memasukkan beberapa perintah dalam satu sesi AAPT.

Sintaksis Daemon

Mulai mode daemon dengan perintah berikut:

aapt2 daemon

Setelah mode daemon berjalan, Anda dapat memasukkan perintah. Setiap argumen perintah harus berada di baris terpisah, dengan baris kosong di akhir perintah. Keluar dari mode daemon dengan mengetik Control+D.

Pertimbangkan masing-masing perintah compile berikut:

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/

Perintah ini dapat dimasukkan dalam mode daemon sebagai:

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

Opsi mode Daemon

Satu-satunya opsi untuk mode daemon adalah --trace-folder folder, yang menghasilkan fragmen rekaman aktivitas JSON systrace ke folder yang ditentukan.

Versi

Tentukan versi AAPT2 yang Anda gunakan dengan perintah version:

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

Perubahan perilaku saat menggunakan AAPT2

Sebelum AAPT2, AAPT adalah versi default Android Asset Packaging Tool, yang sekarang tidak digunakan lagi. Meskipun AAPT2 dapat langsung berfungsi dengan project lama, bagian ini menjelaskan beberapa perubahan perilaku yang harus Anda ketahui.

Hierarki elemen dalam manifes Android

Dalam versi AAPT sebelumnya, elemen yang dibuat bertingkat dalam node yang salah pada file AndroidManifest.xml akan diabaikan atau mengakibatkan munculnya peringatan. Misalnya, perhatikan contoh berikut:

<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 versi sebelumnya akan mengabaikan tag <action> yang salah tempat.

Dengan AAPT2, Anda akan menerima error berikut:

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

Untuk mengatasi masalah ini, pastikan elemen manifes dibuat bertingkat dengan benar. Untuk mengetahui informasi selengkapnya, baca ringkasan Manifes Aplikasi.

Deklarasi resource

Anda tidak lagi dapat menunjukkan jenis resource dari atribut name. Contoh berikut salah mendeklarasikan item resource attr:

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

Mendeklarasikan jenis resource dengan cara ini akan mengakibatkan error build seperti berikut:

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

Untuk mengatasi error ini, deklarasikan jenis menggunakan type="attr" secara eksplisit:

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

Selain itu, saat mendeklarasikan elemen <style>, induknya juga harus berupa jenis resource gaya. Jika tidak, Anda akan mendapatkan error seperti berikut:

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

Penggunaan simbol referensi resource @ yang salah

AAPT2 akan menampilkan error build saat Anda menghilangkan atau salah menempatkan simbol referensi resource (@). Misalnya, jika Anda menghilangkan simbol saat menentukan atribut gaya:

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

Saat membuat modul, AAPT2 akan menampilkan error build seperti berikut:

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

Selain itu, jika Anda salah menyertakan simbol saat mengakses resource dari namespace android:

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

Saat membuat modul, AAPT2 akan menampilkan error build seperti berikut:

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

Konfigurasi library yang salah

Jika aplikasi Anda memiliki dependensi di library pihak ketiga yang dibuat menggunakan versi lama Android SDK Build Tools, aplikasi mungkin akan berhenti bekerja pada runtime tanpa menampilkan error atau peringatan apa pun. Error ini mungkin terjadi karena selama pembuatan library, kolom R.java dideklarasikan sebagai final. Akibatnya, semua ID resource disisipkan dalam class library.

AAPT2 bergantung pada kemampuan untuk menetapkan ulang ID ke resource library saat mem-build aplikasi Anda. Jika library mengasumsikan ID adalah final dan menyisipkannya di DEX library, akan terjadi ketidakcocokan runtime.

Untuk mengatasi error ini, hubungi pembuat library untuk mem-build ulang library menggunakan versi terbaru Android SDK Build Tools dan memublikasikannya lagi.