Jack, Android 6.0 - 8.1 için varsayılan Android oluşturma araç zinciridir
Jack, Java kaynağını Android dex bayt koduna derleyen bir Android araç zinciridir. Jack'i kullanmak için farklı bir şey yapmanıza gerek yoktur; ağacı veya projenizi derlemek için sadece 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.
Şekil 1. Jack'e genel bakış.
Jack kütüphane formatı
Jack'in, kütüphane için önceden derlenmiş dex kodunu içeren, daha hızlı derlemeye (ön dex) olanak tanıyan kendi .jack
dosya formatı vardır.
Şekil 2. Jack kitaplığı 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 formatına çevirir.
Ş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ılır. Bu sunucu:
- Her derlemede yeni bir ana bilgisayar JRE JVM'nin başlatılmasını, Jack kodunun yüklenmesini, Jack'in başlatılmasını ve JIT'in ısınmasını önlediği için gerçek bir hızlanma sağlar. 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 yapılmadan boşta kaldıktan 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özdiziminde 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 kendisini kapatmadan önce herhangi bir derleme yapmadan beklemesi gereken boş 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 derlemeleriyle ilgili sorunları giderme
Sorun | Aksiyon |
---|---|
Bilgisayarınız derleme sırasında yanıt vermiyor veya Jack derlemelerinin Yetersiz bellek hatası nedeniyle başarısız olduğunu görüyorsunuz | $HOME/.jack düzenleyerek ve SERVER_NB_COMPILE 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ı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 engelini kaldırmak için $HOME/.jack düzenleyip SERVER değerini false olarak değiştirerek Jack derleme sunucusunu devre dışı bırakın. Ne yazık ki bu, derlemenizi önemli ölçüde yavaşlatır ve sizi make -j yük kontrolüyle başlatmaya zorlayabilir ( make -l seçeneği). |
Derleme herhangi bir ilerleme olmadan takılıp kalıyor | Durumun engelini kaldırmak için jack-admin kill-server kullanarak Jack arka plan sunucusunu sonlandırın, ardından geçici dizininizin ( /tmp veya $TMPDIR ) jack-$USER dosyasında bulunan geçici dizinleri kaldırın. |
Jack günlüğünü bulun
Dist hedefiyle make
komutunu ç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
ç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ıyı ve hatayı 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
Kriko sınırlamaları
Varsayılan olarak Jack sunucusu bilgisayarda yalnızca bir kullanıcı tarafından kullanılabilir. Ek kullanıcıları desteklemek amacıyla her kullanıcı için farklı bağlantı noktası numaraları seçin ve SERVER_NB_COMPILE
buna göre ayarlayın. Ayrıca $HOME/.jack
dosyasında SERVER=false
ayarını yaparak Jack sunucusunu devre dışı bırakabilirsiniz. Mevcut vm-tests-tf
entegrasyonu nedeniyle CTS derlemesi yavaş. Bayt kodu işleme araçları (JaCoCo gibi) desteklenmez.
Jack'i kullan
Jack, Java programlama dili 1.7'yi destekler ve aşağıda açıklanan ek özellikleri entegre eder.
Dex öncesi
Bir Jack kitaplık dosyası oluşturulurken, kitaplığın .dex
oluşturulur ve .jack
kitaplık dosyasının içinde ön dex olarak saklanır. Derleme sırasında Jack her kitaplıktaki ön dex'i yeniden kullanır. Tüm kütüphaneler önceden düzenlenmiştir.
Şekil 4. Pre-dex içeren Jack kütüphaneleri.
Derlemede küçültme, gizleme veya yeniden paketleme kullanılıyorsa Jack, ön-dex kütüphanesini yeniden kullanmaz.
Artımlı derleme
Artımlı derleme, yalnızca son derlemeden bu yana dokunulan bileşenlerin (ve bunların 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, gizleme, yeniden paketleme veya multi-dex mirası etkinleştirildiğinde otomatik olarak devre dışı bırakılır). Artımlı derlemeleri etkinleştirmek için, artımlı olarak oluşturmak istediğiniz projenin Android.mk
dosyasına aşağıdaki satırı ekleyin:
LOCAL_JACK_ENABLED := incremental
Küçülme ve karartma
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 aşağıdakileri içerir:
-
-dontshrink
Gizleme seçenekleri aşağıdakileri içerir:
-
-dontobfuscate
-
-printmapping
-
-applymapping
-
-obfuscationdictionary
-
-classobfuscationdictionary
-
-packageobfuscationdictionary
-
-useuniqueclassmembernames
-
-dontusemixedcaseclassnames
-
-keeppackagenames
-
-flattenpackagehierarchy
-
-repackageclasses
-
-keepattributes
-
-adaptclassstrings
Yoksayılan seçenekler aşağıdakileri 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 uyumlu olsa da, "zap" veya "keep" kural türleriyle uyumlu değildir.
Çoklu dizin desteği
Jack yerleşik ve eski multidex desteği sunar. Dex dosyaları 65.000 yöntemle sınırlı olduğundan, 65.000'in üzerinde yönteme sahip uygulamaların birden fazla 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.
,Jack, Android 6.0 - 8.1 için varsayılan Android oluşturma araç zinciridir
Jack, Java kaynağını Android dex bayt koduna derleyen bir Android araç zinciridir. Jack'i kullanmak için farklı bir şey yapmanıza gerek yoktur; ağacı veya projenizi derlemek için sadece 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.
Şekil 1. Jack'e genel bakış.
Jack kütüphane formatı
Jack'in, kütüphane için önceden derlenmiş dex kodunu içeren, daha hızlı derlemeye (ön dex) olanak tanıyan kendi .jack
dosya formatı vardır.
Şekil 2. Jack kitaplığı 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 formatına çevirir.
Ş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ılır. Bu sunucu:
- Her derlemede yeni bir ana bilgisayar JRE JVM'nin başlatılmasını, Jack kodunun yüklenmesini, Jack'in başlatılmasını ve JIT'in ısınmasını önlediği için gerçek bir hızlanma sağlar. 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 yapılmadan boşta kaldıktan 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özdiziminde 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 kendisini kapatmadan önce herhangi bir derleme yapmadan beklemesi gereken boş 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 derlemeleriyle ilgili sorunları giderme
Sorun | Aksiyon |
---|---|
Bilgisayarınız derleme sırasında yanıt vermiyor veya Jack derlemelerinin Yetersiz bellek hatası nedeniyle başarısız olduğunu görüyorsunuz | $HOME/.jack düzenleyerek ve SERVER_NB_COMPILE 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ı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 engelini kaldırmak için $HOME/.jack düzenleyip SERVER değerini false olarak değiştirerek Jack derleme sunucusunu devre dışı bırakın. Ne yazık ki bu, derlemenizi önemli ölçüde yavaşlatır ve sizi make -j yük kontrolüyle başlatmaya zorlayabilir ( make -l seçeneği). |
Derleme herhangi bir ilerleme olmadan takılıp kalıyor | Durumun engelini kaldırmak için jack-admin kill-server kullanarak Jack arka plan sunucusunu sonlandırın, ardından geçici dizininizin ( /tmp veya $TMPDIR ) jack-$USER dosyasında bulunan geçici dizinleri kaldırın. |
Jack günlüğünü bulun
Dist hedefiyle make
komutunu ç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
ç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ıyı ve hatayı 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
Kriko sınırlamaları
Varsayılan olarak Jack sunucusu bilgisayarda yalnızca bir kullanıcı tarafından kullanılabilir. Ek kullanıcıları desteklemek amacıyla her kullanıcı için farklı bağlantı noktası numaraları seçin ve SERVER_NB_COMPILE
buna göre ayarlayın. Ayrıca $HOME/.jack
dosyasında SERVER=false
ayarını yaparak Jack sunucusunu devre dışı bırakabilirsiniz. Mevcut vm-tests-tf
entegrasyonu nedeniyle CTS derlemesi yavaş. Bayt kodu işleme araçları (JaCoCo gibi) desteklenmez.
Jack'i kullan
Jack, Java programlama dili 1.7'yi destekler ve aşağıda açıklanan ek özellikleri entegre eder.
Dex öncesi
Bir Jack kitaplık dosyası oluşturulurken, kitaplığın .dex
oluşturulur ve .jack
kitaplık dosyasının içinde ön dex olarak saklanır. Derleme sırasında Jack her kitaplıktaki ön dex'i yeniden kullanır. Tüm kütüphaneler önceden düzenlenmiştir.
Şekil 4. Pre-dex içeren Jack kütüphaneleri.
Derlemede küçültme, gizleme veya yeniden paketleme kullanılıyorsa Jack, ön-dex kütüphanesini yeniden kullanmaz.
Artımlı derleme
Artımlı derleme, yalnızca son derlemeden bu yana dokunulan bileşenlerin (ve bunların 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, gizleme, yeniden paketleme veya multi-dex mirası etkinleştirildiğinde otomatik olarak devre dışı bırakılır). Artımlı derlemeleri etkinleştirmek için, artımlı olarak oluşturmak istediğiniz projenin Android.mk
dosyasına aşağıdaki satırı ekleyin:
LOCAL_JACK_ENABLED := incremental
Küçülme ve karartma
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 aşağıdakileri içerir:
-
-dontshrink
Gizleme seçenekleri aşağıdakileri içerir:
-
-dontobfuscate
-
-printmapping
-
-applymapping
-
-obfuscationdictionary
-
-classobfuscationdictionary
-
-packageobfuscationdictionary
-
-useuniqueclassmembernames
-
-dontusemixedcaseclassnames
-
-keeppackagenames
-
-flattenpackagehierarchy
-
-repackageclasses
-
-keepattributes
-
-adaptclassstrings
Yoksayılan seçenekler aşağıdakileri 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 uyumlu olsa da, "zap" veya "keep" kural türleriyle uyumlu değildir.
Çoklu dizin desteği
Jack yerleşik ve eski multidex desteği sunar. Dex dosyaları 65.000 yöntemle sınırlı olduğundan, 65.000'in üzerinde yönteme sahip uygulamaların birden fazla 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.