Aunque la lógica principal de tu juego en Unity está escrita en C# (compilada con IL2CPP),
las compilaciones de Android incluyen un código de bytes sustancial de Java y Kotlin (classes.dex) para
controlar los eventos del ciclo de vida de UnityPlayerActivity, los Servicios de Google Play, la facturación,
los anuncios y los SDKs sociales.
Habilitar R8, el reductor y optimizador de código predeterminado en el complemento de Android para Gradle (AGP), quita las clases y los métodos que no se usan, y optimiza el código de bytes. Esto
no solo disminuye el tamaño de descarga de tu app, sino que también reduce el espacio en memoria
durante el tiempo de ejecución de las páginas DEX asignadas a la memoria (mmap) y la sobrecarga del proceso de Java
del modelo de referencia, lo que mitiga la presión de la memoria física y las finalizaciones del optimizador de poca memoria (LMK). Google Play también supervisa los niveles de optimización de DEX de tu juego
a través de la métrica Optimización del código DEX en Android vitals.
Comportamiento predeterminado y compatibilidad con versiones de Unity
En Unity, la reducción de código está inhabilitada de forma predeterminada (false) para las compilaciones de lanzamiento y depuración cuando se crea un proyecto nuevo.
Unity introdujo R8 por primera vez como un botón de activación opcional en Unity 2020.1.0f1. A partir de Unity 2022.2.0f1 (y con retrocompatibilidad con Unity 2021.3.41f1 LTS), Unity actualizó su cadena de herramientas integrada a AGP 7.1.2 y versiones posteriores, quitó la compatibilidad heredada con ProGuard y ejecuta R8 exclusivamente cuando se habilita la reducción.
| Versión de Unity | AGP incluido | Versión predeterminada | Compatibilidad con R8 y configuración requerida |
|---|---|---|---|
| 2019.4 LTS y versiones anteriores | Anteriores a la 3.4 | Inhabilitada (false) |
No compatible (solo ProGuard heredado) |
| De 2020.1.0f1 a 2021.3.40f1 | De 3.4 a 4.0 | Inhabilitada (false) |
Opcional (el valor predeterminado es ProGuard). Habilita Minify > Release y Use R8. |
| 2021.3.41f1 y versiones posteriores (LTS 2021) | 7.1+ | Inhabilitada (false) |
Solo R8. Habilita Minify > Release para ejecutar R8 automáticamente. |
| De la versión 2022.2.0f1 a Unity 6 y versiones posteriores | De 7.1 a 8.x | Inhabilitada (false) |
Solo R8. Habilita Minify > Release para ejecutar R8 automáticamente. |
Habilita R8 en Player Settings
Para habilitar la reducción de código y la optimización de R8 en las compilaciones de lanzamiento, haz lo siguiente:
- En el editor de Unity, abre Edit > Project Settings y selecciona Player.
- Selecciona la pestaña Android y expande Publishing Settings > Build.
- En la sección Minify, configura las opciones para tu versión de Unity:
- Unity 2021.3.41f1 y versiones posteriores, y 2022.2.0f1 y versiones posteriores: Selecciona Release. Unity ejecuta R8 automáticamente durante la tarea de Gradle
minifyReleaseWithR8. - Unity 2020.1.0f1 a 2021.3.40f1: Selecciona Release y Use R8.
- Unity 2021.3.41f1 y versiones posteriores, y 2022.2.0f1 y versiones posteriores: Selecciona Release. Unity ejecuta R8 automáticamente durante la tarea de Gradle
Si automatizas las compilaciones con secuencias de comandos de C# Editor, configura estas propiedades
a través de 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
}
}
Agrega reglas de conservación para JNI y la reflexión
Las clases y los métodos de Java que se invocan de forma dinámica desde secuencias de comandos de C# con AndroidJavaClass o AndroidJavaObject no tienen sitios de llamadas estáticas de Java. Sin reglas de conservación explícitas, R8 podría considerar que estas
clases no se usan y quitarlas o cambiarles el nombre.
Para conservar tus puentes de Java personalizados, haz lo siguiente:
- En configuración del proyecto > Player > Android > Publishing Settings > Build, habilita Custom Proguard File.
- Abre el archivo
Assets/Plugins/Android/proguard-user.txtgenerado. - Agrega reglas
-keeppara las clases a las que se accede a través de JNI o que requieren los complementos de terceros:
# 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 { *; }
Soluciona los problemas comunes
En esta sección, se describe cómo resolver problemas comunes de compilación y tiempo de ejecución cuando se usa R8 en Unity.
Missing classes detected while running R8 error de compilación
En las versiones de Unity que usan AGP 7.0 y versiones posteriores (2021.3.41f1+ y 2022.2+), R8 aplica verificaciones estrictas de clases faltantes. Si una compilación falla con este error, inspecciona el archivo missing_rules.txt generado en el directorio de salida de la compilación (en Library/Bee/Android/Prj/.../build/outputs/mapping/release/missing_rules.txt o Temp/gradleOut/...) y agrega las dependencias o reglas requeridas a proguard-user.txt. Para obtener más información sobre cómo escribir reglas de conservación, consulta
Cómo determinar de forma personalizada el código que se conservará.
Compatibilidad del modo completo de R8 con complementos de terceros
En AGP 8.0 y versiones posteriores (Unity 6 y versiones posteriores), el modo completo de R8 está habilitado de forma predeterminada para realizar optimizaciones más agresivas. Si un complemento para Android heredado falla durante el tiempo de ejecución debido a problemas de reflexión, actualiza las reglas de ProGuard del complemento o revierte R8 al modo de compatibilidad:
- En Publishing Settings > Build, habilita Custom Gradle Properties Template.
- Abre
Assets/Plugins/Android/gradleTemplate.propertiesy agrega la siguiente propiedad:
android.enableR8.fullMode=false