Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Cómo generar perfiles y depurar APK previamente compilados

Android Studio 3.0 y las versiones posteriores te permiten definir y depurar APK 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 ventana de diálogo siguiente, selecciona el APK que desees importar a Android Studio y haz clic en OK.

Luego, Android Studio mostrará los archivos APK desempaquetados, 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.

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

La vista Android, en el panel "Project", te permite inspeccionar 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 en este directorio corresponde a una clase de 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 Java y agregar puntos de interrupción en el archivo .java. De manera similar, para depurar tu código nativo, debes adjuntar símbolos de depuración nativos.

Cómo adjuntar códigos fuente Java

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

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

  1. Haz doble clic en un archivo .smali del panel Project (usa la vista Android). Una vez que lo abras, el editor mostrará un banner de advertencia en el que se te solicitará que selecciones los códigos fuente Java, similar al que se muestra en la figura 1.
  2. Haz clic en Attach Java Sources en el banner que aparece en la parte superior de la ventana del editor.
  3. Navega al directorio de la app que contiene los archivos de código fuente Java y haz clic en Open.

En la ventana Project, el IDE reemplaza los archivos .smali por sus archivos .java correspondientes (el IDE también incluye clases internas de manera automática). Ahora podrás agregar puntos de interrupción y depurar tu app como lo harías normalmente.

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

Si tu APK incluye bibliotecas nativas (archivos .so) que no contienen símbolos de depuración, el IDE te mostrará una advertencia en la ventana Messages, similar a la 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 bibliotecas nativas en tu APK con un ID de compilación, Android Studio verifica si el ID de compilación en tus archivos de símbolos coincide con el de tus bibliotecas nativas, y si no lo hace, rechaza los archivos de símbolos. Si no las compilaste con un ID de compilación, es posible que al proporcionar archivos de símbolos incorrectos tengas problemas con la depuración.

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. Haz clic en Add en la esquina superior derecha de la ventana del editor.
  4. Navega al directorio que incluye las bibliotecas nativas depurables que quieras adjuntar y haz clic en OK.

Si el APK y las bibliotecas nativas depurables se compilaron 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.