Usa el Analizador de configuración de R8

R8 Configuration Analyzer es una herramienta diseñada para ayudarte a maximizar los beneficios de rendimiento de R8, ya que proporciona estadísticas detalladas sobre la calidad de la configuración de tu app. Te permite hacer un seguimiento de la optimización de R8 y mejorarla mediante la supervisión de métricas clave, específicamente, las puntuaciones de reducción, optimización y ofuscación, que indican el porcentaje de tu base de código disponible para la optimización. Al identificar reglas de conservación amplias o innecesarias, incluidas las que introducen bibliotecas de terceros, el analizador te ayuda a definir mejor tu configuración para garantizar que R8 pueda optimizar de manera eficaz la mayor cantidad posible de tus clases, campos y métodos.

Genera el informe

En AGP 9.3.0-alpha05 y versiones posteriores, el informe se genera automáticamente en build/outputs/mapping/release/configanalyzer.html cuando se ejecuta una compilación de R8. Para inhabilitar la generación automática de los resultados, establece la siguiente propiedad de Gradle:

android.experimental.r8.enableR8ConfigurationAnalyzer=false

En AGP 9.2 y versiones anteriores, establece la com.android.tools.r8.dumpkeepradiushtmltodirectory propiedad del sistema cuando ejecutes una tarea de Gradle con una compilación habilitada con R8.

./gradlew assembleRelease \
    -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>

Por ejemplo, usa el siguiente comando para generar el informe HTML en el directorio /tmp/r8analysis:

// To create the /tmp/r8analysis folder.
mkdir -p /tmp/r8analysis

// To generate the report in the /tmp/r8analysis folder.
./gradlew assembleRelease \
    -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=/tmp/r8analysis

Cómo interpretar el informe

R8 Configuration Analyzer proporciona estadísticas sobre la configuración de R8 de tu app y el impacto de cada regla de conservación en ella. Esto te ayuda a obtener la optimización máxima de R8, lo que mejora el rendimiento de tu app. Usa las siguientes puntuaciones para comprender qué parte de tu base de código está disponible para la optimización de R8.

Ejemplo de la sección de resumen del informe
Figura 1. Ejemplo de la sección de resumen del informe

Puntuación de reducción

Cuando R8 reduce tu app, disminuye su tamaño general identificando y eliminando el código y los recursos que no se usan, lo que garantiza que la compilación final sea lo más eficiente posible. La puntuación de reducción hace un seguimiento del porcentaje de clases, campos y métodos que están sujetos a la reducción. Por ejemplo, una puntuación de reducción del 66% significa que R8 puede realizar la reducción en el 66% de tu base de código.

Nivel de optimización

R8 realiza optimizaciones, como la inserción de métodos y la combinación de clases, lo que mejora el inicio y la memoria de tu app. El nivel de optimización hace un seguimiento del porcentaje de clases, campos y métodos que están sujetos a las optimizaciones de R8. Por ejemplo, si el nivel de optimización es del 66%, significa que R8 solo puede realizar la optimización en el 66% de tu base de código.

Puntuación de ofuscación

Al ofuscar clases, campos y métodos en nombres más cortos, R8 reduce la huella de metadatos de la app para ahorrar memoria. La puntuación de ofuscación mide el porcentaje de código disponible para la ofuscación dentro de tu base de código.

Define mejor las reglas de conservación

Para mejorar las puntuaciones y desbloquear una mejor optimización de R8, debes definir mejor tus reglas de conservación para que no impidan innecesariamente que R8 optimice tu app. Solo debes conservar las clases, los métodos o los campos a los que se accede mediante la reflexión.

Para ello, usa el análisis de reglas de conservación.

Un ejemplo del análisis de la regla de conservación
Figura 2: Ejemplo del análisis de reglas de conservación

Para ver el análisis detallado de una regla, haz clic en ella para abrir la pantalla de detalles.

Un ejemplo del análisis de la regla de conservación
Figura 3: Ejemplo del análisis de reglas de conservación

Cómo definir mejor las reglas de conservación

Para definir mejor tus reglas de conservación y desbloquear todo el potencial de las optimizaciones de R8 para tu app, haz lo siguiente:

  1. Para cada regla de conservación, consulta el porcentaje de clases, campos y métodos que R8 no puede optimizar en Configuration Analyzer. Usa esta opción para identificar las reglas de conservación que impiden la optimización en una gran cantidad de clases, campos o métodos. También se enumeran las propiedades de optimización que impide cada regla de conservación.
  2. Si ves una regla de conservación que impide la optimización de una gran cantidad de clases, debes asegurarte de verificar qué clases, campos y métodos impide la regla de conservación para ver si esta regla conserva elementos que no se invocan de forma dinámica mediante la reflexión.
  3. Reduce la optimización bloqueada por las reglas de conservación segmentando solo las clases, los campos o los métodos necesarios. Para ello, elige la opción de conservación correcta y sigue las prácticas recomendadas.
  4. Investiga y ejecuta pruebas que abarquen las clases, los campos y los métodos afectados de la regla de conservación, y define mejor las reglas de conservación.

