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,
Saat mengompilasi file DEX untuk versi rilis aplikasi atau
library, gunakan flag |
--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, |
--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
|
--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
Flag ini tidak dapat digunakan bersama dengan
|
--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.jar
dari 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