Jack adalah toolchain build Android default untuk Android 6.0 - 8.1
Jack adalah toolchain Android yang mengompilasi sumber Java menjadi bytecode dex Android. Anda tidak perlu melakukan hal yang berbeda untuk menggunakan Jack - cukup gunakan perintah makefile standar untuk mengompilasi hierarki atau project Anda. Android 8.1 adalah rilis terakhir yang menggunakan Jack.
Tentang Jack
Jack berfungsi seperti yang ditunjukkan pada Gambar 1.
Gambar 1. Ringkasan Jack.
Format library Jack
Jack memiliki format file .jack
sendiri yang berisi kode dex yang telah dikompilasi sebelumnya
untuk library, sehingga memungkinkan kompilasi yang lebih cepat (pra-dex).
Gambar 2. Konten file library Jack.
Jill
Seperti yang ditunjukkan pada gambar berikut, alat Jill menerjemahkan library
.jar
yang ada ke dalam format library baru.
Gambar 3. Alur kerja untuk mengimpor library .jar
yang ada.
Server kompilasi Jack
Saat pertama kali digunakan, Jack akan meluncurkan server kompilasi Jack lokal di komputer Anda. Server ini:
- Membawa peningkatan kecepatan intrinsik karena menghindari peluncuran JVM JRE host baru, memuat kode Jack, menginisialisasi Jack, dan melakukan pemanasan JIT pada setiap kompilasi. Ini juga memberikan 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 akan otomatis mati setelah waktu tidak ada aktivitas tanpa kompilasi apa pun.
Aplikasi ini menggunakan dua port TCP di antarmuka localhost dan tidak tersedia
secara eksternal. Semua parameter (jumlah kompilasi paralel, waktu tunggu, nomor
port, dll.) dapat diubah dengan mengedit file $HOME/.jack
.
File $HOME/.jack
File $HOME/.jack
berisi setelan berikut untuk variabel server
Jack dalam sintaksis bash lengkap:
SERVER=true
mengaktifkan fitur server Jack.SERVER_PORT_SERVICE=8072
menetapkan nomor port TCP server untuk tujuan kompilasi.SERVER_PORT_ADMIN=8073
menetapkan 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
menetapkan jumlah detik tidak ada aktivitas yang harus menunggu server tanpa kompilasi sebelum dimatikan.SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log}
menetapkan file tempat log server ditulis. Secara default, variabel ini dapat dioverload oleh variabel lingkungan.JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}
menetapkan perintah default yang digunakan untuk meluncurkan JVM di host. Secara default, variabel ini dapat dioverload oleh variabel lingkungan.
Memecahkan masalah kompilasi Jack
Masalah | Tindakan |
---|---|
Komputer Anda tidak merespons selama kompilasi atau Anda mengalami kompilasi Jack yang gagal pada Error kehabisan memori | Kurangi jumlah kompilasi
Jack serentak dengan mengedit $HOME/.jack dan mengubah
SERVER_NB_COMPILE ke nilai yang lebih rendah. |
Kompilasi gagal pada Tidak dapat meluncurkan server latar belakang | Penyebab yang paling mungkin adalah port TCP sudah digunakan di komputer Anda. Ubah
port dengan mengedit $HOME/.jack (variabel SERVER_PORT_SERVICE dan
SERVER_PORT_ADMIN ). Untuk membatalkan pemblokiran situasi, nonaktifkan
server kompilasi Jack dengan mengedit $HOME/.jack dan mengubah
SERVER menjadi false . Sayangnya, hal ini akan memperlambat
kompilasi secara signifikan dan dapat memaksa Anda meluncurkan make -j dengan kontrol
beban (opsi -l dari make ). |
Kompilasi macet tanpa progres apa pun | Untuk menghentikan situasi ini, hentikan server latar belakang Jack menggunakan
jack-admin kill-server ), lalu hapus direktori sementara
yang terdapat di jack-$USER dari direktori sementara
(/tmp atau $TMPDIR ). |
Menemukan log Jack
Jika Anda menjalankan perintah make
dengan target dist, log Jack
berada 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 mendetail dengan
menetapkan variabel berikut:
export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"
Gunakan perintah makefile standar untuk mengompilasi hierarki (atau project Anda) dan lampirkan output dan error 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 menetapkan SERVER=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.
Pra-dex
Saat membuat file library Jack, .dex
library
dibuat dan disimpan di dalam file library .jack
sebagai pre-dex.
Saat mengompilasi, Jack menggunakan kembali pre-dex dari setiap library. Semua library
di-pre-dex.
Gambar 4. Library Jack dengan pra-dex.
Jack tidak menggunakan kembali pra-dex library jika penyingkatan, obfuscation, atau pengemasan ulang digunakan dalam kompilasi.
Kompilasi inkremental
Kompilasi inkremental berarti hanya komponen yang disentuh sejak kompilasi terakhir (dan dependensinya) yang dikompilasi ulang. Kompilasi inkremental dapat jauh lebih cepat daripada kompilasi penuh jika perubahan dibatasi pada serangkaian komponen.
Kompilasi inkremental dinonaktifkan secara default (dan otomatis
dinonaktifkan saat penyingkatan, obfuscation, pengemasan ulang, atau multi-dex lama
diaktifkan). Untuk mengaktifkan build inkremental, tambahkan baris berikut ke
file Android.mk
project yang ingin Anda build secara inkremental:
LOCAL_JACK_ENABLED := incremental
Penyingkatan dan obfuscation
Jack menggunakan file konfigurasi ProGuard untuk mengaktifkan penyingkatan dan obfuscation.
Opsi umum meliputi:
@
-include
-basedirectory
-injars
-outjars
(hanya 1 jar output yang didukung)-libraryjars
-keep
-keepclassmembers
-keepclasseswithmembers
-keepnames
-keepclassmembernames
-keepclasseswithmembernames
-printseeds
Opsi pengecilan meliputi:
-dontshrink
Opsi obfuscation mencakup hal berikut:
-dontobfuscate
-printmapping
-applymapping
-obfuscationdictionary
-classobfuscationdictionary
-packageobfuscationdictionary
-useuniqueclassmembernames
-dontusemixedcaseclassnames
-keeppackagenames
-flattenpackagehierarchy
-repackageclasses
-keepattributes
-adaptclassstrings
Opsi yang diabaikan mencakup hal berikut:
-dontoptimize
(Jack tidak mengoptimalkan)-dontpreverify
(Jack tidak melakukan praverifikasi)-skipnonpubliclibraryclasses
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-keepdirectories
-target
-forceprocessing
-printusage
-whyareyoukeeping
-optimizations
-optimizationpasses
-assumenosideeffects
-allowaccessmodification
-mergeinterfacesaggressively
-overloadaggressively
-microedition
-verbose
-dontnote
-dontwarn
-ignorewarnings
-printconfiguration
-dump
Mengemas ulang
Jack menggunakan file konfigurasi jarjar untuk melakukan pengemasan ulang. Meskipun kompatibel dengan jenis aturan "rule", Jack tidak kompatibel dengan jenis aturan "zap" atau "keep".
Dukungan multidex
Jack menawarkan dukungan multidex bawaan dan lama. Karena file dex dibatasi menjadi 65 ribu metode, aplikasi dengan lebih dari 65 ribu metode harus dibagi menjadi beberapa file dex. Untuk mengetahui detail selengkapnya, lihat Mengaktifkan multidex untuk aplikasi dengan lebih dari 64K metode