Desofuscar o simbolizar rastreos de pilas de bloqueos

Los bloqueos y los errores ANR en Android producen un rastreo de pila, que es una captura de la secuencia de funciones anidadas que se hayan ejecutado en tu programa hasta el momento del bloqueo. Estas capturas pueden ayudarte a identificar y solucionar cualquier problema en el origen.

Si has desarrollado tu aplicación o juego con Java y utilizas ProGuard para optimizar y ofuscar tus archivos APK, puedes subir un archivo de asignación de ProGuard para cada versión de tu aplicación en Play Console. Si has desarrollado tu aplicación o juego con código nativo, como C++, puedes subir un archivo de símbolos de depuración para cada versión de tu aplicación en Play Console. De esta forma, es más fácil analizar y resolver los bloqueos y los errores ANR.

Importante: Para realizar la desofuscación de aplicaciones compiladas en Java, solo se admiten archivos de asignación compatibles con ReTrace. Es el mismo formato utilizado por ProGuard o R8.

Paso 1: Genera un archivo de desofuscación o simbolización

Si quieres desofuscar o simbolizar los bloqueos y los errores ANR de una versión de tu aplicación, primero tienes que generar los archivos necesarios para esa versión de tu aplicación. Debes generar y subir un archivo por cada versión nueva de la aplicación; si no, la desofuscación o la simbolización no funcionarán.

Java: Generar un archivo de asignación de ProGuard

Para desofuscar los rastreos de la pila de Java, primero tienes que generar un archivo de asignación de ProGuard. Si quieres consultar cómo hacerlo, ve al sitio web de Google Developers.

Nativo: Generar un archivo de símbolos de depuración

Complemento de Android para Gradle (versión 4.1 y posteriores)

Si tu proyecto crea un Android App Bundle, puedes incluir automáticamente el archivo de símbolos de depuración en él. Para incluir este archivo, añade lo siguiente al archivo build.gradle de tu aplicación:

  • android.defaultConfig.ndk.debugSymbolLevel = 'FULL'

Nota: El tamaño máximo del archivo de símbolos de depuración es 300 MB. Si tu archivo de símbolos de depuración es demasiado grande, utiliza SYMBOL_TABLE en lugar de FULL para reducir el tamaño.

Si tu proyecto crea un APK, utiliza el ajuste de compilación build.gradle en el código que se muestra arriba para generar el archivo de símbolos de depuración por separado. Sube manualmente el archivo de símbolos de depuración a Google Play Console. Para ello, sigue las indicaciones que se incluyen más abajo, en el Paso 2: Sube un archivo de desofuscación o simbolización. Como parte del proceso de compilación, el complemento de Android para Gradle genera un archivo que está en la siguiente ubicación del proyecto:

  • app/build/outputs/native-debug-symbols/variant-name/native-debug-symbols.zip

Complemento de Android para Gradle (versión 4.0 y anteriores) y otros sistemas de compilación

Como parte del proceso de compilación de un APK o Android App Bundle, el complemento de Android para Gradle guarda una copia de las bibliotecas que no se hayan optimizado en un directorio de proyecto, el cual tiene una estructura similar a esta:

app/build/intermediates/cmake/universal/release/obj

├── armeabi-v7a/

│   ├── libgamenegine.so

│   ├── libothercode.so

│   └── libvideocodec.so

├── arm64-v8a/

│   ├── libgamenegine.so

│   ├── libothercode.so

│   └── libvideocodec.so

├── x86/

│   ├── libgamenegine.so

│   ├── libothercode.so

│   └── libvideocodec.so

└── x86_64/

    ├── libgameengine.so

    ├── libothercode.so

    └── libvideocodec.so

Nota: Si utilizas un sistema de compilación diferente, puedes cambiarlo para almacenar bibliotecas que no se hayan optimizado en un directorio con la estructura requerida que se muestra arriba.

  1. Comprime el contenido de este directorio:
    • $ cd app/build/intermediates/cmake/universal/release/obj
    • $ zip -r symbols.zip .
  2. Sube manualmente el archivo symbols.zip a Play Console. Para ello, sigue las indicaciones que se incluyen más abajo, en el Paso 2: Sube un archivo de desofuscación o simbolización.

