Habilidades de Android
Ver en GitHubAnalizador de configuración de R8
android skills add --skill r8-analyzerAnalyze the R8 configurationEl Analizador de configuración de R8 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.
Cómo generar 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 de Gradle independiente (recomendado para uso local)
Cuando realices iteraciones activamente 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
Debido a que esta tarea omite la generación de APK 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 definirlas mejor de inmediato. El informe HTML se genera en app/build/reports/r8/r8-config-analyzer-release.html.
Genera automáticamente durante las compilaciones regulares
Cuando ejecutas 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 regulares, establece la siguiente propiedad de Gradle:
android.experimental.r8.enableR8ConfigurationAnalyzer=false
Para el AGP 9.2 y versiones anteriores
Para el 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
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 obtener la optimización máxima de R8, lo que mejora el rendimiento de la app. Usa las siguientes puntuaciones para comprender qué parte de tu base de código está disponible para la optimización de R8.
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 pequeña 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 el espacio 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.
Cómo definir 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 el reflejo.
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 definir mejor tus reglas de conservación y desbloquear todo el potencial de 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 el Analizador de configuración. 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 regla de conservación para ver si esta regla conserva elementos que no se invocan de forma dinámica mediante el reflejo.
- 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.
- 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.
Cómo inspeccionar la optimización de las bibliotecas
Cuando integras bibliotecas de terceros, a menudo incluyen sus propias reglas de conservación del consumidor para trabajar con R8. Debido a 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 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 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
Para abordar las reglas de conservación que introducen las 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 con los datos de tu informe para demostrar cómo afectan sus reglas actuales a los niveles de optimización de tu app. Si se trata de 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 que conserva 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 y, al mismo tiempo, desbloquear todo el potencial de las capacidades de optimización de R8.
Cómo optimizar las reglas subsumidas
- Busca las reglas de conservación subsumidas 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 del reflejo, que deben conservarse con las reglas de conservación. Conocer esto te ayudará a definir mejor las reglas de conservación.
- Con el analizador de configuración, compara el impacto de cada regla que segmenta las mismas clases, los mismos campos o los mismos 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 específica.
- Si la regla específica está escrita 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.
- Si la regla amplia segmenta las clases correctas, conserva la regla amplia y borra la regla específica. La regla específica 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 tus 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 tus cambios para asegurarte de que la base de código funcione como se espera.
Cómo quitar 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: 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 de 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, los mismos campos y los mismos 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.