Soluciona problemas de la optimización

Dado que las optimizaciones de R8 actualizan el código de tu app, es importante que pruebes exhaustivamente el comportamiento de la app para asegurarte de que funcione según lo previsto. En caso de comportamiento inesperado, usa esta página como guía para solucionar posibles problemas después de la 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 rota, sigue estos lineamientos:

  • Observas excepciones, lo que suele significar 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.
  • Verás Class.forName(...).

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

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 con certeza qué reglas se aplican.

    Solución: Consulta el informe de todas las reglas que R8 aplica al compilar tu proyecto para verificar qué reglas se aplican. 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 usaron para configurar R8, y se puede usar para identificar reglas ineficientes.

  • Se conserva demasiado código: Es posible que la optimización de R8 conserve 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 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, pueden cambiar los números de línea y los nombres de las clases y los métodos.

    Solución: A partir de la versión 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 registro de seguimiento original. Para recuperar el seguimiento de pila original, usa la herramienta de línea de comandos retrace, que se incluye con el paquete de herramientas de línea de comandos.

    Para usar retrace, proporciona al comando la ruta de acceso a un archivo de asignación y a un archivo de seguimiento de pila. El archivo de asignación, llamado mapping.txt, se incluye automáticamente en tu Android App Bundle (AAB). Para obtener más información, consulta la documentación de retrace y el artículo del Centro de ayuda de Play Console sobre cómo desofuscar los 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.