Karena pengoptimalan R8 mengupdate kode aplikasi, Anda harus benar-benar menguji perilaku aplikasi untuk memastikan bahwa aplikasi berfungsi seperti yang diharapkan. Jika terjadi perilaku yang tidak diharapkan, gunakan halaman ini sebagai panduan untuk memecahkan masalah yang mungkin terjadi setelah pengoptimalan. Untuk mengetahui informasi selengkapnya tentang aturan yang dapat Anda gunakan untuk memecahkan masalah pengoptimalan, lihat Menggunakan aturan untuk memecahkan masalah pengoptimalan.
Saat memecahkan masalah, fokuslah pada situasi berikut:
- Pengoptimalan berlebihan yang menyebabkan error aplikasi: Aplikasi Anda error karena R8 mengoptimalkan terlalu banyak kode.
- Pengoptimalan tidak jelas atau tidak memadai: R8 tidak mengoptimalkan aplikasi Anda sebanyak yang Anda harapkan atau Anda memerlukan penjelasan lebih lanjut untuk pengoptimalan tersebut.
Error aplikasi
Jika aplikasi Anda mengalami error setelah dioptimalkan dengan R8, biasanya hal ini disebabkan oleh refleksi yang rusak. Untuk mengidentifikasi pantulan yang rusak, gunakan panduan berikut:
- Anda mengamati pengecualian yang berarti bahwa class, metode, atau
kolom yang ditunjukkan sedang digunakan melalui refleksi. Pengecualian ini biasanya salah satu dari:
ClassNotFoundException,NoSuchMethodException,NoSuchFieldException,NoClassDefFoundError,NoSuchMethodError,NoSuchFieldError. - Anda melihat kode yang mereferensikan refleksi dengan
import kotlin.reflect.*atauimport java.lang.reflect.*. - Anda mengamati konstruktor class yang digunakan sebagai berikut:
Something::class.constructors. - Anda akan melihat
Class.forName(...).
Solusi: Tambahkan aturan pertahankan.
Jika kode Anda sendiri melakukan refleksi, Anda dapat menganotasi kode tersebut dengan anotasi Jetpack Keep, bukan menambahkan aturan keep. Pemeriksaan lint Jetpack Keep juga menandai panggilan reflektif lain yang tidak diberi anotasi, yang membantu Anda mencegah error serupa.
Pengoptimalan tidak jelas atau tidak memadai
Karena aturan diterapkan dari aplikasi Anda serta dari library yang disertakan, Anda mungkin memerlukan kejelasan tambahan tentang aturan yang diterapkan, atau memerlukan penjelasan mengapa R8 mempertahankan bagian kode tertentu yang Anda harapkan untuk dioptimalkan.
Ambiguitas tentang aturan yang diterapkan: Karena aturan dari library yang disertakan juga berlaku untuk aplikasi Anda, dan opsi global dari library ini juga diteruskan ke aplikasi Anda, Anda mungkin tidak yakin tentang aturan mana yang diterapkan.
Solusi: Periksa aturan yang diterapkan dengan melihat laporan semua aturan yang diterapkan R8 saat mem-build project Anda. Anda dapat menemukan laporan ini di
./app/build/outputs/mapping/configuration.txt. Laporan ini berisi semua aturan gabungan dari setiap library dan modul yang digunakan untuk mengonfigurasi R8, dan dapat digunakan untuk mengidentifikasi aturan yang tidak efisien.Terlalu banyak kode yang dipertahankan: Pengoptimalan R8 mungkin mempertahankan kode yang Anda harapkan untuk dihapus.
Solusi: Gunakan opsi konfigurasi
-whyareyoukeepinguntuk membantu memahami alasan kode dipertahankan. Output-nya berisi jalur dari kode yang dipertahankan ke salah satu titik entri aplikasi Anda. Untuk informasi selengkapnya, lihat-whyareyoukeeping.Sulit memahami pelacakan tumpukan asli: R8 mengubah kode dengan berbagai cara, sehingga pelacakan tumpukan tidak lagi merujuk ke kode asli. Misalnya, nomor baris dan nama class serta metode dapat berubah.
Solusi: Mulai dari Fitur Tambahan Android Studio Otter 3 dan AGP 9.0, Logcat otomatis melakukan deobfuskasi stack trace. Namun, jika Anda menggunakan Android Studio versi sebelumnya, Anda harus memulihkan stack trace asli secara manual. Untuk memulihkan pelacakan tumpukan yang asli, gunakan alat command line
retrace, yang dipaketkan dengan paket alat command line.Untuk menggunakan
retrace, berikan perintah dengan jalur ke file pemetaan dan file stack trace. File pemetaan, yang disebutmapping.txt, otomatis dipaketkan dengan Android App Bundle (AAB) Anda. Untuk mengetahui detail selengkapnya, lihat dokumentasi retrace dan artikel Pusat Bantuan Konsol Play tentang cara men-deobfuscate crash stack trace. Saat menggunakan Play dan Firebase Crashlytics, gunakan filemapping.txtdengan error yang dikumpulkan layanan dari pengguna aplikasi. Perintah berikut menunjukkan cara menjalankanretracedari root project Anda:$ANDROID_HOME/cmdline-tools/latest/bin/retrace app/build/outputs/mapping/$releaseVariant/mapping.txt trace.txt
Melaporkan bug
Jika Anda tidak dapat menyelesaikan masalah dengan R8, ajukan bug.