Cómo depurar APK previamente compilados

Android Studio 3.0 y las versiones posteriores te permiten generar perfiles y depurar APKs que tengan la depuración habilitada sin tener que compilarlos desde un proyecto de Android Studio.

Para comenzar a depurar un APK, sigue estos pasos:

  1. En la pantalla de bienvenida de Android Studio, haz clic en Profile or debug APK.

    Si ya tienes un proyecto abierto, haz clic en File > Profile or Debug APK, en la barra de menú.

  2. En el cuadro de diálogo que aparece, selecciona el APK que quieras importar a Android Studio.

  3. Haz clic en ACEPTAR.

Si esta opción no aparece, asegúrate de tener habilitado el complemento "Android APK Support".

Luego, Android Studio mostrará los archivos APK sin empaquetar, de manera similar a la figura 1. Si bien este no es un conjunto de archivos completamente descompilado, sí proporciona archivos SMALI para una versión más legible de los archivos DEX.

Cómo importar a Android Studio un APK previamente compilado

Figura 1: Importación a Android Studio de un APK previamente compilado

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

  • APK file: Haz doble clic en el APK para abrir el analizador de APK.
  • manifests: Contiene los manifiestos de la app que se extraen del APK.
  • java: Contiene el código de Kotlin o Java que Android Studio desensambla (en archivos SMALI) a partir de los archivos DEX de tu APK. Cada archivo SMALI de este directorio corresponde a una clase de Kotlin o 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 para comenzar a probar el rendimiento de tu app.

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

Cómo adjuntar fuentes de Kotlin o Java

De forma predeterminada, Android Studio extrae código de Kotlin o Java de tu APK y lo guarda como archivos SMALI. Para depurar el código de Kotlin o Java con puntos de interrupción, debes apuntar el IDE a los archivos fuente de Kotlin o Java correspondientes a los archivos SMALI que desees depurar.

Para adjuntar los códigos de fuente de Kotlin o 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 de Kotlin o Java: Cómo adjuntar un banner de código fuente
  2. Haz clic en Attach Kotlin/Java Sources… en el banner de la ventana del editor.
  3. Navega al directorio de la app que contiene los archivos de código fuente de Kotlin o Java y haz clic en Open.

En la ventana Project, Android Studio reemplaza los archivos SMALI con los respectivos archivos fuente de Kotlin o Java. Android Studio también incluye automáticamente clases internas. Ahora puedes agregar puntos de interrupción y depurar tu app.

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

Si tu APK incluye bibliotecas nativas (archivos SO) que no incluyen símbolos de depuración, Android Studio te mostrará un banner similar al de la Figura 1. No puedes depurar el código nativo del APK ni usar puntos de interrupción sin adjuntar bibliotecas nativas depurables.

Para adjuntar bibliotecas nativas depurables, sigue estos pasos:

  1. Si aún no lo hiciste, descarga el NDK y las herramientas.
  2. En la vista Android, en el directorio cpp de la ventana Project, 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 ABIs 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. Android Studio también asignará rutas de acceso de forma automática 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.

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

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

Los archivos fuente nativos aparecen en la ventana Project. Ábrelos para agregar los puntos de interrupción y depurar tu app. 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, no necesitas 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.

Cómo importar el APK actualizado

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