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'te derleyen bir Android araç zinciridir. bayt kodu ile eşdeğerdir. Jack'i kullanmak için farklı bir şey yapmanız gerekmez. Tek yapmanız gereken ağacı veya projenizi derlemek için kullanılan standart makefile komutlarını kullanabilirsiniz. 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 kitaplığı biçimi

Jack, önceden derlenmiş dex kodunu içeren kendi .jack dosya biçimine sahiptir daha hızlı derlemeye (dex öncesi) olanak tanıyor.

Jack kitaplığı dosyası içerikleri.

Şekil 2. Jack kitaplığı dosyası içerikleri.

Canan

Aşağıdaki şekilde gösterildiği gibi, Jill aracı mevcut .jar kitaplıktan yeni kitaplık biçimine.

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

Jack ilk kez kullanıldığında, bilgisayarınızdan erişebilirsiniz. Bu sunucu:

  • Yeni bir ana makine JRE JVM'nin başlatılmasını önlediği için doğal bir hız artışı sağlar. Jack kodunu yükleme, Jack'i başlatma ve her birinde JIT'i çalıştırma derlememiz var. Aynı zamanda küçük dönemlerde çok iyi derleme süreleri derlemeler (örneğin, artımlı modda).
  • Paralel Jack sayısını kontrol etmek için kısa vadeli bir çözümdür derlemeler. Sunucu bilgisayarınızda aşırı yükleme yapmaktan kaçınıyor (bellek veya disk sorunu) çünkü paralel derlemelerin sayısını sınırlar.

Jack sunucusu, boşta kaldığında hiçbir derleme işlemi yapılmadan kendi kendine kapanır. Localhost arayüzünde iki TCP bağlantı noktası kullanır ve kullanılamaz kontrol edin. Tüm parametreler (paralel derleme sayısı, zaman aşımı, bağlantı noktası sayısı numarası vb.) $HOME/.jack dosyası düzenlenerek değiştirilebilir.

$HOME/.jack dosyası

$HOME/.jack dosyası, Jack için aşağıdaki ayarları içerir tam bash söz diziminde sunucu değişkenleri:

  • SERVER=true, Jack'in sunucu özelliğini etkinleştirir.
  • SERVER_PORT_SERVICE=8072, sunucunun TCP bağlantı noktası numarasını belirler yalnızca derlemek için kullanır.
  • SERVER_PORT_ADMIN=8073, sunucunun TCP bağlantı noktası numarasını belirler izin alınmasını gerektiriyor.
  • SERVER_COUNT=1 kullanılmıyor.
  • SERVER_NB_COMPILE=4, izin verilen maksimum paralel sayısını belirliyor derlemeler. SERVER_TIMEOUT=60, sunucunun boşta kaldığı saniye sayısını belirler derleme yapmadan önce kapanmadan önce beklemelidir. 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 nedeniyle aşırı yüklendi.
  • JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}, varsayılan değeri belirliyor komutunun bir örneğidir. Varsayılan olarak bu değişken ortam değişkeni nedeniyle aşırı yüklendi.

Jack derlemeleriyle ilgili sorunları giderme

Sorun İşlem
Derleme sırasında veya senkronizasyon sırasında bilgisayarınız yanıt vermemeye başlıyor. Bellek yetersiz hatası nedeniyle Jack derlemeleri başarısız oluyor Eş zamanlı Jack sayısını azalt derlemeler, $HOME/.jack düzenleyip değiştirerek SERVER_NB_COMPILE daha düşük bir değere.
Arka plan sunucusu başlatılamıyor derlemeleri başarısız oluyor Bunun en olası nedeni TCP bağlantı noktalarının bilgisayarınızda zaten kullanılıyor olmasıdır. Değiştir bağlantı noktalarını $HOME/.jack (SERVER_PORT_SERVICE ve SERVER_PORT_ADMIN değişken). Durumun engellemesini kaldırmak için $HOME/.jack öğesini düzenleyip değiştirerek Jack derleme sunucusu SERVER - false. Ne yazık ki bu süreç ve make -j öğesini yüklemeyle başlatmanıza zorlayabilir. kontrol (seçenek -l/make).
Derleme, ilerleme kaydedilmiyorsa takılı kalıyor Durumun engellemesini kaldırmak için aşağıdaki adımları uygulayarak Jack arka plan sunucusunu sonlandırın: jack-admin kill-server), ardından geçici dizinleri kaldırın. geçici dizininizin jack-$USER dizininde bulunur (/tmp veya $TMPDIR).

Jack günlüğünü bulma

