Başarılı Örnekler

Grab, R8 ve profile dayalı optimizasyon ile ANR'leri% 32 oranında azaltıp başlatma süresini% 35 oranında iyileştirdi

Okuma süresi: 5 dk.

Güneydoğu Asya'nın önde gelen süper uygulaması Grab, tek bir uygulama üzerinden sekiz ülkede milyonlarca kullanıcıya teslimat, mobilite ve finansal hizmetler sunuyor. 10 milyon satırdan fazla kod içeren 10 yıllık bir kod tabanına ve karma bir Bazel ve Gradle kurulumu kullanılarak oluşturulmuş yüzlerce üçüncü taraf kitaplığına sahip olan Grab ekibi, giderek büyüyen üç zorlukla karşı karşıyaydı: yüksek Uygulama Yanıt Vermiyor (ANR) oranları, süper uygulama yeni hizmetler ekledikçe büyümeye devam eden uygulama boyutu ve yıldan yıla yavaş yavaş artan başlatma süresi.Grab, R8 optimizasyonunu etkinleştirerek, saklama kurallarını hassaslaştırarak, Temel Profiller ve Başlangıç Profilleri'ni uygulayarak kullanıcı tarafından algılanan yanıt yok hatası oranını %32, uygulama indirme boyutunu yaklaşık %30 azalttı ve başlatma süresini %35 iyileştirdi.

Daha Sorunsuz Bir Kullanıcı Deneyimi İçin Sürüm Sonrası ANR Artışlarını Ortadan Kaldırma

Grab, derleme sürecini optimize etmeden önce yeni güncellemelerin hemen ardından soğuk başlatma gecikmeleri ve Uygulama Yanıt Vermiyor (ANR) artışları yaşadı. Bu durum, temel olarak uygulama başlatma sırasında çok sayıda DEX dosyasının okunmasından kaynaklanıyordu. 

Google Play'in Cloud Profiles özelliği, genel kullanıcı tabanındaki standart akışlar için optimizasyon sağlasa da Grab'in kritik kullanıcı yolculukları için gereken tüm başlatma yollarını (ör. uygulama başlatma sırasında Dagger bağımlılık grafiklerini başlatma) optimize etmez. İlk dağıtımda kapsanmayan kod yolları için cihazlar, sonraki günlerde JIT derleme ve yerel arka plan optimizasyonunu kullandı. Özel bir temel profil uygulayarak bu sorunu çözdüler. Bu kritik kullanıcı yolculuklarını doğrudan Google Play'in bulut profillerine ekleyerek optimizasyon kapsamını genişlettiler. Böylece bu önemli yollar, yükleme sırasında hemen makine diline derlendi.

ANDDM_Grab_Inline_Quote_ALT.png

Grab'in Passenger App Core ekibinde Baş Yazılım Mühendisi olarak çalışan Nguyen Van Minh,"Her haftalık uygulama sürümünde sürekli olarak ANR oranı artışları yaşıyorduk" diyor. 

Grab, ANR'leri ortadan kaldırmak ve başlatma sürelerini iyileştirmek için R8 optimizasyonları, Temel Profiller ve Başlatma Profilleri'ni uyguladı. R8 optimize edici ile birlikte profile dayalı optimizasyon, R8'den% 12 ve Baseline Profiles'dan% 15 daha hızlı soğuk başlatma süresi sağladı. Böylece başlatma süresi% 27 daha hızlı hale geldi ve sürüm sonrası ANR artışları etkili bir şekilde ortadan kaldırıldı.

Grab, bu uygulama optimizasyonunu üç stratejik aşamada gerçekleştirdi: R8 optimizasyonunu uyumluluk modunda etkinleştirme, R8 tam moduna geçiş yapma ve ardından Configuration Analyzer ile saklama kurallarını hassaslaştırma ve CI/CD yönetimi ekleme.

