Jack adalah rantai alat Android yang mengkompilasi sumber Java ke dalam bytecode dex Android. Anda tidak perlu melakukan sesuatu yang berbeda untuk menggunakan Jack—cukup gunakan perintah makefile standar Anda untuk mengkompilasi pohon atau proyek Anda. Android 8.1 adalah rilis terakhir yang menggunakan Jack.
Tentang Jack
Jack bekerja seperti yang ditunjukkan pada Gambar 1.
format perpustakaan jack
Jack memiliki format file .jack
sendiri yang berisi kode dex pra-kompilasi untuk perpustakaan, memungkinkan kompilasi lebih cepat (pre-dex).
Jill
Alat Jill menerjemahkan pustaka .jar
yang ada ke dalam format pustaka baru, seperti yang ditunjukkan di bawah ini.
.jar
yang adaServer kompilasi jack
Pertama kali Jack digunakan, ia meluncurkan server kompilasi Jack lokal di komputer Anda. Server ini:
- Membawa percepatan intrinsik karena menghindari peluncuran host baru JRE JVM, memuat kode Jack, menginisialisasi Jack, dan pemanasan JIT di setiap kompilasi. Ini juga menyediakan waktu kompilasi yang sangat baik selama kompilasi kecil (misalnya, dalam mode inkremental).
- Adalah solusi jangka pendek untuk mengontrol jumlah kompilasi Jack paralel. Server menghindari kelebihan beban komputer Anda (masalah memori atau disk) karena membatasi jumlah kompilasi paralel.
Server Jack mati sendiri setelah waktu idle tanpa kompilasi apa pun. Ini menggunakan dua port TCP pada antarmuka localhost dan tidak tersedia secara eksternal. Semua parameter (jumlah kompilasi paralel, batas waktu, nomor port, dll.) dapat dimodifikasi dengan mengedit file $HOME/.jack
.
$HOME/.jack file
File $HOME/.jack
berisi pengaturan berikut untuk variabel server Jack dalam sintaks bash lengkap:
-
SERVER=true
mengaktifkan fitur server Jack. -
SERVER_PORT_SERVICE=8072
menyetel nomor port TCP server untuk tujuan kompilasi. -
SERVER_PORT_ADMIN=8073
menyetel nomor port TCP server untuk tujuan admin. -
SERVER_COUNT=1
tidak digunakan. -
SERVER_NB_COMPILE=4
menetapkan jumlah maksimum kompilasi paralel yang diizinkan. -
SERVER_TIMEOUT=60
menyetel jumlah detik idle yang harus ditunggu server tanpa kompilasi apa pun sebelum mematikan dirinya sendiri. -
SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log}
menyetel file tempat log server ditulis. Secara default, variabel ini dapat di-overload oleh variabel lingkungan. -
JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}
menyetel perintah default yang digunakan untuk meluncurkan JVM pada host. Secara default, variabel ini dapat di-overload oleh variabel lingkungan.
Memecahkan masalah kompilasi Jack
Masalah | Tindakan |
---|---|
Komputer Anda menjadi tidak responsif selama kompilasi atau Anda mengalami kegagalan kompilasi Jack pada kesalahan Kehabisan memori | Kurangi jumlah kompilasi Jack secara bersamaan dengan mengedit $HOME/.jack dan mengubah SERVER_NB_COMPILE ke nilai yang lebih rendah. |
Kompilasi gagal pada Tidak dapat meluncurkan server latar belakang | Kemungkinan besar penyebabnya adalah port TCP sudah digunakan di komputer Anda. Ubah port dengan mengedit $HOME/.jack ( variabel SERVER_PORT_SERVICE dan SERVER_PORT_ADMIN ). Untuk membuka blokir situasi, nonaktifkan server kompilasi Jack dengan mengedit $HOME/.jack dan mengubah SERVER menjadi false . Sayangnya ini secara signifikan memperlambat kompilasi Anda dan mungkin memaksa Anda untuk meluncurkan make -j dengan kontrol beban (opsi -l dari make ). |
Kompilasi macet tanpa kemajuan apa pun | Untuk membuka blokir situasi, matikan server latar belakang Jack menggunakan jack-admin kill-server ) lalu hapus direktori sementara yang terdapat di jack-$USER dari direktori sementara Anda ( /tmp atau $TMPDIR ). |
Menemukan log Jack
Jika Anda menjalankan perintah make
dengan target dist, log Jack terletak di $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log
. Jika tidak, Anda dapat menemukan log dengan menjalankan jack-admin server-log
. Jika terjadi kegagalan Jack yang dapat direproduksi, Anda bisa mendapatkan log yang lebih detail dengan menyetel variabel berikut:
export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"
Gunakan perintah makefile standar untuk mengkompilasi pohon (atau proyek Anda) dan melampirkan keluaran dan kesalahan standar. Untuk menghapus log build mendetail, jalankan:
unset ANDROID_JACK_EXTRA_ARGS
Batasan Jack
- Secara default, server Jack hanya dapat digunakan oleh satu pengguna di komputer. Untuk mendukung pengguna tambahan, pilih nomor port yang berbeda untuk setiap pengguna dan sesuaikan
SERVER_NB_COMPILE
. Anda juga dapat menonaktifkan server Jack dengan menyetelSERVER=false
di$HOME/.jack
. - Kompilasi CTS lambat karena integrasi
vm-tests-tf
saat ini. - Alat manipulasi bytecode (seperti JaCoCo) tidak didukung.
Menggunakan Jack
Jack mendukung bahasa pemrograman Java 1.7 dan mengintegrasikan fitur tambahan yang dijelaskan di bawah ini.
Pra-dexing
Saat membuat file pustaka Jack, .dex
pustaka dibuat dan disimpan di dalam file pustaka .jack
sebagai pra-dex. Saat kompilasi, Jack menggunakan kembali pre-dex dari setiap perpustakaan. Semua perpustakaan sudah di-dex sebelumnya.
Jack tidak menggunakan kembali pra-deks perpustakaan jika penyusutan, kebingungan, atau pengemasan ulang digunakan dalam kompilasi.
kompilasi tambahan
Kompilasi tambahan berarti bahwa hanya komponen yang disentuh sejak kompilasi terakhir (dan dependensinya) yang dikompilasi ulang. Kompilasi tambahan dapat secara signifikan lebih cepat daripada kompilasi penuh ketika perubahan terbatas pada satu set komponen.
Kompilasi tambahan dinonaktifkan secara default (dan secara otomatis dinonaktifkan saat menyusut, mengaburkan, mengemas ulang, atau warisan multi-dex diaktifkan). Untuk mengaktifkan build inkremental, tambahkan baris berikut ke file Android.mk
dari proyek yang ingin Anda build secara inkremental:
LOCAL_JACK_ENABLED := incremental
Menyusut dan kebingungan
Jack menggunakan file konfigurasi ProGuard untuk mengaktifkan penciutan dan pengaburan.
Opsi umum termasuk yang berikut:
-
@
-
-include
-
-basedirectory
-
-injars
-
-outjars
(hanya 1 stoples keluaran yang didukung) -
-libraryjars
-
-keep
-
-keepclassmembers
-
-keepclasseswithmembers
-
-keepnames
-
-keepclassmembernames
-
-keepclasseswithmembernames
-
-printseeds
Opsi penyusutan meliputi yang berikut:
-
-dontshrink
Opsi kebingungan meliputi yang berikut:
-
-dontobfuscate
-
-printmapping
-
-applymapping
-
-obfuscationdictionary
-
-classobfuscationdictionary
-
-packageobfuscationdictionary
-
-useuniqueclassmembernames
-
-dontusemixedcaseclassnames
-
-keeppackagenames
-
-flattenpackagehierarchy
-
-repackageclasses
-
-keepattributes
-
-adaptclassstrings
Opsi yang diabaikan termasuk yang berikut:
-
-dontoptimize
(Jack tidak mengoptimalkan) -
-dontpreverify
(Jack tidak melakukan verifikasi) -
-skipnonpubliclibraryclasses
-
-dontskipnonpubliclibraryclasses
-
-dontskipnonpubliclibraryclassmembers
-
-keepdirectories
-
-target
-
-forceprocessing
-
-printusage
-
-whyareyoukeeping
-
-optimizations
-
-optimizationpasses
-
-assumenosideeffects
-
-allowaccessmodification
-
-mergeinterfacesaggressively
-
-overloadaggressively
-
-microedition
-
-verbose
-
-dontnote
-
-dontwarn
-
-ignorewarnings
-
-printconfiguration
-
-dump
Mengemas kembali
Jack menggunakan file konfigurasi jarjar untuk melakukan pengemasan ulang. Meskipun Jack kompatibel dengan jenis aturan "aturan", Jack tidak kompatibel dengan jenis aturan "zap" atau "keep".
Dukungan multidex
Jack menawarkan dukungan multidex asli dan lama. Karena file dex terbatas pada 65 ribu metode, aplikasi dengan lebih dari 65 ribu metode harus dipecah menjadi beberapa file dex. Untuk detail selengkapnya, lihat Mengaktifkan multidex untuk aplikasi dengan lebih dari 64 ribu metode .