Jack, Android 6.0 - 8.1 arası sürümler için varsayılan Android geliştirme araç zinciridir.
Jack, Java kaynağını Android dex bayt kodu olarak derleyen bir Android araç zinciridir. Jack'i kullanmak için farklı bir şey yapmanız gerekmez. Ağ veya projenizi derlemek için standart makefile komutlarınızı kullanmanız yeterlidir. Jack'in kullanıldığı son sürüm Android 8.1'dir.
Jack hakkında
Jack, Şekil 1'de gösterildiği gibi çalışır.
Şekil 1. Jack'e genel bakış.
Kriko kitaplığı biçimi
Jack, kitaplık için önceden derlenmiş dex kodunu içeren kendi .jack
dosya biçimine sahiptir. Böylece, daha hızlı derleme işlemi (dex öncesi) yapılabilir.
Şekil 2. Jack kitaplık dosyası içeriği.
Canan
Aşağıdaki şekilde gösterildiği gibi, Jill aracı mevcut .jar
kitaplıklarını yeni kitaplık biçimine çevirir.
Şekil 3. Mevcut bir .jar
kitaplığını içe aktarma iş akışı.
Jack derleme sunucusu
bakın.Jack ilk kez kullanıldığında, bilgisayarınızda yerel bir Jack derleme sunucusu başlatır. Bu sunucu:
- Her derlemede yeni bir ana makine JRE JVM'si başlatmayı, Jack kodunu yüklemeyi, Jack'i başlatmayı ve JIT'yi ısıtmayı önlediği için doğal bir hızlanma sağlar. Ayrıca, küçük derlemeler sırasında (örneğin, artımlı modda) çok iyi derleme süreleri sunar.
- Paralel Jack derlemelerinin sayısını kontrol etmeye yönelik kısa vadeli bir çözümdür. Sunucu, paralel derleme sayısını sınırlandırdığı için bilgisayarınızın aşırı yüklenmesini (bellek veya disk sorunu) önler.
Jack sunucusu, herhangi bir derleme yapılmadan boşta kalma süresinden sonra kendini kapatır.
Bu yerel ana makine 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ı sayısı vb.) $HOME/.jack
dosyası düzenlenerek değiştirilebilir.
$HOME/.jack dosyası
$HOME/.jack
dosyası, Jack sunucu değişkenleri için tam bir bash söz diziminde 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ı belirler.SERVER_PORT_ADMIN=8073
, yönetici amaçlı olarak 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ı belirler.SERVER_TIMEOUT=60
, sunucunun kendisini kapatmadan önce derleme yapmadan beklemesi gereken boşta saniye sayısını belirler.SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log}
, sunucu günlüklerinin yazıldığı dosyayı belirler. Varsayılan olarak bu değişken, bir ortam değişkeni tarafından aşırı yüklenmeye karşı korunamaz.JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}
, ana makinede 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üklenmeye karşı korunabilir.
Jack derlemeleriyle ilgili sorunları giderme
Sorun | İşlem |
---|---|
Bilgisayarınız derleme sırasında yanıt vermez veya Jack derlemeleri Bellek yetersizliği hatası nedeniyle başarısız olur | $HOME/.jack değerini düzenleyerek ve SERVER_NB_COMPILE değerini daha düşük bir değere değiştirerek eşzamanlı Jack derlemelerinin sayısını azaltın. |
Arka plan sunucusu başlatılamıyor derlemeleri başarısız oluyor | Bunun en olası nedeni, bilgisayarınızda TCP bağlantı noktalarının 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. Durumun engellemesini kaldırmak için $HOME/.jack öğesini düzenleyip SERVER değerini false olarak değiştirerek Jack derleme sunucusunu devre dışı bırakın. Maalesef bu, derlemenizi önemli ölçüde yavaşlatır ve make -j öğesini yükleme denetimiyle (seçenek -l /make ) başlatmaya zorlayabilir. |
Derleme, ilerleme kaydedemeden takılıyor | Durumun engellemesini kaldırmak için jack-admin kill-server komutunu kullanarak Jack arka plan sunucusunu sonlandırın, ardından geçici dizininizin jack-$USER dizininde (/tmp veya $TMPDIR ) bulunan geçici dizinleri kaldırın. |
Jack günlüğünü bulma
Uzak hedef ile bir make
komutu çalıştırdıysanız Jack günlüğü, $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log
konumunda bulunur.
Aksi takdirde, günlüğü jack-admin server-log
komutunu çalıştırarak bulabilirsiniz.
Tekrarlanabilir 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 ve standart çıkışı ve 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
Kriko sınırlamaları
Varsayılan olarak Jack sunucusu, bilgisayarda yalnızca tek bir kullanıcı tarafından kullanılabilir. Daha fazla kullanıcıyı desteklemek için her kullanıcı için farklı bağlantı noktası numaraları seçin ve SERVER_NB_COMPILE
değerini buna göre ayarlayın. Ayrıca, $HOME/.jack
içinde SERVER=false
ayarlayarak Jack sunucusunu devre dışı bırakabilirsiniz.
Mevcut vm-tests-tf
entegrasyonu nedeniyle CTS derlemesi yavaş.
Bayt kodu işleme araçları (ör. JaCoCo) desteklenmez.
Jack'i kullan
Jack, Java programlama dili 1.7'yi destekler ve aşağıda açıklanan ek özellikleri entegre eder.
dex'e dönüştürme
Jack kitaplık dosyası oluşturulurken kitaplığın .dex
'si oluşturulur ve .jack
kitaplık dosyasında depolanıyor.
Jack, derleme yaparken her kitaplıktaki ön dex'i yeniden kullanır. Tüm kitaplıklar önceden derlenmiştir.
4.Şekil Preddex ile Jack kitaplıkları
Derlemede sıkıştırma, karartma veya yeniden paketleme kullanılıyorsa Jack, kitaplığı dex öncesi olarak yeniden kullanmaz.
Artımlı derleme
Artımlı derleme, yalnızca son derlemeden bu yana değiştirilen bileşenlerin (ve bunların bağımlıları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 göre önemli ölçüde daha hızlı olabilir.
Artımlı derleme varsayılan olarak devre dışıdır (ve küçültme, kod karartma, yeniden paketleme veya çok katlı eski sürüm etkinleştirildiğinde otomatik olarak devre dışı bırakılır). Artımlı derlemeleri etkinleştirmek için aşamalı olarak derlemek istediğiniz projenin Android.mk
dosyasına aşağıdaki satırı ekleyin:
LOCAL_JACK_ENABLED := incremental
Daraltma ve kod karartma
Jack, sıkıştırma ve karartma özelliğini etkinleştirmek için ProGuard yapılandırma dosyalarını kullanır.
Sık kullanılan seçenekler şunlardır:
@
-include
-basedirectory
-injars
-outjars
(yalnızca 1 çıkış jar dosyası desteklenir)-libraryjars
-keep
-keepclassmembers
-keepclasseswithmembers
-keepnames
-keepclassmembernames
-keepclasseswithmembernames
-printseeds
Shrinking seçenekleri şunlardır:
-dontshrink
Kod 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
(Cem 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 işlemi 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 multimedya 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öntem içeren uygulamalarda çoklu dizinleri etkinleştirme başlıklı makaleyi inceleyin.