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 supervisando 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 las 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
Con el AGP 9.3.0 y versiones posteriores, puedes generar el informe del Analizador de configuración de R8 con una tarea de Gradle independiente dedicada o automáticamente durante una compilación de R8.
Ejecuta la tarea independiente de Gradle (recomendado para uso local)
Cuando iteres de forma activa en las reglas de conservación, usa la tarea de Gradle independiente para evaluar rápidamente el impacto de tus cambios sin compilar por completo el APK o el paquete:
./gradlew :app:analyzeReleaseR8Config
Como esta tarea omite la generación de APKs o paquetes, proporciona un ciclo de retroalimentación mucho más corto. Esto te permite analizar rápidamente cómo afectan tus reglas de conservación a las puntuaciones de reducción, optimización y ofuscación, y refinarlas de inmediato. El informe HTML se genera en app/build/reports/r8/r8-config-analyzer-release.html.
Se genera automáticamente durante las compilaciones normales.
Cuando se ejecuta una compilación de lanzamiento completa de R8 (como assembleRelease), el informe se genera automáticamente en build/outputs/mapping/release/configanalyzer.html.
Para inhabilitar la generación automática de los resultados durante las compilaciones normales, configura la siguiente propiedad de Gradle:
android.experimental.r8.enableR8ConfigurationAnalyzer=false
Para AGP 9.2 y versiones anteriores
En AGP 9.2 y versiones anteriores, establece la propiedad del sistema com.android.tools.r8.dumpkeepradiushtmltodirectory 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
El Analizador de configuración de R8 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 lograr la optimización máxima de R8 y a mejorar 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 con R8.
Puntuación de reducción
Cuando R8 reduce tu app, identifica y elimina el código y los recursos que no se usan para reducir el tamaño general de la app y garantizar 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 genera mejoras en 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. El nivel de ofuscación mide el porcentaje de código disponible para la ofuscación dentro de tu base de código.
Cómo definir mejor las reglas de conservación
Para mejorar las puntuaciones y desbloquear una mejor optimización de R8, debes refinar 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 con la reflexión.
Para lograrlo, usa el 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.
Cómo definir mejor las reglas de conservación
Para refinar tus reglas de conservación y aprovechar al máximo las optimizaciones de R8 para tu app, haz lo siguiente:
- 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.
- 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 optimización la regla de conservación para ver si esta regla conserva elementos que no se invocan de forma dinámica con la reflexión.
- Reduce la optimización bloqueada por las reglas de conservación segmentando solo las clases, los campos o los métodos necesarios eligiendo la opción de conservación correcta y siguiendo las prácticas recomendadas.
- Investiga y ejecuta pruebas que cubran las clases, los campos y los métodos afectados de la regla de conservación, y refina las reglas de conservación.
Inspecciona la optimización de las bibliotecas
Cuando integras bibliotecas de terceros, estas suelen incluir sus propias reglas de conservación del consumidor para trabajar con R8. Como el autor de la biblioteca no puede predecir tu implementación específica, a veces escribe reglas conservadoras y de amplio 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 el Analizador de configuración de R8 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 proveniente 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
Para abordar las reglas de conservación introducidas por bibliotecas de terceros, haz lo siguiente:
- Si una biblioteca incluye una regla demasiado amplia, te recomendamos que te comuniques con el mantenedor de la biblioteca y le proporciones los datos de tu informe para demostrar cómo las reglas actuales afectan las puntuaciones de optimización de tu app. Si se trata de una biblioteca externa, busca errores existentes en ella antes de informar problemas.
- Si es necesario, puedes probar las posibles mejoras filtrando las reglas de una biblioteca específica. Puedes importar las reglas de la biblioteca a tu proyecto, excluir las generales y volver a ejecutar el analizador de configuración para medir las posibles ganancias en tamaño y rendimiento.
Reglas subsumidas
Puede haber casos en los que varias reglas de conservación se superpongan y una de las reglas 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, es posible que una bloquee más optimizaciones de las necesarias. Si refinas 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 y, al mismo tiempo, aprovechar todo el potencial de las capacidades de optimización de R8.
Optimiza las reglas subsumidas
- Busca las reglas de conservación que subsumen otras reglas con el Analizador de configuración de R8.
- Identifica las clases, los campos o los métodos exactos de tu base de código que realmente dependen de la reflexión, que debe conservarse con reglas de conservación. Conocer esta información te ayudará a definir mejor las reglas de conservación.
- Con el analizador de configuración, compara el impacto de cada regla que se orienta a las mismas clases, campos o métodos. Puedes usar el porcentaje de optimización que evita cada regla de conservación para identificar cuál es más amplia y cuál es una regla de conservación estrecha.
- Si la regla específica se escribe con precisión (solo se conservan 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 del paquete.
- Si la regla amplia segmenta las clases correctas, consérvala y borra la regla específica. La regla estrecha solo es un desorden redundante. Asegúrate de refinar la regla general para que solo se dirija a 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 haya corregido el conflicto. Luego, compila una versión de lanzamiento y prueba los cambios para asegurarte de que la base de código funcione según lo esperado.
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. El Analizador de configuración de R8 destaca específicamente dos fuentes principales de reglas innecesarias:
- Reglas no utilizadas: Son reglas que no coinciden con ninguna clase, método o campo 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 innecesaria a la configuración.
- Reglas idénticas: Las reglas de conservación idénticas son aquellas que se dirigen a las mismas clases, campos y métodos, o bien son declaraciones duplicadas de la regla de conservación en el mismo archivo de reglas de conservación o en diferentes archivos.
Ambos tipos de reglas agregan desorden a tu configuración, lo que dificulta su mantenimiento y depuración. Si los identificas, puedes limpiar tu configuración.