Menggunakan R8 Configuration Analyzer

R8 Configuration Analyzer adalah alat yang didesain untuk membantu Anda memaksimalkan manfaat performa R8 dengan memberikan insight mendetail tentang kualitas konfigurasi aplikasi Anda. Anda dapat melacak dan meningkatkan pengoptimalan R8 dengan memantau metrik utama, khususnya skor penyingkatan, pengoptimalan, dan obfuscation, yang menunjukkan persentase codebase yang tersedia untuk pengoptimalan. Dengan mengidentifikasi aturan keep yang luas atau tidak perlu, termasuk yang diperkenalkan oleh library pihak ketiga, penganalisis membantu Anda menyempurnakan konfigurasi untuk memastikan R8 dapat mengoptimalkan sebanyak mungkin class, kolom, dan metode.

Buat laporan

Mulai dari AGP 9.3.0-alpha05 dan yang lebih baru, laporan akan dibuat secara otomatis di build/outputs/mapping/release/configanalyzer.html saat menjalankan build R8. Untuk menonaktifkan pembuatan output otomatis, tetapkan properti Gradle berikut:

android.experimental.r8.enableR8ConfigurationAnalyzer=false

Untuk AGP 9.2 dan yang lebih lama, tetapkan properti sistem com.android.tools.r8.dumpkeepradiushtmltodirectory saat menjalankan tugas Gradle dengan build yang diaktifkan dengan R8.

./gradlew assembleRelease \
    -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>

Misalnya, gunakan perintah berikut untuk menghasilkan laporan HTML di direktori /tmp/r8analysis:

// To create the /tmp/r8analysis folder.
mkdir -p /tmp/r8analysis

// To generate the report in the /tmp/r8analysis folder.
./gradlew assembleRelease \
    -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=/tmp/r8analysis

Memahami laporan

R8 Configuration Analyzer memberikan insight tentang konfigurasi R8 aplikasi Anda dan dampak setiap aturan keep pada aplikasi Anda. Hal ini membantu Anda mendapatkan pengoptimalan maksimum dari R8, sehingga meningkatkan performa aplikasi Anda. Gunakan skor berikut untuk memahami seberapa besar codebase Anda tersedia untuk dioptimalkan oleh R8.

Contoh bagian ringkasan laporan
Gambar 1. Contoh bagian ringkasan laporan.

Skor yang menurun

Saat menyusutkan aplikasi Anda, R8 akan mengurangi ukuran keseluruhan aplikasi dengan mengidentifikasi dan menghilangkan kode dan resource yang tidak digunakan, sehingga memastikan build akhir Anda sekecil mungkin. Skor pengecilan melacak persentase class, kolom, dan metode yang tunduk pada pengecilan. Misalnya, skor penyusutan 66% berarti R8 dapat melakukan penyusutan di 66% codebase Anda.

Skor pengoptimalan

R8 melakukan pengoptimalan seperti penyisipan metode dan penggabungan class yang menghasilkan peningkatan waktu mulai dan memori untuk aplikasi Anda. Skor pengoptimalan melacak persentase class, kolom, dan metode yang tunduk pada pengoptimalan R8. Misalnya, jika skor pengoptimalan adalah 66%, berarti R8 hanya dapat melakukan pengoptimalan di 66% codebase Anda.

Skor pengaburan

Dengan meng-obfuscate class, kolom, dan metode menjadi nama yang lebih pendek, R8 mengurangi jejak metadata aplikasi untuk menghemat memori. Skor pengaburan mengukur persentase kode yang tersedia untuk pengaburan dalam codebase Anda.

Memperbaiki aturan penyimpanan

Untuk meningkatkan skor dan mengaktifkan pengoptimalan R8 yang lebih baik, Anda harus memperbaiki aturan keep agar tidak mencegah R8 mengoptimalkan aplikasi Anda secara tidak perlu. Anda hanya boleh mempertahankan class, metode, atau kolom yang diakses menggunakan refleksi.

