Jack ile derle (AOSP 6.0 - 8.1)

Jack, Android 6.0 - 8.1 için varsayılan Android derleme araç zinciridir.

Jack, Java kaynak kodunu Android dex bytecode'ına derleyen bir Android araç zinciridir. Jack'i kullanmak için farklı bir şey yapmanız gerekmez. Ağ veya projenizi derlemek için standart makefile komutlarınızı kullanmanız yeterlidir. Jack'in kullanıldığı son sürüm Android 8.1'dir.

Jack hakkında

Jack, Şekil 1'de gösterildiği gibi çalışır.

Jack'e genel bakış.

Şekil 1. Jack'e genel bakış.

Kriko kitaplığı biçimi

Jack, kitaplık için önceden derlenmiş dex kodunu içeren kendi .jack dosya biçimine sahiptir. Bu, daha hızlı derlemeye (önceden dex) olanak tanır.

Jack kitaplık dosyası içeriği.

Şekil 2. Jack kitaplık dosyası içeriği.

Jale

Aşağıdaki şekilde gösterildiği gibi Jill aracı, mevcut .jar kitaplıklarını yeni kitaplık biçimine dönüştürür.

Mevcut bir "jar" kitaplığını içe aktarma iş akışı.

Şekil 3. Mevcut bir .jar kitaplığını içe aktarma iş akışı.

Jack derleme sunucusu

bakın.

Jack ilk kez kullanıldığında bilgisayarınızda yerel bir Jack derleme sunucusu başlatılır. Bu sunucu:

  • Her derlemede yeni bir ana makine JRE JVM'si başlatmayı, Jack kodunu yüklemeyi, Jack'i başlatmayı ve JIT'yi ısıtmayı önlediği için doğal bir hızlanma sağlar. Ayrıca küçük derlemeler sırasında (ör. artımlı modda) çok iyi derleme süreleri sağlar.
  • Paralel Jack derlemelerinin sayısını kontrol etmek için kısa vadeli bir çözümdür. Sunucu, paralel derleme sayısını sınırlandırdığı için bilgisayarınızın aşırı yüklenmesini (bellek veya disk sorunu) önler.

Jack sunucusu, herhangi bir derleme yapılmadan boşta kalma süresinden sonra kendini kapatır. Bu protokol, localhost arayüzünde iki TCP bağlantı noktası kullanır ve harici olarak kullanılamaz. Tüm parametreler (paralel derleme sayısı, zaman aşımı, bağlantı noktası sayısı vb.) $HOME/.jack dosyası düzenlenerek değiştirilebilir.

$HOME/.jack dosyası

$HOME/.jack dosyası, Jack sunucu değişkenleri için tam bir bash söz diziminde aşağıdaki ayarları içerir:

  • SERVER=true, Caner'in sunucu özelliğini etkinleştirir.
  • SERVER_PORT_SERVICE=8072, derleme amacıyla sunucunun TCP bağlantı noktası numarasını ayarlar.
  • SERVER_PORT_ADMIN=8073, yönetici amaçlı olarak sunucunun TCP bağlantı noktası numarasını ayarlar.
  • SERVER_COUNT=1 kullanılmıyor.
  • SERVER_NB_COMPILE=4, izin verilen maksimum paralel derleme sayısını belirler. SERVER_TIMEOUT=60, sunucunun kendini kapatmadan önce herhangi bir derleme yapmadan beklemesi gereken boş saniye sayısını ayarlar. SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log} sunucu günlüklerinin yazılacağı dosyayı ayarlar. Varsayılan olarak bu değişken, bir ortam değişkeni tarafından aşırı yüklenmeye karşı korunabilir.
  • JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}, ana makinede JVM başlatmak için kullanılan varsayılan komutu ayarlar. Varsayılan olarak bu değişken, ortam değişkeni tarafından aşırı yüklenmeye karşı korunabilir.

Jack derlemeleriyle ilgili sorunları giderme

