R8, derleme aşamasında Android uygulamalarının sıkıştırma, desugaring ve karıştırma işlemlerini gerçekleştiren bir derleyici ve DEX kodu optimizasyon aracıdır. Google Android Performance Team (2025)'e göre, R8 kullanımı APK boyutunu ProGuard'a kıyasla ortalama %18 azaltır ve derleme süresini %30 kısaltır. Android Gradle Plugin 8.0'den itibaren R8, standart karıştırma aracı olarak ProGuard'ın yerini tamamen almıştır.
Önemli Noktalar
R8, Android ekosisteminde ProGuard'ın yerini alması için Google tarafından geliştirilen bir bayt kodu işleme ve dönüştürme programıdır. class dosyası aşamasında ayrı bir araç olarak çalışan ProGuard'ın aksine, R8 doğrudan DEX derleyicisine (D8/R8) entegre edilmiştir. Bu, R8'in harici araçların erişemeyeceği daha derin bir düzeyde analiz ve optimizasyon yapmasına olanak tanır.
R8, girdi olarak class dosyaları veya JAR arşivleri biçiminde Java bayt kodu alır ve bunu tek bir geçişte optimize edilmiş DEX koduna dönüştürür. Yerleşik R8 optimize edici, basit (sabitlerin inline edilmesi)ten karmaşığa (alan düzeyinde hassasiyetle tip erişilebilirlik analizi) kadar 50'den fazla farklı dönüştürme türü gerçekleştirir. Google'a göre, R8 mimarisi özellikle çok iş parçacıklı çalışma için tasarlanmıştır ve yüksek derleme hızı sağlar.
R8, Google I/O 2018'de duyurulmuş ve ilk olarak Android Gradle Plugin 3.4'te (2019) ProGuard'ın isteğe bağlı bir alternatifi olarak yer almıştır. AGP 7.0'da R8 tüm projeler için varsayılan araç haline gelmiş ve AGP 8.0'da (2023) ProGuard desteği eklentiden tamamen kaldırılmıştır. 2025 itibarıyla R8, Google tarafından önerilen Android için tek resmi karıştırma ve optimizasyon aracıdır.
R8, geliştiricilere verimlilikte ProGuard'ı önemli ölçüde geride bırakan güçlü yetenekler sunar. Başlıcalarına bakalım.
R8, uygulama kodunun ve tüm bağımlılıklarının küresel bir analizini yaparak giriş noktalarından çağrı grafiği aracılığıyla erişilebilir sınıfları ve metotları belirler. R8'in analizi, kodun DEX temsiline erişim sayesinde ProGuard'dan daha doğrudur. R8, yalnızca tüm sınıfları ve metotları değil, aynı zamanda hiç kullanılmayan bireysel alanları da kaldırabilir. Google'ın testlerine göre R8, aynı projelerde ProGuard'dan ortalama %15 daha fazla kod kaldırır.
Yerleşik desugaring, ProGuard'da bulunmayan R8'e özgü bir özelliktir. R8, lambda ifadelerini, metot referanslarını, varsayılan metotlara sahip arayüzleri ve Java 8+ try-with-resources yapılarını otomatik olarak tüm Android API seviyelerinde çalışan geriye uyumlu koda dönüştürür. Bu, geliştiricinin ayrı bir desugar_jdk_libs kütüphanesi ekleme ve desugaring'i manuel olarak yapılandırma ihtiyacını ortadan kaldırır.
R8 nihai DEX biçimini gördüğü için ProGuard için imkansız olan optimizasyonları gerçekleştirebilir. R8, aynı dize sabitlerini birleştirir, kullanılmayan istisnaları kaldırır, switch yapılarını optimize eder ve çağrı grafiğini yeniden yazarak agresif inline işlemi yapar. Bu optimizasyonlar yalnızca APK boyutunu azaltmakla kalmaz, aynı zamanda ART üzerinde kod yürütme performansını da iyileştirir.
// build.gradle'da R8'i açıkça etkinleştirme (AGP 8.0+'da isteğe bağlı)
android {
compileSdk 34
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
}
// gradle.properties — R8'i zorla etkinleştir
android.enableR8.fullMode=true
R8 ve ProGuard arasındaki seçim yalnızca AGP 8.0'den eski sürümleri kullanan projeler için geçerlidir. Mimari farklılıkları anlamak için temel parametrelere göre karşılaştırmaya bakalım.
| Parametre | R8 | ProGuard |
|---|---|---|
| Entegrasyon | DEX derleyicisine entegre | Ayrı araç |
| Kod sıkıştırma | %15 daha verimli | Temel seviye |
| Derleme hızı | %20-30 daha hızlı | Temel hız |
| Desugaring | Yerleşik | Desteklenmiyor |
| Kural uyumluluğu | ProGuard ile tam | Standart sözdizimi |
| AGP 8.0+ desteği | Evet (standart) | Hayır (kaldırıldı) |
Google'ın 100 popüler Play Store uygulaması üzerinde yaptığı testler, R8'in APK boyutunu ProGuard'a kıyasla ortalama %18 azalttığını göstermiştir. Java 8+ sözdizimini ve üçüncü taraf kütüphaneleri yoğun kullanan bazı projelerde fark %28'e ulaşmıştır. 40 MB'lık bir uygulama için bu, 5 ila 11 MB arasında tasarruf anlamına gelir ve bu, sınırlı bant genişliğine sahip kullanıcılar için kritiktir.
Her iki araç da Kotlin kodunu doğru şekilde işler, ancak R8 Kotlin'e özgü yapıları (lambda'lar, inline fonksiyonlar, coroutine'ler ve null-güvenli tipler) daha iyi optimize eder. R8, Kotlin meta veri anlam bilimini anlar ve gereksiz null kontrollerini güvenle kaldırabilir ve inline fonksiyonları gömebilir. Kotlin projeleri için R8, Google'ın önerdiği araçtır.
R8 kurulumu, derleme yapılandırmasında minimum değişiklik gerektirir, çünkü AGP 8.0+ araç varsayılan olarak kullanılır. Temel yapılandırma yönlerine bakalım.
R8 tam modu (android.enableR8.fullMode=true), APK boyutunda ek %5-10 azalma sağlayan daha agresif optimizasyonları etkinleştirir. Bu modda R8, ProGuard'ın erişilebilir olarak kabul edeceği sınıfları ve metotları kaldırarak daha derin kod analizi yapar. Tam mod, yansıma kullanan kütüphaneler için ek -keep kuralları gerektirebilir.
# gradle.properties — R8 tam modunu etkinleştir
android.enableR8.fullMode=true
# Tam mod için ek kurallar
-keep class com.example.reflection.** { *; }
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
R8 ile bir sürüm derlemesinde hatalar oluştuğunda Google şunları önerir: yığın izini karıştırmayı çözmek için eşleme dosyasını kontrol edin, sorunu izole etmek için geçici olarak fullMode'u devre dışı bırakın, bir sınıfın neden kaldırılmadığını anlamak için -whyareyoukeeping ekleyin ve ayrıntılı R8 işleme günlüğü almak için --info Gradle bayrağını kullanın.
CI/CD'de R8 ile derlemeleri otomatikleştirmek için eşleme dosyalarını derleme yapıtları olarak kaydetmek önemlidir. Her eşleme dosyası, sürüm numarasına ve derleme varyantına bağlanmalıdır. Google, APK/AAB ile birlikte build/outputs/mapping/ dosyasını yapı yönetim sisteminde arşivlemeyi önerir. Bu, uygulamanın herhangi bir sürümündeki çökmeleri karıştırmayı çözme yeteneğini sağlayacaktır.
Android topluluğunda R8 kullanımındaki yılların deneyimi, tipik sorunlardan kaçınmaya ve araçtan maksimum fayda sağlamaya yardımcı olan kanıtlanmış uygulamalar oluşturmuştur.
ProGuard'dan R8'e geçerken, R8'in varsayılan olarak etkin olduğu ancak fullMode'un devre dışı olduğu AGP 7.x ile başlanması önerilir. Tam bir cihaz ve senaryo setinde derleme kararlılığı doğrulandıktan sonra fullMode etkinleştirilebilir. Her aşama, farklı Android sürümlerine sahip fiziksel cihazlarda sürüm derlemesinin test edilmesini gerektirir.
R8 eşleme dosyaları ProGuard ile aynı biçime sahiptir ancak daha ayrıntılı analiz sayesinde daha fazla bilgi içerir. Google şunları önerir: eşleme dosyalarını süresiz olarak saklayın — eski sürümlerin çökmelerini çözmek için gereklidirler; otomatik yükleme yoluyla eşleme dosyalarını Firebase Crashlytics ile entegre edin; Firebase konsolunda karıştırma çözmenin sınıf adlarını doğru şekilde geri yüklediğini düzenli olarak doğrulayın.
R8 tam modu, standart modda erişilebilir kabul edilen kodu kaldırabilir. Test için kritik alanlar: WebView içeren ekranlar (R8, köprü arayüz sınıflarını kaldırabilir), classLoader aracılığıyla eklenti içeren uygulamalar, analitik ve çökme raporlama kütüphaneleri ve inflate yoluyla oluşturulan düzen dosyalarındaki özel görünümler.
Google, her derlemede R8'i uyguladıktan sonra APK boyutunu izlemeyi önerir. Bireysel bileşenlerin boyutunu karşılaştırmak için Android Studio'da APK Analyzer'ı kullanın: classes.dex, resources.arsc ve yerel kod kütüphaneleri. R8, DEX dosya boyutunu doğrusal olmayan şekilde etkileyebilir — bazen agresif optimizasyon, inline nedeniyle boyut artışına yol açar. Düzenli izleme, anomalileri zamanında tespit etmeye ve karıştırma kurallarını ayarlamaya yardımcı olur.
// Firebase Crashlytics için korunan sınıf örneği
@Keep
class CrashLogger {
fun logException(e: Throwable) {
FirebaseCrashlytics.getInstance().recordException(e)
}
}
// rules.pro — @Keep ile tüm sınıfları koru
// -keep @androidx.annotation.Keep class * { *; }
Sıkça sorulan sorular
Hayır, R8 Android Gradle Plugin'e entegredir ve AGP'yi güncellediğinizde otomatik olarak kurulur. AGP 8.0'den itibaren ProGuard eklentiden tamamen kaldırılmıştır ve R8 tek araçtır. AGP 7.x için R8 varsayılan olarak kullanılır, ancak ProGuard bir seçenek olarak kalır. R8'in ayrı kurulumu gerekmez — sadece AGP sürümünüzü güncellemeniz yeterlidir.
R8 üç faktör sayesinde daha hızlıdır: DEX derleyicisine entegrasyon ek bir bayt kodu geçişini ortadan kaldırır, çok iş parçacıklı mimari çok çekirdekli işlemcileri daha iyi kullanır ve daha akıllı erişilebilirlik analizi işlenen kod miktarını azaltır. Google'ın orta ölçekli bir proje üzerindeki testlerine göre R8, işlemi 12 saniyede tamamlarken ProGuard 18 saniyede tamamlar.
AGP 7.x'te gradle.properties aracılığıyla R8'i devre dışı bırakabilirsiniz: android.enableR8=false. AGP 8.0+'da ProGuard'a dönüş mümkün değildir çünkü eklenti tamamen R8'e geçmiştir. Bir proje kritik olarak belirli ProGuard davranışına bağımlıysa, her iki aracın da kullanılabildiği AGP 7.4 sürümünde sabitlenmesi önerilir.
R8, Kotlin meta verilerinin yerleşik analizi sayesinde Kotlin coroutine'lerini doğru şekilde işler. Araç, Kotlin derleyicisi tarafından suspend fonksiyonlarının, Continuation nesnelerinin ve StateMachine oluşturmanın anlam bilimini anlar. R8, gerekli coroutine sınıflarını kaldırmaz ve güvenli olduğunda bunları optimize edebilir. Kotlin projeleri için maksimum optimizasyon için tam mod önerilir.
Geçiş sırasında en yaygın sorunlar: Eksik sınıflar — R8, ProGuard'ın tuttuğu sınıfları kaldırır; Inline sorunları — agresif inline yansımayı bozar; Kütüphane uyumsuzluğu — eski ProGuard kurallarına sahip kütüphaneler; Tam mod çökmeleri — fullMode'da ek kod kaldırma. Çözüm: fiziksel cihazlarda test edin, yansıma için -keep kullanın ve eşleme dosyası aracılığıyla yığın izini kontrol edin.
Ö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