1. Aşama: R8 optimizasyonunu etkinleştirme  (2025'te kullanıma sunuldu)

Bu ilk aşamada Grab, eski varsayılan Proguard dosyasından uzaklaşarak R8 optimizasyonlarını etkinleştiren proguard-android-optimize.txt dosyasını kullanmaya başladı. Kod tabanı on yıldan eski olduğu ve 10 milyondan fazla kod satırı içerdiği için optimize ediciyi etkinleştirmek, eski yapılandırmaların ve yansıma kullanımının ele alınmasını gerektiriyordu.

Grab, bu aşamanın etkisini en üst düzeye çıkarmak için R8 uyumluluk modu etkinleştirilmiş uygulama güncellemesini Temel Profiller ve Başlangıç Profilleri ile yayınladı. Bu ortak çalışma sonucunda, kullanıcı tarafından algılanan ANR oranlarında anında% 25, uygulama indirme boyutunda% 16 azalma ve soğuk başlatma sürelerinde genel olarak% 27 iyileşme sağlandı.

2. Aşama: R8 Tam Modu ve Geçiş (2026'da kullanıma sunulacak)

İlk kullanıma sunma aşamasından dokuz ay sonra başlatılan bu aşamada uygulama, R8 Tam Modu'na geçirildi ve bu sayede daha fazla optimizasyonun kilidi açıldı. Retrofit, Firebase ve Jetpack Compose gibi standart kitaplıklar, yerleşik kuralları sayesinde R8 ile sorunsuz çalıştı. Devasa kod tabanının geri kalanını taşımak için ise yansıma yoğun kod yolları çözüldü:

Ekip, R8 tam moduna geçmek için en son Gson sürümündeki tüketici saklama kurallarını benimseyerek sorunsuz JSON ayrıştırma sağladı. Ayrıca, çalışma zamanında arayüz uygulamaları oluşturmak için yansımayı kullanan Java dinamik proxy'leriyle ilgili optimizasyon sorunlarını da ele aldılar. R8, derleme sırasında bu çalışma zamanı kullanımını algılayamadığı için gerekli sınıfları kaldırır veya yeniden adlandırır. Bu da uygulamanın kilitlenmesine neden olur. Ekip, uygulama boyutunu artıracak geniş kapsamlı istisnalar uygulamak yerine, yansımaya dayalı belirli sınıfları izole etti ve son derece hedefli saklama kuralları uygulayarak hem uygulama kararlılığını hem de optimizasyon verimliliğini korudu.

Sonuç olarak R8 Tam Mod, uygulama indirme boyutunda% 14 daha fazla azalma, başlatma süresinde% 10 daha fazla iyileşme ve kullanıcı tarafından algılanan ANR'lerde% 10 daha fazla azalma dahil olmak üzere büyük ve birleşik iyileştirmeler sağladı. R8 tam moduna geçişin ardından Grab'in kod tabanı şu R8 optimizasyon puanlarını elde etti. 

  • Optimizasyon puanı: %72
  • Küçültme Skoru: %73
  • Kod karartma puanı: %79,6

Bu puanlar, R8 yapılandırması ve R8 optimizasyonunu en üst düzeye çıkarmak için saklama kurallarını hassaslaştırma ihtiyacı hakkında geri bildirim sağladı. 

3. Aşama: Saklama Kuralını İyileştirme 

Optimizasyon yolculuğunun son aşamasında Grab, uzun vadeli kod tabanı sağlığı, sürekli performans izleme ve katı derleme yönetimi oluşturmaya odaklanıyor. Ekip, kural hijyenini sistematik olarak ölçmek ve devam eden sürüm döngülerinde yapılandırma gerilemelerini önlemek için R8 Yapılandırma Analiz Aracı'nı değerlendirme iş akışına entegre ediyor. Bu araç, Grab'in saklama (keep) kurallarının R8'in uygulamayı optimize etmesine, küçültmesine ve kodunu karartmasına ne kadar etkili bir şekilde izin verdiğine dair ayrıntılı görünürlük sağlar.

Grab, R8 tam modunun temelini kullanarak ve eski saklama kurallarını metodik olarak kırparak analizör tarafından değerlendirilen üç temel boyutta da önemli iyileştirmeler elde ediyor:

  • Optimizasyon puanı: %72'den %78,2'ye yükseliyor
  • Küçültme Skoru: %73'ten %79,1'e yükseliyor
  • Kod Karartma Skoru: %79,6'dan %81,7'ye yükseliyor

Bu teşhis puanlarını artırmanın yanı sıra, bu özel saklama kuralı hassaslaştırma aşaması, uygulama indirme boyutunda yaklaşık% 3,6'lık ek bir azalma sağlıyor. Daha da önemlisi, bu metriklerin izlenmesi, mühendislik ekibine otomatik birleştirme öncesi CI koruma önlemlerini uygulamak için gereken nesnel verileri sağlıyor. Bu sayede, yeni eklenen kodların katı saklama kuralı standartlarına uyması ve zorlukla elde edilen performans kazanımlarının zaman içinde korunması sağlanıyor.

Sonuçlar

R8 optimizasyon aracının kullanıma sunulmasının ardından elde edilen önemli performans iyileştirmeleri:

Optimizasyon aşamasıANR'lerBoyutSıfırdan Başlatma
1. Aşama: R8 Optimize Edici (2025'te kullanıma sunuldu)~% 25 azalma%16 azalmaYaklaşık% 27 iyileşme
2. Aşama: R8 Tam Modu (2026'da kullanıma sunuldu)%10 azalma%14 azalma%10 iyileşme
Saklama Kuralı Optimizasyonu-%3,6 azalma-
Genel (Kümülatif)~% 32,5 azalma~% 30,4 azalma~% 35 iyileşme

Teknik zorluklar 

R8 optimize ediciyi Grab'in on yıllık kod tabanında etkinleştirmek, büyük ölçekte önemli teknik engelleri beraberinde getirdi:

  • Test: On yıllık birikmiş yansıma, tam optimizasyon altında uç durumlar oluşturdu. Milyonlarca satır kodun kapsamlı bir şekilde test edilmesi imkansız olduğundan ekip, artımlı ve yüksek öncelikli bir yaklaşım benimsedi. Özellikle daraltılan saklama kurallarının kapsadığı kodun test edilmesine odaklandı ve R8 optimizasyonunu en üst düzeye çıkarmak için yalnızca yansıma için gereken belirli sınıfları, yöntemleri veya alanları hedeflemek üzere bu kuralları yinelemeli olarak hassaslaştırdı.
  • Derleme gecikmesi ve karma mimari: Grab'in karma derleme sistemi (hata ayıklama için Bazel, R8 yayınlanan derlemeler için Gradle) nedeniyle deneysel R8 değişiklikleri, uzak CI'da 2 saate kadar süre gerektiriyordu. Grab, geri bildirim boşluğunu kapatmak için günlük kalite güvencesi derlemelerini üretim R8 davranışıyla eşleşecek şekilde uyumlu hale getirdi ve kolaylaştırılmış inceleme için mapping.txt, configuration.txt gibi önemli CI derleme yapılarının toplanmasını otomatikleştirdi.
  • Yavaş hata ayıklama döngüleri: Optimize edilmiş yüzlerce sınıfta temel nedenleri izlemek, küçük bir ekibe ağır bir yük getiriyordu. Grab, Gradle aracılığıyla Firebase Crashlytics'e eşleme dosyası yüklemelerini otomatikleştirerek ve Play Console için kod gösterme eşlemelerini paketleyerek bu sorunu çözdü. Böylece çalışma zamanı sorunları için anında ve doğru sembol çözümü sağladı.

R8 ile Uzun Vadeli Kod Etkisi

R8 optimizasyon aracını etkinleştirmek, anında performans artışı sağlamanın yanı sıra Grab'in devasa kod tabanı için kalıcı bir yapısal avantaj sağladı. Grab'deki ekip, R8'in etkisini ölçmek için açık kaynaklı app-sizer aracını kullandı ve R8'in, uygulamadaki her kod satırının indirme boyutuna olan etkisini kalıcı olarak azalttığını gözlemledi.

ANDDM_Grab_Inline_Metric.png

Yapay zeka destekli geliştirme çağında kod hacmi hızla artarken bu optimizasyon daha da önemli hale geliyor. R8 olmadan kod genişletme, indirme boyutunu orantılı olarak artırır. R8, aynı kod genişletme oranının bellekte kaplanan yeri önemli ölçüde azaltmasını sağlar.

Not: Metodoloji: app-sizer'ın uygulama indirme boyutuna (temsili cihaz) Kotlin/Java katkısı, üretim Kotlin LOC'ye (cloc; yalnızca ana kaynak grupları; test, örnek ve örnek modüller hariç) bölünür.

Kural Yönetimi ve Önlemler'i kullanmaya devam etme

Grab, kural bozulmasını önlemek ve R8 optimizasyonlarını zaman içinde sürdürmek için otomatik birleştirme öncesi koruma mekanizmalarını doğrudan CI ardışık düzenine entegre etmeyi planlıyor. Bu politika kapsamında, yeni saklama kuralları kesinlikle kısıtlanır ve ek kurallar için açık bir gerekçe ve inceleme gerekir. Grab ekibi, CI'da R8 optimizasyon puanlarını takip eder. Ekip, bu başarıdan yola çıkarak bu metrikleri sürekli bir geri bildirim döngüsü olarak kullanmayı planlıyor. Böylece, gerilemeler birleştirmeden önce yakalanacak ve optimizasyon kazanımları her sürüm döngüsünde korunacak. 

R8-rules-score (1).png

1. görsel: Sürümler arasında gerilemeleri proaktif olarak tespit etmek ve önlemek için Grab derlemelerinde zaman içinde R8 küçültme, optimizasyon ve kod karartma puanlarını izleyen CI kontrol paneli.

Sonuç 

Grab'in Pax App Core ekibi, devasa ve olgunlaşan bir kod tabanının zorluklarıyla karşı karşıya kaldı. Ekip, Temel Profiller'i uygulayarak ve R8 yapılandırmasını sürekli olarak iyileştirerek artan başlatma sürelerini ve sürüm sonrası performans artışlarını proaktif bir şekilde ele aldı. Ekip, kullanıcı tarafından algılanan ANR'leri yaklaşık %32,5, uygulama indirme boyutunu yaklaşık %30,3 ve sıfırdan başlatma süresini yaklaşık %35 oranında azalttı. Aynı zamanda kod tabanının ölçeklendirme verimliliğini de önemli ölçüde artırdı.

Bu optimizasyonlar, Güneydoğu Asya'daki milyonlarca kullanıcıya daha hızlı ve daha kararlı bir süper uygulama deneyimi sunarken Grab'in mühendislerine de indirme boyutunu hızla artırmadan özellikleri daha hızlı oluşturma araçları sağladı.

R8'i kullanmaya başlamak ve daha fazla bilgi edinmek için - d.android.com/r8 adresini ziyaret edin.

Yazan:
Okumaya devam et