Jack adalah toolchain build Android default untuk Android 6.0 - 8.1, yang digunakan untuk mengompilasi sumber Java ke bytecode dex Android seperti yang ditunjukkan pada Gambar 1:
Gambar 1. Ringkasan Jack.
Format file .jack berisi kode dex yang telah dikompilasi sebelumnya untuk library, sehingga memungkinkan kompilasi yang lebih cepat (pre-dex).
Gambar 2. Isi file library Jack.
Alat Jill
Alat Jill menerjemahkan library .jar yang ada ke dalam format library .jack baru, seperti yang ditunjukkan pada Gambar 3:
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:
- Menghadirkan peningkatan kecepatan intrinsik karena menghindari peluncuran JVM JRE host baru, memuat kode Jack, menginisialisasi Jack, dan memanaskan JIT pada setiap kompilasi. Server ini juga memberikan waktu kompilasi yang sangat baik selama kompilasi kecil (misalnya, dalam mode inkremental).
- Merupakan solusi jangka pendek untuk mengontrol jumlah kompilasi Jack paralel. Server ini menghindari pemuatan berlebih pada komputer Anda (masalah memori atau disk) karena membatasi jumlah kompilasi paralel.
Server Jack akan dimatikan sendiri setelah waktu tidak ada aktivitas tanpa kompilasi. Server ini menggunakan dua port TCP pada antarmuka localhost dan tidak tersedia secara eksternal.
Semua parameter (seperti jumlah kompilasi paralel, waktu tunggu, dan nomor port) dapat diubah dengan mengedit file $HOME/.jack.
File $HOME/.jack
File $HOME/.jack berisi setelan berikut untuk variabel server Jack dalam sintaks bash lengkap:
SERVER=truemengaktifkan fitur server Jack.SERVER_PORT_SERVICE=8072menetapkan nomor port TCP server untuk tujuan kompilasi.SERVER_PORT_ADMIN=8073menetapkan nomor port TCP server untuk tujuan admin.SERVER_COUNT=1tidak digunakan.SERVER_NB_COMPILE=4menetapkan jumlah maksimum kompilasi paralel yang diizinkan.SERVER_TIMEOUT=60menetapkan jumlah detik tidak ada aktivitas yang harus ditunggu server tanpa kompilasi sebelum dimatikan sendiri.SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log}menetapkan file tempat log server ditulis. Secara default, variabel ini dapat dimuat berlebih 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 dimuat berlebih oleh variabel lingkungan.
Memecahkan masalah kompilasi Jack
| Masalah | Tindakan |
|---|---|
| Komputer Anda tidak responsif selama kompilasi atau Anda mengalami kompilasi Jack yang gagal karena Error kehabisan memori | Kurangi jumlah kompilasi Jack simultan dengan mengedit $HOME/.jack dan mengubah SERVER_NB_COMPILE ke nilai yang lebih rendah. |
| Kompilasi gagal karena Tidak dapat meluncurkan server latar belakang | Penyebab 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 mengatasi situasi ini, nonaktifkan server kompilasi
Jack dengan mengedit $HOME/.jack dan mengubah
SERVER menjadi false. Sayangnya, hal ini akan memperlambat kompilasi Anda secara signifikan dan mungkin memaksa Anda meluncurkan make -j dengan kontrol beban (opsi -l dari make). |
| Kompilasi macet tanpa ada progres | Untuk mengatasi situasi ini, hentikan 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 akan 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 pohon (atau project Anda) dan melampirkan 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 bagian ini. Gunakan perintah makefile standar untuk mengompilasi pohon atau project Anda.
Pre-dex
Saat membuat file library Jack, .dex library akan dibuat dan disimpan di dalam file library .jack sebagai pre-dex. Saat mengompilasi, Jack akan menggunakan kembali pre-dex dari setiap library. Semua library di-pre-dex.
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 kompilasi terakhir (dan dependensinya) yang dikompilasi ulang. Kompilasi inkremental dapat jauh lebih cepat daripada kompilasi penuh jika perubahan terbatas pada sekumpulan 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 mencakup hal berikut:
@-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 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
Pengemasan ulang
Jack menggunakan file konfigurasi jarjar untuk melakukan pengemasan ulang. Meskipun Jack 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 hingga 65 ribu metode, aplikasi dengan lebih dari 65 ribu metode harus dibagi menjadi beberapa file dex. Untuk mengetahui informasi selengkapnya, lihat Mengaktifkan multidex untuk aplikasi dengan lebih dari 64 ribu metode.