Cómo analizar tu compilación con el Analizador de APK

Android Studio incluye un Analizador de APK que proporciona estadísticas inmediatas sobre la composición de tu APK o Android App Bundle una vez que se completa el proceso de compilación. El uso de este analizador puede disminuir el tiempo que tardas en depurar los errores de recursos y archivos DEX de tu app, y ayuda a reducir el tamaño de tu APK. El Analizador de APK también está disponible desde la línea de comandos con apkanalyzer.


Con el Analizador de APK, puedes hacer lo siguiente:

  • Ver el tamaño absoluto y relativo de los archivos en la app, como los archivos de recursos Android y DEX
  • Comprender la composición de los archivos DEX
  • Ver rápidamente las versiones finales de los archivos en la app, como el archivo AndroidManifest.xml
  • Realizar una comparación entre dos APK o paquetes de aplicación

Hay tres maneras de acceder al Analizador de APK en un proyecto abierto:

  • Arrastra un APK o paquete de aplicación a la ventana Editor de Android Studio.
  • Cambia a la vista Project en la ventana Project y, luego, haz doble clic en el APK que se encuentra en el directorio build/output/apks/ predeterminado.
  • Selecciona Build > Analyze APK en la barra de menú y, luego, selecciona tu APK o paquete de aplicación.

Cómo ver información sobre tamaños y archivos

Los APK son archivos que tienen un formato similar al ZIP. El Analizador de APK muestra cada archivo o carpeta como una entidad que puedes expandir para navegar entre carpetas. La jerarquía de las entidades refleja la estructura de los archivos y carpetas en el archivo APK.

El Analizador de APK muestra el tamaño del archivo comprimido (o "tamaño de archivo sin procesar") y descarga los valores de tamaño del archivo para cada entidad, como se muestra en la figura 1. Raw File Size representa la contribución de la entidad al tamaño total del APK. Download Size representa el tamaño comprimido estimado de la entidad como la entregaría Google Play. La opción % of Total Download Size indica el porcentaje que representa el tamaño de descarga total del APK.

Figura 1: Tamaños de archivos en el Analizador de APK

Cómo ver el archivo AndroidManifest.xml

Si tu proyecto incluye varios archivos AndroidManifest.xml, por ejemplo, para variantes de producto o bibliotecas que también proporcionan un archivo de manifiesto, estos se combinan en un único archivo en tu app. Este archivo de manifiesto suele ser un archivo binario dentro del APK o el paquete de aplicación; pero, cuando se selecciona en el Analizador de APK, el formulario XML de esta entidad se vuelve a construir y se presenta.

Este visor te ayuda a comprender cualquier cambio que se haya realizado en tu app durante la compilación. Por ejemplo, puedes ver cómo el archivo AndroidManifest.xml de una biblioteca de la que depende tu aplicación se combina con el archivo final AndroidManifest.xml.

Además, este visor proporciona algunas capacidades de lint. Las advertencias o los errores aparecen en la esquina superior derecha. En la Figura 2, se muestra un error informado para el archivo de manifiesto seleccionado.

Figura 2: Ícono de error que aparece en la esquina superior derecha del archivo de manifiesto seleccionado.

Cómo ver archivos DEX

El visor de archivos DEX del Analizador de APK te brinda acceso inmediato a la información subyacente en los archivos DEX de tu app. El visor proporciona los recuentos de clases, paquetes, referencias totales y declaraciones, lo que puede ayudar a decidir si usar multidex o quitar dependencias para no superar el límite de 64 mil DEX.

En la Figura 3, se muestra una app de tamaño medio que se encuentra por debajo del límite de 64 mil DEX. Cada paquete, clase y método dentro del archivo DEX tiene recuentos que se enumeran en las columnas Defined Method y Referenced Method.

En la columna Reference Methods, se especifica el recuento de todos los métodos a los que se hace referencia en el archivo DEX. En esta, normalmente se incluyen los métodos definidos en tu código, las bibliotecas de dependencia y los métodos definidos en los paquetes de Android y Java estándar que usa el código. Estos son los métodos que se cuentan en el límite de 64 mil métodos, en cada archivo DEX.

En la columna Defined Methods, solo se especifica el recuento de los métodos que se definen en uno de tus archivos DEX, por lo que este número es un subconjunto de los métodos de la columna Referenced Methods.

Figura 3: Una app de tamaño medio

Cómo filtrar la vista de árbol del archivo DEX

Justo encima de la lista Class, el Analizador de APK proporciona filtros para ver el contenido del archivo DEX seleccionado, como se muestra en la Figura 4.

Figura 4: Filtros de DEX configurados para mostrar campos y métodos de BuildConfig

Si quieres usar los filtros para mostrar todos los métodos y campos dentro de una clase, haz lo siguiente:

  1. En la lista File, selecciona el archivo classes.dex.
  2. En la lista Class, navega hasta una clase y selecciónala.
  3. Expande la clase que seleccionaste.
  4. Activa o desactiva la opción Show fields  para ocultar o mostrar los campos de la clase.
  5. Activa o desactiva la opción Show methods  para ocultar o mostrar los métodos de la clase.
  6. Activa o desactiva la opción Show all referenced methods or fields para ocultar o mostrar los paquetes, las clases, los métodos y los campos referenciados.

    En la vista de árbol, los nodos que aparecen con letra cursiva son referencias que no tienen una definición en el archivo DEX seleccionado. Un archivo DEX puede hacer referencia a métodos y campos que están definidos en un archivo diferente. Por ejemplo, System.out.println() es una referencia al método println() en el framework de Android.

