Menerapkan pengoptimalan secara bertahap

Secara default, R8 melakukan banyak pengoptimalan untuk meningkatkan performa dan ukuran, tetapi pengoptimalan mungkin tidak langsung berfungsi untuk aplikasi Anda. Jika Anda mengaktifkan R8 (atau mengaktifkan mode penuh) di aplikasi besar untuk pertama kalinya, coba terapkan pengoptimalan secara bertahap: nonaktifkan obfuscation untuk sementara dan aktifkan R8 untuk sebagian kode pada satu waktu, bukan untuk semua kode di aplikasi Anda. Sebaiknya gunakan pendekatan inkremental ini selama pengembangan lokal, tetapi Anda juga dapat menggunakannya selama pengujian QA internal atau bahkan dalam produksi sebagai peluncuran bertahap. Langkah-langkah yang Anda lakukan bergantung pada linimasa yang diinginkan dan keyakinan Anda terhadap cakupan pengujian pra-rilis.

Membatasi pengoptimalan

R8 melakukan banyak jenis pengoptimalan, termasuk menghapus kode, menulis ulang kode, dan menghapus resource. Berikut adalah beberapa deskripsi umum tentang jenis pengoptimalan:

  • Penyingkatan kode (atau tree shaking): menghapus kode yang tidak direferensikan
  • Obfuscation (atau minifikasi ID): mempersingkat nama class dan metode
  • Pengoptimalan: menulis ulang kode, misalnya penggabungan

Untuk mengurangi kemungkinan error, Anda dapat memulai dengan mengaktifkan beberapa pengoptimalan ini saja.

Aktifkan hanya tree shaking

Penyingkatan kode, yang juga dikenal sebagai tree shaking, menghapus kode yang tampaknya tidak direferensikan. Sebaiknya mulai dengan hanya melakukan tree shaking, karena ini adalah cara yang paling sederhana.

Untuk mengaktifkan tree shaking saja, tambahkan kode berikut ke file proguard-rules.pro untuk menonaktifkan jenis pengoptimalan lainnya. Menonaktifkan obfuscation adalah kunci karena membuat pelacakan tumpukan jauh lebih mudah dibaca.

-dontobfuscate // Use temporarily to turn off identifier minification
-dontoptimize // Use temporarily to turn off optimization

Pada akhirnya, Anda tidak ingin mengirimkan konfigurasi ini, karena konfigurasi ini secara drastis membatasi kemampuan R8 untuk mengoptimalkan kode, tetapi ini adalah titik awal yang bagus saat menggunakan R8 untuk pertama kalinya di codebase besar dengan masalah yang perlu diperbaiki.

Menggunakan mode kompatibilitas

Secara default, R8 berjalan dalam mode penuh. Mode penuh memberikan performa dan penghematan ukuran yang jauh lebih baik, tetapi Anda dapat menonaktifkannya untuk sementara dan menggunakan mode kompatibilitas saat mengaktifkan minifikasi untuk pertama kalinya.

Untuk menggunakan mode kompatibilitas, gunakan setelan berikut dalam file gradle.properties:

android.enableR8.fullMode = false // Use temporarily to disable full mode

Mengaktifkan pengoptimalan lainnya

Setelah mengonfirmasi bahwa tree shaking berfungsi untuk aplikasi Anda, Anda dapat menghapus setelan sebelumnya untuk mengaktifkan kembali obfuscation, pengoptimalan, dan mode penuh R8. Perhatikan bahwa obfuscation dapat mempersulit proses debug, itulah sebabnya kami menyarankan untuk mengatasi masalah tree shaking terlebih dahulu.

Untuk informasi selengkapnya tentang cara men-deobfuscate pelacakan tumpukan, lihat Memulihkan pelacakan tumpukan asli.

Membatasi cakupan pengoptimalan

Build yang dioptimalkan sepenuhnya akan mengoptimalkan semua kode di setiap library dan paket, sehingga biasanya Anda akan mengalami masalah dengan R8 saat pertama kali mengaktifkannya. Jika Anda menemukan masalah terkait pengoptimalan di satu bagian aplikasi, jangan nonaktifkan R8 sepenuhnya atau Anda akan kehilangan manfaat di tempat lain. Sebagai gantinya, nonaktifkan R8 secara sementara hanya di bagian aplikasi Anda yang menyebabkan masalah.

Menggunakan aturan keep di seluruh paket

Sebaiknya gunakan aturan keep seluruh paket sebagai cara untuk menonaktifkan R8 sementara di bagian aplikasi Anda. Anda harus selalu kembali untuk memperbaiki masalah pengoptimalan ini nanti; ini umumnya merupakan solusi sementara untuk mengatasi area masalah.

Misalnya, jika bagian aplikasi Anda banyak menggunakan Gson dan menyebabkan masalah pengoptimalan, perbaikan yang ideal adalah menambahkan lebih banyak aturan keep yang ditargetkan atau beralih ke solusi codegen. Namun, untuk berhenti memblokir pengoptimalan aplikasi lainnya, Anda dapat menempatkan kode yang menentukan jenis Gson dalam subpaket khusus, dan menambahkan aturan seperti ini ke file proguard-rules.pro:

-keep class com.myapp.json.** { *; }

Jika beberapa library yang Anda gunakan memiliki refleksi ke dalam komponen internal, Anda juga dapat menambahkan aturan keep untuk seluruh library. Anda harus memeriksa kode library atau JAR/AAR untuk menemukan paket yang sesuai untuk disimpan. Sekali lagi, hal ini tidak direkomendasikan untuk dipertahankan dalam jangka panjang, tetapi dapat memblokir pengoptimalan aplikasi lainnya:

-keep class com.somelibrary.** { *; }

Menghapus aturan simpan seluruh paket

Setelah aplikasi berfungsi dengan benar dengan aturan keep seluruh paket, Anda harus kembali dan menambahkan aturan keep yang ditargetkan, atau menghapus penggunaan atau library refleksi yang memerlukan aturan keep sejak awal.

Misalnya, menyimpan semua aturan yang memperluas class tertentu sangat umum di AndroidX untuk hanya menyimpan class yang relevan. Umumnya, refleksi hanya boleh menargetkan class atau metode yang memperluas class abstrak tertentu, mengimplementasikan antarmuka tertentu, atau ke dalam class dengan anotasi runtime tertentu. Setiap cara ini adalah cara yang didukung untuk menentukan aturan keep sehingga Anda tidak memerlukan aturan keep seluruh paket di aplikasi akhir yang dioptimalkan sepenuhnya.