Jack, Android 6.0-8.1 için varsayılan Android derleme araç zinciriydi ve Şekil 1'de gösterildiği gibi Java kaynağını Android dex bayt koduna derlemek için kullanılıyordu:
Şekil 1. Jack'e genel bakış
.jack dosya biçimi, kitaplığın önceden derlenmiş dex kodunu içerir ve daha hızlı derlemeye (önceden dex) olanak tanır.
Şekil 2. Jack kitaplık dosyasının içeriği.
Jill aracı
Jill aracı, Şekil 3'te gösterildiği gibi mevcut .jar kitaplıklarını yeni .jack kitaplık biçimine çevirir:
Şekil 3. 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'sinin başlatılmasını, Jack kodunun yüklenmesini, Jack'in başlatılmasını ve JIT'nin ısınmasını önlediği 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ırladığından bilgisayarınızın aşırı yüklenmesini (bellek veya disk sorunu) önler.
Jack sunucusu, derleme yapılmadan geçen boşta kalma süresinden sonra kendini kapatır. Yerel ana makine arayüzünde iki TCP bağlantı noktası kullanır ve harici olarak kullanılamaz.
Tüm parametreler (ör. paralel derleme sayısı, zaman aşımı ve bağlantı noktası numaraları) $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=1kullanılmıyor.SERVER_NB_COMPILE=4, izin verilen maksimum paralel derleme sayısını belirler.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. Bu değişken, varsayılan olarak bir ortam değişkeniyle aşırı yüklenebilir.JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}, ana makinede JVM başlatmak için kullanılan varsayılan komutu ayarlar. Bu değişken, varsayılan olarak ortam değişkeni tarafından aşırı yüklenebilir.
Jack derlemeleriyle ilgili sorunları giderme
| Sorun | İşlem |
|---|---|
| Bilgisayarınız derleme sırasında yanıt vermiyor veya Yetersiz bellek 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 düzeltmek 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 dizininizdeki jack-$USER içinde 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. Tekrarlanabilen 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 çıkış ile 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
Jak 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. CTS derlemesi, mevcut vm-tests-tf entegrasyonu nedeniyle yavaş. Byte kodu manipülasyon araçları (ör. JaCoCo) desteklenmez.
Jack'i kullanma
Jack, Java programlama dili 1.7'yi destekler ve bu bölümde açıklanan ek özellikleri entegre eder. Ağacı veya projenizi derlemek için standart makefile komutlarını kullanın.
Ö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 dexlenmiş 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ık önceden dexlenmiş dosyalarını 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 derlenmesi 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 çoklu dex eski sürümü 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. Genel 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 yapmak için jarjar yapılandırma dosyalarını kullanır. Jack, rule 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.