Cómo solucionar problemas de optimización

Dado que las optimizaciones de R8 actualizan el código de tu app, es importante que pruebes exhaustivamente su comportamiento para asegurarte de que funcione como se espera. En caso de que se produzca un comportamiento inesperado, usa esta página como guía para solucionar posibles problemas después de la optimización. Para obtener más información sobre las reglas que puedes usar para solucionar problemas de optimización, consulta Usa reglas para solucionar problemas de optimización.

Cuando soluciones problemas, enfócate en las siguientes situaciones:

  • Optimización excesiva que provoca fallas en la app: Tu app falla porque R8 optimizó demasiado código.
  • Optimización poco clara o insuficiente: R8 no optimizó tu app tanto como esperabas o necesitas más explicaciones sobre las optimizaciones.

La app falla

Si tu app falló después de optimizarla con R8, suele deberse a una reflexión interrumpida. Para identificar la reflexión interrumpida, sigue estos lineamientos:

  • Observas una excepción que significa que la clase, el método o el campo indicados se usan a través de la reflexión. Por lo general, estas excepciones son una de las siguientes: ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, NoClassDefFoundError, NoSuchMethodError, NoSuchFieldError.
  • Ves código que hace referencia a la reflexión con import kotlin.reflect.* o import java.lang.reflect.*.
  • Observas que se usa un constructor de clase de la siguiente manera: Something::class.constructors.
  • Ves Class.forName(...).

Solución: Agrega una regla de conservación.

Si tu propio código realiza la reflexión, puedes anotarlo con anotaciones de Jetpack Keep en lugar de agregar una regla de conservación. Las verificaciones de lint de Jetpack Keep también marcan otras llamadas reflexivas que no están anotadas, lo que te ayuda a evitar fallas similares.

Optimización poco clara o insuficiente

Dado que las reglas se aplican desde tu app y desde las bibliotecas incluidas, es posible que necesites más claridad sobre las reglas aplicadas o una explicación de por qué R8 conservó ciertas secciones de código que esperabas que se optimizaran.

  • Ambigüedad sobre las reglas aplicadas: Debido a que las reglas de las bibliotecas incluidas también se aplican a tu app y las opciones globales de estas bibliotecas también se propagan a tu app, es posible que no sepas qué reglas se aplican.

    Solución: Para verificar qué reglas se aplican, consulta el informe de todas las reglas que aplica R8 cuando compila tu proyecto. Puedes encontrar este informe en ./app/build/outputs/mapping/configuration.txt. Este informe contiene todas las reglas combinadas de cada biblioteca y módulo que se usó para configurar R8, y se puede usar para identificar reglas ineficientes.

  • Se conserva demasiado código: La optimización de R8 puede conservar el código que esperabas que se quitara.

    Solución: Usa la opción de configuración -whyareyoukeeping para comprender por qué se conservó el código. El resultado contiene una ruta de acceso desde el código conservado hasta uno de los puntos de entrada de tu app. Para obtener más información, consulta -whyareyoukeeping.

  • Dificultad para comprender el seguimiento de pila original: R8 cambia el código de varias maneras, lo que hace que el seguimiento de pila ya no haga referencia al código original. Por ejemplo, los números de línea y los nombres de las clases y los métodos pueden cambiar.

    Solución: A partir de Android Studio Otter 3 Feature Drop y AGP 9.0, Logcat desofusca automáticamente los seguimientos de pila. Sin embargo, si usas una versión anterior de Android Studio, debes recuperar manualmente el seguimiento de pila original. Para recuperar el seguimiento de pila original, usa la retrace herramienta de línea de comandos, que se incluye con el paquete de herramientas de línea de comandos.

    Para usar retrace, proporciona el comando con la ruta de acceso a un archivo de asignación y un archivo de seguimiento de pila. El archivo de asignación, llamado mapping.txt, se incluye automáticamente con tu Android App Bundle (AAB). Para obtener más detalles, consulta la documentación de retrace y el artículo del Centro de ayuda de Play Console sobre cómo desofuscar seguimientos de pila de fallas. Cuando uses Play y Firebase Crashlytics, usa el archivo mapping.txt con las fallas que el servicio recopila de los usuarios de la app. En el siguiente comando, se muestra cómo puedes ejecutar retrace desde la raíz de tu proyecto:

    $ANDROID_HOME/cmdline-tools/latest/bin/retrace app/build/outputs/mapping/$releaseVariant/mapping.txt trace.txt
    

Cómo informar errores

Si no puedes resolver un problema con R8, informa un error.