ART tam zamanında derleyiciyi uygulayın

Android çalışma zamanı (ART), Android uygulamalarının çalışırken performansını sürekli olarak artıran kod profili oluşturmaya sahip bir tam zamanında (JIT) derleyici içerir. JIT derleyicisi, ART'ın mevcut ileri düzey (AOT) derleyicisini tamamlar ve çalışma zamanı performansını artırır, depolama alanından tasarruf sağlar ve uygulama ve sistem güncellemelerini hızlandırır. Ayrıca, otomatik uygulama güncellemeleri sırasında sistem yavaşlamasını veya kablosuz (OTA) güncellemeler sırasında uygulamaların yeniden derlenmesini önleyerek AOT derleyicisini de geliştirir.

JIT ve AOT benzer optimizasyonlarla aynı derleyiciyi kullansa da, oluşturulan kod aynı olmayabilir. JIT, çalışma zamanı türü bilgisinden yararlanır, daha iyi satır içi oluşturma yapabilir ve yığın değiştirme (OSR) derlemesini mümkün kılar; bunların tümü biraz farklı kod üretir.

JIT mimarisi

JIT mimarisi
Şekil 1. JIT mimarisi.

JIT derlemesi

JIT derlemesi aşağıdaki faaliyetleri içerir:

Profil destekli kompozisyon
Şekil 2. Profil destekli derleme.
  1. Kullanıcı uygulamayı çalıştırır ve ardından ART'ın .dex dosyasını yüklemesini tetikler.
    • .oat dosyası ( .dex dosyasının 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çermezler.
    • .oat dosyası derlenmiş kod içermiyorsa ART, .dex dosyasını yürütmek için JIT ve yorumlayıcı üzerinden çalışır.
  2. JIT, speed derleme filtresine göre derlenmeyen ("uygulamadan yapabildiğiniz kadar derleyin" yazan) tüm uygulamalar için etkinleştirilir.
  3. JIT profil verileri, sistem dizinindeki yalnızca uygulamanın erişebileceği bir dosyaya dökü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 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ğinde saklanır ve bellek baskısı altında çöp toplama işlemine tabi tutulur.
    • Uygulama arka plandayken alınan bir anlık görüntünün tam verileri (yani JIT'lenen her şeyi) içereceğinin garantisi yoktur.
    • Her şeyin kaydedilmesini sağlamaya yönelik bir girişim yoktur (çünkü bu, çalışma zamanı performansını etkileyebilir).
  • Yöntemler üç farklı durumda olabilir:
    • yorumlanmış (dex kodu)
    • JIT derlendi
    • AOT derlendi
    Hem JIT hem de AOT kodu mevcutsa (örn. tekrarlanan optimizasyondan çıkarma nedeniyle), JIT'li kod tercih edilir.
  • Ön plandaki uygulama performansını etkilemeden JIT'i çalıştırmak için gereken bellek gereksinimi, söz konusu uygulamaya bağlıdır. Büyük uygulamalar, küçük uygulamalara göre daha fazla bellek gerektirir. Genel olarak büyük uygulamalar 4 MB civarında sabitlenir.

JIT günlüğünü aç

JIT günlüğü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 zorla

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

adb shell cmd package compile

Belirli bir paketi zorla derlemeye yönelik yaygın kullanım durumları:

  • 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 derlemeye yönelik yaygın kullanım durumları:

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

Profil verilerini temizle

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ümlere yönelik komuttan farklı olarak 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 (yani 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.

Derlenmiş tüm kodu temizlemek için şu komutu çalıştırın:

adb shell cmd package compile -m verify -f 

Not: Bu komut yerel profil verilerini korur.