Android 6.0–8.1 için Jack ile derleme

Jack, Java kaynağını Android dex bayt koduna derleyen bir Android araç zinciridir. Jack'i kullanmak için farklı bir şey yapmanız gerekmez — ağacı veya projenizi derlemek için standart makefile komutlarınızı kullanın. Android 8.1, Jack'i kullanan son sürümdür.

Jack hakkında

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

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

Jack kitaplık biçimi

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

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

Jill

Jill aracı, mevcut .jar kitaplıklarını aşağıda gösterildiği gibi yeni kitaplık biçimine çevirir.

.Jar kitaplıklarını Jill ile içe aktarma
Şekil 3. Mevcut bir .jar kitaplığını içe aktarmak için iş akışı

Jack derleme sunucusu

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

  • Yeni bir ana bilgisayar JRE JVM'yi başlatmayı, Jack kodunu yüklemeyi, Jack'i başlatmayı ve her derlemede JIT'i ısıtmayı engellediği için içsel bir hızlanma getirir. Ayrıca küçük derlemeler sırasında (örneğin 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 derlemelerin sayısını sınırladığı için bilgisayarınızın aşırı yüklenmesini önler (bellek veya disk sorunu).

Jack sunucusu, herhangi bir derleme yapılmadan boşta geçen bir sürenin ardından kendini kapatır. Localhost arabiriminde iki TCP bağlantı noktası kullanır ve harici olarak kullanılamaz. Tüm parametreler (paralel derlemelerin 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ı, tam bir bash sözdiziminde Jack sunucu değişkenleri için aşağıdaki ayarları içerir:

  • SERVER=true , Jack'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öneticinin amaçları için 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ı ayarlar.
  • SERVER_TIMEOUT=60 , sunucunun kendisini kapatmadan önce herhangi bir derleme olmadan beklemesi gereken boş saniye sayısını belirler.
  • SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log} sunucu günlüklerinin yazıldığı dosyayı ayarlar. Varsayılan olarak, bu değişken bir ortam değişkeni tarafından aşırı yüklenebilir.
  • JACK_VM_COMMAND=${JACK_VM_COMMAND:=java} , ana bilgisayarda bir 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üklenebilir.

Jack derlemelerinde sorun giderme

Sorun Aksiyon
Bilgisayarınız derleme sırasında yanıt vermiyor veya Bellek yetersiz hatası nedeniyle Jack derlemelerinin başarısız olduğunu görüyorsanız $HOME/.jack ve SERVER_NB_COMPILE daha düşük bir değere değiştirerek eşzamanlı Jack derlemelerinin sayısını azaltın.
Derlemeler başarısız oluyor, Arka plan sunucusu başlatılamıyor Bunun en olası nedeni, bilgisayarınızda TCP bağlantı noktalarının zaten kullanılmış olmasıdır. $HOME/.jack ( SERVER_PORT_SERVICE ve SERVER_PORT_ADMIN değişkenleri) düzenleyerek bağlantı noktalarını değiştirin. Durumu engelini kaldırmak için, düzenleyerek Jack derleme sunucusunu devre dışı $HOME/.jack ve değişen SERVER için false . Ne yazık ki bu, derlemenizi önemli ölçüde yavaşlatır ve sizi yük kontrolü ile make -j başlatmaya zorlayabilir ( make seçeneği -l ).
Derleme herhangi bir ilerleme olmadan takılıyor Durumun engelini kaldırmak için, Jack jack-admin kill-server server'ı kullanarak Jack arka plan sunucusunu öldürün ve ardından geçici dizininizin jack-$USER $TMPDIR bulunan geçici dizinleri kaldırın ( /tmp veya $TMPDIR ).

Jack günlüğünü bulma

Uzak bir hedefle bir make komutu çalıştırdıysanız, Jack günlüğü $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log . Aksi takdirde, jack-admin server-log çalıştırarak günlüğü bulabilirsiniz. Tekrarlanabilir Jack arızaları durumunda, aşağıdaki değişkeni ayarlayarak daha ayrıntılı bir günlük elde edebilirsiniz:

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

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

unset ANDROID_JACK_EXTRA_ARGS

Jack sınırlamaları

  • Varsayılan olarak, Jack sunucusu 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 buna göre SERVER_NB_COMPILE ayarlayın. Jack sunucusunu $HOME/.jack içinde SERVER=false olarak ayarlayarak da devre dışı bırakabilirsiniz.
  • Mevcut vm-tests-tf entegrasyonu nedeniyle CTS derlemesi yavaş.
  • Bayt kodu işleme araçları (JaCoCo gibi) desteklenmez.

Jack kullanma

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

Ön dexing

Bir Jack kitaplık dosyası oluştururken, kitaplığın .dex oluşturulur ve ön dex olarak .jack kitaplık dosyası içinde saklanır. Jack, derlerken her kitaplıktaki ön dex'i yeniden kullanır. Tüm kütüphaneler önceden tanımlanmıştır.

Ön dex içeren Jack kütüphaneleri
Şekil 4. Ön dex içeren Jack kitaplıkları

Derlemede küçültme, gizleme veya yeniden paketleme kullanılırsa Jack kitaplık ön dex'i yeniden kullanmaz.

Artımlı derleme

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

Artımlı derleme varsayılan olarak devre dışıdır (ve küçültme, gizleme, yeniden paketleme veya multi-dex mirası etkinleştirildiğinde otomatik olarak devre dışı bırakılır). Artımlı derlemeleri etkinleştirmek için, artımlı olarak oluşturmak istediğiniz projenin Android.mk dosyasına aşağıdaki satırı ekleyin:

LOCAL_JACK_ENABLED := incremental

Küçülme ve şaşırtma

Jack, küçültmeyi ve gizlemeyi etkinleştirmek için ProGuard yapılandırma dosyalarını kullanır.

Yaygın seçenekler şunları içerir:

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

Küçültme seçenekleri şunları içerir:

  • -dontshrink

Gizleme seçenekleri şunları içerir:

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

Yoksayılan seçenekler şunları içerir:

  • -dontoptimize (Jack optimize etmez)
  • -dontpreverify (Jack onaylamaz)
  • -skipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclassmembers
  • -keepdirectories
  • -target
  • -forceprocessing
  • -printusage
  • -whyareyoukeeping
  • -optimizations
  • -optimizationpasses
  • -assumenosideeffects
  • -allowaccessmodification
  • -mergeinterfacesaggressively
  • -overloadaggressively
  • -microedition
  • -verbose
  • -dontnote
  • -dontwarn
  • -ignorewarnings
  • -printconfiguration
  • -dump

Yeniden paketleme

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

Multidex desteği

Jack, yerel ve eski multidex desteği sunar. Dex dosyaları 65.000 yöntemle sınırlı olduğundan, 65.000'den fazla yöntemi olan uygulamaların birden çok dex dosyasına bölünmesi gerekir. Daha fazla ayrıntı için 64K'dan fazla yöntem içeren uygulamalar için multidex'i etkinleştirme bölümüne bakın.