Mengaktifkan pengoptimalan aplikasi dengan R8

Untuk mendapatkan pengalaman pengguna terbaik, Anda harus mengoptimalkan aplikasi agar sekecil dan secepat mungkin. Pengoptimal aplikasi kami, yang disebut R8, menyederhanakan aplikasi Anda dengan menghapus kode dan resource yang tidak terpakai, menulis ulang kode untuk mengoptimalkan performa runtime, dan banyak lagi. 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 meliputi:

  • Penyingkatan kode (juga dikenal sebagai 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 apa pun yang tetap tidak direferensikan.

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

    • Penyisipan metode: R8 mengganti situs panggilan metode dengan isi 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, sehingga menurunkan tekanan memori dan meningkatkan kecepatan peluncuran.

  • Obfuscation (juga dikenal sebagai minifikasi): Untuk mengurangi ukuran file DEX, 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 akhir aplikasi yang Anda uji sebelum dipublikasikan—biasanya build rilis—karena pengoptimalan akan meningkatkan waktu build project Anda dan dapat mempersulit proses pen-debug-an karena cara pengoptimalan memodifikasi 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 level aplikasi build rilis Anda.
  • Tambahkan aturan penyimpanan Anda ke file dengan akhiran .keep di set sumber src/<variant>/keepRules. Contoh, 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 versi AGP 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 Anda selalu mengaktifkan 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 Anda yang dapat dioptimalkan oleh R8. Untuk mendapatkan manfaat maksimal dari R8, ikuti praktik terbaik:

Untuk membantu Anda menyempurnakan aturan penyimpanan, gunakan Penganalisis Konfigurasi R8.

R8 Configuration Analyzer memungkinkan Anda melakukan hal berikut:

  • Lacak dan tingkatkan kualitas konfigurasi R8 secara keseluruhan dengan memantau metrik yang disediakan oleh laporan R8 Configuration Analyzer.
  • Temukan aturan penyimpanan terluas - aturan yang mencegah sebagian besar pengoptimalan
  • dan memahami pengoptimalan yang mereka cegah untuk menyempurnakannya.

Penganalisis Konfigurasi R8 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

Versi 8.12.0 AGP 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) membuat 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 dirujuk, kumpulan tersebut tidak dilindungi oleh aturan penyimpanan, dan dapat dihapus.

Mengaktifkan penyingkatan resource yang dioptimalkan

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

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

Memverifikasi dan mengonfigurasi setelan pengoptimalan R8

Untuk mengaktifkan R8 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 penyimpanan Android default bersifat penonaktifan.

Set sumber`keepRules`: Jika Anda 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 penetapan 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 yang tidak disebutkan namanya, di tingkat teratas) 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, alat ini mengidentifikasi dan menghapus resource yang direferensikan secara eksklusif dari kode yang tidak digunakan. Hal ini merupakan peningkatan signifikan dibandingkan proses pengoptimalan terpisah sebelumnya.

Hal ini sangat berguna untuk aplikasi yang membagikan 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 lebih baik, 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 tertentu dengan packageScope.

Dioptimalkan secara default: Dukungan untuk getDefaultProguardFile("proguard-android.txt") telah dihentikan, karena mencakup -dontoptimize, yang harus dihindari. Sebagai gantinya, gunakan "proguard-android-optimize.txt". Jika Anda perlu menonaktifkan pengoptimalan secara global di aplikasi, tambahkan tanda 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.

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

Mengupdate R8 membantu memastikan bahwa stack trace dari build yang di-obfuscate dapat dibaca dengan mudah dan jelas. Versi ini meningkatkan pemetaan nomor baris dan file sumber, sehingga alat seperti Logcat Android Studio dapat secara otomatis melacak ulang error ke kode sumber asli dengan lebih mudah.
8.0 Mode penuh secara default: Mode penuh R8 memberikan pengoptimalan yang jauh lebih canggih. Fitur ini diaktifkan secara default. Anda dapat memilih untuk 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, hal ini mungkin memerlukan aturan keep tambahan untuk mencegah kode yang diperlukan dihapus.