Jack ile derle (AOSP 6.0 - 8.1)

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.

Jack'e genel bakış.

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

Jack kitaplığı dosyası içerikleri.

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

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

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

Preddex ile Jack kitaplıkları

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.