Untuk melakukannya, gunakan Analisis Aturan Penyimpanan.

Contoh analisis aturan penyimpanan
Gambar 2. Contoh analisis aturan penyimpanan.

Untuk melihat analisis mendetail suatu aturan, klik aturan tersebut untuk membuka layar detail.

Contoh analisis aturan penyimpanan
Gambar 3. Contoh analisis aturan penyimpanan.

Cara menyempurnakan aturan penyimpanan

Untuk menyempurnakan aturan penyimpanan dan memaksimalkan potensi pengoptimalan R8 untuk aplikasi Anda, lakukan hal berikut:

  1. Untuk setiap aturan keep, lihat persentase class, kolom, dan metode yang tidak dapat dioptimalkan oleh R8 di Configuration Analyzer. Gunakan ini untuk mengidentifikasi aturan keep yang mencegah pengoptimalan dalam sejumlah besar class, kolom, atau metode. Properti pengoptimalan yang dicegah oleh setiap aturan penyimpanan juga dicantumkan.
  2. Jika Anda melihat aturan keep yang mencegah pengoptimalan sejumlah besar class, Anda harus memastikan untuk memeriksa class, kolom, dan metode mana yang dicegah pengoptimalannya oleh aturan keep untuk melihat apakah aturan ini menyimpan item yang tidak dipanggil secara dinamis menggunakan refleksi.
  3. Kurangi pengoptimalan yang diblokir oleh aturan penyimpanan dengan menargetkan hanya class, kolom, atau metode yang diperlukan dengan memilih opsi penyimpanan yang tepat dan mengikuti praktik terbaik.
  4. Selidiki dan jalankan pengujian yang mencakup class, kolom, dan metode yang terpengaruh dari aturan penyimpanan dan sesuaikan aturan penyimpanan.

Memeriksa pengoptimalan library

Saat Anda mengintegrasikan library pihak ketiga, library tersebut sering kali menyertakan aturan keep konsumennya sendiri untuk bekerja dengan R8. Karena penulis library tidak dapat memprediksi implementasi spesifik Anda, terkadang mereka menulis aturan konservatif yang luas yang mencegah pengoptimalan di lebih banyak class, kolom, dan metode daripada yang diperlukan. Hal ini dapat mencegah R8 mengoptimalkan bagian aplikasi Anda yang tidak ada hubungannya dengan eksekusi runtime sebenarnya dari library. Anda dapat menggunakan Analisis Konfigurasi R8 untuk mengidentifikasi library yang memperkenalkan aturan yang berdampak negatif pada pengoptimalan aplikasi Anda.

Gunakan penganalisis konfigurasi untuk memeriksa efek gabungan dari semua aturan penyimpanan konsumen yang digabungkan. Dengan menganalisis dampak setiap aturan penyimpanan yang berasal dari library pihak ketiga, Anda dapat mengidentifikasi dan melacak library pihak ketiga tertentu yang mencegah pengoptimalan dalam jumlah besar di aplikasi Anda.

Cara mengoptimalkan library

  • Jika library menyertakan aturan yang terlalu luas, sebaiknya hubungi pengelola library dengan data dari laporan Anda untuk menunjukkan bagaimana aturan saat ini memengaruhi skor pengoptimalan aplikasi Anda. Jika library adalah library eksternal, cari bug yang ada di library sebelum mengajukan masalah.
  • Jika perlu, Anda dapat menguji potensi peningkatan dengan mengecualikan aturan dari pustaka tertentu. Anda dapat mengimpor aturan pustaka ke dalam project, mengecualikan aturan yang luas, dan menjalankan kembali penganalisis konfigurasi untuk mengukur potensi peningkatan ukuran dan performa.

Aturan yang tercakup

Mungkin ada kasus di mana beberapa aturan penyimpanan tumpang-tindih dan salah satu aturan mungkin mencegah lebih banyak pengoptimalan daripada yang diperlukan. Jika ada dua aturan penyimpanan di codebase Anda.

