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.
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:
- Genellikle belirtilen sınıfın, yöntemin veya alanın yansıtma yoluyla kullanıldığı anlamına gelen istisnalar gözlemliyorsunuz.
Bu istisnalar genellikle şunlardan biridir:
ClassNotFoundException,NoSuchMethodException,NoSuchFieldException,NoClassDefFoundError,NoSuchMethodError,NoSuchFieldError. import kotlin.reflect.*veyaimport java.lang.reflect.*ile yansıtmayı referans alan bir kod görürsünüz.- Bir sınıf oluşturucusunun aşağıdaki gibi 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 uygulamanızdan ve 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: Eklenen 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: R8'in projenizi oluştururken uyguladığı tüm kuralların raporunu görüntüleyerek hangi kuralların uygulandığını kontrol edin. Bu raporu
./app/build/outputs/mapping/configuration.txtadresinde 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
-whyareyoukeepingyapı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-whyareyoukeepingkonusuna 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 Feature Drop 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
retracekomut satırı aracını kullanın. Bu araç, komut satırı araçları paketiyle birlikte gelir.retracekomutunu kullanmak için eşleme dosyası ve yığın izleme dosyası yolunu belirtin.mapping.txtadlı eşleme dosyası, Android App Bundle'ınızla (AAB) otomatik olarak birlikte gönderilir. 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ğumapping.txtdosyası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.