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

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

.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çindeSERVER=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.

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.