Únete a ⁠ #Android11: The Beta Launch Show el 3 de junio.

Cómo depurar APK previamente compilados

Android Studio 3.0 y versiones posteriores te permiten depurar APK y generar perfiles de ellos sin tener que compilarlos desde un proyecto de Android Studio. Sin embargo, debes asegurarte de usar un APK con la opción de depuración habilitada.

Para comenzar a depurar un APK, haz clic en Profile or debug APK, en la pantalla de bienvenida de Android Studio. O bien, si ya tienes un proyecto abierto, haz clic en File > Profile or debug APK, en la barra de menú. En la siguiente ventana de diálogo, selecciona el APK que quieras importar a Android Studio y haz clic en OK.

Luego, Android Studio mostrará los archivos APK desempaquetados, de manera similar a la figura 1. Este no es un conjunto de archivos completamente descompilado, aunque proporciona archivos .smali para una versión más legible de los archivos .dex.

Figura 1: Cómo importar a Android Studio un APK previamente compilado

La vista Android, en el panel Project, te permite explorar el siguiente contenido de tu APK:

  • APK file: cuando haces doble clic en el APK, se abre el analizador de APK.
  • manifests: contiene los manifiestos de la app que se extraen del APK.
  • java: contiene el código Java que desensambla Android Studio (en archivos .smali) de los archivos DEX de tu APK. Cada archivo .smali de este directorio corresponde a una clase de Kotlin/Java.
  • cpp: si tu app incluye código nativo, este directorio contiene las bibliotecas nativas (archivos .so) de tu APK.
  • External Libraries: contiene el SDK de Android.

Puedes usar el generador de perfiles de Android de inmediato para comenzar a probar el rendimiento de tu app.

Para depurar el código Java de tu app, debes adjuntar los códigos fuente Kotlin/Java y agregar puntos de interrupción en los archivos .kt/.java. De manera similar, para depurar tu código nativo, debes adjuntar símbolos de depuración nativos.

Cómo adjuntar códigos fuente Kotlin/Java

De forma predeterminada, Android Studio extrae código de Kotlin/Java de tu APK y lo guarda como archivos .smali. Para depurar el código de Kotlin/Java mediante puntos de interrupción, debes apuntar el IDE a los archivos de origen .kt o .java correspondientes a los archivos .smali que quieras depurar.

Para adjuntar códigos fuente Kotlin/Java, sigue estos pasos:

  1. Haz doble clic en un archivo .smali del panel Project (usa la vista Android). Una vez que abras el archivo, el editor mostrará un banner que te solicitará que selecciones los códigos fuente Kotlin/Java:

Cómo adjuntar un banner de código fuente

  1. En el banner que aparece en la parte superior de la ventana del editor, haz clic en Attach Kotlin/Java Sources.
  2. Navega al directorio de la app que contiene los archivos de código fuente Kotlin/Java y haz clic en Open.

En la ventana Project, el IDE reemplaza los archivos .smali por sus archivos .kt o .java correspondientes. El IDE también incluye automáticamente clases internas. Ahora podrás agregar puntos de interrupción y depurar tu app como lo harías de forma normal.

Cómo adjuntar símbolos de depuración nativa

Si tu archivo APK contiene bibliotecas nativas (archivos .so) que no incluyen símbolos de depuración, el IDE mostrará un banner similar al que se muestra en la figura 1. No puedes depurar el código nativo del APK ni usar puntos de interrupción sin adjuntar bibliotecas nativas depurables.

Si compilas las bibliotecas nativas de tu APK con un ID de compilación, Android Studio comprobará que ese ID de los archivos de símbolos coincida con el de compilación de las bibliotecas nativas y rechazará los archivos de símbolos que no lo hagan. Si no usas un ID de compilación en el proceso, es posible que ocurran problemas de depuración si proporcionas archivos de símbolos incorrectos.

Para adjuntar bibliotecas nativas depurables, sigue estos pasos:

  1. Si aún no lo hiciste, asegúrate de descargar el NDK y las herramientas.
  2. En el directorio cpp de la ventana Project (solo está visible si seleccionaste la vista Android, como se muestra en la figura 2), haz doble clic en un archivo de biblioteca nativa que no contenga símbolos de depuración. En el editor, se mostrará una tabla con todas las ABI compatibles con tu APK.
  3. En la esquina superior derecha de la ventana del editor, haz clic en Add.
  4. Navega al directorio en el que se incluyen las bibliotecas nativas depurables que desees adjuntar y haz clic en OK.

Si se compilaron el APK y las bibliotecas nativas depurables en una estación de trabajo diferente, deberás especificar las rutas de acceso a los símbolos de depuración locales mediante los siguientes pasos:

  1. Agrega rutas de acceso locales a los símbolos de depuración faltantes editando el campo en la columna Local Paths de la sección Path Mappings de la ventana del editor, como se muestra en la figura 2. En la mayoría de los casos, solo necesitas proporcionar la ruta de acceso a una carpeta raíz, y Android Studio inspeccionará automáticamente los subdirectorios para asignar fuentes adicionales. El IDE también asignará rutas de acceso automáticamente a un NDK remoto en tu descarga de NDK local.
  2. Haz clic en Apply Changes, en la sección Path Mappings de la ventana del editor.

Figura 2: Provisión de rutas de acceso a símbolos de depuración locales

Ahora deberías ver los archivos fuente nativos en la ventana Project. Ábrelos para agregar los puntos de interrupción y depurar tu app como lo harías normalmente. Para quitar las asignaciones, haz clic en Clear, en la sección Path Mappings de la ventana del editor.

Problema conocido: cuando adjuntas símbolos de depuración a un APK, tanto este como los archivos .so depurables deben compilarse en la misma estación de trabajo o en el mismo servidor de compilación.

En Android Studio 3.6 y versiones posteriores, ya no es necesario crear un proyecto nuevo cuando el APK se actualiza fuera del IDE. Android Studio detecta cambios en el APK y te brinda la opción de volver a importarlos.

Figura 3: Los APK actualizados fuera de Android Studio se pueden volver a importar