Mengaktifkan pengoptimalan aplikasi dengan R8

Untuk pengalaman pengguna terbaik, Anda harus mengoptimalkan aplikasi agar ukurannya sekecil dan secepat mungkin. Pengoptimal aplikasi kami, yang disebut R8, menyederhanakan aplikasi Anda dengan menghapus kode dan resource yang tidak digunakan, menulis ulang kode untuk mengoptimalkan performa runtime, dan lainnya. Bagi pengguna Anda, hal ini berarti:

  • Waktu mulai lebih cepat
  • Penggunaan memori yang lebih rendah
  • Peningkatan performa rendering dan runtime
  • Lebih sedikit ANR

Ringkasan pengoptimalan R8

R8 menggunakan proses multi-fase untuk mengoptimalkan ukuran dan kecepatan aplikasi Anda. Operasi utama mencakup hal berikut:

  • Penyingkatan kode (disebut juga tree shaking): R8 mengidentifikasi dan menghapus kode yang tidak dapat dijangkau dari aplikasi Anda dan dependensi library-nya. Dengan menganalisis titik entri aplikasi Anda (seperti Activities atau Services yang ditentukan dalam manifes), R8 membuat grafik kode yang direferensikan dan menghapus semua yang tetap tidak direferensikan.

  • Pengoptimalan logis: R8 menulis ulang kode Anda untuk meningkatkan efisiensi eksekusi dan mengurangi overhead. Teknik utama mencakup:

    • Inlining metode: R8 mengganti situs panggilan metode dengan isi sebenarnya dari metode yang dipanggil. Hal ini akan menghilangkan overhead panggilan fungsi dan memungkinkan R8 melakukan pengoptimalan lebih lanjut.

    • Penggabungan class: R8 menggabungkan kumpulan class dan antarmuka menjadi satu class. Hal ini mengurangi jumlah class dalam aplikasi, menurunkan tekanan memori, dan meningkatkan kecepatan startup.

  • Obfuscation (disebut juga minifikasi): Untuk mengurangi ukuran file DEX file, R8 mempersingkat nama class, kolom, dan metode (misalnya, com.example.MyActivity dapat menjadi a.b.a).

Sejak versi 8.12.0 Android Gradle Plugin (AGP), R8 juga mengoptimalkan resource sebagai bagian dari fase pengoptimalannya. Untuk mengetahui informasi selengkapnya, lihat Penyingkatan resource yang dioptimalkan.

Mengaktifkan pengoptimalan

Untuk mengaktifkan pengoptimalan aplikasi, tetapkan isMinifyEnabled = true (untuk pengoptimalan kode) dan isShrinkResources = true (untuk pengoptimalan resource) dalam skrip build tingkat aplikasi build rilis Anda seperti yang ditunjukkan dalam kode berikut. Sebaiknya selalu aktifkan kedua setelan tersebut. Sebaiknya aktifkan pengoptimalan aplikasi hanya di versi final aplikasi yang Anda uji sebelum dipublikasikan—biasanya build rilis Anda—karena pengoptimalan meningkatkan waktu build project Anda dan dapat membuat proses debug lebih sulit karena cara pengoptimalan mengubah kode.

Kotlin

android {
    buildTypes {
        release {

            // Enables code-related app optimization.
            isMinifyEnabled = true

            // Enables resource shrinking.
            isShrinkResources = true

            proguardFiles(
                // Default file with automatically generated optimization rules.
                getDefaultProguardFile("proguard-android-optimize.txt"),

                ...
            )
            ...
        }
    }
    ...
}

Groovy

android {
    buildTypes {
        release {

            // Enables code-related app optimization.
            minifyEnabled = true

            // Enables resource shrinking.
            shrinkResources = true

            // Default file with automatically generated optimization rules.
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')

            ...
        }
    }
}

Mengoptimalkan penyingkatan resource untuk aplikasi yang lebih kecil

Versi 8.12.0 Android Gradle Plugin (AGP) memperkenalkan penyingkatan resource yang dioptimalkan, yang bertujuan untuk mengintegrasikan pengoptimalan resource dan kode guna membuat aplikasi yang lebih kecil dan lebih cepat.

