Memperbaiki masalah pengoptimalan

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.* atau import 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 -whyareyoukeeping untuk 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 disebut mapping.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 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
    

Melaporkan bug

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