d8
adalah alat command line yang digunakan Android Studio dan plugin Android Gradle.
gunakan untuk mengompilasi bytecode Java project Anda ke dalam bytecode DEX yang menjalankan
di perangkat Android. d8
memungkinkan Anda menggunakan fitur bahasa Java 8 di
kode aplikasi Google Cloud.
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
yang akan 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 untuk menjalankan build inkremental, tentukan class yang
harus dikompilasi ke dalam file DEX utama, dan menentukan jalur ke
resource tambahan yang diperlukan untuk menggunakan fitur bahasa Java 8.
d8 path-to-input-files [options]
Tabel berikut menjelaskan tanda opsional yang dapat Anda gunakan dengan d8
:
Opsi | Deskripsi |
---|---|
--debug
|
Mengompilasi bytecode DEX agar menyertakan informasi debug, seperti simbol debug tabel sementara. Opsi ini diaktifkan secara default. Untuk menyertakan informasi debug
dalam bytecode DEX, Saat mengompilasi file DEX untuk versi rilis aplikasi Anda atau
library, sebagai gantinya, gunakan flag |
--release
|
Mengompilasi bytecode DEX tanpa informasi debug. Namun,
Meneruskan flag ini saat mengompilasi bytecode untuk rilis publik. |
--output path
|
Menentukan jalur yang diinginkan untuk output DEX. Secara {i>default<i},
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
|
Menentukan resource classpath yang mungkin diperlukan d8 untuk dikompilasi
file DEX project Anda. Secara khusus, d8 mengharuskan Anda
menetapkan sumber daya tertentu saat mengompilasi bytecode yang menggunakan
Fitur bahasa Java 8.
|
--min-api number
|
Menetapkan level API minimum yang Anda inginkan untuk didukung oleh file DEX output. |
--intermediate
|
Teruskan flag ini untuk memberi tahu d8 bahwa Anda tidak mengompilasi
set lengkap bytecode Java project Anda. Penanda ini berguna ketika
dan menjalankan build inkremental. Daripada mengompilasi file DEX yang dioptimalkan
yang diharapkan untuk berjalan di perangkat, d8 membuat kode perantara
file DEX dan menyimpannya dalam 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
|
Mengompilasi setiap class ke dalam file DEX terpisah. Mengaktifkan flag ini memungkinkan Anda menjalankan lebih banyak build inkremental dengan mengompilasi ulang hanya class yang telah berubah. Saat tampil inkremental build menggunakan plugin Android Gradle, pengoptimalan ini adalah diaktifkan secara default. Anda tidak dapat menggunakan penanda ini
saat menentukan juga
|
--no-desugaring
|
Nonaktifkan 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
|
Tentukan file teks yang mencantumkan class yang harus disertakan 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. Hal ini sangat berguna saat mendukung multidex lama, karena hanya class dalam DEX utama tersedia saat runtime hingga library multidex lama dimuat. Perlu diingat, setiap file DEX harus tetap memenuhi
batas referensi 64K. Jadi, jangan
menetapkan terlalu banyak class untuk file DEX utama, atau Anda akan
error kompilasi. Secara default, saat menentukan class menggunakan
Anda tidak dapat menggunakan penanda ini
saat menentukan juga
|
--pg-map file
|
Gunakan file sebagai file pemetaan untuk distribusi. |
--file-per-class-file
|
Buat file DEX terpisah per file .class input. Mempertahankan class sintetis dengan class asalnya. |
--desugared-lib file
|
Menentukan konfigurasi library desugaring. file adalah file konfigurasi library desugaring di JSON format font. |
--main-dex-rules file
|
Proguard menyimpan aturan untuk class agar dapat ditempatkan di file DEX utama. |
--main-dex-list-output file
|
Menghasilkan output daftar DEX utama dalam |
|
Aktifkan kode pernyataan yang dibuat javac secara paksa.
|
|
Nonaktifkan secara paksa kode pernyataan yang dibuat javac . Ini
adalah penanganan default kode pernyataan javac saat
menghasilkan file DEX.
|
|
Jangan mengubah kode pernyataan yang dibuat javac . Ini
adalah penanganan default kode pernyataan javac saat
menghasilkan file class .
|
|
Mengubah pernyataan yang dibuat javac dan kotlinc
kode untuk memanggil metode handler method dengan setiap pernyataan
{i>error<i} alih-alih menampilkannya. handler method ditentukan
sebagai nama class diikuti dengan titik dan nama metode. Tujuan
harus mengambil satu argumen 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 tersebut didasarkan pada heuristik, menggunakan jumlah setiap inti perusahaan. |
--map-diagnostics[
:type] from-level to-level
|
Diagnostik peta type (defaultnya) dilaporkan sebagai from-level ke to-level, dengan from-level dan to-level adalah salah satu dari 'info', 'peringatan', atau 'error' dan type opsional dapat berupa resource sederhana atau sepenuhnya memenuhi syarat Nama jenis Java diagnostik. Jika type tidak ditentukan, semua diagnostik di from-level dipetakan. Perlu diperhatikan 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 continuous integration
build, instruksikan d8
agar hanya mengompilasi subset Java project Anda
bytecode. 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, aplikasi ini akan menyimpan informasi tambahan di
Output DEX. d8
kemudian menggunakan informasi tersebut untuk memproses
--main-dex-list
dan gabungkan file DEX selama build penuh aplikasi.
Misalnya, saat memproses class lambda Java 8, d8
melacak mana yang
class lambda dibuat untuk setiap class input. Selama build penuh, saat d8
menyertakan class dalam file DEX utama, class ini berkonsultasi dengan metadata untuk
class lambda yang dibuat untuk class tersebut juga disertakan dalam
file DEX.
Jika telah mengompilasi semua bytecode project Anda ke dalam file DEX
di beberapa build inkremental, lakukan build penuh dengan meneruskan
file DEX perantara ke d8
, seperti yang ditunjukkan dalam perintah berikut.
Selain itu, Anda dapat menentukan class yang perlu dikompilasi oleh d8
ke dalam class utama
File DEX menggunakan --main-dex-list
. Karena inputnya adalah sekumpulan file yang
sudah dikompilasi ke dalam bytecode DEX, build ini akan selesai lebih cepat
dibandingkan 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 Anda melalui proses kompilasi yang disebut desugaring. Konversi desugaring
fitur bahasa yang berguna ini menjadi bytecode yang dapat berjalan di sistem
terkelola sepenuhnya.
Android Studio dan plugin Android Gradle menyertakan classpath
resource 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. Ini
resource mencakup sekumpulan API platform Android. Tentukan jalurnya menggunakan
flag --lib
.
Resource lain adalah set bytecode Java yang dikompilasi ke dalam project Anda yang saat ini tidak dikompilasi ke dalam bytecode DEX, tetapi perlu mengompilasi ke dalam bytecode DEX.
Misalnya, jika kode Anda menggunakan
metode antarmuka default dan statis, yang merupakan model
8 bahasa, Anda perlu menggunakan penanda ini untuk menentukan jalur ke semua
bytecode Java milik project Anda, meskipun Anda tidak ingin mengompilasi semua bytecode
menjadi 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