Sebelum penyingkatan resource yang dioptimalkan, Android Asset Packaging Tool (AAPT2) menghasilkan aturan keep yang secara efektif memperlakukan penyingkatan resource secara terpisah dari kode, sering kali mempertahankan kode atau resource yang tidak dapat diakses yang saling mereferensikan.

Dengan penyingkatan resource yang dioptimalkan, resource dianggap sebagai bagian dari kode program, yang membentuk grafik referensi. Jika kumpulan kode atau resource tidak direferensikan, kode atau resource tersebut tidak dilindungi oleh aturan keep, dan dapat dihapus.

Mengaktifkan penyingkatan resource yang dioptimalkan

Untuk mengaktifkan pipeline penyingkatan resource yang dioptimalkan baru untuk AGP 8.12 atau 8.13, tambahkan hal berikut ke file gradle.properties project Anda:

android.r8.optimizedResourceShrinking=true

Jika Anda menggunakan AGP 9.0.0 atau versi yang lebih baru, Anda tidak perlu menetapkan android.r8.optimizedResourceShrinking=true. Penyingkatan resource yang dioptimalkan akan otomatis diterapkan saat isShrinkResources = true diaktifkan dalam konfigurasi build Anda.

Memverifikasi dan mengonfigurasi setelan pengoptimalan R8

Untuk mengaktifkan R8 agar menggunakan kemampuan pengoptimalan penuhnya, hapus baris berikut dari file gradle.properties project Anda, jika ada:

android.enableR8.fullMode=false # Remove this line from your codebase.

Perhatikan bahwa mengaktifkan pengoptimalan aplikasi membuat pelacakan tumpukan sulit dipahami, terutama jika R8 mengganti nama class atau metode. Untuk mendapatkan pelacakan tumpukan yang sesuai dengan kode sumber Anda, lihat Memulihkan pelacakan tumpukan asli.

Jika R8 diaktifkan, Anda juga harus membuat Profil Startup untuk performa startup yang lebih baik.

Jika Anda mengaktifkan pengoptimalan aplikasi dan menyebabkan error, berikut beberapa strategi untuk memperbaikinya:

Jika Anda tertarik untuk mengoptimalkan kecepatan build, lihat Mengonfigurasi cara R8 berjalan untuk mengetahui informasi tentang cara mengonfigurasi R8 berdasarkan lingkungan Anda.

Meningkatkan pengoptimalan R8

Manfaat performa R8 berkorelasi langsung dengan seberapa banyak codebase yang dapat dioptimalkan oleh R8. Untuk mendapatkan manfaat maksimal dari R8, aktifkan R8 dalam mode penuh dan sesuaikan aturan keep untuk memungkinkan pengoptimalan class, kolom, dan metode secara maksimal.Untuk membantu Anda melakukannya, gunakan R8 Configuration Analyzer.

R8 Configuration Analyzer memungkinkan Anda melakukan hal berikut:

  • Melacak dan meningkatkan kualitas konfigurasi R8 secara keseluruhan dengan memantau metrik yang disediakan oleh laporan R8 Configuration Analyzer.
  • Menemukan aturan keep terluas—aturan yang mencegah pengoptimalan paling banyak
  • dan memahami pengoptimalan yang dicegah untuk menyempurnakannya.

R8 Configuration Analyzer tersedia di AGP versi 9.3.0-alpha05 atau dari R8 versi 9.3.7-dev. Untuk mengetahui informasi selengkapnya, lihat Menganalisis konfigurasi R8.

Perubahan perilaku versi AGP dan R8

Tabel berikut menguraikan fitur utama yang diperkenalkan dalam berbagai versi Android Gradle Plugin (AGP) dan compiler R8.

