ART tam zamanında derleyici uygulama

Android Runtime (ART), Android uygulamalarının performansını çalıştıkları sırada sürekli olarak iyileştiren kod profilleme özelliğine sahip bir tam zamanında (JIT) derleyici içerir. JIT derleyici, ART'ın mevcut önceden derleme (AOT) derleyicisini tamamlar ve çalışma zamanı performansını iyileştirir, depolama alanından tasarruf sağlar, uygulama ve sistem güncellemelerini hızlandırır. Ayrıca, otomatik uygulama güncellemeleri sırasında sistemin yavaşlamasını veya kablosuz (OTA) güncellemeler sırasında uygulamaların yeniden derlenmesini önleyerek AOT derleyicisini iyileştirir.

JIT ve AOT, benzer optimizasyon gruplarına sahip aynı derleyiciyi kullansa da oluşturulan kod aynı olmayabilir. JIT, çalışma zamanı türü bilgisinden yararlanır, daha iyi satır içine alabilir ve yığın değiştirme (OSR) derlemesini mümkün kılar. Bunların tümü biraz farklı kod oluşturur.

JIT mimarisi

JIT mimarisi
Şekil 1. JIT mimarisi.

JIT derleme

JIT derleme aşağıdaki etkinlikleri içerir:

Profil odaklı kompozisyon
Şekil 2. Profil odaklı derleme
  1. Kullanıcı uygulamayı çalıştırır. Bu işlem, ART'yi .dex dosyasını yüklemesi için tetikler.
    • .oat dosyası (.dex dosyası için AOT ikili dosyası) mevcutsa ART bunu doğrudan kullanır. .oat dosyaları düzenli olarak oluşturulsa da her zaman derlenmiş kod (AOT ikili dosyası) içermez.
    • .oat dosyası derlenmiş kod içermiyorsa ART, .dex dosyasını yürütmek için JIT ve yorumlayıcıyı kullanır.
  2. JIT, speed derleme filtresine ("uygulamadan mümkün olduğunca çok derleyin") göre derlenmemiş tüm uygulamalar için etkindir.
  3. JIT profil verileri, yalnızca uygulamanın erişebileceği bir sistem dizinindeki bir dosyaya aktarılır.
  4. AOT derlemesi (dex2oat) arka plan programı, derlemesini yürütmek için bu dosyayı ayrıştırır.

    JIT arka plan programı
    Şekil 3. JIT arka plan programı etkinlikleri.

Google Play hizmeti, paylaşılan kitaplıklara benzer şekilde davranan diğer uygulamalar tarafından kullanılan bir örnektir.

JIT iş akışı

JIT mimarisi
Şekil 4. JIT veri akışı.
  • Profil oluşturma bilgileri kod önbelleği içinde saklanır ve bellek baskısı altında çöp toplama işlemine tabi tutulur.
    • Uygulama arka plandayken alınan anlık görüntünün tüm verileri (ör. JIT'ye alınmış her şey) içereceği garanti edilmez.
    • Her şeyin kaydedildiğinden emin olmak için herhangi bir girişimde bulunulmaz (bu, çalışma zamanı performansını etkileyebileceğinden).
  • Yöntemler üç farklı durumda olabilir:
    • yorumlanmış (dex kodu)
    • JIT derlendi
    • AOT derlenmiş
    Hem JIT hem de AOT kodu varsa (ör. tekrarlanan optimizasyon kaldırma işlemleri nedeniyle) JIT kod tercih edilir.
  • JIT'yi ön plan uygulama performansını etkilemeden çalıştırmak için gereken bellek miktarı söz konusu uygulamaya bağlıdır. Büyük uygulamalar küçük uygulamalardan daha fazla bellek gerektirir. Genel olarak, büyük uygulamalar yaklaşık 4 MB boyutunda sabitlenir.

JIT günlük kaydını etkinleştirme

JIT günlük kaydını açmak için aşağıdaki komutları çalıştırın:

adb root
adb shell stop
adb shell setprop dalvik.vm.extra-opts -verbose:jit
adb shell start

JIT'i devre dışı bırak

JIT'yi devre dışı bırakmak için aşağıdaki komutları çalıştırın:

adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb shell start

Derlemeyi zorlama

Derlemeyi zorlamak için aşağıdakileri çalıştırın:

adb shell cmd package compile

Belirli bir paketi zorla derlemek için yaygın kullanım alanları:

  • Profil tabanlı:
    adb shell cmd package compile -m speed-profile -f my-package
    
  • Tam:
    adb shell cmd package compile -m speed -f my-package
    

Tüm paketleri zorla derlemek için yaygın kullanım alanları:

  • Profil tabanlı:
    adb shell cmd package compile -m speed-profile -f -a
    
  • Tam:
    adb shell cmd package compile -m speed -f -a
    

Profil verilerini temizleme

Android 13 veya önceki sürümlerde

Yerel profil verilerini temizlemek ve derlenmiş kodu kaldırmak için aşağıdakileri çalıştırın:

adb shell pm compile --reset 

Android 14 veya sonraki sürümlerde

Yalnızca yerel profil verilerini temizlemek için:

adb shell pm art clear-app-profiles 

Not: Android 13 veya önceki sürümlerdeki komutun aksine bu komut, uygulamayla birlikte yüklenen harici profil verilerini (".dm") temizlemez.

Yerel profil verilerini temizlemek ve yerel profil verilerinden oluşturulan derlenmiş kodu kaldırmak (ör. yükleme durumuna sıfırlamak) için aşağıdakileri çalıştırın:

adb shell pm compile --reset 

Not: Bu komut, uygulamayla birlikte yüklenen harici profil verilerinden (".dm") oluşturulan derlenmiş kodu kaldırmaz.

Tüm derlenmiş kodları temizlemek için şu komutu çalıştırın:

adb shell cmd package compile -m verify -f 

Not: Bu komut, yerel profil verilerini korur.