Sorun İşlem
Bilgisayarınız derleme sırasında yanıt vermez veya Jack derlemeleri Bellek yetersizliği hatası nedeniyle başarısız olur $HOME/.jack değerini düzenleyerek ve SERVER_NB_COMPILE değerini daha düşük bir değere değiştirerek eşzamanlı Jack derlemelerinin sayısını azaltın.
Derlemeler Arka plan sunucusu başlatılamıyor hatasıyla başarısız oluyor Bunun en olası nedeni, bilgisayarınızda TCP bağlantı noktalarının zaten kullanılıyor olmasıdır. $HOME/.jack'ü (SERVER_PORT_SERVICE ve SERVER_PORT_ADMIN değişkenleri) düzenleyerek raporları değiştirin. Bu durumun engelini kaldırmak için $HOME/.jack dosyasını düzenleyip SERVER değerini false olarak değiştirerek Jack derleme sunucusunu devre dışı bırakın. Maalesef bu durum derleme işleminizi önemli ölçüde yavaşlatır ve make -j'ü yükleme kontrolüyle (make'deki -l seçeneği) başlatmaya zorlayabilir.
Derleme, ilerleme kaydedemeden takılıyor Bu durumun engellemesini kaldırmak için jack-admin kill-server kullanarak Jack arka plan sunucusunu kapatın, ardından geçici dizininizin (/tmp veya $TMPDIR) jack-$USER bölümündeki geçici dizinleri kaldırın.

Jack günlüğünü bulma

dist hedefi içeren bir make komutu çalıştırdıysanız Jack günlüğü $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log adresinde bulunur. Aksi takdirde jack-admin server-log komutunu çalıştırarak günlüğü bulabilirsiniz. Tekrarlanabilir Jack hataları durumunda aşağıdaki değişkeni ayarlayarak daha ayrıntılı bir günlük alabilirsiniz:

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

Ağacı (veya projenizi) derlemek ve standart çıkışı ve hatayı eklemek için standart makefile komutlarını kullanın. Ayrıntılı derleme günlüklerini kaldırmak için şu komutu çalıştırın:

unset ANDROID_JACK_EXTRA_ARGS

Kriko sınırlamaları

Jack sunucusu varsayılan olarak bir bilgisayarda yalnızca bir kullanıcı tarafından kullanılabilir. Ek kullanıcıları desteklemek için her kullanıcı için farklı bağlantı noktası numaraları seçin ve SERVER_NB_COMPILE değerini buna göre ayarlayın. Jack sunucusunu $HOME/.jack'te SERVER=false olarak ayarlayarak da devre dışı bırakabilirsiniz. Mevcut vm-tests-tf entegrasyonu nedeniyle CTS derlemesi yavaş. Bayt kodu değiştirme araçları (JaCoCo gibi) desteklenmez.

Jack'i kullanma

Jack, Java programlama dili 1.7'yi destekler ve aşağıda açıklanan ek özellikleri entegre eder.

dex'e dönüştürme

Jack kütüphane dosyası oluşturulurken kütüphanenin .dex oluşturulur ve .jack kütüphane dosyasında ön dex olarak saklanır. Jack, derleme yaparken her kitaplıktaki ön dex'i yeniden kullanır. Tüm kitaplıklar önceden derlenmiştir.

Önceden derlenmiş kitaplıklara bağlayın.

Şekil 4. Önceden derlenmiş kitaplıklara bağlayın.

Derlemede sıkıştırma, karartma veya yeniden paketleme kullanılıyorsa Jack, kitaplığı dex öncesi olarak yeniden kullanmaz.

Artımlı derleme

Artımlı derleme, yalnızca son derlemeden bu yana değiştirilen bileşenlerin (ve bunların bağımlılarının) yeniden derlendiği anlamına gelir. Değişiklikler bir bileşen grubuyla sınırlı olduğunda artımlı derleme, tam derlemeden önemli ölçüde daha hızlı olabilir.

Artımlı derleme varsayılan olarak devre dışıdır (ve sıkıştırma, karartma, yeniden paketleme veya eski çoklu dex etkinleştirildiğinde otomatik olarak devre dışı bırakılır). Artımlı derlemeleri etkinleştirmek için artımlı olarak derlemek istediğiniz projenin Android.mk dosyasına aşağıdaki satırı ekleyin:

LOCAL_JACK_ENABLED := incremental

Kod küçültme ve kod karartma

Jack, sıkıştırma ve karartma özelliğini etkinleştirmek için ProGuard yapılandırma dosyalarını kullanır.

Sık kullanılan seçenekler şunlardır:

  • @
  • -include
  • -basedirectory
  • -injars
  • -outjars (yalnızca 1 çıkış jar dosyası desteklenir)
  • -libraryjars
  • -keep
  • -keepclassmembers
  • -keepclasseswithmembers
  • -keepnames
  • -keepclassmembernames
  • -keepclasseswithmembernames
  • -printseeds

Shrinking seçenekleri şunlardır:

  • -dontshrink

Kod karartma seçenekleri şunlardır:

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

Yoksayılan seçenekler şunlardır:

  • -dontoptimize (Cem optimize etmez)
  • -dontpreverify (Jack ön doğrulama yapmaz)
  • -skipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclassmembers
  • -keepdirectories
  • -target
  • -forceprocessing
  • -printusage
  • -whyareyoukeeping
  • -optimizations
  • -optimizationpasses
  • -assumenosideeffects
  • -allowaccessmodification
  • -mergeinterfacesaggressively
  • -overloadaggressively
  • -microedition
  • -verbose
  • -dontnote
  • -dontwarn
  • -ignorewarnings
  • -printconfiguration
  • -dump

Yeniden paketleme

Cem, yeniden paketleme yapmak için jarjar yapılandırma dosyalarını kullanır. Jack, "kurallar" kural türleriyle uyumlu olsa da "sil" veya "sakla" kural türleriyle uyumlu değildir.

Multidex desteği

Jack, yerleşik ve eski çoklu dex desteği sunar. Dex dosyaları 65.000 yöntemle sınırlı olduğundan 65.000'den fazla yöntem içeren uygulamalar birden fazla dex dosyasına bölünmelidir. Daha fazla bilgi için 64.000'den fazla yöntem içeren uygulamalarda çoklu dizinleri etkinleştirme başlıklı makaleyi inceleyin.