It's happening now, watch the livestream.

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 una vez que se completa el proceso de compilación. El uso del 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. 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 el APK, 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 el APK, como el archivo AndroidManifest.xml
  • Realizar una comparación entre dos APK

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

  • Arrastra un APK a la ventana Editor de Android Studio.
  • Cambia a la perspectiva Project en la ventana Project y haz doble clic en el APK en el directorio build/output/apks/ predeterminado.
  • Selecciona Build > Analyze APK en la barra de menú y, luego, selecciona tu APK.

Importante: Cuando analices las compilaciones de depuración, usa el APK creado mediante Build > Build APK o desde los comandos de Gradle. Al hacer clic en Run en la barra de herramientas, se generan APK con la opción Instant Run habilitada, que no deben usarse con el Analizador de APK para tareas de optimización porque su uso es únicamente para desarrollo y la mayoría de los recursos se carga de forma dinámica. Puedes identificar un APK de ejecución al instante mediante la presencia de un archivo instant-run.zip incorporado en el APK.

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 con funcionalidad de expansión disponible 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 de archivos RAW y descarga valores de tamaño de archivo para cada entidad como se muestra en la figura 1. Raw File Size representa el tamaño sin comprimir de la entidad en el disco mientras que 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 tipos de productos) o bibliotecas que también proporcionan un archivo de manifiesto, estos se fusionan en un único archivo en tu APK. Este archivo de manifiesto suele ser un archivo binario dentro del APK, 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 permite 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 app se fusionó en el archivo final AndroidManifest.xml.

Además, este visor proporciona algunas capacidades de Lint y muestra las advertencias y los errores 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 el margen derecho del archivo de manifiesto seleccionado

Cómo ver archivos DEX

El visor de archivos DEX del Analizador de APK ofrece acceso inmediato a la información subyacente de los archivos DEX de tu app. Los recuentos de clases, paquetes, referencias totales y declaraciones se proporcionan dentro del visor, lo que puede ayudarte a decidir si usar varios DEX o quitar dependencias para no superar el límite de 64 mil DEX.

En la figura 3, se representa 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 Method, 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. Ten en cuenta que cuando empaquetas una dependencia en tu APK, los métodos definidos en ella se agregan a ambos recuentos de métodos. Además, considera que la reducción y la disminución de Proguard también pueden cambiar considerablemente el contenido de un archivo DEX luego de que se compile el código.

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.

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. 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 marco de trabajo de Android.

Cómo cargar asignaciones de ProGuard

Los íconos de asignación de Proguard están junto a los íconos de filtrado. Estos permanecerán inhabilitados hasta que cargues un conjunto de archivos de asignación de ProGuard que agregue la funcionalidad del visor de archivos DEX, como nombres desofuscados (mapping.txt) que muestren nodos que se quitaron (usage.txt) y que indiquen nodos que no se pueden quitar (seeds.txt). Los archivos de asignación de ProGuard se aplican a los APK que se compilaron con la herramienta ProGuard habilitada y deben provenir de la misma compilación que generó el APK.

Figura 5: Carga de asignaciones de ProGuard

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.

    Los archivos de asignación normalmente se ubican 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 los nombres de archivo que coincidan de manera exacta con mapping.txt, seeds.txt y usage.txt. Luego, busca los nombres de archivo que contienen el texto mapping, usage o seeds en alguna parte y terminan 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 ProGuard ofuscó. Por ejemplo, puedes restablecer nombres de nodos ofuscados como a, b y 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 ProGuard quitó durante la reducción. Los nodos restablecidos aparecen tachados.

    Si quieres obtener más información sobre cómo usar ProGuard para ofuscar y minimizar tu código, consulta Cómo reducir tu código y tus recursos.

Cómo mostrar código de byte, 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 byte, 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 (no código Java) en un diálogo de la siguiente manera:

Figura 6: Código de byte 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 (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 a fin de evitar que un paquete, una clase, un método o un campo determinado se quite durante la fase de reducción de ProGuard (figura 8). Para obtener más información, consulta Cómo personalizar 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 un archivo APK. Por ejemplo, las reglas de reducción ProGuard pueden alterar el código final, y los recursos en un tipo de producto pueden anular los recursos de imagen. Puedes ver la versión final de tus archivos fácilmente con el Analizador de APK: haz clic en la entidad y aparecerá una vista previa de la entidad de texto o imagen debajo, 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 string. En la figura 10, puedes ver las traducciones para cada recurso de string.

Figura 10: Vista previa de los recursos de string traducidos

Cómo comparar archivos APK

El Analizador de APK puede comparar el tamaño de las entidades de dos archivos APK 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 un APK actualizado, haz lo siguiente:

  1. Carga la versión del APK 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.
  3. En el diálogo de selección, busca el APK más reciente que se publicó a 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