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 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 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 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.