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 dalam 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.

Ringkasan Jack.

Gambar 1. Ringkasan Jack.

Format library Jack

Jack memiliki format file .jack-nya sendiri yang berisi kode dex yang telah dikompilasi sebelumnya untuk library, sehingga memungkinkan kompilasi yang lebih cepat (pre-dex).

Konten file library Jack.

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.

Alur kerja untuk mengimpor library `jar.` yang sudah 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:

  • Menambahkan percepatan intrinsik karena menghindari peluncuran JRE JVM host baru, memuat kode Jack, menginisialisasi Jack, dan memanaskan JIT pada setiap kompilasi. Hal 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 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. 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 di-overload oleh variabel lingkungan.
  • JACK_VM_COMMAND=${JACK_VM_COMMAND:=java} menetapkan perintah default yang digunakan untuk meluncurkan JVM pada host. Secara default, variabel ini dapat dioverload oleh variabel lingkungan.

Memecahkan masalah kompilasi Jack

Masalah Tindakan
Komputer menjadi tidak responsif selama kompilasi atau Anda mengalami kompilasi Jack gagal saat Error memori habis Kurangi jumlah kompilasi Jack bersamaan 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. 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 memperlambat kompilasi Anda secara signifikan dan dapat memaksa Anda untuk 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 catatan Jack

Jika Anda menjalankan perintah make dengan dist target, 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 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) serta 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 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 tambahan yang dijelaskan di bawah.

Pre-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.

Library Jack dengan pre-dex.

Gambar 4. Library Jack dengan pra-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 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 bangun secara bertahap:

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 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 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 menjadi 65 ribu metode, aplikasi dengan lebih dari 65 ribu metode harus dibagi menjadi beberapa file dex. Untuk detail selengkapnya, lihat Mengaktifkan multidex untuk aplikasi dengan lebih dari metode 64K