Versi AGP Fitur yang diperkenalkan
9.1 Class yang dikemas ulang secara default: R8 mengemas ulang class (memindahkannya ke paket tanpa nama, di tingkat atas) untuk memadatkan DEX lebih lanjut, sehingga tidak perlu menentukan opsi -repackageclasses. Untuk mengetahui informasi tentang cara kerjanya dan cara memilih tidak ikut, lihat opsi global.
9.0 Penyingkatan resource yang dioptimalkan: Diaktifkan secara default (dikontrol menggunakan android.r8.optimizedResourceShrinking). Penyingkatan resource yang dioptimalkan membantu mengintegrasikan penyingkatan resource dengan pipeline pengoptimalan kode, sehingga menghasilkan aplikasi yang lebih kecil dan lebih cepat. Dengan mengoptimalkan referensi kode dan resource secara bersamaan, kode dan resource tersebut akan mengidentifikasi dan menghapus resource yang direferensikan secara eksklusif dari kode yang tidak digunakan. Hal ini merupakan peningkatan yang signifikan dibandingkan proses pengoptimalan terpisah sebelumnya.

Hal ini sangat berguna untuk aplikasi yang berbagi resource dan kode yang substansial di berbagai vertikal faktor bentuk, dengan peningkatan terukur lebih dari 50% dalam ukuran aplikasi. Pengurangan ukuran yang dihasilkan menyebabkan download yang lebih kecil, penginstalan yang lebih cepat, dan pengalaman pengguna yang lebih baik dengan startup yang lebih cepat, rendering yang ditingkatkan, dan lebih sedikit ANR.

Pemfilteran aturan library: Dukungan untuk opsi global (misalnya, -dontobfuscate) dalam aturan konsumen library telah dihentikan, dan aplikasi akan memfilternya. Untuk mengetahui informasi selengkapnya, lihat Menambahkan opsi global.

Pemeriksaan null Kotlin: Dioptimalkan secara default (dikontrol menggunakan -processkotlinnullchecks). Versi ini juga memperkenalkan peningkatan signifikan dalam kecepatan build. Untuk mengetahui informasi selengkapnya, lihat Opsi global untuk pengoptimalan tambahan.

Mengoptimalkan paket tertentu: Anda dapat menggunakan packageScope untuk mengoptimalkan paket tertentu. Fitur ini dalam dukungan eksperimental. Untuk mengetahui informasi selengkapnya, lihat Mengoptimalkan paket yang ditentukan dengan packageScope.

Dioptimalkan secara default: Dukungan untuk getDefaultProguardFile("proguard-android.txt") telah dihentikan, karena menyertakan -dontoptimize, yang harus dihindari. Sebagai gantinya, gunakan "proguard-android-optimize.txt". Jika Anda perlu menonaktifkan pengoptimalan secara global di aplikasi, tambahkan flag secara manual ke file proguard.
8.12 Penyingkatan resource yang dioptimalkan: Dukungan awal ditambahkan (dikontrol menggunakan android.r8.optimizedResourceShrinking). Penyingkatan resource yang dioptimalkan membantu mengintegrasikan penyingkatan resource dengan pipeline pengoptimalan kode. Anda harus mengaktifkannya secara manual di versi AGP ini.

Retracing Logcat: Dukungan untuk retracing otomatis di jendela Logcat Android Studio.
8.6 Retracing yang ditingkatkan: Menyertakan retracing nama file dan nomor baris secara default untuk semua level minSdk (sebelumnya memerlukan minSdk 26+ di versi 8.2).

Mengupdate R8 membantu memastikan bahwa pelacakan tumpukan dari build yang di-obfuscate dapat dibaca dengan mudah dan jelas. Versi ini meningkatkan cara nomor baris dan file sumber dipetakan, sehingga memudahkan alat seperti Logcat Android Studio untuk melakukan retrace error secara otomatis ke kode sumber asli.
8.0 Mode penuh secara default: Mode penuh R8 memberikan pengoptimalan yang jauh lebih canggih. Fitur ini diaktifkan secara default. Anda dapat memilih tidak ikut menggunakan android.enableR8.fullMode=false.
7.0 Mode penuh tersedia: Diperkenalkan sebagai fitur keikutsertaan menggunakan android.enableR8.fullMode=true. Mode penuh menerapkan pengoptimalan yang lebih canggih dengan membuat asumsi yang lebih ketat tentang cara kode Anda menggunakan refleksi dan fitur dinamis lainnya. Meskipun mengurangi ukuran aplikasi dan meningkatkan performa, mode ini mungkin memerlukan aturan keep tambahan untuk mencegah kode yang diperlukan dihapus.