Cómo cargar asignaciones de ProGuard

Los íconos de asignación de ProGuard están junto a los íconos de filtrado. Los íconos de ProGuard permanecerán inhabilitados hasta que cargues un conjunto de archivos de asignación de ProGuard que agreguen funcionalidad al visor de archivos DEX, como desofuscar nombres (mapping.txt), mostrar nodos que se quitaron (usage.txt) e indicar nodos que no se pueden quitar (seeds.txt).

El archivo de asignación de ProGuard que importes debe ser el resultado de la misma compilación que produjeron los archivos DEX con la reducción de código habilitada.

Figura 5: Opción "Load Proguard mappings…"

Para cargar los archivos de asignación de ProGuard, haz lo siguiente:

  1. Haz clic en Load ProGuard mappings….
  2. Navega hasta la carpeta del proyecto que contiene los archivos de asignación y carga todos los archivos, cualquier combinación de estos o la carpeta que los contiene.

    Por lo general, los archivos de asignación están en project/app/build/outputs/mappings/release/. El selector de archivos usa la carpeta release como ubicación predeterminada si detecta esta estructura de proyecto.

    En primer lugar, el selector de archivos busca nombres de archivos que coincidan exactamente con mapping.txt, seeds.txt y usage.txt. Luego, el selector de archivos busca nombres de archivo que contengan el texto mapping, usage o seeds en alguna parte y finalicen con .txt. Por ejemplo, release-seeds-1.10.15.txt es una coincidencia.

En la siguiente lista, se describen los archivos de asignación:

  • seeds.txt: Son los nodos que la configuración de ProGuard impide que se quiten durante la reducción se muestran en negrita.
  • mapping.txt: Habilita la opción Deobfuscate names de manera que puedas restablecer los nombres originales de los nodos que R8 ofuscó. Por ejemplo, puedes restablecer nombres de nodos ofuscados, como a, b, c a MyClass, MainActivity y myMethod().
  • usage.txt: habilita la opción Show removed nodes  de manera que puedas mostrar las clases, los métodos y los campos que R8 quitó durante la reducción. Los nodos restablecidos aparecen tachados.

    Si quieres obtener más información sobre el uso de R8 para ofuscar y reducir el código, consulta Cómo reducir, ofuscar y optimizar tu app.

Cómo mostrar código de bytes, buscar usos y generar reglas de conservación

Los nodos en la vista de lista Class tienen un menú contextual con las siguientes opciones que te permiten ver el código de bytes, buscar usos y abrir un diálogo en el que se muestran las reglas ProGuard que puedes copiar y pegar para el nodo seleccionado. Haz clic con el botón derecho en cualquier nodo, en la vista de lista Class para mostrar el menú contextual.

Show bytecode: Descompila la clase, el método o el campo seleccionado y muestra la representación de código de byte smali en un diálogo de la siguiente manera:

Figura 6: Código de bytes de DEX para el método init

Find usages: Muestra qué partes del código DEX tienen referencias a la clase o al método seleccionado, como se muestra en la Figura 7. Si tienes un archivo seeds.txt cargado, los nodos que aparecen en negrita indican que la configuración de ProGuard impide que se quiten durante la reducción:

Figura 7: Referencias a MyClass

Generate ProGuard Keep rule: Muestra las reglas ProGuard que puedes copiar y pegar en el archivo de configuración de ProGuard de tu proyecto, como se muestra en la Figura 8. De esta manera, se evita que un paquete, una clase, un método o un campo determinado se quiten durante la fase de reducción de código. Para obtener más información, consulta Cómo determinar de forma personalizada el código que se conservará.

Figura 8: Reglas ProGuard que puedes copiar del diálogo en tu archivo de configuración de ProGuard

Cómo ver entidades de recursos y código

Hay diferentes tareas de compilación que modifican las entidades finales en una app. Por ejemplo, las reglas de reducción ProGuard pueden alterar el código final, y los recursos en una variante de producto pueden anular los recursos de imagen.

Para ver la versión final de tus archivos con el Analizador de APK, haz clic en la entidad para obtener una vista previa de la entidad de texto o de la imagen, como se muestra en la Figura 9.

Figura 9: Vista previa del recurso de imagen final

El Analizador de APK también puede mostrar diferentes archivos binarios y de texto. Por ejemplo, el visor de la entidad resources.arsc te permite ver los valores específicos de la configuración, como las traducciones de idioma para un recurso de strings. En la Figura 10, puedes ver las traducciones para cada recurso de cadenas.

Figura 10: Vista previa de los recursos de strings traducidos

Cómo comparar archivos

El Analizador de APK puede comparar el tamaño de las entidades de dos archivos APK o paquetes de aplicación diferentes, lo que resulta útil para comprender por qué aumentó el tamaño de tu app en comparación con una versión anterior.

Antes de publicar una app actualizada, haz lo siguiente:

  1. Carga la versión de la app que estás por publicar en el Analizador de APK.
  2. En la esquina superior derecha del Analizador de APK, haz clic en Compare with previous APK….
  3. En el diálogo de selección, busca el artefacto más reciente que se publicó para tus usuarios y haz clic en OK.

    Aparecerá un diálogo similar al de la figura 11 para ayudarte a evaluar el posible impacto de la actualización en los usuarios.

En la figura 11, se muestra la diferencia entre las compilaciones de depuración y de lanzamiento de una app en particular. Entre estos tipos de compilaciones, se usan distintas opciones de compilación que alteran las entidades subyacentes de manera diferente.

Figura 11: Diferencia entre un APK de depuración y uno de lanzamiento