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:
- Di Unity Editor, buka Edit > Setelan Project, lalu pilih Player.
- Pilih tab Android, lalu luaskan Publishing Settings > Build.
- 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.
- Unity 2021.3.41f1+ dan 2022.2.0f1+: Pilih Release. Unity menjalankan R8
secara otomatis selama tugas Gradle
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:
- Di Setelan Project > Player > Android > Publishing Settings > Build, aktifkan Custom Proguard File.
- Buka file
Assets/Plugins/Android/proguard-user.txtyang dihasilkan. - Tambahkan aturan
-keepuntuk 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:
- Di Publishing Settings > Build, aktifkan Custom Gradle Properties Template.
- Buka
Assets/Plugins/Android/gradleTemplate.propertiesdan tambahkan properti berikut:
android.enableR8.fullMode=false