apkanalyzer

La versión de línea de comandos del Analizador de APK proporciona información inmediata sobre la composición del APK una vez que se completa el proceso de compilación y te permite comparar las diferencias entre dos APKs. El uso del Analizador de APK reduce el tiempo que dedicas a depurar problemas con archivos y recursos DEX dentro de la app y reduce el tamaño del APK.

apkanalyzer se incluye en el paquete de herramientas de línea de comandos del SDK de Android en android_sdk/cmdline-tools/version/bin/apkanalyzer. Otra opción es acceder a la herramienta Analizador de APK dentro de Android Studio según se describe en Cómo analizar tu compilación con el Analizador de APK.

Sintaxis

La sintaxis de apkanalyzer es la siguiente:

apkanalyzer [global-options] subject verb [options] apk-file [apk-file2]

El subject es lo que deseas consultar y puede ser el APK completo o una parte de él. Este elemento puede ser cualquiera de los siguientes:

  • apk: Analiza los atributos del archivo APK, como el ID de aplicación y el código y el nombre de la versión.
  • files: Analiza los archivos dentro del archivo APK.
  • manifest: Analiza el contenido del manifiesto dentro del archivo APK.
  • dex: Analiza los archivos DEX dentro del archivo APK.
  • resources: Permite ver recursos de texto, imagen y strings.

El verb es lo que quieres saber sobre el sujeto. Los sujetos, los verbos y sus opciones se describen en la siguiente sección sobre comandos.

Para cada comando, debes especificar un archivo APK. Solo para el comando apk compare debes especificar un segundo archivo APK.

Puedes acortar cada opción, siempre que esta no sea ambigua. Por ejemplo, la opción global --human-readable se puede acortar a -h.

En el siguiente ejemplo, se analiza apk (sujeto) para obtener su file-size (verbo) y luego imprimir el tamaño del archivo en lenguaje natural (opción -h):

apkanalyzer -h apk file-size myapk.apk

Comandos

Las siguientes descripciones de comandos están organizadas por sujeto e incluyen las combinaciones de verbos y opciones disponibles para cada sujeto:

Ver atributos del archivo APK Descripción
apk summary apk-file Imprime el ID de aplicación, el código de la versión y el nombre de la versión.

Resultado de ejemplo:

com.myapp 5 1.1-beta

apk file-size apk-file Imprime el tamaño total del archivo del APK.
apk download-size apk-file Imprime una estimación del tamaño de descarga del APK.
apk features [--not-required] apk-file Muestra las funciones utilizadas por el APK que activan el filtrado de Play Store. Agrega la opción --not-required para incluir funciones marcadas como no obligatorias en el resultado.

Resultado de ejemplo:

android.hardware.type.watch
android.hardware.microphone implied:
    requested android.permission.RECORD_AUDIO permission

apk compare [options] apk-file apk-file2 Compara los tamaños de apk-file y apk-file2. Puedes incluir las siguientes opciones:
  • --different-only: Muestra directorios y archivos con diferencias.
  • --files-only: No muestra entradas del directorio.
  • --patch-size: Muestra una estimación del parche archivo por archivo, en lugar de una diferencia sin procesar.

Resultado de ejemplo (tamaño anterior / tamaño nuevo / diferencia de tamaño / ruta):

39086736 48855615 9768879 /
10678448 11039232 360784 /classes.dex
18968956 18968956 0 /lib/
110576 110100 -476 /AndroidManifest.xml
...

Ver sistema de archivos APK Descripción
files list apk-file Enumera todos los archivos del APK.

Resultado de ejemplo:

/
/classes2.dex
/classes.dex
/assets/
/assets/asset.data
/AndroidManifest.xml
/resources.arsc
/res/
...

files cat --file path apk-file Imprime el contenido del archivo. Debes especificar una ruta dentro del APK con la opción --file path, como --file /AndroidManifest.xml
Ver información en el manifiesto Descripción
manifest print apk-file Imprime el manifiesto del APK en formato XML.
manifest application-id apk-file Imprime el valor del ID de aplicación.
manifest version-name apk-file Imprime el valor del nombre de la versión.
manifest version-code apk-file Imprime el valor del código de la versión.
manifest min-sdk apk-file Imprime la versión mínima del SDK.
manifest target-sdk apk-file Imprime la versión del SDK de destino.
manifest permissions apk-file Imprime la lista de permisos.
manifest debuggable apk-file Imprime si la aplicación es depurable.
Acceder a la información del archivo DEX Descripción
dex list apk-file Imprime una lista de los archivos DEX del APK.
dex references [--files path] [--files path2] apk-file Imprime el número de referencias de métodos en los archivos DEX especificados. El valor predeterminado equivale a todos los archivos DEX. Agrega la opción --files para indicar los archivos específicos que desees incluir.

Resultado de ejemplo:

classes.dex 59598
classes2.dex 8042

dex packages [option1 option2 ...] apk-file Imprime el árbol de clases desde DEX. En el resultado, P, C, M y F indican paquetes, clases, métodos y campos, respectivamente. Y x, k, r y d indican nodos borrados, guardados, mencionados y definidos, respectivamente.

Agrega las siguientes opciones para definir mejor el resultado:

  • --defined-only: Incluye en el resultado solo las clases definidas en el APK.
  • --files: Especifica los nombres de archivo DEX que se incluirán. Valor predeterminado: todos los archivos DEX.
  • --proguard-folder file: Especifica la carpeta de salida de Proguard para buscar asignaciones.
  • --proguard-mappings file: Especifica el archivo de asignaciones de ProGuard.
  • --proguard-seeds file: Especifica el archivo de origen ProGuard.
  • --proguard-usages file: Especifica el archivo de usos ProGuard.
  • --show-removed: Muestra las clases y los miembros que Proguard quitó.

Resultado de ejemplo (tipo/estado/métodos definidos/métodos de referencia/tamaño en bytes/nombre):

P d 1 1 85 g
P d 1 1 85 g.a
C d 1 1 85 g.a.a
M d 1 1 45 g.a.a java.lang.Object get()
C r 0 1 40 byte[]
M r 0 1 40 byte[] java.lang.Object clone()

dex code --class class [--method method] Muestra el código de bytes de una clase o método en formato Smali. El nombre de la clase es obligatorio y se imprime totalmente calificado para descompilar. Agrega la opción --method para especificar el método de descompilación.

El formato de este método es name(params)returnType, por ejemplo, someMethod(Ljava/lang/String;I)V.

Ver los recursos almacenados en res/ y resources.arsc Descripción
resources packages Imprime una lista de los paquetes que se definen en la tabla de recursos.
resources configs --type type [--package package] apk-file Imprime una lista de configuraciones para el type especificado. El type es un tipo de recurso, como string. Incluye la opción --package si deseas especificar el nombre del paquete de la tabla de recursos; de lo contrario, se utilizará el primer paquete definido.
resources value --config config --name name --type type [--package package] apk-file Imprime el valor del recurso especificado por config, name y type. La opción type es el tipo de recurso, como string.

Incluye la opción --package si deseas especificar el nombre del paquete de la tabla de recursos; de lo contrario, se utilizará el primer paquete definido.

resources names --config config --type type [--package package] apk-file Imprime una lista de nombres de recursos para una configuración y un tipo. La opción type es el tipo de recurso, como string. Incluye la opción --package si deseas especificar el nombre del paquete de la tabla de recursos; de lo contrario, se utilizará el primer paquete definido.
resources xml --file path apk-file Imprime un archivo XML binario en formato en lenguaje natural. Incluye la opción file para especificar la ruta del archivo.