AOT (Ahead-Of-Time) — kaynak kodun veya bayt kodunun program çalıştırılmadan önce, derleme veya yükleme aşamasında makine talimatlarına dönüştürüldüğü bir derleme teknolojisidir. Android'de, AOT derlemesi, 5.0 Lollipop sürümünde Dalvik'in yerini alan ART çalışma zamanı ortamının önemli bir yeniliği haline geldi. Google, 2024'e göre, ART'deki AOT derlemesi, ısınma gecikmelerini ortadan kaldırır ve JIT yaklaşımına kıyasla uygulamaların güç tüketimini %10–15 oranında azaltır.
Önemli Noktalar
Ahead-Of-Time (AOT), bir programın çalıştırılmadan önce makine koduna dönüştürüldüğü bir derleme yöntemidir. “Ahead-Of-Time” terimi JIT (Just-In-Time) ile tezat oluşturur: JIT “tam zamanında” derlerken, AOT “önceden” derler. Bir AOT derleyicisi, girdi olarak kaynak kodu veya bir ara gösterimi (bayt kodu) alır ve çalıştırılmaya hazır bir yürütülebilir dosya üretir.
AOT'nin tarihi, derlemenin her zaman yürütmeden önce gerçekleştiği geleneksel C ve C++ derleyicilerine kadar uzanır. Yönetilen diller (Java, C#, Dart) bağlamında, AOT daha yeni bir yeniliktir: uzun süre dinamik yeteneklerin (yansıma, dinamik sınıf yükleme) AOT'yi uygulamayı zorlaştırdığı düşünülüyordu. Google, DEX bayt kodunu yerel koda dönüştüren bir AOT derleyicisi olan dex2oat'ı oluşturarak Android için bu sorunu çözdü.
Bir AOT derleyicisi tam bir çevrim döngüsü gerçekleştirir. İlk aşama, ayrıştırma ve soyut sözdizimi ağacı (AST) oluşturmadır. İkincisi, analiz ve optimizasyondur: ölü kod kaldırma, içine alma, döngü optimizasyonu. Üçüncüsü, hedef mimari (ARM, ARM64, x86) için makine kodu üretmektir. Sonuç, çalışma zamanında ek işlem gerektirmeyen yürütülebilir bir dosyadır.
# dex2oat AOT derleyicisinin manuel çalıştırılması
dex2oat --dex-file=classes.dex \
--oat-file=classes.oat \
--arch=arm64 \
--instruction-set-variant=generic
# Derlenen OAT dosyasını kontrol et
oatdump --oat-file=classes.oat --output=oat_dump.txt
Android'de AOT derlemesi, dex2oat yardımcı programı (dalvik executable to optimized android translator) aracılığıyla uygulanır. Bir kullanıcı bir uygulama yüklediğinde, sistem dex2oat'ı çalıştırır, bu da APK'dan DEX dosyalarını okur, bayt kodunu optimize eder ve bir OAT dosyası — yerel kod içeren bir ELF ikili dosyası oluşturur. Bu dosya /data/dalvik-cache/ bölümüne kaydedilir.
Derleme süreci birkaç düzey optimizasyon içerir. Temel düzey — bayt kodu doğrulama ve temel optimizasyonlar (ölü kod kaldırma, sabit katlama). Orta düzey — yöntem içine alma, döngü açma, kaçış analizi. Maksimum düzey — sanallaştırmayı kaldırma ve yığın boyutu optimizasyonu dahil olmak üzere tüm uygulamanın küresel optimizasyonları. Optimizasyon düzeyi derleme moduna (speed, speed-profile, space) bağlıdır.
Bir OAT dosyası, ELF (Executable and Linkable Format) biçimini kullanır — yerel Linux ikili dosyalarının kullandığıyla aynı biçim. OAT dosyasının içinde, her uygulama yöntemi için derlenmiş kod ve meta veriler bulunur: sınıflar, alanlar, yöntemler ve bunların ilişkileri hakkında bilgiler. ART, bu meta verileri tam DEX ayrıştırması olmadan hızlı sınıf yükleme ve sembolik referansları çözmek için kullanır.
| OAT Bileşeni | Amaç |
|---|---|
| ELF başlığı | ELF biçimi başlığı |
| Kod bölümü | Derlenmiş yöntemlerin makine kodu |
| OAT başlığı | ART meta verileri: sürüm, bölüm boyutları |
| DEX bölümleri | Yansıma için orijinal DEX verileri |
| Bağlantı tablosu | JNI ve yerel kütüphaneler için bağlantı tablosu |
AOT ve JIT, performans ve esneklik arasındaki ödünleşim alanında farklı noktaları temsil eder. AOT, ilk saniyeden itibaren maksimum yürütme hızı sağlar ancak daha fazla disk alanı ve yükleme süresi gerektirir. JIT, alan ve yükleme süresinden tasarruf sağlar ancak ısınma gecikmeleri ve pik güç tüketimi ile öder.
Anahtar seçim faktörü kullanım durumudur. Bir kez başlatılan ve uzun süre çalışan uygulamalar için (oyunlar, düzenleyiciler, navigasyon), AOT tercih edilir — derleme maliyetleri kararlı performansla dengelenir. Nadiren başlatılan ve kısa sürelerde çalışan küçük yardımcı programlar için JIT daha avantajlı olabilir — hızlı kurulum ve küçük ayak izi, pik performanstan daha önemlidir.
| Kriter | AOT | JIT |
|---|---|---|
| Başlatma | Anlık | ısınmalı |
| Yükleme | Daha yavaş (derleme) | Hızlı |
| Disk alanı | +%15–30 | Minimum |
| Güç tüketimi | Kararlı | Derleme sırasında pik |
| Uyarlanabilirlik | Düşük | Yüksek |
ilginç bir nüan: AOT kodu her zaman JIT'ten daha hızlı değildir. JIT, çalışma zamanı profil bilgilerine — kesin nesne türleri, çağrı sıklıkları, gerçek dallanma desenleri — erişebilir. Bu, AOT için mevcut olmayan optimizasyonların (profil güdümlü içine alma gibi) uygulanmasına olanak tanır. Pratikte, AOT ve JIT arasındaki derlenmiş kod performans farkı senaryoya bağlı olarak ±%5–10'dur.
AOT, mobil uygulamalar için üç temel avantaj sağlar. Birincisi — öngörülebilir performans. Kullanıcı ilk saniyelerde “takılma” görmez: uygulama ilk kareden itibaren maksimum hızda çalışır. Bu, oyunlar, animasyonlar ve yumuşak geçişli arayüzler için kritik öneme sahiptir.
ikincisi — enerji verimliliği. AOT, JIT derlemesinin tipik CPU pik yüklerini oluşturmaz. işlemci kararlı modda çalışır ve uygulama kullanımının ilk 30–60 saniyesinde güç tüketimini %10–15 azaltır. Günde 20–30 uygulama başlatan tipik bir kullanıcı için bu, pil ömründe gözle görülür bir artış sağlar.
AOT derlemesi çalışma zamanı ortamını basitleştirir. Tüm kod zaten derlendiğinde, çalışma zamanında bir JIT derleyicisine, yorumlayıcıya veya profil oluşturucuya gerek yoktur. Bu, çalışma zamanının boyutunu azaltır ve hata olasılığını düşürür. Tam AOT modunda ART, aktif JIT'li benzer bir ortama göre yaklaşık %15 daha az RAM kullanır.
AOT'nin ana dezavantajı yükleme süresidir. Android 5.0'lı ilk cihazlarda, büyük uygulamaların (100–200 MB) yüklenmesi, AOT derlemesi nedeniyle 2–5 dakika sürebiliyordu. Bu, olumsuz bir kullanıcı deneyimi yarattı: APK indirildikten sonra, kullanıcılar uygulamayı açmadan önce beklemek zorunda kalıyordu. Google, Android 7.0'da hibrit bir şemaya geçerek bu sorunu kısmen çözdü.
ikinci dezavantaj disk alanıdır. OAT dosyaları orijinal DEX dosyalarından %15–30 daha büyüktür. 8–16 GB dahili depolama alanına sahip cihazlarda, her uygulama sistem bölümünde ekstra alan “tüketir.” Çok sayıda yüklü uygulaması olan kullanıcılar için (50–100), bu durum sistem güncellemeleri için yetersiz alana yol açabilir.
AOT kodu derleme zamanında sabitlenir. Uygulama, Android sürümüne, cihaz modeline veya kullanıcı ayarlarına bağlı olarak farklı yürütme desenleri kullanıyorsa, AOT uyum sağlayamaz. Bir senaryo için seçilen optimizasyonlar başka bir senaryo için optimal olmayabilir. JIT bu açıdan daha esnektir: yürütme koşulları değiştiğinde sıcak yöntemleri yeniden derler.
AOT derlemesi yalnızca Android'de kullanılmaz. Flutter, Dart kodunu iOS ve Android için yerel koda derlemek için AOT kullanır. Bu, düşük kaliteli cihazlarda bile 60 fps'de UI performansı sağlar. Geliştirme sırasında Flutter, JIT (hot reload) kullanır ve sürüm yapıları için AOT kullanarak her iki yaklaşımın avantajlarını birleştirir.
.NET ekosisteminde, ReadyToRun (R2R) teknolojisi derlemelerin önceden yerel koda derlenmesine olanak tanır. Bu, .NET uygulamalarının başlatma süresini %30–50 oranında azaltır. Go derleyicisi aslında bir AOT derleyicisidir: Go programları, harici bağımlılıkları olmayan tek bir statik ikili dosyada derlenir ve bu da onları konteyner ortamları için ideal hale getirir.
// Flutter: Dart'ın yerel koda AOT derlemesi
// Sürüm yapısı AOT kullanır
flutter build apk --release
// Sonuç: AOT ile derlenmiş Dart kodu içeren libapp.so
// Geliştirme JIT (hot reload) kullanır
flutter run
AOT'nin ek bir avantajı da tersine mühendisliği zorlaştırmasıdır. Derlenmiş yerel kodun decompile edilmesi bayt koduna göre daha zordur. JADX ve APKTool gibi araçlar DEX biçimiyle çalışır ancak OAT dosyalarından aynı ayrıntı düzeyinde kaynak kodu kurtaramaz. Bu, karartmanın (ProGuard, R8) yerini almaz ancak analizciler için ek bir engel oluşturur.
Android'deki modern standart, Android 7.0'dan itibaren ART'de uygulanan profil bazlı AOT derlemesidir. Yükleme sırasında uygulama tamamen derlenmez — bunun yerine, ilk başlatmalar için hızlı bayt kodu doğrulama ve JIT kullanılır. Bu, Android 5.0–6.0'daki saf AOT'nin uzun yükleme sorununu çözer.
2–3 uygulama başlatmasından sonra ART profil oluşturucusu, gerçek kullanım hakkında veri toplar ve hangi yöntemlerin performans için en kritik olduğunu belirler. Ardından, arka planda (genellikle cihaz şarj olurken gece), dex2oat bu sıcak yöntemleri yerel koda derler. Arka plan derlemesinden sonra uygulama, yükleme sırasında kullanıcı deneyimini olumsuz etkilemeden tam AOT'ye eşdeğer performans elde eder.
// Derleme modunun programatik kontrolü (Android 9+)
fun requestProfileCompilation(context: Context) {
val pm = context.packageManager
// Profil bazlı derleme kullanılması önerilir
pm.setComponentEnabledSetting(
ComponentName(context, javaClass()),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP
)
}
Hibrit derlemenin avantajlarını en üst düzeye çıkarmak için geliştiricilerin birkaç kurala uyması gerekir. APK ile birlikte gelen ve ART'nin yüklemeden hemen sonra sıcak yöntemlerin AOT derlemesine başlamasına izin veren temel profilleri (baseline profiles) kullanın. Temel profiller, tam performansa ulaşma süresini 2–3 başlatmadan ilk başlatmaya düşürür.
Sıkça Sorulan Sorular
AOT, bir programı kullanıcı çalıştırmadan önce makine koduna dönüştürmektir. Bir kitabı açmadan önce tamamen dilinize çevrildiğini hayal edin — sayfa çevirisi için beklemeden hemen okursunuz.
AOT kodu yükleme sırasında derler (daha yavaş yükleme, ancak daha hızlı başlatma). JIT kodu çalışma zamanında derler (hızlı yükleme, ancak ilk saniyeler daha yavaştır). Modern sistemler her iki yaklaşımı birleştirir.
Google, JIT ısınma sorununu — uygulama yürütmesinin ilk saniyelerindeki gecikmeleri — ortadan kaldırmak istedi. ART'deki AOT derlemesi, anlık başlatma sağladı ve güç tüketimini azalttı; bu, mobil cihazlar için kritik derecede önemliydi.
APK boyutu değişmez — AOT derlemesi, sistem bölümünde orijinal DEX dosyalarından %15–30 daha büyük OAT dosyaları oluşturur. Kullanıcı bunu indirme dosyası boyutunda bir artış olarak değil, boş dahili depolama alanında bir azalma olarak görür.
Bu, uygulamanın ilk başlatmalarının JIT kullandığı ve ardından sistemin arka planda yalnızca sık kullanılan yöntemleri yerel koda derlediği hibrit bir yaklaşımdır. Bu, JIT'nin hızlı kurulumunu AOT'nin yüksek performansıyla birleştirir.
Ö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