Jack ile Derleme (AOSP 6.0 - 8.1)

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.

Jack'e genel bakış.

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

Jack kitaplığı dosya içeriği.

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

Mevcut bir "jar." kitaplığını içe aktarmak için iş akışı.

Ş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 derlemelerinde sorun 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 dosyasını 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 dosyasını düzenleyip SERVER 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ü bulma

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 kullanma

Jack, Java programlama dili 1.7'yi destekler ve aşağıda açıklanan ek özellikleri entegre eder.

Ön-dexing

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.

Dex öncesi Jack kütüphaneleri.

Ş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, karartma, yeniden paketleme veya çoklu 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.