Android 6.0–8.1 için Jack ile derleme

Jack, Java kaynağını Android dex bayt kodunda 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. Jack'e genel bakış

Jack kitaplığı formatı

Jack'in, kitaplık için önceden derlenmiş dex kodunu içeren kendi .jack dosya formatı vardır, bu da daha hızlı derlemeye (pre-dex) izin verir.

Jack kitaplığı dosya içeriği
Şekil 2. Jack kitaplığı dosya içeriği

Jill

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

Jill ile .jar kitaplıklarını 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 başlatmaktan, Jack kodunu yüklemekten, Jack'i başlatmaktan ve her derlemede JIT'i ısıtmaktan kaçındığı 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 (bellek veya disk sorunu) önler.

Jack sunucusu herhangi bir derleme yapmadan 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 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ı, tam bir bash sözdiziminde Jack sunucusu 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önetici 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şta saniye sayısını ayarlar.
  • 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 Eylem
Derleme sırasında bilgisayarınız yanıt vermiyor veya Jack derlemelerinde yetersiz bellek yetersiz hatasıyla karşılaşıyorsunuz $HOME/.jack 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 başarısız oluyor Arka plan sunucusu başlatılamıyor Bunun en olası nedeni, TCP bağlantı noktalarının bilgisayarınızda 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. Durumun engellemesini kaldırmak için, Jack derleme sunucusunu $HOME/.jack ve SERVER öğesini false olarak değiştirerek devre dışı bırakın. Ne yazık ki bu, derlemenizi önemli ölçüde yavaşlatır ve sizi yük kontrolüyle make -j başlatmaya zorlayabilir (seçenek -l make ).
Derleme herhangi bir ilerleme olmadan takılıyor Durumun engellemesini kaldırmak için Jack arka plan sunucusunu jack-admin kill-server server kullanarak sonlandırın, ardından geçici dizininizin jack-$USER içinde bulunan geçici dizinleri kaldırın ( /tmp veya $TMPDIR ).

Jack günlüğünü bulma

Dist hedefiyle bir make komutu çalıştırdıysanız, Jack günlüğü $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log bulunur. 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 alabilirsiniz:

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 SERVER_NB_COMPILE öğesini buna göre ayarlayın. Jack sunucusunu $HOME/.jack içinde SERVER=false ayarını yaparak da devre dışı bırakabilirsiniz.
  • Mevcut vm-tests-tf entegrasyonu nedeniyle CTS derlemesi yavaş.
  • Bayt kodu işleme 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.

ön düzeltme

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

ön-dex ile Jack kitaplıkları
Şekil 4. Pre-dex'li Jack kitaplıkları

Derlemede küçültme, karartma veya yeniden paketleme kullanılıyorsa, Jack kitaplık pre-dex'ini yeniden kullanmaz.

artımlı derleme

Artımlı derleme, yalnızca son derlemeden bu yana dokunulan bileşenlerin (ve bağımlılıklarının) yeniden derlenmesi anlamına gelir. Değişiklikler bir dizi bileşenle 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 küçültme, şaşırtma, yeniden paketleme veya çok yönlü eski sürüm etkinleştirildiğinde otomatik olarak devre dışı bırakılır). Artımlı yapıları etkinleştirmek için, aşamalı 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 karartmayı etkinleştirmek için ProGuard yapılandırma dosyalarını kullanır.

Ortak seçenekler aşağıdakileri 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 aşağıdakileri içerir:

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

Yok sayılan seçenekler şunları içerir:

  • -dontoptimize (Jack 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

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

multideks desteği

Jack, yerel ve eski multidex desteği sunar. Dex dosyaları 65K yöntemlerle sınırlı olduğundan, 65K'dan 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önteme sahip uygulamalar için multidex'i etkinleştirme bölümüne bakın.