Mengaktifkan pengoptimalan aplikasi dengan R8

Untuk pengalaman pengguna terbaik, Anda harus mengoptimalkan aplikasi agar berukuran 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, 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 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 plugin Android Gradle (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, gunakan DSL yang sesuai berdasarkan versi AGP project Anda. Sebaiknya aktifkan pengoptimalan aplikasi hanya di versi final aplikasi yang Anda uji sebelum dipublikasikan—biasanya build rilis—karena pengoptimalan meningkatkan waktu build project Anda dan dapat membuat proses debug lebih sulit karena cara pengoptimalan mengubah kode.

Untuk AGP versi 9.3 dan yang lebih tinggi

Untuk mengaktifkan pengoptimalan aplikasi untuk AGP 9.3 dan yang lebih tinggi:

  • Tetapkan enable = true di blok optimization dalam skrip build tingkat aplikasi build rilis Anda.
  • Tambahkan aturan keep Anda ke file dengan akhiran .keep di src/<variant>/keepRules set sumber. Misalnya, src/main/keepRules/custom-rules.keep.

Kotlin

android {
    buildTypes {
        release {
            optimization {
                enable = true // Enables code and resource optimizations.
            }
        }
    }
}

Groovy

android {
    buildTypes {
        release {
            optimization {
                enable = true // Enables code and resource optimizations.
            }
        }
    }
}

DSL lama untuk AGP versi yang lebih rendah dari 9.3

Untuk mengaktifkan pengoptimalan aplikasi, tetapkan isMinifyEnabled = true (untuk pengoptimalan kode) dan isShrinkResources = true (untuk pengoptimalan resource) dalam skrip build tingkat aplikasi build rilis Anda. Sebaiknya selalu aktifkan kedua setelan tersebut.

DSL lama (Kotlin)

android {
    buildTypes {
        release {

            // Enables code optimizations.
            isMinifyEnabled = true

            // Enables resource shrinking.
            isShrinkResources = true

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

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

DSL lama (Groovy)

android {
    buildTypes {
        release {

            // Enables code optimizations.
            minifyEnabled = true

            // Enables resource shrinking.
            shrinkResources = true

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

            ...
        }
    }
}

Meningkatkan pengoptimalan R8

Manfaat performa R8 berkorelasi langsung dengan seberapa banyak codebase yang dapat dioptimalkan R8. Untuk mendapatkan manfaat maksimal dari R8, ikuti praktik terbaik:

Untuk membantu Anda memperbaiki aturan keep, 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—yang mencegah pengoptimalan paling banyak
  • dan memahami pengoptimalan yang dicegah untuk memperbaikinya.

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.

Mengoptimalkan penyingkatan resource untuk aplikasi yang lebih kecil

AGP versi 8.12.0 memperkenalkan penyingkatan resource yang dioptimalkan, yang bertujuan untuk mengintegrasikan pengoptimalan resource dan kode untuk 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 untuk AGP 8.12 atau 8.13, tambahkan hal berikut ke file gradle.properties project Anda:

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 dapat menggunakan kemampuan pengoptimalan penuhnya, hapus baris berikut dari file gradle.properties project Anda, jika ada:

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

Perubahan perilaku versi AGP dan R8

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

Versi AGP Fitur yang diperkenalkan
9.3 DSL yang disederhanakan:Blok `optimization {}` baru memungkinkan konfigurasi yang lebih sedikit—penyingkatan resource yang dioptimalkan selalu diaktifkan, aturan keep Android default adalah tidak ikut.

Set sumber`keepRules`: Jika menggunakan DSL baru, Anda harus menempatkan aturan keep di set sumber src/<variant>/keepRules, dalam file dengan akhiran .keep. Set sumber juga kompatibel dengan DSL lama.

Aturan konsumen KMP (Kotlin MultiPlatform): KMP tidak lagi memerlukan setelan publish = true, dan mendukung set sumber src/<variant>/keepRules dengan ekstensi .keep.

Perhatikan bahwa DSL lama masih didukung.
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 menonaktifkannya, 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 yang direferensikan secara eksklusif dari kode yang tidak digunakan akan diidentifikasi dan dihapus. Hal ini merupakan peningkatan 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 akan menghasilkan 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 AGP versi 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 tingkat 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 menonaktifkannya 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.