Memecahkan masalah pengoptimalan

Karena pengoptimalan R8 memperbarui kode aplikasi Anda, penting untuk menguji perilaku aplikasi Anda secara menyeluruh untuk memastikan bahwa aplikasi Anda berfungsi seperti yang diharapkan. Jika terjadi perilaku yang tidak terduga, gunakan halaman ini sebagai panduan untuk memecahkan masalah yang mungkin terjadi setelah pengoptimalan.

Saat memecahkan masalah, fokuslah pada situasi berikut:

  • Pengoptimalan berlebihan yang menyebabkan aplikasi error: Aplikasi Anda error karena R8 mengoptimalkan terlalu banyak kode.
  • Pengoptimalan tidak jelas atau tidak memadai: R8 tidak mengoptimalkan aplikasi Anda seperti yang diharapkan atau Anda memerlukan penjelasan lebih lanjut untuk pengoptimalan.

Error aplikasi

Jika aplikasi Anda 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 biasanya berarti bahwa class, metode, atau kolom yang ditunjukkan sedang digunakan melalui refleksi. Pengecualian ini biasanya berupa salah satu dari: ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, NoClassDefFoundError, NoSuchMethodError, NoSuchFieldError.
  • Anda melihat kode yang mereferensikan refleksi dengan import kotlin.reflect.* atau import java.lang.reflect.*.
  • Anda mengamati konstruktor class yang digunakan sebagai berikut: Something::class.constructors.
  • Anda melihat Class.forName(...).

Solusi: Tambahkan aturan penyimpanan.

Pengoptimalan tidak jelas atau tidak memadai

Karena aturan diterapkan dari aplikasi Anda, serta library yang disertakan, Anda mungkin memerlukan kejelasan tambahan tentang aturan yang diterapkan, atau memerlukan penjelasan tentang alasan R8 mempertahankan bagian kode tertentu yang Anda harapkan 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 mana yang diterapkan dengan melihat laporan semua aturan yang diterapkan R8 saat membuat 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 -whyareyoukeeping untuk membantu memahami alasan kode dipertahankan. Output-nya berisi jalur dari kode yang dipertahankan ke salah satu titik entri aplikasi Anda. Untuk mengetahui 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 Update Fitur Baru Android Studio Otter 3 dan AGP 9.0, Logcat secara otomatis meng-deobfuscate stack trace. Namun, jika Anda menggunakan Android Studio versi sebelumnya, Anda harus memulihkan stack trace asli secara manual. Untuk memulihkan pelacakan tumpukan 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 disebut mapping.txt, otomatis dibundel dengan Android App Bundle (AAB) Anda. Untuk mengetahui detail selengkapnya, lihat dokumentasi retrace dan artikel Pusat Bantuan Konsol Play tentang cara men-deobfuscate pelacakan tumpukan yang tidak berfungsi. Saat menggunakan Play dan Firebase Crashlytics, gunakan file mapping.txt dengan error yang dikumpulkan layanan dari pengguna aplikasi. Perintah berikut menunjukkan cara menjalankan retrace dari root project Anda:

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

Laporkan bug

Jika Anda tidak dapat menyelesaikan masalah dengan R8, ajukan bug.