El tamaño del archivo de símbolos de depuración no puede ser superior a 300 MB. Si el archivo es demasiado grande, es probable que tus archivos .so contengan una tabla de símbolos (nombres de funciones) e información de depuración en formato DWARF (nombres de archivos y líneas de código). Estos elementos no son necesarios para simbolizar el código y se pueden quitar ejecutando el siguiente comando:

  • $OBJCOPY --strip-debug lib.so lib.so.sym

Nota: $OBJCOPY apunta a la versión específica del ABI que estés preparando, por ejemplo: ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-objcopy

Paso 2: Sube un archivo de desofuscación o simbolización

Para desofuscar o simbolizar los bloqueos y los errores ANR de una versión de tu aplicación, tienes que subir los archivos de desofuscación o simbolización para cada versión de tu aplicación.

Importante: Este paso solo es necesario en el caso de los desarrolladores que utilicen APKs. Si utilizas Android App Bundle y el complemento de Android para Gradle (versión 4.1 o posterior), no tienes que hacer nada, ya que obtendremos automáticamente el archivo de desofuscación del bundle. Puedes ir directamente al Paso 3: Consulta los rastreos de pilas de bloqueos desofuscados. Obtén más información sobre app bundles en el sitio web para desarrolladores de Android.

Subir archivos mediante Play Console

Para subir un archivo de desofuscación o simbolización, haz lo siguiente:

  1. Abre Play Console.
  2. Selecciona una aplicación.
  3. En el menú de la izquierda, selecciona Versión > Dispositivos y versiones > Explorador de app bundles.
  4. Elige el artefacto correspondiente usando el selector situado en la esquina superior derecha.
  5. Selecciona la pestaña Descargas y desplázate hacia abajo hasta la sección "Recursos".
  6. Para subir el archivo de desofuscación o simbolización correspondiente a la versión de tu aplicación, haz clic en la flecha de subida del archivo de asignación o del archivo de los símbolos de depuración.
Subir archivos con la API Google Play Developer

Para subir archivos con la API Google Play Developer, ve al sitio web de Google Developers.

Paso 3: Consulta los rastreos de pilas de bloqueos desofuscados

Una vez que hayas subido un archivo de asignación de ProGuard o un archivo de símbolos de depuración correspondiente a una versión de tu aplicación, los bloqueos y los errores ANR que se produzcan después se desofuscarán. En la página Bloqueos y errores ANR de tu aplicación, puedes revisar los rastreos de la pila desofuscados de bloqueos y errores ANR concretos.

  1. Abre Play Console.
  2. Selecciona una aplicación.
  3. En el menú de la izquierda, selecciona Calidad > Android vitals > Bloqueos y errores ANR.
  4. Selecciona un bloqueo.
  5. En la sección "Seguimientos de pila", verás los rastreos de la pila desofuscados y simbolizados.

Importante: Una vez que hayas subido un archivo de asignación correspondiente a una versión de tu aplicación, solo se desofuscarán los futuros bloqueos y errores ANR de esa versión de la aplicación. No se desofuscarán los bloqueos ni los errores ANR de una versión de la aplicación que se hayan producido antes de subir el archivo de asignación correspondiente.

Preguntas frecuentes

No quiero utilizar la desofuscación o la simbolización de Play Console. ¿Se puede hacer offline?

Play Console utiliza ndk-stack para simbolizar los rastreos de la pila de aplicaciones nativas. En el caso de los bloqueos de Java, Play Console utiliza ReTrace. Si decides no compartir tus archivos de desofuscación, puedes copiar las pilas de bloqueos ofuscados de Play Console y utilizar la herramienta adecuada para simbolizarlas. Sin embargo, este proceso se debe realizar manualmente por cada pila de bloqueos, por lo que es lento y requiere mucho tiempo. Si proporcionas tus archivos de desofuscación, Play Console se encargará de ello.

He subido el archivo de desofuscación o simbolización, pero mis bloqueos y errores ANR siguen ofuscados, ¿por qué?

Una vez que hayas subido un archivo de asignación de ProGuard o un archivo de símbolos de depuración correspondiente a una versión de tu aplicación, solo se desofuscarán los bloqueos y los errores ANR que se produzcan después. Tendrás que esperar un tiempo a que los dispositivos de los usuarios notifiquen nuevos bloqueos y errores ANR para que estos aparezcan desofuscados en Play Console.

