Tentang aturan penyimpanan

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 dengan Class.getAnnotation(). Dalam kasus ini, R8 mungkin mengganti nama metode dan anotasi ini atau menghapusnya sepenuhnya, sehingga menyebabkan ClassNotFoundException atau NoSuchMethodException 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 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.