Jack adalah toolchain build Android default untuk Android 6.0 - 8.1
Jack adalah toolchain Android yang mengompilasi sumber Java ke dalam Android dex bytecode. Anda tidak perlu melakukan sesuatu yang berbeda untuk menggunakan Jack - cukup gunakan perintah makefile standar untuk mengompilasi pohon atau proyek 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 (pre-dex).
Gambar 2. Konten file library Jack.
Jill
Seperti dalam gambar berikut, alat Jill menerjemahkan struktur
.jar
library ke dalam format library baru.
Gambar 3. Alur kerja untuk mengimpor library .jar
yang ada.
Server kompilasi Jack
Pertama kali Jack digunakan, ia meluncurkan server kompilasi Jack lokal pada seperti di komputer Anda. Server ini:
- Membawa percepatan intrinsik karena menghindari peluncuran {i>host<i} JRE JVM, memuat kode Jack, melakukan inisialisasi Jack, dan melakukan pemanasan JIT pada setiap kompilasi. Ini juga menyediakan waktu kompilasi yang sangat baik selama kompilasi (misalnya, dalam mode inkremental).
- Merupakan solusi jangka pendek untuk mengontrol jumlah Jack paralel kompilasi. Server menghindari kelebihan beban pada komputer Anda (masalah memori atau disk) karena membatasi jumlah kompilasi paralel.
Server Jack mati sendiri setelah waktu tidak ada aktivitas tanpa kompilasi apa pun.
Ini menggunakan dua porta TCP di antarmuka {i>localhost<i} dan tidak tersedia
secara eksternal. Semua parameter (jumlah kompilasi paralel, waktu tunggu, port
nomor, dll.) dapat diubah dengan mengedit file $HOME/.jack
.
File $HOME/.jack
File $HOME/.jack
berisi setelan berikut untuk Jack
variabel server dalam sintaks{i> <i}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 paralel yang diizinkan kompilasi.SERVER_TIMEOUT=60
menetapkan jumlah detik tidak ada aktivitas yang dilakukan server harus menunggu tanpa kompilasi apa pun sebelum mematikan dirinya sendiri.SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log}
mengatur file di mana log server ditulis. Secara {i>default<i}, variabel ini dapat kelebihan beban akibat variabel lingkungan.JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}
menetapkan default yang digunakan untuk meluncurkan JVM pada {i>host<i}. Secara {i>default<i}, variabel ini dapat kelebihan beban oleh variabel lingkungan.
Memecahkan masalah kompilasi Jack
Masalah | Tindakan |
---|---|
Komputer Anda menjadi tidak responsif selama kompilasi atau Anda mengalami Kompilasi Jack gagal pada Error memori habis | Mengurangi jumlah Jack secara serentak
kompilasi dengan mengedit $HOME/.jack dan mengubah
SERVER_NB_COMPILE ke nilai yang lebih rendah. |
Kompilasi gagal di Tidak dapat meluncurkan server latar belakang | Penyebab yang paling mungkin adalah porta TCP sudah digunakan di komputer Anda. Mengubah
port dengan mengedit $HOME/.jack (SERVER_PORT_SERVICE dan
variabel SERVER_PORT_ADMIN ). Untuk membatalkan pemblokiran situasi ini, nonaktifkan
Server kompilasi Jack dengan mengedit $HOME/.jack dan mengubah
SERVER untuk false . Sayangnya, hal ini melambat secara signifikan
kompilasi Anda dan dapat memaksa Anda meluncurkan make -j dengan muatan
kontrol (opsi -l dari make ). |
Kompilasi macet tanpa progres | Untuk membuka blokir situasi, matikan server latar belakang Jack menggunakan
jack-admin kill-server ) lalu hapus direktori sementara
ada di jack-$USER direktori sementara Anda
(/tmp atau $TMPDIR ). |
Menemukan log Jack
Jika Anda menjalankan perintah make
dengan dist target, log Jack akan
yang berlokasi 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
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 proyek Anda) dan output standar, dan error. Untuk menghapus log build yang mendetail, jalankan:
unset ANDROID_JACK_EXTRA_ARGS
Batasan Jack
Secara {i>default<i}, server Jack
hanya dapat digunakan oleh satu pengguna di
komputer. Untuk mendukung pengguna tambahan, pilih nomor port yang berbeda untuk setiap
dan menyesuaikan SERVER_NB_COMPILE
. Anda juga dapat menonaktifkan
server Jack dengan menyetel SERVER=false
di $HOME/.jack
.
Kompilasi CTS berjalan lambat karena integrasi vm-tests-tf
saat ini.
Alat manipulasi Bytecode (seperti JaCoCo) tidak didukung.
Gunakan Jack
Jack mendukung bahasa pemrograman Java 1.7 dan mengintegrasikan fitur yang dijelaskan di bawah ini.
Pre-dex
Saat membuat file library Jack, .dex
library akan
dihasilkan dan disimpan di dalam file library .jack
sebagai pre-dex.
Saat mengompilasi, Jack akan menggunakan kembali pre-dex tersebut dari setiap library. Semua library
yang mengalami pre-dexed.
Gambar 4. Library Jack dengan pre-dex.
Jack tidak menggunakan kembali pre-dex library jika penyingkatan, obfuscation, atau pengemasan ulang digunakan dalam kompilasi.
Kompilasi inkremental
Kompilasi inkremental berarti hanya komponen yang disentuh sejak (dan dependensinya) dikompilasi ulang. Kompilasi inkremental dapat jauh lebih cepat daripada kompilasi lengkap ketika perubahan terbatas pada satu set komponen.
Kompilasi inkremental dinonaktifkan secara default (dan secara 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 bangun secara bertahap:
LOCAL_JACK_ENABLED := incremental
Penyusutan dan obfuscation
Jack menggunakan file konfigurasi ProGuard untuk mengaktifkan penyingkatan dan {i>obfuscation<i}.
Opsi umumnya meliputi:
@
-include
-basedirectory
-injars
-outjars
(hanya 1 jar output yang didukung)-libraryjars
-keep
-keepclassmembers
-keepclasseswithmembers
-keepnames
-keepclassmembernames
-keepclasseswithmembernames
-printseeds
Opsi penyingkatan mencakup hal berikut:
-dontshrink
Opsi obfuscation meliputi:
-dontobfuscate
-printmapping
-applymapping
-obfuscationdictionary
-classobfuscationdictionary
-packageobfuscationdictionary
-useuniqueclassmembernames
-dontusemixedcaseclassnames
-keeppackagenames
-flattenpackagehierarchy
-repackageclasses
-keepattributes
-adaptclassstrings
Opsi yang diabaikan meliputi:
-dontoptimize
(Jack tidak mengoptimalkan)-dontpreverify
(Jack tidak dapat melakukan pra-verifikasi)-skipnonpubliclibraryclasses
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-keepdirectories
-target
-forceprocessing
-printusage
-whyareyoukeeping
-optimizations
-optimizationpasses
-assumenosideeffects
-allowaccessmodification
-mergeinterfacesaggressively
-overloadaggressively
-microedition
-verbose
-dontnote
-dontwarn
-ignorewarnings
-printconfiguration
-dump
Kemas ulang
Jack menggunakan file konfigurasi jarjar untuk melakukan pengemasan ulang. Sementara Jack adalah kompatibel dengan "rule" jenis aturan ini, tidak kompatibel dengan "zap" atau "simpan" jenis aturan.
Dukungan multidex
Jack menawarkan dukungan multidex bawaan dan lama. Karena file dex terbatas hingga 65 ribu metode, aplikasi dengan lebih dari 65 ribu metode harus dibagi menjadi beberapa dex . Untuk detail selengkapnya, lihat Mengaktifkan multidex untuk aplikasi dengan lebih dari 64 ribu metode