Inspecciona la optimización de las bibliotecas

Cuando integras bibliotecas de terceros, suelen incluir sus propias reglas de conservación del consumidor para trabajar con R8. Dado que el autor de la biblioteca no puede predecir tu implementación específica, a veces escribe reglas conservadoras y de gran alcance que impiden la optimización en más clases, campos y métodos de los necesarios. Esto puede impedir que R8 optimice partes de tu app que no tienen nada que ver con la ejecución real del tiempo de ejecución de la biblioteca. Puedes usar R8 Configuration Analyzer para identificar las bibliotecas que introducen reglas que afectan negativamente la optimización de tu app.

Usa el analizador de configuración para inspeccionar el efecto combinado de todas las reglas de conservación del consumidor combinadas. Si analizas el impacto de cada regla de conservación que proviene de una biblioteca de terceros, puedes identificar y rastrear las bibliotecas de terceros específicas que impiden una gran cantidad de optimización en tu app.

Cómo optimizar bibliotecas

  • Si una biblioteca incluye una regla demasiado amplia, te recomendamos que te comuniques con el mantenedor de la biblioteca con los datos de tu informe para demostrar cómo afectan sus reglas actuales a los niveles de optimización de tu app. Si es una biblioteca externa, busca errores existentes en la biblioteca antes de informar problemas.
  • Si es necesario, puedes probar posibles mejoras filtrando las reglas de una biblioteca específica. Puedes importar las reglas de la biblioteca a tu proyecto, excluir las amplias y volver a ejecutar el analizador de configuración para medir las posibles ganancias en tamaño y rendimiento.

Reglas subsumidas

Es posible que varias reglas de conservación se superpongan y que una de ellas impida más optimización de la necesaria. Si hay dos reglas de conservación en tu base de código.

# Prevents optimization in the entire package
# Remove this to improve optimization
-keep class com.example.package.** { *; }

# Prevents optimization to the class inside the package
-keep class com.example.package.Myclass

La primera regla de conservación que impide la optimización en todo el paquete subsume la segunda regla de conservación que segmenta una clase dentro del paquete conservado por la primera regla de conservación. Cuando las reglas de conservación se superponen, una puede bloquear más optimizaciones de las necesarias. Si defines mejor estas reglas superpuestas, puedes maximizar la optimización de R8 y eliminar la deuda técnica. Este proceso implica optimizar tu configuración para garantizar que solo se conserve el código esencial mientras se desbloquea todo el potencial de las capacidades de optimización de R8.

Ejemplo de la sección de resumen del informe
Figura 4: Ejemplo de reglas subsumidas en el informe

Optimiza las reglas subsumidas

  1. Busca las reglas de conservación subsumidas con R8 Configuration Analyzer.
  2. Identifica las clases, los campos o los métodos exactos de tu base de código que realmente dependen de la reflexión, que deben conservarse con reglas de conservación. Conocer esto te ayudará a definir mejor las reglas de conservación.
  3. Con el analizador de configuración, compara el impacto de cada regla que segmenta las mismas clases, campos o métodos. Puedes usar el porcentaje de optimización que impide cada regla de conservación para identificar cuál es más amplia y cuál es una regla de conservación más limitada.
    1. Si la regla limitada se escribe con precisión (solo conserva los miembros o las clases exactos a los que se accede de forma reflexiva), quita la regla de conservación más amplia. Esto desbloquea de forma segura las optimizaciones de R8 para el resto de tu paquete.
    2. Si la regla amplia segmenta las clases correctas, conserva la regla amplia y borra la regla limitada. La regla limitada es solo un desorden redundante. Asegúrate de definir mejor la regla amplia para segmentar solo las clases, los campos o los métodos que identificaste.

Verifica y prueba los cambios: Vuelve a ejecutar el analizador de configuración para asegurarte de que se corrigió el conflicto. Luego, compila una compilación de lanzamiento y prueba los cambios para asegurarte de que la base de código funcione como se espera.

Quita las reglas innecesarias

Con el analizador de configuración, puedes auditar sistemáticamente tu base de código para identificar y eliminar las reglas de conservación obsoletas que desordenan tu configuración. R8 Configuration Analyzer destaca específicamente dos fuentes principales de reglas innecesarias:

  • Reglas no utilizadas: Reglas que coinciden con cero clases, métodos o campos en tu compilación actual. A menudo, persisten después de la refactorización del código, la eliminación de dependencias o las configuraciones de copiar y pegar que ya no son relevantes, lo que agrega una complejidad de configuración innecesaria.
  • Reglas idénticas: Las reglas de conservación idénticas son reglas que segmentan las mismas clases, campos y métodos o declaraciones duplicadas de la regla de conservación en el mismo archivo de reglas de conservación o en archivos diferentes.

Ambos tipos de reglas agregan desorden a tu configuración, lo que dificulta el mantenimiento y la depuración. Si las identificas, puedes limpiar tu configuración.