Aunque la lógica principal de tu juego en Unreal Engine se escribe en C++ o Blueprints,
el empaquetado de Android compila el código de bytes de Java y Kotlin (classes.dex) para controlar
los eventos del ciclo de vida de GameActivity, los Servicios de Google Play, la facturación, el audio y
los complementos de estadísticas.
R8, el reductor y optimizador de código predeterminado del 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 del paquete, sino que también reduce el espacio en memoria del entorno de ejecución de las páginas DEX asignadas a la memoria (mmap) y la sobrecarga del proceso de Java de referencia, lo que mitiga la presión de la memoria física y las finalizaciones del eliminador de memoria insuficiente (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 Unreal Engine
A partir de la versión 4.22.0 de UE, la UEDeployAndroid.cs de Unreal Engine inserta minifyEnabled true en la configuración de compilación de lanzamiento de Android generada (buildAdditions.gradle) de forma predeterminada. Debido a que UE 4.25 actualizó la cadena de herramientas empaquetada a AGP 4.0.0, R8 está habilitado de forma predeterminada (true) en todas las compilaciones de lanzamiento (envío y distribución) en UE 4.25 y versiones posteriores sin configuración adicional.
| Versión de Unreal Engine | AGP incluido | Versión predeterminada | Depuración predeterminada | Comportamiento |
|---|---|---|---|---|
| UE 4.21 y versiones anteriores | Gradle o Ant heredados | Inhabilitada (false) |
Inhabilitada (false) |
El motor no insertó ninguna configuración de minifyEnabled. |
| UE 4.22 a 4.24 | Anteriores a la 3.4 | Habilitado (ProGuard) | Inhabilitada (false) |
minifyEnabled true habilitado de forma predeterminada en las compilaciones de lanzamiento (ejecuta ProGuard) |
| UE 4.25 a 5.3 | 4.0.0 | Habilitado (R8) | Inhabilitada (false) |
La adopción de AGP 4.0 ejecuta R8 de forma predeterminada en las compilaciones de lanzamiento. |
| UE 5.4 a 5.7 | 7.4.2 | Habilitado (R8) | Inhabilitada (false) |
AGP 7.x quita las opciones heredadas de useProguard; R8 se ejecuta de forma exclusiva. |
| UE 5.8 (5.8.3 o versiones posteriores) | 8.13.0 | Habilitado (R8) | Inhabilitada (false) |
Usa AGP 8.x y canalizaciones de optimización de R8 modernas de forma predeterminada. |
Diferencias entre las compilaciones de lanzamiento y de depuración
UnrealBuildTool (UEDeployAndroid.cs) configura el archivo buildAdditions.gradle generado de manera diferente para las compilaciones de lanzamiento y depuración:
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
signingConfig signingConfigs.debug
}
}
- Versión (envío o distribución): Establece
minifyEnabled truey aplicaproguard-rules.prode forma predeterminada, lo que ejecuta la reducción y ofuscación de código de R8. - Depuración (desarrollo): Habilita
debuggable truey omiteminifyEnabled(el valor predeterminado esfalse) para preservar la iteración de compilación rápida y la depuración de símbolos.
Agrega reglas de conservación con el lenguaje de complementos de Unreal (UPL)
Como R8 se ejecuta automáticamente en las compilaciones de lanzamiento en UE 4.25 y versiones posteriores, debes conservar las clases de Java a las que solo se accede a través de la JNI de C++ (JNIEnv->FindClass, GetMethodID) o el manifiesto. Las clases sin sitios de llamada de Java se consideran no utilizadas y R8 las quita, lo que puede provocar que las funciones que se ejecutan en las compilaciones de desarrollo fallen con ClassNotFoundException o NoSuchMethodError en las compilaciones de envío.
Usa la etiqueta <proguardAdditions> en un archivo en formato XML de Unreal Plugin Language (UPL) para combinar reglas de conservación personalizadas en proguard-rules.pro durante el empaquetado. Agrega el siguiente bloque al archivo *_UPL.xml de tu proyecto o complemento:
<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>
Soluciona los problemas comunes
En esta sección, se describe cómo resolver problemas habituales de empaquetado y del entorno de ejecución cuando se usa R8 en Unreal Engine.
Inhabilita R8 temporalmente para la depuración
Para aislar si una falla exclusiva de la versión de lanzamiento se debe a que R8 quita las clases
necesarias, inserta DISABLE_MINIFY=1 en <gradleProperties> en tu archivo UPL.
Cuando está presente, UEDeployAndroid.cs genera minifyEnabled false:
<gradleProperties>
<insert>
DISABLE_MINIFY=1
</insert>
</gradleProperties>
Missing classes detected while running R8 error de empaquetado
En UE 5.4 y versiones posteriores (AGP 7.4.2 y versiones posteriores), R8 aplica verificaciones estrictas de clases faltantes. Si el empaquetado falla con este error, inspecciona missing_rules.txt en tu directorio de compilación intermedio (en Intermediate/Android/.../gradle/app/build/outputs/mapping/release/missing_rules.txt) y agrega las dependencias de biblioteca faltantes o las reglas requeridas a <proguardAdditions> en tu archivo UPL.
Compatibilidad del modo completo de R8 con SDKs de terceros
En UE 5.8 y versiones posteriores (AGP 8.13.0 y versiones posteriores), el modo completo de R8 está habilitado de forma predeterminada para realizar optimizaciones más agresivas. Si un SDK de Android heredado de terceros falla en el entorno de ejecución debido a problemas de reflexión, actualiza las reglas de ProGuard del complemento o revierte R8 al modo de compatibilidad agregando la siguiente propiedad a tu archivo UPL:
<gradleProperties>
<insert>
android.enableR8.fullMode=false
</insert>
</gradleProperties>