d8

d8 adalah alat command line yang digunakan Android Studio dan plugin Android Gradle untuk mengompilasi bytecode Java project Anda ke dalam bytecode DEX yang berjalan di perangkat Android. d8 memungkinkan Anda menggunakan fitur bahasa Java 8 dalam kode aplikasi.

d8 juga disertakan sebagai alat mandiri di Android Build Tools 28.0.1 dan versi yang lebih tinggi: android_sdk/build-tools/version/.

Penggunaan umum

d8 hanya memerlukan jalur ke bytecode Java yang dikompilasi, yang ingin Anda konversi menjadi bytecode DEX. Contoh:

d8 MyProject/app/build/intermediates/classes/debug/*/*.class

Bytecode input dapat berupa kombinasi dari file *.class atau penampung seperti file JAR, APK, atau ZIP. Anda juga dapat menyertakan file DEX untuk d8 agar digabungkan ke dalam output DEX, yang berguna saat menyertakan output dari build inkremental.

Secara default, d8 mengompilasi bytecode Java ke dalam file DEX yang dioptimalkan dan menyertakan informasi debug yang dapat Anda gunakan untuk melakukan debug pada kode selama runtime. Namun, Anda dapat menyertakan flag opsional untuk menjalankan build inkremental, menentukan class yang harus dikompilasi ke dalam file DEX utama, dan menentukan jalur ke resource tambahan yang diperlukan untuk menggunakan berbagai fitur bahasa Java 8.

d8 path-to-input-files [options]

Tabel berikut menjelaskan flag opsional yang dapat Anda gunakan dengan d8:

Opsi Deskripsi
--debug

Mengompilasi bytecode DEX agar menyertakan informasi debug, seperti tabel simbol debug.

Opsi ini diaktifkan secara default. Untuk menyertakan informasi debug dalam bytecode DEX, d8 mengharapkan bahwa bytecode Java input mencakup informasi tersebut. Misalnya, jika menggunakan javac untuk mengompilasi kode, Anda harus meneruskan flag -g guna menyertakan informasi debug dalam bytecode Java output.

Saat mengompilasi file DEX untuk versi rilis aplikasi atau library, gunakan flag --release.

--release

Mengompilasi bytecode DEX tanpa informasi debug. Namun, d8 menyertakan beberapa informasi yang digunakan saat membuat pelacakan tumpukan dan mencatat pengecualian.

Teruskan flag ini saat mengompilasi bytecode untuk rilis publik.

--output path

Tetapkan jalur yang diinginkan untuk output DEX. Secara default, d8 meng-output file DEX di direktori kerja saat ini.

Jika Anda menentukan jalur dan nama file ZIP atau JAR, d8 akan membuat file yang ditentukan dan menyertakan file DEX output. Jika Anda menentukan jalur ke direktori yang sudah ada, d8 akan meng-output file DEX dalam direktori tersebut.

--lib android_sdk/platforms/api-level/android.jar Tentukan jalur ke android.jar Android SDK Anda. Flag ini diperlukan saat mengompilasi bytecode yang menggunakan fitur bahasa Java 8.
--classpath path Tetapkan resource classpath yang mungkin diperlukan d8 untuk mengompilasi file DEX project Anda. Secara khusus, d8 mengharuskan Anda menentukan resource tertentu saat mengompilasi bytecode yang menggunakan fitur bahasa Java 8.
--min-api number Menetapkan level API minimum yang perlu didukung oleh file DEX output.
--intermediate Teruskan flag ini untuk memberi tahu d8 bahwa Anda tidak mengompilasi set lengkap bytecode Java project Anda. Flag ini berguna saat menjalankan build inkremental. Daripada mengompilasi file DEX yang dioptimalkan yang ingin Anda jalankan di perangkat, d8 membuat file DEX perantara dan menyimpannya di output atau jalur default yang ditentukan.

Jika ingin mengompilasi file DEX yang ingin Anda jalankan di perangkat, kecualikan flag ini dan tentukan jalur ke class DEX perantara sebagai input.

--file-per-class

Kompilasi setiap class ke dalam file DEX terpisah.

Dengan mengaktifkan flag ini, Anda dapat menjalankan lebih banyak build inkremental dengan mengompilasi ulang class yang telah berubah saja. Saat menjalankan build inkremental menggunakan plugin Android Gradle, pengoptimalan ini akan diaktifkan secara default.

Flag ini tidak dapat digunakan bersama dengan --main-dex-list.

--no-desugaring Menonaktifkan fitur bahasa Java 8. Gunakan flag ini hanya jika Anda tidak bermaksud mengompilasi bytecode Java yang menggunakan fitur bahasa Java 8.
--main-dex-list path

Menentukan file teks yang mencantumkan class yang harus disertakan oleh d8 dalam file DEX utama, yang biasanya bernama classes.dex. Jika Anda tidak menentukan daftar class menggunakan flag ini, d8 tidak menjamin class mana yang akan disertakan dalam file DEX utama.

Karena sistem Android memuat file DEX utama terlebih dahulu saat memulai aplikasi, Anda dapat menggunakan flag ini untuk memprioritaskan class tertentu saat memulai aplikasi dengan mengompilasinya ke dalam file DEX utama. Ini sangat berguna ketika mendukung multidex lama, karena hanya class dalam file DEX utama yang tersedia saat runtime hingga library multidex lama dimuat.

Perlu diingat, setiap file DEX harus tetap memenuhi batas referensi 64K. Jadi, jangan menentukan terlalu banyak class untuk file DEX utama, atau Anda akan mendapatkan error kompilasi. Secara default, saat menentukan class menggunakan --main-dex-list, d8 hanya menyertakan class tersebut dalam file DEX utama. Hal ini untuk membuat masalah yang terkait dengan class yang hilang dari file DEX utama lebih mudah di-debug. Jika Anda menentukan mode --release, d8 akan mencoba mengurangi jumlah file DEX yang dikemas ke dalam versi rilis aplikasi Anda dengan menyertakan sebanyak mungkin class lain dalam file DEX utama hingga batas 64 K tercapai.

Flag ini tidak dapat digunakan bersama dengan --file-per-class.

--pg-map file Gunakan file sebagai file pemetaan untuk distribusi.
--file-per-class-file

Membuat file DEX terpisah per file input .class.

Mempertahankan class sintetis dengan class asalnya.

--desugared-lib file

Tentukan konfigurasi library desugaring.

file adalah file konfigurasi library desugaring dalam format JSON.

--main-dex-rules file Proguard mempertahankan aturan untuk class yang akan ditempatkan di file DEX utama.
--main-dex-list-output file Menghasilkan daftar DEX utama yang dihasilkan dalam file.

--force-enable-assertions [:class_or_package_name...]

--force-ea [:class_or_package_name...]

Aktifkan secara paksa kode pernyataan yang dihasilkan javac.

--force-disable-assertions [:class_or_package_name...]

--force-da [:class_or_package_name...]

Menonaktifkan kode pernyataan yang dihasilkan javac secara paksa. Ini adalah penanganan default kode pernyataan javac saat membuat file DEX.

--force-passthrough-assertions [:class_or_package_name...]

--force-pa [:class_or_package_name...]

Jangan ubah kode pernyataan yang dihasilkan javac. Ini adalah penanganan default kode pernyataan javac saat membuat file class.

--force-assertions-handler:handler method [:class_or_package_name...]

--force-ah:handler method [:class_or_package_name...]

Ubah kode pernyataan yang dihasilkan javac dan kotlinc untuk memanggil metode handler method dengan setiap error pernyataan, bukan menampilkannya. handler method ditentukan sebagai nama class, diikuti dengan titik dan nama metode. Metode pengendali harus mengambil satu argumen dari jenis java.lang.Throwable dan memiliki jenis nilai yang ditampilkan void.
--thread-count number of threads Menentukan jumlah thread yang akan digunakan untuk kompilasi. Jika tidak ditentukan, jumlah akan didasarkan pada heuristik, dengan mempertimbangkan jumlah core.
--map-diagnostics[ :type] from-level to-level Diagnostik peta type (default any) dilaporkan sebagai from-level hingga to-level, dengan from-level dan to-level adalah salah satu dari 'info', 'peringatan', atau 'error' dan type opsional adalah nama jenis Java yang sederhana atau sepenuhnya memenuhi syarat untuk diagnostik. Jika type tidak ditentukan, semua diagnostik di from-level akan dipetakan. Perhatikan bahwa error compiler fatal tidak dapat dipetakan.
--version Cetak versi d8 yang sedang Anda gunakan.
--help Cetak teks bantuan untuk menggunakan d8.

Menjalankan build inkremental

Untuk meningkatkan kecepatan build selama pengembangan, seperti untuk build continuous integration, minta d8 untuk hanya mengompilasi sebagian bytecode Java project Anda. Misalnya, jika dexing per class diaktifkan, Anda dapat mengompilasi ulang hanya class yang telah Anda ubah sejak build sebelumnya.

Perintah berikut menjalankan build inkremental untuk beberapa class dan memungkinkan dexing per class. Perintah ini juga menentukan direktori output untuk build inkremental.

d8 MainActivity.class R.class --intermediate --file-per-class --output ~/build/intermediate/dex

Saat menjalankan build inkremental, d8 akan menyimpan informasi tambahan dalam output DEX. d8 kemudian menggunakan informasi tersebut untuk memproses opsi --main-dex-list dan menggabungkan file DEX dengan benar selama build penuh aplikasi.

Misalnya, saat memproses class lambda Java 8, d8 melacak class lambda mana yang dibuat untuk setiap class input. Selama build penuh, saat d8 menyertakan class dalam file DEX utama, build akan memeriksa metadata untuk memastikan semua class lambda yang dibuat untuk class tersebut juga disertakan dalam file DEX utama.

Jika Anda telah mengompilasi semua bytecode project Anda ke dalam file DEX di beberapa build inkremental, jalankan build penuh dengan meneruskan direktori file DEX perantara ke d8, seperti yang ditunjukkan dalam perintah berikut. Selain itu, Anda dapat menentukan class yang ingin dikompilasi d8 ke dalam file DEX utama menggunakan --main-dex-list. Karena inputnya adalah kumpulan file yang telah dikompilasi ke dalam bytecode DEX, build ini akan selesai lebih cepat daripada build bersih.

d8 ~/build/intermediate/dex --release --main-dex-list ~/build/classes.txt --output ~/build/release/dex

Mengompilasi bytecode yang menggunakan fitur bahasa Java 8

d8 memungkinkan Anda menggunakan fitur bahasa Java 8 dalam kode melalui proses kompilasi yang disebut desugaring. Desugaring mengonversi fitur bahasa yang berguna ini menjadi bytecode yang dapat berjalan di platform Android.

Android Studio dan plugin Android Gradle menyertakan resource classpath yang diperlukan d8 untuk mengaktifkan desugaring. Namun, jika menggunakan d8 dari command line, Anda perlu menyertakannya sendiri.

Salah satu resource tersebut adalah android.jar dari Android SDK target Anda. Resource ini mencakup sekumpulan API platform Android. Tentukan jalurnya menggunakan flag --lib.

Resource lainnya adalah set bytecode Java yang dikompilasi ke dalam project Anda, yang saat ini tidak Anda kompilasi ke dalam bytecode DEX, tetapi Anda perlukan untuk mengompilasi class lain ke dalam bytecode DEX.

Misalnya, jika kode Anda menggunakan metode antarmuka default dan statis, yang merupakan fitur bahasa Java 8, Anda harus menggunakan flag ini untuk menentukan jalur ke semua bytecode Java project Anda, meskipun Anda tidak bermaksud mengompilasi semua bytecode ke dalam bytecode DEX. Hal itu dikarenakan d8 memerlukan informasi ini untuk memahami kode project Anda dan menyelesaikan panggilan ke metode antarmuka.

Contoh kode berikut menjalankan build inkremental dari sebuah class yang mengakses metode antarmuka default:

d8 MainActivity.class --intermediate --file-per-class --output ~/build/intermediate/dex
--lib android_sdk/platforms/api-level/android.jar
--classpath ~/build/javac/debug