Saat Anda mengaktifkan pengoptimalan aplikasi dengan setelan default, R8 akan melakukan pengoptimalan ekstensif untuk memaksimalkan manfaat performa Anda. R8 melakukan modifikasi substansial pada kode, termasuk mengganti nama, memindahkan, dan menghapus class, kolom, dan metode. Jika Anda mengamati bahwa modifikasi ini menyebabkan error, Anda perlu menentukan bagian kode yang tidak boleh diubah oleh R8 dengan mendeklarasikannya dalam aturan keep.
Skenario umum yang memerlukan aturan penyimpanan
R8 mengidentifikasi dan mempertahankan semua panggilan langsung dalam kode Anda. Namun, R8 tidak dapat melihat penggunaan kode tidak langsung, yang dapat menyebabkan R8 menghapus kode yang dibutuhkan aplikasi Anda, sehingga menyebabkan error. Gunakan aturan keep untuk memberi tahu R8 agar mempertahankan kode yang digunakan secara tidak langsung tersebut. Berikut beberapa situasi umum saat Anda cenderung memerlukan aturan penyimpanan:
- Kode yang diakses oleh refleksi: R8 tidak dapat mengidentifikasi kapan class, kolom, atau metode diakses dengan refleksi. Misalnya, R8 tidak dapat mengidentifikasi
metode yang dicari berdasarkan namanya menggunakan
Class.getDeclaredMethod()
atau anotasi yang diambil denganClass.getAnnotation()
. Dalam kasus ini, R8 mungkin mengganti nama metode dan anotasi ini atau menghapusnya sepenuhnya, sehingga menyebabkanClassNotFoundException
atauNoSuchMethodException
saat runtime. - Kode yang dipanggil dari Java Native Interface (JNI): Saat kode native (C atau C++) memanggil metode Java atau Kotlin, atau kode Java atau Kotlin memanggil kode C++ dengan JNI, panggilan didasarkan pada pencarian string dinamis dari nama metode. R8 tidak dapat melihat panggilan metode berbasis string dinamis, sehingga pengoptimalannya dapat merusak kode Anda.
Ini bukan daftar lengkap skenario yang memerlukan aturan penyimpanan, tetapi skenario ini mencakup sebagian besar kasus yang mungkin memerlukan aturan penyimpanan.
Cara menambahkan aturan penyimpanan ke aplikasi Anda
Anda harus menambahkan aturan ke file proguard-rules.pro
yang berada di direktori root modul
aplikasi—file mungkin sudah ada, tetapi jika belum, buat
file tersebut. Untuk menerapkan aturan dalam file, Anda harus mendeklarasikan file dalam file build.gradle.kts
(atau build.gradle
) level modul seperti yang ditunjukkan dalam kode berikut:
Kotlin
android { buildTypes { release { isMinifyEnabled = true isShrinkResources = true proguardFiles( // File with default rules provided by the Android Gradle Plugin getDefaultProguardFile("proguard-android-optimize.txt"), // File with your custom rules "proguard-rules.pro" ) // ... } } // ... }
Groovy
android { buildTypes { release { minifyEnabled true shrinkResources true proguardFiles( // File with default rules provided by the Android Gradle Plugin getDefaultProguardFile('proguard-android-optimize.txt'), // File with your custom rules. 'proguard-rules.pro' ) // ... } } // ... }
Secara default, file build Anda juga menyertakan file proguard-android-optimize.txt
. File ini menyertakan aturan yang diperlukan untuk sebagian besar project Android, jadi
Anda harus membiarkannya tetap ada dalam file build. File ini didasarkan pada, dan berbagi
konten dengan, file proguard-common.txt
.
Aplikasi yang lebih besar biasanya memiliki kode di beberapa modul library. Dalam kasus seperti itu, sebaiknya letakkan aturan keep bersama kode yang berlaku di dalam modul library tertentu. Perbedaan penting dalam mempertahankan aturan penyimpanan untuk
library terletak pada cara Anda mendeklarasikan aturan ini dalam file
build.gradle.kts
(atau build.gradle
) modul library. Lihat Pengoptimalan untuk penulis
pustaka untuk mempelajari lebih lanjut.
Menambahkan aturan penyimpanan
Saat menambahkan aturan penyimpanan, Anda dapat menyertakan opsi global serta menentukan aturan penyimpanan Anda sendiri.
- Opsi global: Opsi global adalah arahan umum yang memengaruhi cara R8 beroperasi di seluruh codebase Anda. Untuk mempelajari lebih lanjut, lihat Opsi global.
- Aturan keep: Aturan keep harus dirancang dengan cermat, untuk memastikan Anda mendapatkan keseimbangan yang tepat antara memaksimalkan pengoptimalan kode tanpa merusak aplikasi secara tidak sengaja. Untuk mempelajari sintaksis aturan keep Anda sendiri, lihat Sintaksis aturan keep.
Aturan penyimpanan untuk penulis pustaka
Setelah mempelajari opsi dan sintaksis global untuk aturan penyimpanan, lihat Pengoptimalan untuk penulis library untuk mengetahui detail selengkapnya.