d8

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, 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 Anda atau library, sebagai gantinya, gunakan flag --release.

--release

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

Meneruskan flag ini saat mengompilasi bytecode untuk rilis publik.

--output path

Menentukan jalur yang diinginkan untuk output DEX. Secara {i>default<i}, d8 menghasilkan file DEX dalam mode kerja saat ini 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 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 --main-dex-list.

--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 d8 dalam file DEX utama, yang biasanya bernama classes.dex. Ketika Anda tidak menentukan daftar kelas menggunakan penanda ini, d8 tidak menjamin class mana yang disertakan dalam modul utama file DEX.

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 --main-dex-list, d8 hanya menyertakan item dalam file DEX utama. Ini untuk membuat masalah yang berkaitan dengan class hilang dari file DEX utama, akan lebih mudah di-debug. Jika Anda menentukan Mode --release, d8 mencoba mengurangi jumlah dari file DEX yang dikemas ke dalam versi rilis aplikasi Anda dengan termasuk sebanyak mungkin kelas lain dalam file DEX utama sampai batas 64K terpenuhi.

Anda tidak dapat menggunakan penanda ini saat menentukan juga --file-per-class.

--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 file.

--force-enable-assertions [:class_or_package_name...]

--force-ea [:class_or_package_name...]

Aktifkan kode pernyataan yang dibuat javac secara paksa.

--force-disable-assertions [:class_or_package_name...]

--force-da [:class_or_package_name...]

Nonaktifkan secara paksa kode pernyataan yang dibuat javac. Ini adalah penanganan default kode pernyataan javac saat menghasilkan file DEX.

--force-passthrough-assertions [:class_or_package_name...]

--force-pa [:class_or_package_name...]

Jangan mengubah kode pernyataan yang dibuat javac. Ini adalah penanganan default kode pernyataan javac saat menghasilkan file class.

--force-assertions-handler:handler method [:class_or_package_name...]

--force-ah:handler method [:class_or_package_name...]

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