Bien que la logique de base de votre jeu dans Unity soit écrite en C# (compilée avec IL2CPP), les builds Android incluent un bytecode Java et Kotlin (classes.dex) important pour gérer les événements de cycle de vie UnityPlayerActivity, les services Google Play, la facturation, les annonces et les SDK de réseaux sociaux.
L'activation de R8, l'outil de minification et d'optimisation du code par défaut du plug-in Android Gradle (AGP), supprime les classes et méthodes inutilisées, et optimise le bytecode. Cela permet non seulement de réduire la taille de téléchargement de votre application, mais aussi l'espace mémoire utilisé au moment de l'exécution des pages DEX mappées en mémoire (mmap) et la surcharge du processus Java de référence, ce qui réduit la pression sur la mémoire physique et les arrêts par le tueur de mémoire faible (LMK). Google Play surveille également les niveaux d'optimisation DEX de votre jeu grâce à la métrique Optimisation du code DEX dans Android Vitals.
Comportement par défaut et compatibilité avec les versions d'Unity
Dans Unity, la minimisation du code est désactivée par défaut (false) pour les versions de production et de débogage lors de la création d'un projet.
Unity a introduit R8 en tant qu'option facultative dans Unity 2020.1.0f1. À partir de Unity 2022.2.0f1 (et rétroporté vers Unity 2021.3.41f1 LTS), Unity a mis à niveau sa chaîne d'outils groupée vers AGP 7.1.2+, supprimé l'ancienne compatibilité avec ProGuard et exécute exclusivement R8 lorsque la minimisation est activée.
| Version d'Unity | AGP groupé | Version par défaut | Compatibilité avec R8 et configuration requise |
|---|---|---|---|
| 2019.4 LTS et versions antérieures | Antérieur à la version 3.4 | Désactivé (false) |
Non disponible (ancien ProGuard uniquement). |
| 2020.1.0f1 à 2021.3.40f1 | 3,4 à 4,0 | Désactivé (false) |
Facultatif (par défaut, ProGuard). Activez les options Minify > Release (Réduire > Version) et Use R8 (Utiliser R8). |
| 2021.3.41f1 et versions ultérieures (2021 LTS) | 7.1+ | Désactivé (false) |
R8 uniquement. Activez Minify > Release (Minifier > Version) pour exécuter R8 automatiquement. |
| 2022.2.0f1 à Unity 6+ | 7.1 à 8.x | Désactivé (false) |
R8 uniquement. Activez Minify > Release (Minifier > Version) pour exécuter R8 automatiquement. |
Activer R8 dans les paramètres du lecteur
Pour activer la minification et l'optimisation du code R8 pour les builds de release :
- Dans l'éditeur Unity, ouvrez Edit > Project Settings (Modifier > Paramètres du projet), puis sélectionnez Player (Lecteur).
- Sélectionnez l'onglet Android, puis développez Publishing Settings > Build (Paramètres de publication > Compilation).
- Dans la section Minify (Minifier), configurez les options de votre version d'Unity :
- Unity 2021.3.41f1 ou version ultérieure et 2022.2.0f1 ou version ultérieure : sélectionnez Release (Version). Unity exécute automatiquement R8 lors de la tâche Gradle
minifyReleaseWithR8. - Unity 2020.1.0f1 à 2021.3.40f1 : sélectionnez Release (Version) et Use R8 (Utiliser R8).
- Unity 2021.3.41f1 ou version ultérieure et 2022.2.0f1 ou version ultérieure : sélectionnez Release (Version). Unity exécute automatiquement R8 lors de la tâche Gradle
Si vous automatisez les builds à l'aide de scripts de l'éditeur C#, configurez ces propriétés via 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
}
}
Ajouter des règles de conservation pour JNI et la réflexion
Les classes et méthodes Java appelées de manière dynamique à partir de scripts C# à l'aide de AndroidJavaClass ou AndroidJavaObject n'ont pas de sites d'appel Java statiques. Sans règles de conservation explicites, R8 peut considérer ces classes comme inutilisées et les supprimer ou les renommer.
Pour conserver vos ponts Java personnalisés :
- Dans Project Settings > Player > Android > Publishing Settings > Build (Paramètres du projet > Lecteur > Android > Paramètres de publication > Compilation), activez Custom Proguard File (Fichier Proguard personnalisé).
- Ouvrez le fichier
Assets/Plugins/Android/proguard-user.txtgénéré. - Ajoutez des règles
-keeppour les classes accessibles via JNI ou requises par des plug-ins tiers :
# 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 { *; }
Résoudre les problèmes courants
Cette section explique comment résoudre les problèmes courants de compilation et d'exécution lors de l'utilisation de R8 dans Unity.
Missing classes detected while running R8 erreur de compilation
Dans les versions d'Unity utilisant AGP 7.0 et versions ultérieures (2021.3.41f1+ et 2022.2+), R8 applique des vérifications strictes des classes manquantes. Si une compilation échoue avec cette erreur, inspectez le fichier missing_rules.txt généré dans le répertoire de sortie de compilation (sous Library/Bee/Android/Prj/.../build/outputs/mapping/release/missing_rules.txt ou Temp/gradleOut/...), puis ajoutez les dépendances ou les règles requises à proguard-user.txt. Pour en savoir plus sur l'écriture de règles de conservation, consultez Personnaliser le code à conserver.
Compatibilité du mode complet R8 avec les plug-ins tiers
Dans AGP 8.0 et versions ultérieures (Unity 6 et versions ultérieures), le mode complet R8 est activé par défaut pour effectuer des optimisations plus agressives. Si un ancien plug-in Android échoue au moment de l'exécution en raison de problèmes de réflexion, mettez à jour les règles ProGuard du plug-in ou rétablissez le mode de compatibilité de R8 :
- Dans Publishing Settings > Build (Paramètres de publication > Compilation), activez Custom Gradle Properties Template (Modèle de propriétés Gradle personnalisées).
- Ouvrez
Assets/Plugins/Android/gradleTemplate.propertieset ajoutez la propriété suivante :
android.enableR8.fullMode=false