He subido el archivo de desofuscación o simbolización, pero los bloqueos y errores ANR solo están parcialmente desofuscados, ¿por qué?

Esto se debe a que has subido un archivo de desofuscación o simbolización incompleto. Debes incluir los archivos de simbolización de toda la aplicación, especialmente si utilizas un proceso de compilación complejo o de varias fases. Una de las causas más habituales de la desofuscación parcial es usar una biblioteca de terceros. En este caso, es posible que el proveedor de la biblioteca pueda proporcionarte los archivos de desofuscación.

Después de subir el archivo de desofuscación o simbolización, parece que hay menos bloqueos y errores ANR, pero más graves, ¿por qué?

Sin archivos de desofuscación, los mismos bloqueos o errores ANR que se producen en un dispositivo de 32 bits y de 64 bits, o en un dispositivo ARM e Intel, se muestran por separado. Al proporcionar archivos de desofuscación, podemos agrupar estos bloqueos para que puedas ver mejor qué bloqueos y errores ANR afectan más a tu aplicación.

¿Qué pasa si se me olvida subir el archivo?

Si se te olvida subir el archivo para una nueva versión de tu aplicación, los bloqueos y los errores ANR volverán a estar ofuscados. Para subir el archivo, sigue las instrucciones que se indican arriba. Una vez que hayas subido un archivo de asignación de ProGuard o un archivo de símbolos de depuración correspondiente a una versión de tu aplicación, solo se desofuscarán los bloqueos y los errores ANR que se produzcan después. Tendrás que esperar un tiempo a que los dispositivos de los usuarios notifiquen nuevos bloqueos y errores ANR para que estos aparezcan desofuscados en Play Console.

Para que no se te olvide subir el archivo, te recomendamos que cambies el proceso de compilación y uses app bundles con el complemento de Android para Gradle (versión 4.1 o posterior). En este caso, puedes incluir automáticamente el archivo de símbolos de depuración en el app bundle siguiendo las instrucciones que encontrarás en el sitio web para desarrolladores de Android.

¿Qué pasa si subo un archivo incorrecto?

Si subes un archivo incorrecto que no se corresponde con la versión de tu aplicación, los bloqueos y los errores ANR volverán a estar ofuscados. Para subir el archivo correcto, haz lo siguiente:

  1. Abre Play Console.
  2. Selecciona una aplicación.
  3. En el menú de la izquierda, selecciona Versión > Dispositivos y versiones > Explorador de app bundles.
  4. Elige el artefacto correspondiente usando el selector situado en la esquina superior derecha.
  5. Selecciona la pestaña Descargas y desplázate hacia abajo hasta la sección "Recursos".
  6. Haz clic en el icono de eliminar situado junto al archivo de desofuscación o de simbolización incorrecto.
  7. Una vez que se haya eliminado la versión incorrecta, haz clic en el icono de subida y sube el archivo correcto según la versión de tu aplicación.

Una vez que hayas subido el archivo correcto de asignación de ProGuard o el archivo correcto de símbolos de depuración correspondiente a una versión de tu aplicación, solo se desofuscarán los bloqueos y los errores ANR que se produzcan después. Tendrás que esperar un tiempo a que los dispositivos de los usuarios notifiquen nuevos bloqueos y errores ANR para que estos aparezcan desofuscados en Play Console.

Nota: Para evitar el riesgo de subir una versión incorrecta del archivo, te recomendamos que cambies el proceso de compilación y uses app bundles con el complemento de Android para Gradle (versión 4.1 o posterior). En este caso, puedes incluir automáticamente el archivo de símbolos de depuración en el app bundle siguiendo las instrucciones que encontrarás en el sitio web para desarrolladores de Android.

Actualmente, utilizo archivos APK. ¿Cómo puedo cambiar y usar app bundles? Mi aplicación tiene código nativo y código Java. ¿Puedo subir un archivo de simbolización nativo y un archivo de desofuscación de Java?

Sí.

¿Te ha resultado útil esta información?
¿Cómo podemos mejorar esta página?

¿Necesitas más ayuda?

Inicia sesión si quieres ver otras opciones de asistencia para solucionar tu problema.