Mengompilasi dengan Jack (AOSP 6.0 - 8.1)

Jack adalah toolchain build Android default untuk Android 6.0 - 8.1

Jack adalah toolchain Android yang mengompilasi sumber Java ke bytecode dex Android. Anda tidak perlu melakukan sesuatu yang berbeda untuk menggunakan Jack - cukup gunakan perintah makefile standar untuk mengompilasi struktur atau project Anda. Android 8.1 adalah rilis terakhir yang menggunakan Jack.

Tentang Jack

Jack berfungsi seperti yang ditunjukkan dalam Gambar 1.

Ringkasan Jack.

Gambar 1. Ringkasan Jack.

Format pustaka 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).

Isi file library Jack.

Gambar 2. Isi file library Jack.

Jill

Seperti yang ditunjukkan pada gambar berikut, alat Jill menerjemahkan library .jar yang ada ke dalam format library baru.

Alur kerja untuk mengimpor library `jar.` yang ada.

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 memanaskan JIT di setiap kompilasi. Compiler 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 pada komputer Anda (masalah memori atau disk) karena server membatasi jumlah kompilasi paralel.

Server Jack akan mati sendiri setelah waktu tidak aktif tanpa kompilasi apa pun. Aplikasi ini menggunakan dua port TCP pada antarmuka localhost dan tidak tersedia secara eksternal. Semua parameter (jumlah kompilasi paralel, waktu tunggu, jumlah 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 ditunggu server tanpa kompilasi apa pun sebelum mematikan dirinya sendiri. SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log} menetapkan file tempat log server ditulis. Secara default, variabel ini dapat di-overload 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 di-overload oleh variabel lingkungan.

Memecahkan masalah kompilasi Jack

Masalah Tindakan
Komputer Anda tidak merespons selama kompilasi atau Anda mengalami Kompilasi Jack gagal karena error Kehabisan memori Kurangi jumlah kompilasi Jack serentak dengan mengedit $HOME/.jack dan mengubah SERVER_NB_COMPILE ke nilai yang lebih rendah.
Kompilasi gagal karena 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 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 dapat memaksa Anda meluncurkan make -j dengan kontrol pemuatan (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 ada di jack-$USER direktori sementara Anda (/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 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 dengan tepat. Anda juga dapat menonaktifkan server Jack dengan menyetel 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.

Pre-dex

Saat membuat file library Jack, .dex library akan dibuat dan disimpan di dalam file library .jack sebagai pre-dex. Saat mengompilasi, Jack menggunakan kembali pre-dex dari setiap library. Semua library telah di-pre-dex.

Library Jack dengan pra-dex.

Gambar 4. Library Jack dengan pra-dex.

Jack tidak menggunakan kembali pra-dex library jika penyusutan, pengaburan, atau pengemasan ulang digunakan dalam kompilasi.

Kompilasi inkremental

Kompilasi inkremental berarti hanya komponen yang diubah 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 penyusutan, pengaburan, pengemasan ulang, atau multi-dex lama diaktifkan). Untuk mengaktifkan build inkremental, tambahkan baris berikut ke file Android.mk project yang ingin Anda bangun secara inkremental:

LOCAL_JACK_ENABLED := incremental

Pengecilan dan pengaburan

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 pengaburan mencakup hal berikut:

  • -dontobfuscate
  • -printmapping
  • -applymapping
  • -obfuscationdictionary
  • -classobfuscationdictionary
  • -packageobfuscationdictionary
  • -useuniqueclassmembernames
  • -dontusemixedcaseclassnames
  • -keeppackagenames
  • -flattenpackagehierarchy
  • -repackageclasses
  • -keepattributes
  • -adaptclassstrings

Opsi yang diabaikan meliputi:

  • -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 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 detail selengkapnya, lihat Mengaktifkan multidex untuk aplikasi dengan lebih dari 64K metode