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 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 yang kemungkinan 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 dengan Class.getAnnotation(). Dalam kasus ini, R8 dapat 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 didasarkan pada pencarian string dinamis 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

Konfigurasi aturan penyimpanan Anda bergantung pada versi AGP yang Anda gunakan.

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 keep untuk library terletak pada cara Anda mendeklarasikan aturan ini dalam file build.gradle.kts (atau build.gradle) modul library. Lihat Pengoptimalan untuk penulis library untuk 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. Contohnya, src/main/keepRules/custom-rules.keep. Perhatikan bahwa penggunaan DSL yang diupdate untuk AGP 9.3 dan yang lebih tinggi memungkinkan pengoptimalan kode dan resource, dan tidak mengharuskan Anda menentukan file aturan penyimpanan Android default secara eksplisit (proguard-android-optimize.txt), karena disertakan secara default, kecuali 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.
            }
        }
    }
}

Menghapus aturan penyimpanan platform Android default (Lanjutan)

AGP menyediakan serangkaian aturan platform Android default. Untuk menghapus aturan ini dari konfigurasi project Anda dan mengelola semua aturan penyimpanan 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 versi AGP yang lebih rendah dari 9.3

Tambahkan aturan Anda 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) tingkat modul.

Secara default, file build Anda juga menyertakan file proguard-android-optimize.txt. File ini mencakup 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.

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 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 cara menulis aturan keep, lihat Menambahkan aturan keep.

Aturan penyimpanan untuk penulis pustaka

Setelah mempelajari opsi dan sintaksis global untuk aturan penyimpanan, lihat Pengoptimalan untuk penulis pustaka untuk mengetahui detail selengkapnya.