# Prevents optimization in the entire package
# Remove this to improve optimization
-keep class com.example.package.** { *; }

# Prevents optimization to the class inside the package
-keep class com.example.package.Myclass

Aturan penyimpanan pertama yang mencegah pengoptimalan di seluruh paket mencakup aturan penyimpanan kedua yang menargetkan class di dalam paket yang disimpan oleh aturan penyimpanan pertama. Jika aturan penyimpanan tumpang-tindih, salah satu aturan dapat memblokir lebih banyak pengoptimalan daripada yang diperlukan. Dengan menyempurnakan aturan yang tumpang-tindih ini, Anda dapat memaksimalkan pengoptimalan R8 dan menghilangkan beban teknis. Proses ini melibatkan penyederhanaan konfigurasi untuk memastikan hanya kode penting yang dipertahankan sekaligus memaksimalkan potensi penuh kemampuan pengoptimalan R8.

Contoh bagian ringkasan laporan
Gambar 4. Contoh aturan yang tercakup dalam laporan.

Mengoptimalkan aturan yang tercakup

  1. Temukan aturan keep yang mencakup menggunakan Penganalisis Konfigurasi R8.
  2. Identifikasi class, kolom, atau metode yang tepat dalam codebase Anda yang benar-benar mengandalkan refleksi, yang perlu dipertahankan menggunakan aturan keep. Mengetahui hal ini akan membantu Anda menyempurnakan aturan penyimpanan.
  3. Dengan menggunakan penganalisis konfigurasi, bandingkan dampak setiap aturan yang menargetkan class, kolom, atau metode yang sama. Anda dapat menggunakan persentase pengoptimalan yang dicegah oleh setiap aturan penyimpanan untuk mengidentifikasi aturan mana yang lebih luas dan aturan mana yang merupakan aturan penyimpanan sempit.
    1. Jika aturan sempit ditulis dengan tepat—hanya menyimpan anggota atau class yang diakses secara reflektif—maka hapus aturan keep yang lebih luas. Tindakan ini akan membuka kunci pengoptimalan R8 dengan aman untuk paket Anda lainnya.
    2. Jika aturan luas menargetkan kelas yang tepat, pertahankan aturan luas dan hapus aturan sempit. Aturan sempit hanyalah kekacauan yang berlebihan. Pastikan untuk menyempurnakan aturan luas agar hanya menargetkan class, kolom, atau metode yang telah Anda identifikasi.

Verifikasi dan uji perubahan Anda: Jalankan kembali penganalisis konfigurasi untuk memastikan konflik telah diselesaikan. Kemudian, kompilasi build rilis dan uji perubahan Anda untuk memastikan bahwa codebase berfungsi seperti yang diharapkan.

Menghapus aturan yang tidak perlu

Dengan penganalisis konfigurasi, Anda dapat mengaudit codebase secara sistematis untuk mengidentifikasi dan memangkas aturan keep yang sudah tidak berlaku dan membuat konfigurasi Anda menjadi berantakan. Penganalisis Konfigurasi R8 secara khusus menandai dua sumber utama aturan yang tidak perlu:

  • Aturan yang tidak digunakan: Aturan yang cocok dengan nol class, metode, atau kolom dalam build saat ini. Konfigurasi ini sering kali tetap ada setelah pemfaktoran ulang kode, penghapusan dependensi, atau dari konfigurasi salin tempel yang tidak lagi relevan, sehingga menambah kompleksitas konfigurasi yang tidak perlu.
  • Aturan identik: Aturan keep identik berarti aturan yang menargetkan class, kolom, dan metode yang sama atau deklarasi aturan keep duplikat dalam file aturan keep yang sama atau berbeda.

Kedua jenis aturan ini membuat konfigurasi Anda berantakan, sehingga lebih sulit dipertahankan dan di-debug. Dengan mengidentifikasinya, Anda dapat membersihkan konfigurasi.