ART: çalışma zamanı ve nasıl çalışır

Yazar: IT Sectr Yayınlanma: 2026-04-16 Okuma süresi: 10 dk

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

  • ART, AOT derlemesine sahip Android çalışma zamanıdır ve Android 5.0’da Dalvik’in yerini almıştır.
  • AOT derlemesi, uygulama kurulumu sırasında DEX bayt kodunu yerel makine koduna dönüştürür.
  • Hibrit JIT+AOT modu (Android 7.0’dan itibaren) kurulumu hızlandırır ve yüksek performansı korur.
  • ART’de çöp toplama iyileştirildi: nesilsel toplayıcı sayesinde duraklamalar 2–3 ms’ye düşürüldü.
  • ART, Dalvik DEX bayt koduyla geriye uyumluluğu korur ve Java 8+ özelliklerini destekler.

ART nedir?

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.

Geliştirme geçmişi

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.

Mimari değişiklikler

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 mimarisi: Dalvik’ten yeni çalışma zamanına

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.

bash
# 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 bileşenleri

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.

Hibrit derleme: JIT + AOT + profilleme

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.

Derleme modları

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.

ModDerlemeKurulum süresiPerformans
speedTam AOTYavaşMaksimum
speed-profileProfilli AOTHızlıYüksek
verifyDerleme yokAnındaYorumlama
spaceMinimum AOTOrtaOrta

ART profilleyicisi

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’de çöp toplama

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.

java
// 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();
}

ART çağında bellek sızıntıları

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 vs Dalvik: karşılaştırmalı analiz

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.

ParametreDalvikART
DerlemeJIT (çalışma zamanında)AOT + hibrit (kurulumda)
Başlatma süresi3–10 sn (ısınma)Anında
APK boyutu~6–7 MB (DEX)+%20 (OAT)
GC duraklamaları5–10 ms2–3 ms
Güç tüketimiDaha yüksek (JIT CPU’yu ısıtır)Daha düşük (yerel kod)

Uyumluluk

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.

Java 8 desteği ve şekerden arındırma

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
// 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);
    }
});

Şekerden arındırmanın sınırlamaları

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 için uygulama optimizasyonu

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.

xml
<!-- AndroidManifest.xml’de App Startup Optimization -->
<application>
    <profileable
        android:shell="true"
        android:enable="true" />
</application>

Performans testi

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

Android’de ART nedir?

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, Dalvik’ten nasıl farklıdı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.

Bir uygulamanın ART’de çalışıp çalışmadığı nasıl kontrol edilir?

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.

ART, APK boyutunu etkiler mi?

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.

ART, Java 8’i destekler mi?

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

  • ART, temelde farklı bir derleme yaklaşımıyla Android 5.0 Lollipop’ta Dalvik’in yerini alan Android çalışma zamanıdır.
  • AOT derlemesi dex2oat, uygulama kurulumu sırasında DEX bayt kodunu yerel ELF ikili dosyasına dönüştürür.
  • Hibrit JIT + AOT modu (Android 7.0+) kurulumu hızlandırır ve gerçek kullanıma uyum sağlar.
  • ART’deki nesilsel çöp toplayıcı, GC duraklamalarını 5–10 ms’den 2–3 ms’ye düşürdü.
  • Profilleyici, 2–3 başlatmada veri toplar ve sıcak yöntemlerin arka planda derlenmesini tetikler.
  • Java 8 şekerden arındırma, Android 5.0+ cihazlarda lambda ve Stream API’yi etkinleştirir.
  • ART’de en iyi performans için yansımayı en aza indirin ve App Startup Optimization’ı kullanın.

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.

Projeyi tartış

Ayrıca okuyun