d8

d8 adalah alat command line yang digunakan Android Studio dan Plugin Android Gradle untuk mengompilasi bytcode Java project ke bytecode DEX yang beroperasi di perangkat Android, dan 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 mudah digunakan dan hanya memerlukan jalur ke bytecode Java terkompilasi yang ingin dikonversi menjadi bytecode DEX, seperti yang ditunjukkan di bawah.

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 guna menggabungkannya ke dalam output DEX, yang berguna saat menyertakan output dari build tambahan.

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, misalnya, 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 yang dijelaskan di bawah.

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

Anda harus meneruskan flag ini saat mengompilasi bytecode untuk rilis publik.

--output path Menetapkan 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 Menentukan jalur ke android.jar Android SDK Anda. Flag ini diperlukan saat mengompilasi bytecode yang menggunakan fitur bahasa Java 8.
--classpath path Menentukan 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 API level minimum yang harus 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, bukannya mengompilasi file DEX yang dioptimalkan yang Anda harapkan untuk berjalan di perangkat, d8 akan membuat file DEX perantara dan menyimpannya di jalur output atau 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 Mengompilasi 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 d8 dalam file DEX utama, yang biasanya bernama classes.dex. Artinya, jika Anda tidak menentukan daftar class yang menggunakan flag ini, d8 tidak menjamin class mana yang 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, pastikan untuk tidak 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, untuk mempermudah debug masalah yang terkait dengan class yang hilang dari file DEX utama. Jika Anda menentukan mode --release, d8 akan mencoba mengurangi jumlah file DEX yang dipaketkan ke dalam versi rilis aplikasi Anda dengan memasukkan sebanyak mungkin class lain dalam file DEX utama, hingga batas 64K tercapai.

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

--version Mencetak versi d8 yang sedang Anda gunakan.
--help Mencetak teks bantuan untuk menggunakan d8

Menjalankan build inkremental

Untuk meningkatkan kecepatan build selama pengembangan, seperti untuk build continuous integration, Anda dapat meminta d8 agar 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 d8 menjalankan build inkremental, informasi tambahan akan disimpan dalam output DEX yang kemudian digunakannya untuk memproses opsi --main-dex-list dengan benar dan menggabungkan file DEX selama build penuh aplikasi Anda. Misalnya, saat memproses class lambda Java 8, d8 terus melacak class lamdba yang dibuat untuk setiap class input. Selama build penuh, jika menyertakan class dalam file DEX utama, d8 akan memeriksa metadata untuk memastikan semua class lambda yang dibuat untuk class itu juga disertakan dalam file DEX utama.

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

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

Mengompilasi bytecode yang menggunakan fitur bahasa Java 8

Dengan d8, Anda dapat menggunakan fitur bahasa Java 8 dalam kode Anda melalui proses kompilasi yang disebut desugaring, yang 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.jardari Android SDK target Anda. Resource ini mencakup sekumpulan API platform Android, dan Anda menentukan jalurnya menggunakan flag --lib.

Resource lainnya adalah set bytecode Java yang terkompilasi di 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 itu 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