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 harus menentukan bagian kode mana yang tidak boleh diubah oleh R8 dengan mendeklarasikannya dalam aturan keep.
Skenario umum yang memerlukan aturan keep
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 diperlukan aplikasi Anda, sehingga menyebabkan error. Gunakan aturan keep untuk memberi tahu R8 agar mempertahankan kode yang digunakan secara tidak langsung tersebut. Beberapa situasi umum yang kemungkinan memerlukan aturan keep adalah sebagai berikut:
- 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 menyebabkanClassNotFoundExceptionatauNoSuchMethodExceptionsaat 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 tersebut 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 keep, tetapi skenario ini mencakup sebagian besar kasus yang mungkin memerlukan aturan keep.
Jika kode Anda sendiri menggunakan refleksi atau dipanggil dari JNI, Anda dapat menganotasi kode tersebut dengan anotasi Jetpack Keep, bukan menulis aturan keep secara manual. Plugin Gradle-nya menghasilkan aturan keep dari anotasi pada waktu build.
Cara menambahkan aturan keep ke aplikasi Anda
Konfigurasi aturan keep Anda bergantung pada versi AGP yang Anda gunakan.
Aplikasi yang lebih besar biasanya memiliki kode di beberapa modul library. Dalam kasus seperti itu, sering kali lebih baik untuk menempatkan aturan keep bersama kode yang diterapkan dalam modul library tertentu. Perbedaan penting dalam mempertahankan aturan keep untuk
library terletak pada cara Anda mendeklarasikan aturan ini dalam file modul library Anda
build.gradle.kts (atau build.gradle). Lihat Pengoptimalan untuk penulis library
guna mempelajari lebih lanjut.
Untuk AGP versi 9.3 dan yang lebih tinggi
Tambahkan aturan Anda ke file dengan akhiran .keep di direktori
src/<variant>/keepRules. Misalnya, src/main/keepRules/custom-rules.keep. Perhatikan bahwa penggunaan DSL yang diperbarui untuk AGP 9.3 dan yang lebih tinggi memungkinkan pengoptimalan kode dan resource, dan tidak mengharuskan Anda menentukan file aturan keep Android default (proguard-android-optimize.txt) secara eksplisit, karena file tersebut disertakan secara default, kecuali jika dihilangkan secara eksplisit.
Kotlin
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
Groovy
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
Menghilangkan aturan keep platform Android default (Lanjutan)
AGP menyediakan kumpulan aturan platform Android default. Untuk menghilangkan aturan ini dari konfigurasi project dan mengelola semua aturan keep sendiri, tetapkan optimization.keepRules.includeDefault ke false.
Kotlin
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
keepRules {
includeDefault = false // The file with optimization
// rules for the Android platform is included by
// default. To omit this file, set this option to false.
}
}
}
}
}
Groovy
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
keepRules {
includeDefault = false // The file with optimization
// rules for the Android platform is included by
// default. To omit this file, set this option to false.
}
}
}
}
}
DSL lama untuk AGP versi yang lebih rendah dari 9.3
Tambahkan aturan Anda ke file proguard-rules.pro yang terletak di direktori root modul aplikasi—file mungkin sudah ada, tetapi jika tidak, buat file tersebut. Untuk menerapkan
aturan dalam file, Anda harus mendeklarasikan file dalam file tingkat modul
build.gradle.kts (atau build.gradle).
Secara default, file build Anda juga menyertakan file proguard-android-optimize.txt. File ini menyertakan aturan yang diperlukan untuk sebagian besar project Android, sehingga Anda harus membiarkannya tetap berada di file build. File ini didasarkan pada, dan berbagi
konten dengan, file proguard-common.txt.
DSL lama (Kotlin)
android {
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
// Default file with default optimization rules.
getDefaultProguardFile("proguard-android-optimize.txt"),
...
)
}
}
}
DSL lama (Groovy)
android {
buildTypes {
release {
minifyEnabled = true
shrinkResources = true
// Default file with default optimization rules.
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
...
}
}
}
Menambahkan aturan keep
Saat menambahkan aturan keep, Anda dapat menyertakan opsi global serta menentukan aturan keep Anda sendiri.
Opsi global: Opsi global adalah perintah 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 cara menulis aturan keep, lihat Menambahkan aturan keep.
Aturan keep untuk penulis library
Setelah mempelajari opsi global dan sintaksis untuk aturan keep, lihat Pengoptimalan untuk penulis library guna mengetahui detail lebih lanjut.