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ı kapsamlı bir şekilde test etmeniz önemlidir. Beklenmedik bir davranışla karşılaşırsanız optimizasyondan sonra 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 için Optimizasyonla ilgili sorunları 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 ya da optimizasyonlarla ilgili daha fazla açıklamaya ihtiyacınız var.

Uygulama kilitleniyor

Uygulamanız R8 ile optimize edildikten sonra kilitleniyorsa 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ıtma yoluyla kullanıldığını gösteren bir istisna gözlemliyorsunuz. Bu istisnalar genellikle şunlardan biridir: ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, NoClassDefFoundError, NoSuchMethodError, NoSuchFieldError.
  • Yansıtma ile ilgili import kotlin.reflect.* veya import java.lang.reflect.* referanslı kod görüyorsunuz.
  • Aşağıdaki gibi bir sınıf oluşturucunun kullanıldığını gözlemliyorsunuz: Something::class.constructors.
  • Class.forName(...) mesajını görürsünüz.

Çözüm: Saklama kuralı ekleyin.

Net olmayan 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 kodun belirli bölümlerini neden koruduğuna dair bir açıklamaya ihtiyacınız olabilir.

  • Uygulanan kurallar hakkında belirsizlik: Dahil edilen kitaplıklardaki kurallar uygulamanız için de geçerli olduğundan ve bu kitaplıklardaki genel seçenekler de uygulamanıza 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 konusuna bakın.

  • Orijinal yığın izinin anlaşılmasının zor olması: R8, kodu çeşitli şekillerde değiştirir. Bu nedenle, yığın izi artık orijinal kodu ifade etmez. Örneğin, satır numaraları ile sınıfların ve yöntemlerin adları değişebilir.

    Çözüm: Android Studio Otter 3 Yeni Özellikler Güncellemesi ve AGP 9.0'dan itibaren Logcat, yığın izlerini otomatik olarak netleştirir. Ancak Android Studio'nun daha eski bir sürümünü kullanıyorsanız orijinal yığın izini manuel olarak kurtarmanız gerekir. Orijinal yığın izini kurtarmak için retrace komut satırı aracını kullanın. Bu araç, komut satırı araçları paketiyle birlikte gelir.

    retrace komutunu kullanmak için eşleme dosyası ve yığın izleme dosyası yolunu belirtin. mapping.txt adlı eşleme dosyası, Android App Bundle'ınızla (AAB) otomatik olarak paketlenir. Daha fazla bilgi için retrace dokümanlarına ve kilitlenme yığını izlerinin kodunu çözme ile ilgili Play Console Yardım Merkezi makalesine bakın. Play ve Firebase Crashlytics'i kullanırken hizmetin uygulama kullanıcılarından topladığı kilitlenmelerin bulunduğu 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
    

Hata bildir

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