Optimizasyon sorunlarını düzeltme

R8'in optimizasyonları uygulamanızın kodunu güncellediğinden, uygulamanızın beklendiği gibi çalıştığından emin olmak için uygulamanızın davranışını sıkı bir şekilde test etmeniz önemlidir. Beklenmedik bir durumla karşılaşırsanız optimizasyon sonrasında olası sorunları gidermek için bu sayfayı kılavuz olarak kullanın. Optimizasyonunuzla ilgili sorunları gidermek için kullanabileceğiniz kurallar hakkında daha fazla bilgi edinmek isterseniz Optimizasyon sorunlarını gidermek için kuralları kullanma başlıklı makaleyi inceleyin.

Sorun giderirken aşağıdaki durumlara odaklanın:

  • Aşırı optimizasyon nedeniyle uygulama çökmeleri: R8 çok fazla kodu optimize ettiği için uygulamanız çöküyor.
  • Net olmayan veya yetersiz optimizasyon: R8, uygulamanızı beklediğiniz kadar optimize etmedi veya optimizasyonlarla ilgili daha fazla açıklamaya ihtiyacınız var.

Uygulama kilitleniyor

Uygulamanız R8 ile optimize edildikten sonra kilitlendiyse bunun nedeni genellikle bozuk yansımadır. Bozuk yansımayı belirlemek için aşağıdaki kuralları kullanın:

  • Belirtilen sınıfın, yöntemin veya alanın yansıma yoluyla kullanıldığı anlamına gelen bir istisna görürsünüz. Bu istisnalar genellikle şunlardan biridir: ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, NoClassDefFoundError, NoSuchMethodError, NoSuchFieldError.
  • import kotlin.reflect.* veya import java.lang.reflect.* ile yansımaya referans veren bir kod görürsünüz.
  • Bir sınıf oluşturucunun şu şekilde kullanıldığını görüyorsunuz: Something::class.constructors.
  • Class.forName(...) görüyorsunuz.

Çözüm: Saklama kuralı ekleyin.

Yansıtma işlemini kendi kodunuz yapıyorsa saklama kuralı eklemek yerine bu kodu Jetpack Keep ek açıklamalarıyla açıklayabilirsiniz. Jetpack Keep lint kontrolleri, ek açıklama eklenmemiş diğer yansıtma çağrılarını da işaretleyerek benzer kilitlenmeleri önlemenize yardımcı olur.

Belirsiz veya yetersiz optimizasyon

Kurallar hem uygulamanızdan hem de dahil edilen kitaplıklardan uygulandığı için uygulanan kurallar hakkında daha fazla bilgiye veya R8'in, optimize edilmesini beklediğiniz belirli kod bölümlerini neden koruduğuna dair bir açıklamaya ihtiyacınız olabilir.

  • Uygulanan kurallarla ilgili belirsizlik: Dahil edilen kitaplıklardaki kurallar uygulamanız için de geçerli olduğundan ve bu kitaplıklardaki genel seçenekler uygulamanıza da yayıldığından hangi kuralların uygulandığından emin olamayabilirsiniz.

    Çözüm: Projenizi oluştururken R8'in uyguladığı tüm kuralların raporunu görüntüleyerek hangi kuralların uygulandığını kontrol edin. Bu raporu ./app/build/outputs/mapping/configuration.txt adresinde bulabilirsiniz. Bu rapor, R8'i yapılandırmak için kullanılan her kitaplık ve modüldeki tüm birleştirilmiş kuralları içerir ve verimsiz kuralları belirlemek için kullanılabilir.

  • Çok fazla kod tutuluyor: R8'in optimizasyonu, kaldırılmasını beklediğiniz kodu tutabilir.

    Çözüm: Kodun neden tutulduğunu anlamak için -whyareyoukeeping yapılandırma seçeneğini kullanın. Çıkış, saklanan koddan uygulamanızın giriş noktalarından birine giden bir yol içeriyor. Daha fazla bilgi için -whyareyoukeeping başlıklı makaleyi inceleyin.

  • Orijinal yığın izinin anlaşılmasındaki zorluk: R8, kodu çeşitli şekillerde değiştirir ve yığın izinin artık orijinal kodu referans almamasına neden olur. Örneğin, satır numaraları ile sınıfların ve yöntemlerin adları değişebilir.

    Çözüm: Android Studio Otter 3 Özellik Güncellemesi ve AGP 9.0'dan itibaren Logcat, yığın izlemeleri otomatik olarak kod çözme işlemine tabi tutar. Ancak Android Studio'nun daha eski bir sürümünü kullanıyorsanız orijinal yığın izlemeyi manuel olarak kurtarmanız gerekir. Orijinal yığın izlemeyi kurtarmak için komut satırı araçları paketinde bulunan retrace komut satırı aracını kullanın.

    retrace aracını kullanmak için komuta bir eşleme dosyasının ve yığın izleme dosyasının yolunu ekleyin. mapping.txt adlı eşleme dosyası, Android App Bundle'ınıza (AAB) otomatik olarak eklenir. Daha fazla bilgi için retrace belgelerine ve çökmeyle sonuçlanan yığın izlemelerinin kodunu gösterme ile ilgili Play Console Yardım Merkezi makalesine bakın. Play ve Firebase Crashlytics'i kullanırken, hizmetin uygulama kullanıcılarından topladığı kilitlenmelerle birlikte mapping.txt dosyasını kullanın. Aşağıdaki komutta, retrace'yı projenizin kökünden nasıl çalıştırabileceğiniz gösterilmektedir:

    $ANDROID_HOME/cmdline-tools/latest/bin/retrace app/build/outputs/mapping/$releaseVariant/mapping.txt trace.txt
    

Report bugs

R8 ile ilgili bir sorunu çözemiyorsanız hata bildiriminde bulunun.