Optimización de código DEX

La optimización del código DEX es un hallazgo de Android vitals que te ayuda a supervisar y mejorar la calidad, el tamaño y el rendimiento de la compilación de tu app. Optimizar y ofuscar tu código con R8 o herramientas alternativas (como optimizadores compatibles con ProGuard o posprocesadores DEX secundarios) reduce el tamaño de DEX de tu app, mejora el rendimiento del tiempo de ejecución y minimiza su espacio en memoria.

Los archivos DEX, o Dalvik Executable, contienen el código compilado que se usa para ejecutar tu app. Por lo general, esto incluye código Java y Kotlin, a diferencia del código C++ compilado o los archivos .so.

Android vitals informa las métricas de optimización del código DEX para todas las apps y los juegos, pero solo aplica umbrales para las apps y los juegos que cumplen con requisitos de tamaño específicos.

Cómo detectar el problema

Android vitals puede enviarte alertas en Play Console cuando los niveles de optimización, reducción o confusión del código DEX de tu app no cumplan con los porcentajes mínimos definidos.

Cómo se calculan los niveles de optimización

En el caso de las apps compiladas con la versión de parche más reciente de AGP 8.10 o una posterior (por ejemplo, 8.10.1 en lugar de 8.10.0), estos porcentajes se extraen del archivo r8.json incluido. Asegúrate de usar la versión de parche más reciente de AGP y R8 para tu versión secundaria, de modo que se generen metadatos precisos.

En el caso de las apps compiladas con versiones anteriores del AGP o las apps optimizadas con un optimizador de código alternativo en el que no se incluye r8.json, Android vitals estima los porcentajes de ofuscación como un proxy con el archivo mapping.txt (si se incluye) o la heurística de DEX.

Tamaños mínimos totales de DEX

Si bien Android vitals calcula las métricas de optimización de código para todas las apps, solo recibirás alertas si tu paquete de aplicación cumple con los siguientes requisitos de tamaño total de DEX:

  • Apps: El paquete contiene al menos 10 MB de código DEX medido como tamaño sin comprimir.
  • Juegos: El paquete contiene, al menos, 50 MB de código DEX medido como tamaño sin comprimir.

Mide la optimización del código de forma local

Para medir el tamaño de DEX sin comprimir de tu paquete de aplicación y obtener los porcentajes de optimización, reducción y ofuscación que coincidan con los resultados de Android vitals, ejecuta android analyze:

android analyze <yourapp>.aab

Cómo corregir el problema

Para abordar las puntuaciones bajas de optimización del código DEX, revisa las recomendaciones según tu sistema de compilación y optimizador:

R8

Para mejorar tus niveles de optimización de código DEX de R8, consulta la guía en Mejora la optimización de R8 y usa el Analizador de configuración de R8 para comprender cómo tus reglas de conservación afectan tus niveles de optimización, reducción y ofuscación (para obtener definiciones detalladas de estas métricas, consulta Información sobre el informe).

Si usas el complemento de Android para Gradle (AGP), también puedes usar la habilidad del Analizador de R8 para obtener orientación adicional sobre cómo optimizar las reglas de conservación de tu app. Si usas Bazel, también tienes acceso al Analizador de configuración de R8. Consulta la documentación de optimización de R8 de rules_android.

Optimizadores que no son de R8 y posprocesadores de DEX

Si tu canalización de compilación usa herramientas de compilación personalizadas o posprocesadores DEX secundarios, sigue estos pasos para mejorar la optimización de tu app:

  • Abre tu paquete de aplicación en Android Studio y visualízalo en el Analizador de APK.
  • Selecciona todos los archivos .dex.
  • Presta mucha atención a los archivos con el tamaño más grande mientras activas o desactivas el botón "Deobfuscate names" (ten en cuenta que esto requiere que cargues un archivo mapping.txt). Si descubres que algunos de esos archivos siguen siendo grandes mientras están ofuscados, es probable que se vean afectados por reglas de conservación de todo el paquete.
  • Busca en tu archivo proguard-rules.pro, configuration.txt o el equivalente para tu optimizador si no usas R8, y busca reglas de conservación que coincidan con los paquetes que no se ofuscan. Por ejemplo, si com.foo. es un paquete grande en tus archivos DEX, busca reglas de conservación con el formato -keep com.foo.** o -keep com.foo.bar.**.
  • Ten en cuenta que las reglas de conservación de los consumidores de la biblioteca podrían no ser tan fáciles de identificar. Si sospechas que una regla de consumidor de biblioteca afecta la optimización, puedes inspeccionar la biblioteca directamente con android analyze <library>.aar o validarla agregándola a una app de ejemplo independiente con una versión reciente de AGP y, luego, inspeccionarla con el analizador de configuración de R8.