Menyingkat dan mengoptimalkan kode Unreal Engine dengan R8

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 true dan menerapkan proguard-rules.pro secara default, menjalankan penyingkatan dan obfuscation kode R8.
  • Debug (Pengembangan): Mengaktifkan debuggable true dan menghilangkan minifyEnabled (secara default ke false) 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>