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, Saat mengompilasi file DEX untuk versi rilis aplikasi atau
library, gunakan flag |
--release
|
Mengompilasi bytecode DEX tanpa informasi debug. Namun,
Teruskan flag ini saat mengompilasi bytecode untuk rilis publik. |
--output path
|
Tetapkan jalur yang diinginkan untuk output DEX. Secara default,
Jika Anda menentukan jalur dan nama file ZIP atau JAR, |
--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
|
--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 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
Flag ini tidak dapat digunakan bersama dengan
|
--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 |
|
Aktifkan secara paksa kode pernyataan yang dihasilkan javac .
|
|
Menonaktifkan kode pernyataan yang dihasilkan javac secara paksa. Ini adalah penanganan default kode pernyataan javac saat membuat file DEX.
|
|
Jangan ubah kode pernyataan yang dihasilkan javac . Ini adalah penanganan default kode pernyataan javac saat membuat file class .
|
|
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