Meskipun logika game inti Anda di Unreal Engine ditulis dalam C++ atau Blueprint,
pembuatan paket Android mengompilasi bytecode Java dan Kotlin (classes.dex) untuk menangani
peristiwa siklus proses GameActivity, layanan Google Play, penagihan, audio, dan
plugin analisis.
R8, penyingkat dan pengoptimal kode default di Plugin Android Gradle
(AGP), menghapus class dan metode yang tidak digunakan serta mengoptimalkan bytecode. Hal ini tidak hanya
mengurangi ukuran download paket, 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 Unreal Engine
Mulai UE 4.22.0, UEDeployAndroid.cs Unreal Engine memasukkan
minifyEnabled true ke dalam konfigurasi build Rilis Android yang dihasilkan
(buildAdditions.gradle) secara default. Karena UE 4.25 mengupgrade toolchain yang dipaketkan ke AGP 4.0.0, R8 diaktifkan secara default (true) pada semua build Rilis (Pengiriman dan Distribusi) di UE 4.25 dan yang lebih tinggi tanpa penyiapan tambahan.
| Versi Unreal Engine | AGP yang dipaketkan | Default rilis | Debug default | Perilaku |
|---|---|---|---|---|
| UE 4.21 dan yang lebih lama | Gradle atau Ant lama | Dinonaktifkan (false) |
Dinonaktifkan (false) |
Tidak ada konfigurasi minifyEnabled yang dimasukkan oleh mesin. |
| UE 4.22 hingga 4.24 | Sebelum 3.4 | Diaktifkan (ProGuard) | Dinonaktifkan (false) |
minifyEnabled true diaktifkan secara default di build Rilis (menjalankan ProGuard). |
| UE 4.25 hingga 5.3 | 4.0.0 | Diaktifkan (R8) | Dinonaktifkan (false) |
Adopsi AGP 4.0 menjalankan R8 secara default di build Rilis. |
| UE 5.4 hingga 5.7 | 7.4.2 | Diaktifkan (R8) | Dinonaktifkan (false) |
AGP 7.x menghapus opsi useProguard lama; R8 berjalan secara eksklusif. |
| UE 5.8 (5.8.3+) | 8.13.0 | Diaktifkan (R8) | Dinonaktifkan (false) |
Menggunakan AGP 8.x dan pipeline pengoptimalan R8 modern secara default. |
Perbedaan build Rilis dan Debug
UnrealBuildTool (UEDeployAndroid.cs) mengonfigurasi file buildAdditions.gradle yang dihasilkan secara berbeda untuk build Rilis dan build debug:
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
signingConfig signingConfigs.debug
}
}
- Rilis (Pengiriman atau Distribusi): Menetapkan
minifyEnabled truedan menerapkanproguard-rules.prosecara default, menjalankan penyingkatan dan obfuscation kode R8. - Debug (Pengembangan): Mengaktifkan
debuggable truedan menghilangkanminifyEnabled(secara default kefalse) untuk mempertahankan iterasi build cepat dan proses debug simbol.
Menambahkan aturan keep menggunakan Unreal Plugin Language (UPL)
Karena R8 berjalan otomatis pada build Rilis di UE 4.25 dan yang lebih tinggi, Anda harus
mempertahankan class Java yang hanya dijangkau melalui JNI C++ (JNIEnv->FindClass,
GetMethodID) atau manifes. Class tanpa situs panggilan Java diperlakukan sebagai
tidak digunakan dan dihapus oleh R8, yang dapat menyebabkan fitur yang berfungsi di build
Pengembangan gagal dengan ClassNotFoundException atau NoSuchMethodError di build
Pengiriman.
Gunakan tag <proguardAdditions> dalam file XML Unreal Plugin Language
(UPL) untuk menggabungkan aturan keep kustom ke dalam
proguard-rules.pro selama pengemasan. Tambahkan blok berikut ke file *_UPL.xml project atau plugin Anda:
<root xmlns:android="http://schemas.android.com/apk/res/android">
<proguardAdditions>
<insert>
-keep class com.epicgames.unreal.** { *; }
-keep class com.example.plugin.** { public *; }
-dontwarn com.example.plugin.**
</insert>
</proguardAdditions>
</root>
Memecahkan masalah umum
Bagian ini menjelaskan cara menyelesaikan masalah umum terkait pengemasan dan runtime saat menggunakan R8 di Unreal Engine.
Menonaktifkan sementara R8 untuk proses debug
Untuk mengisolasi apakah error khusus Rilis disebabkan oleh R8 yang menghapus class yang diperlukan, sisipkan DISABLE_MINIFY=1 di bawah <gradleProperties> dalam file UPL Anda.
Jika ada, UEDeployAndroid.cs akan menghasilkan minifyEnabled false:
<gradleProperties>
<insert>
DISABLE_MINIFY=1
</insert>
</gradleProperties>
Missing classes detected while running R8 error pengemasan
Di UE 5.4 dan yang lebih tinggi (AGP 7.4.2+), R8 menerapkan pemeriksaan ketat untuk class yang tidak ada. Jika
pengemasan gagal dengan error ini, periksa missing_rules.txt di
direktori build perantara (di bagian
Intermediate/Android/.../gradle/app/build/outputs/mapping/release/missing_rules.txt)
dan tambahkan dependensi library yang tidak ada atau aturan yang diperlukan ke
<proguardAdditions> di file UPL Anda.
Kompatibilitas mode penuh R8 dengan SDK pihak ketiga
Di UE 5.8 dan yang lebih tinggi (AGP 8.13.0+), mode penuh R8 diaktifkan secara default untuk melakukan pengoptimalan yang lebih agresif. Jika SDK Android pihak ketiga lama gagal saat runtime karena masalah refleksi, update aturan ProGuard plugin atau kembalikan R8 ke mode kompatibilitas dengan menambahkan properti berikut ke file UPL Anda:
<gradleProperties>
<insert>
android.enableR8.fullMode=false
</insert>
</gradleProperties>