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 derleme
JIT derleme aşağıdaki etkinlikleri içerir:
- 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.
- JIT,
speed
derleme filtresine ("uygulamadan mümkün olduğunca çok derleyin") göre derlenmemiş tüm uygulamalar için etkindir. - JIT profil verileri, yalnızca uygulamanın erişebileceği bir sistem dizinindeki bir dosyaya aktarılır.
- AOT derlemesi (
dex2oat
) arka plan programı, derlemesini yürütmek için bu dosyayı ayrıştırır.
Ş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ışı
- 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ş
- 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.