d8

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

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

Penggunaan umum

d8 mudah digunakan dan hanya memerlukan jalur ke bytecode Java terkompilasi yang ingin Anda konversi menjadi bytecode DEX, seperti ditunjukkan di bawah ini.

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

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

Secara default, d8 akan mengompilasi bytecode Java ke dalam file DEX yang dioptimalkan dan menyertakan informasi debug yang dapat Anda gunakan untuk men-debug kode Anda selama runtime. Namun, Anda dapat menyertakan flag opsional untuk, misalnya, menjalankan build inkremental, menentukan class yang harus dikompilasi ke dalam file DEX utama, dan menetapkan 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 input bytecode Java menyertakan informasi tersebut. Misalnya, jika menggunakan javac untuk mengompilasi kode, Anda harus meneruskan flag -g untuk menyertakan informasi debug dalam bytecode Java output.

Saat mengompilasi file DEX untuk versi rilis aplikasi atau library, gunakan flag --release yang dijelaskan di bawah ini.

--release Mengompilasi bytecode DEX tanpa informasi debug. Namun, d8 mencakup 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 untuk 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 di direktori tersebut.

--lib android_sdk/platforms/api-level/android.jar Menetapkan jalur ke android.jar Android SDK Anda. Flag ini diperlukan saat mengompilasi bytecode yang menggunakan fitur bahasa Java 8.
--classpath path Menetapkan resource classpath yang mungkin diperlukan d8 untuk mengompilasi file DEX project Anda. Secara khusus, d8 mengharuskan Anda menetapkan resource tertentu saat mengompilasi bytecode yang menggunakan fitur bahasa Java 8.
--min-api number Menetapkan level API 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 lokasi 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 Android Gradle Plugin, 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 daftar class yang harus disertakan d8 dalam file DEX utama, yang biasanya bernama classes.dex. Artinya, jika Anda tidak menentukan daftar class menggunakan flag ini, d8 tidak menjamin class mana saja 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 64 K. Jadi, pastikan untuk tidak menetapkan terlalu banyak class untuk file DEX utama, atau Anda akan mendapatkan error kompilasi. Secara default, saat menetapkan class menggunakan --main-dex-list, d8 menyertakan class itu saja dalam file DEX utama—untuk mempermudah debug masalah yang terkait dengan class yang hilang dari file DEX utama. Jika Anda menetapkan mode --release, d8 akan mencoba mengurangi jumlah file DEX yang dikemas ke dalam versi rilis aplikasi Anda dengan memasukkan sebanyak mungkin class lain dalam file DEX utama—hingga batas 64 K 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 menetapkan 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 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 akan melacak class lamdba mana saja 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 ini. Selain itu, Anda dapat menentukan class yang perlu dikompilasi d8 ke dalam file DEX utama menggunakan --main-dex-list. Karena inputnya adalah sekumpulan 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 Android Gradle Plugin menyertakan resource classpath yang diperlukan d8 untuk mengaktifkan desugaring. Namun, saat menggunakan d8 dari command line, Anda harus 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 kumpulan bytecode Java 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 karena 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