Kompilasi dengan Jack (AOSP 6.0 - 8.1)

Jack adalah toolchain build Android default untuk Android 6.0 - 8.1

Jack adalah rantai alat Android yang mengkompilasi sumber Java menjadi bytecode dex Android. Anda tidak perlu melakukan apa pun secara berbeda untuk menggunakan Jack - cukup gunakan perintah makefile standar untuk mengkompilasi pohon atau proyek Anda. Android 8.1 adalah rilis terakhir yang menggunakan Jack.

Tentang Jack

Jack bekerja seperti yang ditunjukkan pada Gambar 1.

Ikhtisar Jack.

Gambar 1. Ikhtisar jack.

Format perpustakaan Jack

Jack memiliki format file .jack sendiri yang berisi kode dex yang telah dikompilasi sebelumnya untuk perpustakaan, memungkinkan kompilasi yang lebih cepat (pra-dex).

Isi file perpustakaan Jack.

Gambar 2. Isi file perpustakaan Jack.

jill

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

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

Gambar 3. Alur kerja untuk mengimpor perpustakaan .jar yang ada.

Server kompilasi Jack

Pertama kali Jack digunakan, ia meluncurkan server kompilasi Jack lokal di komputer Anda. pelayan ini:

  • Membawa percepatan intrinsik karena menghindari peluncuran host JRE JVM baru, memuat kode Jack, menginisialisasi Jack, dan menghangatkan JIT di setiap kompilasi. 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 membebani komputer Anda secara berlebihan (masalah memori atau disk) karena membatasi jumlah kompilasi paralel.

Server Jack mati sendiri setelah waktu idle tanpa kompilasi apa pun. Ia menggunakan dua port TCP pada antarmuka localhost dan tidak tersedia secara eksternal. Semua parameter (jumlah kompilasi paralel, batas waktu, nomor port, dll.) dapat dimodifikasi dengan mengedit file $HOME/.jack .

$HOME/.jack mengajukan

File $HOME/.jack berisi pengaturan berikut untuk variabel server Jack dalam sintaks 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 keperluan admin.
  • SERVER_COUNT=1 tidak digunakan.
  • SERVER_NB_COMPILE=4 menetapkan jumlah maksimum kompilasi paralel yang diperbolehkan. SERVER_TIMEOUT=60 menyetel jumlah detik idle yang harus ditunggu server tanpa kompilasi apa pun sebelum mati sendiri. SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log} menyetel file tempat log server ditulis. Secara default, variabel ini dapat dibebani secara berlebihan 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 dibebani oleh variabel lingkungan.

Memecahkan masalah kompilasi Jack

Masalah Tindakan
Komputer Anda menjadi tidak responsif selama kompilasi atau Anda mengalami kegagalan kompilasi Jack karena kesalahan kehabisan memori Kurangi jumlah kompilasi Jack secara bersamaan dengan mengedit $HOME/.jack dan mengubah SERVER_NB_COMPILE ke nilai yang lebih rendah.
Kompilasi gagal pada 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 membuka blokir situasi, nonaktifkan server kompilasi Jack dengan mengedit $HOME/.jack dan mengubah SERVER menjadi false . Sayangnya hal ini memperlambat kompilasi Anda secara signifikan dan mungkin memaksa Anda untuk meluncurkan make -j dengan kontrol beban (opsi -l dari make ).
Kompilasi terhenti tanpa kemajuan apa pun Untuk membuka blokir situasi, matikan server latar belakang Jack menggunakan jack-admin kill-server ) lalu hapus direktori sementara yang terdapat dalam jack-$USER dari direktori sementara Anda ( /tmp atau $TMPDIR ).

Temukan log Jack

Jika Anda menjalankan perintah make dengan target dist, 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 detail dengan mengatur variabel berikut:

export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"

Gunakan perintah makefile standar untuk mengkompilasi pohon (atau proyek Anda) dan melampirkan keluaran dan kesalahan standar. Untuk menghapus log build terperinci, jalankan:

unset ANDROID_JACK_EXTRA_ARGS

Keterbatasan 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 mengatur SERVER=false di $HOME/.jack . Kompilasi CTS 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.

Pra-dex

Saat membuat file perpustakaan Jack, .dex perpustakaan dibuat dan disimpan di dalam file perpustakaan .jack sebagai pre-dex. Saat kompilasi, Jack menggunakan kembali pre-dex dari setiap perpustakaan. Semua perpustakaan sudah dipra-dex.

Perpustakaan Jack dengan pre-dex.

Gambar 4. Pustaka Jack dengan pre-dex.

Jack tidak menggunakan kembali perpustakaan pre-dex jika penyusutan, kebingungan, atau pengemasan ulang digunakan dalam kompilasi.

Kompilasi tambahan

Kompilasi tambahan berarti hanya komponen yang disentuh sejak kompilasi terakhir (dan dependensinya) yang dikompilasi ulang. Kompilasi tambahan bisa jauh lebih cepat daripada kompilasi penuh ketika perubahan terbatas pada sekumpulan komponen.

Kompilasi tambahan dinonaktifkan secara default (dan secara otomatis dinonaktifkan ketika penyusutan, kebingungan, pengemasan ulang, atau warisan multi-dex diaktifkan). Untuk mengaktifkan build inkremental, tambahkan baris berikut ke file Android.mk proyek yang ingin Anda build secara bertahap:

LOCAL_JACK_ENABLED := incremental

Menyusut dan kebingungan

Jack menggunakan file konfigurasi ProGuard untuk mengaktifkan penyusutan dan kebingungan.

Opsi umum mencakup hal berikut:

  • @
  • -include
  • -basedirectory
  • -injars
  • -outjars (hanya mendukung 1 jar keluaran)
  • -libraryjars
  • -keep
  • -keepclassmembers
  • -keepclasseswithmembers
  • -keepnames
  • -keepclassmembernames
  • -keepclasseswithmembernames
  • -printseeds

Opsi penyusutan mencakup hal berikut:

  • -dontshrink

Opsi kebingungan 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 preverifikasi)
  • -skipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclassmembers
  • -keepdirectories
  • -target
  • -forceprocessing
  • -printusage
  • -whyareyoukeeping
  • -optimizations
  • -optimizationpasses
  • -assumenosideeffects
  • -allowaccessmodification
  • -mergeinterfacesaggressively
  • -overloadaggressively
  • -microedition
  • -verbose
  • -dontnote
  • -dontwarn
  • -ignorewarnings
  • -printconfiguration
  • -dump

Mengemas kembali

Jack menggunakan file konfigurasi jarjar untuk melakukan pengemasan ulang. Meskipun Jack kompatibel dengan tipe aturan "rule", Jack tidak kompatibel dengan tipe aturan "zap" atau "keep".

Dukungan multideks

Jack menawarkan dukungan multidex bawaan dan lama. Karena file dex dibatasi pada 65 ribu metode, aplikasi dengan lebih dari 65 ribu metode harus dipecah menjadi beberapa file dex. Untuk detail selengkapnya, lihat Mengaktifkan multidex untuk aplikasi dengan lebih dari 64 ribu metode