Jack, Android 6.0-8.1 için varsayılan Android derleme araç zinciridir.
Jack, Java kaynağını Android dex bayt koduna derleyen bir Android araç zinciriydi. Jack'i kullanmak için farklı bir işlem yapmanız gerekmez. Ağacı veya projenizi derlemek için standart makefile komutlarınızı kullanmanız yeterlidir. Android 8.1, Jack'i kullanan son sürümdür.
Jack hakkında
Jak, Şekil 1'de gösterildiği gibi çalışır.
1. şekil. Jack'e genel bakış
Jack kitaplık biçimi
Jack'in, kitaplık için önceden derlenmiş dex kodunu içeren kendi .jack
dosya biçimi vardır. Bu biçim, daha hızlı derlemeye (önceden dex) olanak tanır.
Şekil 2. Jack kitaplık dosyasının içeriği.
Jill
Aşağıdaki şekilde gösterildiği gibi Jill aracı, mevcut .jar
kitaplıklarını yeni kitaplık biçimine çevirir.
3.Şekil Mevcut bir .jar
kitaplığını içe aktarma iş akışı.
Jack derleme sunucusu
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şlatmaktan, Jack kodunu yüklemekten, Jack'i başlatmaktan ve JIT'yi ısıtmaktan kaçındığı için doğal bir hızlanma sağlar. Ayrıca küçük derlemeler (ör. artımlı modda) sırasında ç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ırlayarak bilgisayarınızın aşırı yüklenmesini (bellek veya disk sorunu) önler.
Jack sunucusu, derleme yapılmayan bir boşta kalma süresinden sonra kendini kapatır.
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ı numarası vb.) $HOME/.jack
dosyası düzenlenerek değiştirilebilir.
$HOME/.jack dosyası
$HOME/.jack
dosyası, tam bash söz diziminde 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ö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 kapanmadan önce derleme olmadan beklemesi gereken boşta kalma süresini saniye cinsinden 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 makinede JVM'yi başlatmak için kullanılan varsayılan komutu ayarlar. Bu değişken, varsayılan olarak ortam değişkeniyle aşırı yüklenebilir.
Jack derlemeleriyle ilgili sorunları giderme
Sorun | İşlem |
---|---|
Derleme sırasında bilgisayarınız yanıt vermiyor veya Bellek yetersiz hatası nedeniyle Jack derlemeleri başarısız oluyor. | $HOME/.jack dosyasını düzenleyip SERVER_NB_COMPILE değerini daha düşük bir değerle değiştirerek eşzamanlı Jack derlemelerinin sayısını azaltın. |
Derlemeler, Arka plan sunucusu başlatılamıyor hatası nedeniyle başarısız oluyor | En olası neden, TCP bağlantı noktalarının bilgisayarınızda zaten kullanılıyor olmasıdır. $HOME/.jack (SERVER_PORT_SERVICE ve SERVER_PORT_ADMIN değişkenleri) düzenleyerek bağlantı noktalarını değiştirin. Bu durumu engellemeyi 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 derlemenizi önemli ölçüde yavaşlatır ve make -j 'ı yükleme kontrolüyle (make 'nin -l seçeneği) başlatmanıza neden olabilir. |
Derleme, ilerleme kaydedilmeden takılıyor | Bu durumu düzeltmek için jack-admin kill-server kullanarak Jack arka plan sunucusunu sonlandırın, ardından geçici dizininizin jack-$USER bölümünde bulunan geçici dizinleri (/tmp veya $TMPDIR ) kaldırın. |
Jack günlüğünü bulma
Bir dist hedefiyle make
komutu çalıştırdıysanız Jack günlüğü $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log
konumunda bulunur.
Aksi takdirde, jack-admin server-log
komutunu çalıştırarak günlüğü bulabilirsiniz.
Yinelenebilir 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 için standart makefile komutlarını kullanın ve standart çıkış ile hatayı ekleyin. Ayrıntılı derleme günlüklerini kaldırmak için şu komutu ç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
ayarını buna göre yapın. Ayrıca SERVER=false
değerini $HOME/.jack
olarak ayarlayarak Jack sunucusunu devre dışı bırakabilirsiniz.
Mevcut vm-tests-tf
entegrasyonu nedeniyle CTS derlemesi yavaş.
Bytecode manipülasyon araçları (ör. JaCoCo) desteklenmez.
Jack'i kullanma
Jack, Java programlama dili 1.7'yi destekler ve aşağıda açıklanan ek özellikleri entegre eder.
Önceden dex'e dönüştürme
Bir Jack kitaplığı dosyası oluşturulurken kitaplığın .dex
değeri oluşturulur ve .jack
kitaplığı dosyasında önceden oluşturulmuş bir dex olarak saklanır.
Jack, derleme sırasında her kitaplığın önceden oluşturulmuş dex'ini yeniden kullanır. Tüm kitaplıklar önceden dexlenir.
Şekil 4. Önceden dexlenmiş Jack kitaplıkları.
Jack, derlemede küçültme, karartma veya yeniden paketleme kullanılıyorsa kitaplığı önceden dex'e dönüştürme işlemini yeniden kullanmaz.
Artımlı derleme
Artımlı derleme, yalnızca son derlemeden bu yana değiştirilen bileşenlerin (ve bağımlılıklarının) yeniden derlendiği anlamına gelir. Değişiklikler bir bileşen grubuyla sınırlı olduğunda artımlı derleme, tam derlemeye kıyasla önemli ölçüde daha hızlı olabilir.
Artımlı derleme varsayılan olarak devre dışıdır (ve küçültme, 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
Küçültme ve kod karartma
Jack, küçültme ve karartmayı etkinleştirmek için ProGuard yapılandırma dosyalarını kullanır.
Yaygın seçenekler arasında şunlar yer alır:
@
-include
-basedirectory
-injars
-outjars
(yalnızca 1 çıkış JAR'ı desteklenir)-libraryjars
-keep
-keepclassmembers
-keepclasseswithmembers
-keepnames
-keepclassmembernames
-keepclasseswithmembernames
-printseeds
Küçültme seçenekleri şunlardır:
-dontshrink
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
(Jack optimize etmiyor)-dontpreverify
(Jack önceden 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 için jarjar yapılandırma dosyalarını kullanır. Jack, "kural" kural türleriyle uyumlu olsa da "zap" veya "keep" kural türleriyle uyumlu değildir.
Multidex desteği
Jack, yerleşik ve eski multidex 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öntemi olan uygulamalarda multidex'i etkinleştirme başlıklı makaleyi inceleyin.