Obwohl die Kernlogik Ihres Spiels in der Unreal Engine in C++ oder Blueprints geschrieben ist, wird beim Android-Packaging Java- und Kotlin-Bytecode (classes.dex) kompiliert, um GameActivity Lifecycle-Events, Google Play-Dienste, Abrechnung, Audio und Analyse-Plug-ins zu verarbeiten.
R8, der Standard-Code-Shrinker und -Optimierer im Android Gradle-Plug-in (AGP), entfernt nicht verwendete Klassen und Methoden und optimiert Bytecode. Dadurch wird nicht nur die Downloadgröße des Pakets verringert, sondern auch der Speicherbedarf von speicherzugeordneten (mmap) DEX-Seiten und der Overhead des zugrunde liegenden Java-Prozesses zur Laufzeit. So werden die Belastung des physischen Speichers und Beendigungen durch den Low Memory Killer (LMK) reduziert. Google Play überwacht auch die DEX-Optimierungsstufen deines Spiels über den Messwert DEX-Codeoptimierung in Android Vitals.
Standardverhalten und Unterstützung von Unreal Engine-Versionen
Ab UE 4.22.0 fügt UEDeployAndroid.cs von Unreal Engine standardmäßig minifyEnabled true in die generierte Android-Release-Build-Konfiguration (buildAdditions.gradle) ein. Da in UE 4.25 die gebündelte Toolchain auf AGP 4.0.0 aktualisiert wurde, ist R8 standardmäßig (true) für alle Release-Builds (Versand und Vertrieb) in UE 4.25 und höher aktiviert, ohne dass eine zusätzliche Einrichtung erforderlich ist.
| Unreal Engine-Version | Gebündeltes AGP | Standardrelease | Standard-Debugging | Verhalten |
|---|---|---|---|---|
| UE 4.21 und früher | Legacy-Gradle oder Ant | Deaktiviert (false) |
Deaktiviert (false) |
Keine minifyEnabled-Konfiguration von der Engine eingefügt. |
| UE 4.22 bis 4.24 | Älter als 3.4 | Aktiviert (ProGuard) | Deaktiviert (false) |
minifyEnabled true ist in Release-Builds standardmäßig aktiviert (führt ProGuard aus). |
| UE 4.25 bis 5.3 | 4.0.0 | Aktiviert (R8) | Deaktiviert (false) |
Bei der Einführung von AGP 4.0 wird in Release-Builds standardmäßig R8 ausgeführt. |
| UE 5.4 bis 5.7 | 7.4.2 | Aktiviert (R8) | Deaktiviert (false) |
In AGP 7.x werden die alten useProguard-Optionen entfernt. R8 wird exklusiv ausgeführt. |
| UE 5.8 (5.8.3+) | 8.13.0 | Aktiviert (R8) | Deaktiviert (false) |
Verwendet standardmäßig AGP 8.x und moderne R8-Optimierungspipelines. |
Unterschiede zwischen Release- und Debug-Builds
UnrealBuildTool (UEDeployAndroid.cs) konfiguriert die generierte buildAdditions.gradle-Datei für Release- und Debug-Builds unterschiedlich:
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
signingConfig signingConfigs.debug
}
}
- Release (Versand oder Vertrieb): Legt
minifyEnabled truefest und wendet standardmäßigproguard-rules.proan, wobei die R8-Codekomprimierung und ‑Obfuskation ausgeführt werden. - Debug (Entwicklung): Aktiviert
debuggable trueund lässtminifyEnabledaus (standardmäßigfalse), um eine schnelle Build-Iteration und Symbol-Debugging zu ermöglichen.
Keep-Regeln mit der Unreal Plugin Language (UPL) hinzufügen
Da R8 in UE 4.25 und höher automatisch für Release-Builds ausgeführt wird, müssen Sie Java-Klassen beibehalten, die nur über C++ JNI (JNIEnv->FindClass, GetMethodID) oder das Manifest erreicht werden. Klassen ohne Java-Aufrufstellen werden als nicht verwendet behandelt und von R8 entfernt. Dies kann dazu führen, dass Funktionen, die in Entwicklungs-Builds funktionieren, in Versand-Builds mit ClassNotFoundException oder NoSuchMethodError fehlschlagen.
Verwenden Sie das Tag <proguardAdditions> in einer XML-Datei der Unreal Plugin Language (UPL), um benutzerdefinierte Beibehaltungsregeln während des Packens in proguard-rules.pro zusammenzuführen. Fügen Sie der Datei *_UPL.xml Ihres Projekts oder Plug-ins den folgenden Block hinzu:
<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>
Häufige Probleme beheben
In diesem Abschnitt wird beschrieben, wie Sie häufige Paket- und Laufzeitprobleme beheben, die bei der Verwendung von R8 in Unreal Engine auftreten können.
R8 vorübergehend für das Debugging deaktivieren
Wenn Sie herausfinden möchten, ob ein Absturz, der nur in der Release-Version auftritt, darauf zurückzuführen ist, dass R8 erforderliche Klassen entfernt, fügen Sie DISABLE_MINIFY=1 unter <gradleProperties> in Ihre UPL-Datei ein.
Wenn UEDeployAndroid.cs vorhanden ist, wird minifyEnabled false generiert:
<gradleProperties>
<insert>
DISABLE_MINIFY=1
</insert>
</gradleProperties>
Missing classes detected while running R8 Verpackungsfehler
In UE 5.4 und höher (AGP 7.4.2+) erzwingt R8 strenge Prüfungen auf fehlende Klassen. Wenn das Verpacken mit diesem Fehler fehlschlägt, prüfen Sie missing_rules.txt in Ihrem Zwischen-Build-Verzeichnis (unter Intermediate/Android/.../gradle/app/build/outputs/mapping/release/missing_rules.txt) und fügen Sie die fehlenden Bibliotheksabhängigkeiten oder erforderlichen Regeln zu <proguardAdditions> in Ihrer UPL-Datei hinzu.
Kompatibilität des vollständigen R8-Modus mit SDKs von Drittanbietern
In UE 5.8 und höher (AGP 8.13.0+) ist der vollständige R8-Modus standardmäßig aktiviert, um aggressivere Optimierungen durchzuführen. Wenn ein älteres Android-SDK eines Drittanbieters zur Laufzeit aufgrund von Reflexionsproblemen fehlschlägt, aktualisieren Sie die ProGuard-Regeln des Plug-ins oder setzen Sie R8 in den Kompatibilitätsmodus zurück, indem Sie Ihrer UPL-Datei die folgende Property hinzufügen:
<gradleProperties>
<insert>
android.enableR8.fullMode=false
</insert>
</gradleProperties>