Uzak hedef ile bir make komutu çalıştırırsanız Jack günlüğü şu adreste bulunuyor: $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log. Aksi takdirde, günlüğü jack-admin server-log komutunu çalıştırarak bulabilirsiniz. Yinelenebilir Jack hataları durumunda, aşağıdaki adımları izleyerek daha ayrıntılı bir günlük edinebilirsiniz: şu değişkeni ayarlayabilirsiniz:

export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"

Ağacı (veya projenizi) derlemek için standart Makefile komutlarını kullanın ve standart çıktı ve hata eklemeniz gerekir. Ayrıntılı derleme günlüklerini kaldırmak için şu komutu çalıştırın:

unset ANDROID_JACK_EXTRA_ARGS

Jack sınırlamaları

Jack sunucusu varsayılan olarak bilgisayardır. Başka kullanıcıları desteklemek amacıyla her biri için farklı bağlantı noktası numarası seçin ve SERVER_NB_COMPILE değerini buna göre ayarlayın. İsterseniz $HOME/.jack içinde SERVER=false ayarlayarak Jack sunucusunu devre dışı bırakın. 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 özelliklerini inceleyin.

Dex öncesi

Jack kitaplık dosyası oluştururken kitaplığın .dex öğesi oluşturulur ve .jack kitaplık dosyasında dizin öncesi olarak depolanır. Jack, derleme sırasında her kitaplıktaki öndex'i yeniden kullanır. Tüm kütüphaneler önceden dizi olarak eklenmiş.

Preddex ile Jack kitaplıkları

4.Şekil Preddex ile Jack kitaplıkları

Jack, küçültme, kod karartma veya derlemede kullanılan yeniden paketleme yöntemidir.

Artımlı derleme

Artımlı derlemede ise yalnızca son denemeden bu yana değinilen bileşenler, derlemeleri (ve bağımlılıkları) yeniden derlenir. Artımlı derleme sınırlı sayıda olduğunda, tam bir derlemeden çok daha hızlı bir dizi bileşendir.

Artımlı derleme varsayılan olarak devre dışıdır (ve otomatik Bu özellik daraltılırken, kod karartma, yeniden paketleme veya çoklu dex eskitme olduğunda devre dışı bırakılır. etkin). Artımlı derlemeleri etkinleştirmek için aşağıdaki satırı Adım adım geliştirmek istediğiniz projenin Android.mk dosyası:

LOCAL_JACK_ENABLED := incremental

Daraltma ve kod karartma

Jack, küçültmeyi ve boyutu korumayı mümkün kılmak için ProGuard yapılandırma dosyalarını kod karartma.

Sık kullanılan seçenekler şunlardır:

  • @
  • -include
  • -basedirectory
  • -injars
  • -outjars (yalnızca 1 çıkış jar aracı desteklenir)
  • -libraryjars
  • -keep
  • -keepclassmembers
  • -keepclasseswithmembers
  • -keepnames
  • -keepclassmembernames
  • -keepclasseswithmembernames
  • -printseeds

Daraltma seçenekleri arasında şunlar bulunur:

  • -dontshrink

Kod karartma seçenekleri şunlardır:

  • -dontobfuscate
  • -printmapping
  • -applymapping
  • -obfuscationdictionary
  • -classobfuscationdictionary
  • -packageobfuscationdictionary
  • -useuniqueclassmembernames
  • -dontusemixedcaseclassnames
  • -keeppackagenames
  • -flattenpackagehierarchy
  • -repackageclasses
  • -keepattributes
  • -adaptclassstrings

Yok sayılan seçenekler şunlardır:

  • -dontoptimize (Jack optimize edilmez)
  • -dontpreverify (Jack önceden doğrulama yapmıyor)
  • -skipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclassmembers
  • -keepdirectories
  • -target
  • -forceprocessing
  • -printusage
  • -whyareyoukeeping
  • -optimizations
  • -optimizationpasses
  • -assumenosideeffects
  • -allowaccessmodification
  • -mergeinterfacesaggressively
  • -overloadaggressively
  • -microedition
  • -verbose
  • -dontnote
  • -dontwarn
  • -ignorewarnings
  • -printconfiguration
  • -dump
ziyaret edin.

Yeniden paketleme

Jack, yeniden paketleme işlemi için jarjar yapılandırma dosyalarını kullanır. Jack "rule" ile uyumlu kural türleri, "zap" ile uyumlu değildir veya "sakla" kural türleri.

Multidex desteği

Jack, yerleşik ve eski multimedya desteği sunar. Dex dosyaları sınırlı olduğu için 65 binden fazla yöntem içeren uygulamalar birden fazla dex'e bölünmelidir. dosyası olarak da kaydedebilir. Daha fazla bilgi için: 64 binden fazla yöntemi olan uygulamalar için multidex'i etkinleştirme