Menyingkat dan mengoptimalkan kode Unity dengan R8

Meskipun logika game inti Anda di Unity ditulis dalam C# (dikompilasi dengan IL2CPP), build Android menyertakan bytecode Java dan Kotlin (classes.dex) yang substansial untuk menangani peristiwa siklus proses UnityPlayerActivity, layanan Google Play, penagihan, iklan, dan SDK sosial.

Mengaktifkan R8, penyingkat dan pengoptimal kode default di Plugin Android Gradle (AGP), akan menghapus class dan metode yang tidak digunakan serta mengoptimalkan bytecode. Hal ini tidak hanya mengurangi ukuran download aplikasi, tetapi juga mengurangi jejak memori runtime halaman DEX yang dipetakan memori (mmap) dan overhead proses Java dasar, sehingga mengurangi tekanan memori fisik dan penghentian low memory killer (LMK). Google Play juga memantau tingkat pengoptimalan DEX game Anda melalui metrik Pengoptimalan kode DEX di Android vitals.

Perilaku default dan dukungan versi Unity

Di Unity, minifikasi kode dinonaktifkan secara default (false) untuk build Rilis dan build debug saat membuat project baru.

Unity pertama kali memperkenalkan R8 sebagai tombol opsional di Unity 2020.1.0f1. Mulai Unity 2022.2.0f1 (dan di-backport ke Unity 2021.3.41f1 LTS), Unity mengupgrade toolchain yang dipaketkan ke AGP 7.1.2+, menghapus dukungan ProGuard lama, dan menjalankan R8 secara eksklusif setiap kali minifikasi diaktifkan.

Versi Unity AGP yang dipaketkan Default rilis Dukungan R8 dan konfigurasi yang diperlukan
2019.4 LTS dan yang lebih lama Sebelum 3.4 Dinonaktifkan (false) Tidak didukung (khusus ProGuard lama).
2020.1.0f1 hingga 2021.3.40f1 3,4 hingga 4,0 Dinonaktifkan (false) Opsional (defaultnya adalah ProGuard). Aktifkan Minify > Release dan Use R8.
2021.3.41f1 dan yang lebih baru (2021 LTS) 7.1+ Dinonaktifkan (false) Khusus R8. Aktifkan Minify > Release untuk menjalankan R8 secara otomatis.
2022.2.0f1 ke Unity 6+ 7.1 hingga 8.x Dinonaktifkan (false) Khusus R8. Aktifkan Minify > Release untuk menjalankan R8 secara otomatis.

Mengaktifkan R8 di Setelan Pemutar

Untuk mengaktifkan penyingkatan dan pengoptimalan kode R8 untuk build Rilis:

  1. Di Unity Editor, buka Edit > Setelan Project, lalu pilih Player.
  2. Pilih tab Android, lalu luaskan Publishing Settings > Build.
  3. Di bagian Minify, konfigurasikan opsi untuk versi Unity Anda:
    • Unity 2021.3.41f1+ dan 2022.2.0f1+: Pilih Release. Unity menjalankan R8 secara otomatis selama tugas Gradle minifyReleaseWithR8.
    • Unity 2020.1.0f1 hingga 2021.3.40f1: Pilih Release dan Use R8.

Jika Anda mengotomatiskan build menggunakan skrip Editor C#, konfigurasikan properti ini melalui PlayerSettings.Android:

using UnityEditor;

public static class AndroidBuildConfig
{
    public static void EnableR8ForRelease()
    {
        PlayerSettings.Android.minifyRelease = true;

        // Required only in Unity 2020.1.0f1 to 2021.3.40f1 and 2022.1 or earlier
        // (In Unity 2021.3.41f1+ and 2022.2+, R8 is always used when minification is enabled)
#if !UNITY_2022_2_OR_NEWER
        PlayerSettings.Android.minifyWithR8 = true;
#endif
    }
}

Menambahkan aturan keep untuk JNI dan refleksi

Class dan metode Java yang dipanggil secara dinamis dari skrip C# menggunakan AndroidJavaClass atau AndroidJavaObject tidak memiliki situs panggilan Java statis. Tanpa aturan penyimpanan yang eksplisit, R8 mungkin menganggap class ini tidak digunakan dan menghapus atau mengganti namanya.

Untuk mempertahankan jembatan Java kustom Anda:

  1. Di Setelan Project > Player > Android > Publishing Settings > Build, aktifkan Custom Proguard File.
  2. Buka file Assets/Plugins/Android/proguard-user.txt yang dihasilkan.
  3. Tambahkan aturan -keep untuk class yang diakses melalui JNI atau yang diperlukan oleh plugin pihak ketiga:
# Keep custom Java classes invoked from C# using JNI bridges
-keep class com.example.yourgame.** { *; }

# Keep callback interfaces passed between C# and Java
-keep interface com.example.yourgame.IPluginCallback { *; }

Memecahkan masalah umum

Bagian ini menjelaskan cara menyelesaikan masalah build dan runtime umum saat menggunakan R8 di Unity.

Missing classes detected while running R8 error build

Di versi Unity yang menggunakan AGP 7.0 dan yang lebih tinggi (2021.3.41f1+ dan 2022.2+), R8 menerapkan pemeriksaan class yang tidak ada secara ketat. Jika build gagal dengan error ini, periksa file missing_rules.txt yang dihasilkan di direktori output build (di bagian Library/Bee/Android/Prj/.../build/outputs/mapping/release/missing_rules.txt atau Temp/gradleOut/...) dan tambahkan dependensi atau aturan yang diperlukan ke proguard-user.txt. Untuk mengetahui informasi selengkapnya tentang cara menulis aturan keep, lihat Menyesuaikan kode yang perlu dipertahankan.

Kompatibilitas mode penuh R8 dengan plugin pihak ketiga

Di AGP 8.0 dan yang lebih tinggi (Unity 6+), mode penuh R8 diaktifkan secara default untuk melakukan pengoptimalan yang lebih agresif. Jika plugin Android lama gagal saat runtime karena masalah refleksi, update aturan ProGuard plugin atau kembalikan R8 ke mode kompatibilitas:

  1. Di Publishing Settings > Build, aktifkan Custom Gradle Properties Template.
  2. Buka Assets/Plugins/Android/gradleTemplate.properties dan tambahkan properti berikut:
android.enableR8.fullMode=false