Android Runtime (ART), Android 5.0 Lollipop’ta Dalvik’in yerini almak üzere tanıtılan Android uygulama çalışma zamanı ortamıdır. Ana yenilik, uygulama kurulumu sırasında DEX bayt kodunun doğrudan yerel makine koduna AOT derlenmesi ve JIT derleyici ısınmasının uzun süreli sorununu ortadan kaldırmasıdır. Google, 2024’e göre ART, DEX formatıyla tam geriye uyumluluğu korurken Dalvik’e kıyasla %20–30 oranında performans artışı sağlar.
Anahtar Noktalar
Android Runtime (ART), yürütmeden önce DEX bayt kodunu yerel makine koduna derleyen bir uygulama çalışma zamanı ortamıdır. Çalışma zamanı sırasında Just-In-Time derlemesi kullanan Dalvik’in aksine ART, APK kurulumu sırasında Ahead-Of-Time (AOT) derlemesi gerçekleştirir. Bu temel mimari değişiklik, uygulamalarda önemli ölçüde hızlanma ve azaltılmış güç tüketimi sağladı.
ART ilk olarak Android 4.4 KitKat’ta deneysel bir seçenek olarak ortaya çıktı. Geliştiriciler, geliştirici ayarlarından etkinleştirip uygulamalarını test edebiliyordu. Android 5.0 Lollipop’ta ART varsayılan çalışma zamanı haline geldi ve Dalvik platformdan tamamen kaldırıldı. Android 7.0 Nougat piyasaya sürüldüğünde ART, hibrit derleme moduna kavuştu.
Dalvik’i ART ile değiştirme kararı ani olmadı. Yeni çalışma zamanı üzerindeki çalışmalar, Google’ın JIT yaklaşımının sınırlamalarını fark ettiği 2012 yılında başladı. Ana hedefler: uygulama başlatmayı hızlandırmak, CPU yükünü azaltmak ve güç tüketimini düşürmek. Geliştirme, daha önce Dalvik optimizasyonları üzerinde çalışan Android Runtime Group tarafından yönetildi.
ART, Dalvik ile aynı kayıt tabanlı mimariyi kullanır, ancak tamamen yeniden tasarlanmış bir derleyiciyle birlikte. Bir yorumlayıcı ve JIT derleyici yerine ART, kurulum sırasında DEX dosyalarını ELF ikili dosyalarına dönüştüren dex2oat AOT derleyicisini içerir. Sonuç olarak, ART’deki uygulamalar ısınma aşaması olmadan anında yerel performansla başlar.
ART, Dalvik’in temel ilkelerini korudu: ayrı süreçler aracılığıyla uygulama yalıtımı, kayıt tabanlı mimari ve DEX formatı desteği. Ancak, iç uygulama tamamen yeniden yazıldı. Dalvik yorumlayıcısının yerine ART, üç yürütme modu içerir: yorumlayıcı, JIT derleyici ve dex2oat AOT derleyici. Mod seçimi, uygulamanın yaşam döngüsü aşamasına bağlıdır.
ART’nin anahtar bileşeni dex2oat’tır (dalvik executable to optimized android translator). Bu yardımcı program, uygulama kurulumu sırasında çalışır (Android 7.0’dan itibaren — arka plan optimizasyonu sırasında da). dex2oat, APK’daki DEX dosyalarını okur, bayt kodunu optimize eder ve yerel kod içeren bir OAT dosyası — bir ELF ikili dosyası — oluşturur. OAT dosyaları /data/dalvik-cache/ dizininde saklanır.
# Cihazda OAT dosyalarını kontrol etme
adb shell ls -la /data/dalvik-cache/arm64/
# Uygulamanın zorunlu yeniden derlenmesi
adb shell cmd package compile -m speed com.example.app
ART sistemi, birbirine bağlı birkaç modülden oluşur. dex2oat derleyicisi yerel kod üretiminden sorumludur. Çöp toplayıcı (GC), bellek serbest bırakmayı yönetir. Yorumlayıcı, derleme olmadan seyrek çağrılan kodu yürütür. Profilleyici, hibrit derleme için sıcak yöntemleri izler. Her modül bağımsız olarak çalışabilir, bu da ART’yi esnek ve ölçeklenebilir kılar.
Android 7.0 Nougat’tan itibaren ART, JIT ve AOT’nin avantajlarını birleştiren hibrit bir yaklaşım kullanır. Uygulama kurulumu sırasında ART artık tam AOT derlemesi yapmaz — bunun yerine uygulama, sıcak yöntemlerin JIT derlemesiyle yorumlanan modda çalışır. Bu, kurulum süresini ve depolama alanını azaltır.
Bir arka plan profilleyicisi paralel olarak çalışır. Hangi yöntemlerin en sık çağrıldığı, hangi kod dallarının yürütüldüğü, hangi sınıfların yüklendiği gibi yürütme istatistiklerini toplar. Yeterli veri biriktikten sonra (genellikle 2–3 uygulama başlatmasından sonra), ART arka planda dex2oat’ı çalıştırır ve yalnızca profillenmiş sıcak yöntemleri yerel koda derler.
ART, system_server aracılığıyla yönetilen birkaç derleme modunu destekler. “speed” modu tüm yöntemleri AOT ile derler (maksimum performans, yavaş kurulum). “speed-profile” modu yalnızca profillenmiş sıcak yöntemleri derler (hız ve boyut dengesi). “verify” modu derleme olmadan yalnızca bayt kodunu doğrular (minimum alan, yorumlama). Varsayılan olarak, çoğu uygulama için en uygun olan speed-profile kullanılır.
| Mod | Derleme | Kurulum süresi | Performans |
|---|---|---|---|
| speed | Tam AOT | Yavaş | Maksimum |
| speed-profile | Profilli AOT | Hızlı | Yüksek |
| verify | Derleme yok | Anında | Yorumlama |
| space | Minimum AOT | Orta | Orta |
Profilleyici, yürütme verilerini özel .prof dosyalarında toplar. Her uygulama, profilini /data/misc/profiles/ içinde saklar. Eşik değerine ulaşıldığında (genellikle 1000 örnek), profilleyici tanımlanan sıcak yöntemleri derlemek için dex2oat’ı başlatır. Profiller, uygulama güncellemeleri arasında korunur ve OTA sistem güncellemelerinden sonra yeniden optimizasyonu hızlandırır.
ART’deki çöp toplama, Dalvik’e kıyasla önemli ölçüde iyileştirilmiştir. Tek iş parçacıklı Concurrent Mark and Sweep (CMS) yerine ART, birden çok optimizasyonla nesilsel bir toplayıcı kullanır: hareketli toplayıcı (yığın sıkıştırma), büyük nesne alanı (büyük nesneler için ayrı depolama) ve eş zamanlı sıkıştırma (paralel sıkıştırma).
ART’de tipik bir GC duraklaması 2–3 ms iken, Dalvik’te 5–10 ms’dir. Bu, birkaç mekanizma sayesinde mümkün oldu. Birincisi, ART eş zamanlı aşamalar için stop-the-world yerine read-barrier kullanır. İkincisi, nesilsel toplayıcı çoğu döngüde tüm yığına dokunmadan yalnızca genç nesil nesneleri işler. Üçüncüsü, büyük nesne alanı (LOS) ayrı olarak tahsis edilir ve normal GC döngülerine katılmaz.
// Hata ayıklama için GC günlüklerini etkinleştirme
System.logV("ART", "GC trigger: allocation failed");
// Zorunlu GC çağrısı (üretimde önerilmez)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Debug.getRuntimeIStats();
}
GC iyileştirilmesine rağmen, bellek sızıntıları güncel bir sorun olmaya devam ediyor. ART’ye özgü bir neden, JNI aracılığıyla yerel kütüphanelerin uygun şekilde serbest bırakılmadan yüklenmesidir. Yerel kod, malloc aracılığıyla bellek ayırır ancak free çağırmazsa, ART bu belleği serbest bırakamaz — yönetilen yığının dışındadır. Android NDK’daki AddressSanitizer aracı, bu tür sızıntıları belirlemeye yardımcı olur.
ART ve Dalvik, aynı görevin (Android uygulamalarını çalıştırma) temelde farklı iki uygulamasıdır. Farklılıklar tüm seviyeleri etkiler: derlemeden bellek yönetimine kadar. Aşağıda temel performans ve uyumluluk parametrelerinin bir karşılaştırması bulunmaktadır.
ART’nin ana avantajı JIT ısınmasını ortadan kaldırmasıdır. Dalvik’te, JIT sıcak yöntemleri derlerken bir uygulama ilk 3–10 saniye boyunca yavaşlayabilirdi. ART’de tüm yöntemler zaten yerel koda derlenmiştir (veya arka planda derlenecektir). Bu özellikle oyunlarda ve ağır arayüzlü uygulamalarda belirgindir: fps farkı ART lehine %15–20’ye ulaşabilir.
| Parametre | Dalvik | ART |
|---|---|---|
| Derleme | JIT (çalışma zamanında) | AOT + hibrit (kurulumda) |
| Başlatma süresi | 3–10 sn (ısınma) | Anında |
| APK boyutu | ~6–7 MB (DEX) | +%20 (OAT) |
| GC duraklamaları | 5–10 ms | 2–3 ms |
| Güç tüketimi | Daha yüksek (JIT CPU’yu ısıtır) | Daha düşük (yerel kod) |
Dalvik için yazılmış tüm uygulamalar, değişiklik yapılmadan ART’de çalışır. Google, DEX bayt kodu düzeyinde tam geriye uyumluluğu garanti eder. İstisna, yansıma yoluyla Dalvik’e özgü iç API’yi kullanan koddur: Android SDK’da @hide ile işaretlenmiş dalvik.system.DexFile sınıfının üyeleri. Bu tür kod, genel API’leri kullanacak şekilde güncellenmelidir.
ART, yerel Java 8 özellik desteğine sahip ilk Android çalışma zamanı oldu. Android 7.0’dan itibaren ART, şekerden arındırmayı (desugaring) içerir — Java 8 yapılarını (lambda, metot referansları, Stream API) eşdeğer Java 7 koduna dönüştürme işlemi. Bu, eski cihazlarla uyumluluğu kaybetmeden modern sözdizimini kullanmayı sağlar.
Şekerden arındırma, D8 derleyicisi tarafından gerçekleştirilir ve şu şekilde çalışır. Lambda içeren kaynak kodu, aynı sınıf içinde sentetik bir metoda dönüştürülür ve lambda, invoke-custom çağrısıyla değiştirilir. ART’nin çalışma zamanı, özellikle Java 8 için eklenen invoke-custom talimatının desteğini içerir. Android 6.0 ve altı cihazlarda, lambda’lar anonim sınıflara dönüştürülür.
// Java 8 lambda — ART’de şekerden arındırma
button.setOnClickListener(v -> handleClick(v));
// Şekerden arındırmadan sonra (Java 7 eşdeğeri)
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
handleClick(v);
}
});
Tüm Java 8 özellikleri şekerden arındırma tarafından desteklenmez. java.time API’si (tarihler ve saat) yalnızca build.gradle’a eklenen ek bir kütüphane olan desugar_jdk_libs aracılığıyla kullanılabilir. Stream API de desugar_jdk_libs gerektirir. java.util.function ve Optional ek bağımlılık olmadan çalışır. Tam Java 8 desteği, şekerden arındırma olmadan Android 8.0 ve üzeri cihazlarda kullanılabilir.
ART geriye uyumlu olmasına rağmen, bazı optimizasyon uygulamaları özellikle bu çalışma zamanında performansı artırır. Ana öneri, yansımayı en aza indirmektir. ART, derleme zamanında görünür yöntemleri doğrudan makine kodu çağrılarına derler. Yansıma, ART’nin ek saplamalar oluşturmasına neden olarak yürütmeyi %10–15 yavaşlatır.
Android 9.0’dan itibaren ART, App Startup Optimization desteğini sundu. Geliştirici, manifestte <initialization> aracılığıyla başlatma sınıflarını işaretleyebilir ve ART bunları uygulama başlatmada önceden yükler. Bu, çok sayıda eklenti veya kütüphane içeren uygulamalar için başlatma süresini %5–15 oranında azaltır.
<!-- AndroidManifest.xml’de App Startup Optimization -->
<application>
<profileable
android:shell="true"
android:enable="true" />
</application>
ART üzerinde performansı ölçmek için systrace ve perfetto kullanın. Systrace, dex2oat derleme süresini, GC sıklığını ve kare oluşturma hızını gösterir. Perfetto, daha ayrıntılı bilgi sağlar: iş parçacığı dağılımı, JNI geçiş süresi, yerel kütüphane yükleme. Başlatma: adb shell perfetto -o /data/misc/perfetto-traces/trace.perfetto -t 10s sched freq idle am wm.
Sıkça sorulan sorular
ART (Android Runtime), kurulum sırasında uygulama kodunu makine koduna derleyen Android uygulama çalışma zamanı ortamıdır. Bu, eski Dalvik çalışma zamanına kıyasla uygulama başlatma ve çalıştırmayı hızlandırır.
ART, uygulama kurulumu sırasında kodu önceden (AOT) derlerken, Dalvik çalışma zamanı sırasında parça parça (JIT) derlerdi. Bu nedenle, ART’de uygulamalar daha hızlı başlatılır ve daha az güç tüketir.
adb shell getprop komutunu çalıştırın ve persist.sys.dalvik.vm.lib.2 özelliğini bulun. “libart.so” değeri ART’yi, “libdvm.so” değeri Dalvik’i belirtir. Android 5.0+ olan tüm cihazlar ART’yi kullanır.
Minimum düzeyde. Uygulamanın kendisi DEX dosyalarıyla birlikte APK formatında kalır. ART, /data/dalvik-cache/ içinde orijinal DEX’ten %10–20 daha fazla yer kaplayan ek bir OAT dosyası oluşturur, ancak bu depolama APK boyutuna dahil değildir.
Evet, ART şekerden arındırma mekanizması aracılığıyla çoğu Java 8 özelliğini destekler. Lambda, metot referansları ve işlevsel arayüzler, Android 5.0+ olan tüm cihazlarda çalışır. Stream API ve java.time, desugar_jdk_libs kütüphanesini gerektirir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun