Obwohl die Kernlogik des Spiels in Unity in C# geschrieben ist (kompiliert mit IL2CPP), enthalten Android-Builds erheblichen Java- und Kotlin-Bytecode (classes.dex), um UnityPlayerActivity-Lifecycle-Events, Google Play-Dienste, Abrechnung, Anzeigen und soziale SDKs zu verarbeiten.
Wenn Sie R8 aktivieren, das Standardtool zum Verkleinern und Optimieren von Code im Android Gradle-Plug-in (AGP), werden nicht verwendete Klassen und Methoden entfernt und der Bytecode wird optimiert. Dadurch wird nicht nur die Downloadgröße Ihrer App verringert, sondern auch der Laufzeitspeicherbedarf von speicherzugeordneten (mmap) DEX-Seiten und der Overhead des zugrunde liegenden Java-Prozesses. Das reduziert die Belastung des physischen Speichers und die Anzahl der Beendigungen durch den Low Memory Killer (LMK). Google Play überwacht auch die DEX-Optimierungsstufen deines Spiels über den Messwert DEX-Codeoptimierung in Android Vitals.
Standardverhalten und Unterstützung von Unity-Versionen
In Unity ist die Codeminimierung beim Erstellen eines neuen Projekts sowohl für Release- als auch für Debug-Builds standardmäßig deaktiviert (false).
Unity hat R8 erstmals in Unity 2020.1.0f1 als optionale Einstellung eingeführt. Ab Unity 2022.2.0f1 (und rückportiert auf Unity 2021.3.41f1 LTS) wurde die gebündelte Toolchain auf AGP 7.1.2 oder höher aktualisiert, die Unterstützung für das alte ProGuard entfernt und R8 wird ausschließlich ausgeführt, wenn die Reduzierung aktiviert ist.
| Unity-Version | Gebündeltes AGP | Standardrelease | R8-Unterstützung und erforderliche Konfiguration |
|---|---|---|---|
| 2019.4 LTS und früher | Älter als 3.4 | Deaktiviert (false) |
Nicht unterstützt (nur Legacy-ProGuard). |
| 2020.1.0f1 bis 2021.3.40f1 | 3,4 bis 4,0 | Deaktiviert (false) |
Optional (Standardeinstellung ist ProGuard). Aktivieren Sie sowohl Minify > Release als auch Use R8. |
| 2021.3.41f1 und höher (2021 LTS) | 7.1+ | Deaktiviert (false) |
Nur R8. Aktivieren Sie Minify > Release, um R8 automatisch auszuführen. |
| 2022.2.0f1 bis Unity 6+ | 7.1 bis 8.x | Deaktiviert (false) |
Nur R8. Aktivieren Sie Minify > Release, um R8 automatisch auszuführen. |
R8 in den Player-Einstellungen aktivieren
So aktivieren Sie die Codekomprimierung und ‑optimierung mit R8 für Release-Builds:
- Öffnen Sie im Unity-Editor Edit > Project Settings (Bearbeiten > Projekteinstellungen) und wählen Sie Player aus.
- Wählen Sie den Tab Android aus und maximieren Sie Publishing Settings > Build (Veröffentlichungseinstellungen > Build).
- Konfigurieren Sie im Abschnitt Minify die Optionen für Ihre Unity-Version:
- Unity 2021.3.41f1+ und 2022.2.0f1+: Wählen Sie Release aus. Unity führt R8 automatisch während der Gradle-Aufgabe
minifyReleaseWithR8aus. - Unity 2020.1.0f1 bis 2021.3.40f1: Wählen Sie sowohl Release als auch Use R8 aus.
- Unity 2021.3.41f1+ und 2022.2.0f1+: Wählen Sie Release aus. Unity führt R8 automatisch während der Gradle-Aufgabe
Wenn Sie Builds mit C#-Editor-Skripts automatisieren, konfigurieren Sie diese Properties über 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
}
}
Beibehaltungsregeln für JNI und Reflexion hinzufügen
Java-Klassen und -Methoden, die dynamisch aus C#-Skripts mit AndroidJavaClass oder AndroidJavaObject aufgerufen werden, haben keine statischen Java-Aufrufstellen. Ohne explizite Beibehaltungsregeln könnte R8 diese Klassen als nicht verwendet betrachten und sie entfernen oder umbenennen.
So behalten Sie Ihre benutzerdefinierten Java-Bridges bei:
- Aktivieren Sie unter Projekteinstellungen > Player > Android > Publishing Settings > Build die Option Custom Proguard File.
- Öffnen Sie die generierte
Assets/Plugins/Android/proguard-user.txt-Datei. - Fügen Sie
-keep-Regeln für Klassen hinzu, auf die über JNI zugegriffen wird oder die von Drittanbieter-Plug-ins benötigt werden:
# 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 { *; }
Häufige Probleme beheben
In diesem Abschnitt wird beschrieben, wie Sie häufige Build- und Laufzeitprobleme bei der Verwendung von R8 in Unity beheben.
Missing classes detected while running R8 Build-Fehler
In Unity-Versionen mit AGP 7.0 und höher (2021.3.41f1+ und 2022.2+) erzwingt R8 strenge Prüfungen auf fehlende Klassen. Wenn ein Build mit diesem Fehler fehlschlägt, prüfen Sie die generierte missing_rules.txt-Datei im Build-Ausgabeverzeichnis (unter Library/Bee/Android/Prj/.../build/outputs/mapping/release/missing_rules.txt oder Temp/gradleOut/...) und fügen Sie die erforderlichen Abhängigkeiten oder Regeln zu proguard-user.txt hinzu. Weitere Informationen zum Schreiben von Beibehaltungsregeln finden Sie unter Anpassen, welcher Code beibehalten werden soll.
Kompatibilität des vollständigen R8-Modus mit Drittanbieter-Plug-ins
In AGP 8.0 und höher (Unity 6+) ist der vollständige R8-Modus standardmäßig aktiviert, um aggressivere Optimierungen durchzuführen. Wenn ein älteres Android-Plug-in 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:
- Aktivieren Sie unter Publishing Settings > Build (Veröffentlichungseinstellungen > Build) die Option Custom Gradle Properties Template (Benutzerdefinierte Gradle-Eigenschaften-Vorlage).
- Öffnen Sie
Assets/Plugins/Android/gradleTemplate.propertiesund fügen Sie das folgende Attribut hinzu:
android.enableR8.fullMode=false