Este archivo parece estar en formato XML binario. ¿Cuál es este formato y cómo se puede analizar mediante programación (en lugar de utilizar la herramienta de volcado aapt en el SDK)?
Este formato binario no se trata en la documentación aquí .
Nota : Deseo acceder a esta información desde fuera del entorno de Android, preferiblemente desde Java.
android
android-manifest
jnorris
fuente
fuente
android.content.pm.PackageManager.queryXX
métodos (docs: developer.android.com/reference/android/content/pm/… ).Respuestas:
Utilice android-apktool
Hay una aplicación que lee archivos apk y decodifica XML a su forma casi original.
Uso:
Consulte android-apktool para más información
fuente
apktool d Gmail.apk && cat Gmail/AndroidManifest.xml
minSdkVersion
y otros parámetros de versión también se pueden encontrar enGmail/apktool.yml
Este método Java, que se ejecuta en un Android, documenta (sobre lo que he podido interpretar) el formato binario del archivo AndroidManifest.xml en el paquete .apk. El segundo cuadro de código muestra cómo llamar a decompressXML y cómo cargar el byte [] desde el archivo del paquete de la aplicación en el dispositivo. (Hay campos cuyo propósito no entiendo, si sabes lo que significan, dime, actualizaré la información).
Este método lee el AndroidManifest en un byte [] para procesar:
La mayoría de las aplicaciones se almacenan en / system / app que es legible sin root mi Evo, otras aplicaciones están en / data / app que necesitaba root para ver. El argumento 'ruta' anterior sería algo como: "/system/app/Weather.apk"
fuente
¿Qué pasa con el uso de Android Asset Packaging Tool (aapt), desde el SDK de Android, en un script Python (o lo que sea)?
A través del aapt ( http://elinux.org/Android_aapt ), de hecho, puede recuperar información sobre el paquete .apk y sobre su archivo AndroidManifest.xml . En particular, puede extraer los valores de elementos individuales de un paquete .apk a través del subcomando 'dump' . Por ejemplo, puede extraer los permisos de usuario en el archivo AndroidManifest.xml dentro de un paquete .apk de esta manera:
Donde package.apk es tu paquete .apk .
Además, puede usar el comando de tubería Unix para borrar la salida. Por ejemplo:
Aquí un script de Python que a eso programáticamente:
De manera similar, puede extraer otra información (por ejemplo , paquete , nombre de la aplicación , etc.) del AndroidManifest.xml :
Si, en cambio, desea analizar todo el árbol XML de AndroidManifest, puede hacerlo de manera similar con el comando xmltree :
Usando Python como antes:
fuente
Puede usar la herramienta axml2xml.pl desarrollada hace un tiempo dentro del proyecto android-random . Generará el archivo de manifiesto textual (AndroidManifest.xml) a partir del binario.
Digo " textual " y no " original " porque, como muchas herramientas de ingeniería inversa, esta no es perfecta y el resultado no será completo . Supongo que nunca se completó la función o simplemente no era compatible con el reenvío (con el nuevo esquema de codificación binaria). Cualquiera sea la razón, la herramienta axml2xml.pl no podrá extraer todos los valores de los atributos correctamente. Dichos atributos son minSdkVersion, targetSdkVersion y básicamente todos los atributos que hacen referencia a recursos (como cadenas, iconos, etc.), es decir, solo se extraen correctamente los nombres de clase (de actividades, servicios, etc.).
Sin embargo, aún puede encontrar esta información faltante ejecutando una herramienta en el archivo original de la aplicación de Android ( .apk ):
fuente
Con las últimas herramientas SDK, ahora puede usar una herramienta llamada apkanalyzer para imprimir el AndroidManifest.xml de un APK (así como otras partes, como recursos).
[android sdk]/tools/bin/apkanalyzer manifest print [app.apk]
apkanalyzer
fuente
Verifique esto a continuación del Proyecto WPF que decodifica las propiedades correctamente.
fuente
apk-parser, https://github.com/caoqianli/apk-parser , un impl ligero para java, sin dependencia de aapt u otros binarios, es bueno para analizar archivos binarios xml y otras informaciones de apk.
fuente
Si estás en Python o usas Androguard , la función Androguard Androaxml hará esta conversión por ti. La característica se detalla en esta publicación de blog , con documentación adicional aquí y fuente aquí .
Uso:
fuente
En caso de que sea útil, aquí hay una versión C ++ del fragmento de Java publicado por Ribo:
fuente
chars
es asignado por new char [], pero luego liberado, en lugar del correctodelete[] chars;
. Al final de la ctor decompressXML debe serprt(" end at offset "+toIntString(off));
, de lo contrario se utiliza la aritmética de punteros ...para referencia aquí está mi versión del código de Ribo. La principal diferencia es que decompressXML () devuelve directamente una cadena, que para mi propósito fue un uso más apropiado.
NOTA: mi único propósito al usar la solución de Ribo era obtener una versión publicada del archivo .APK del archivo XML Manifest, y confirmo que para este propósito funciona de maravilla.
EDITAR [2013-03-16]: Funciona maravillosamente SI la versión está configurada como texto sin formato, pero si está configurada para hacer referencia a un XML de recursos, aparecerá como 'Recurso 0x1' por ejemplo. En este caso particular, probablemente tenga que acoplar esta solución a otra solución que obtenga la referencia de recursos de cadena adecuada.
Espero que pueda ayudar a otras personas también.
fuente
En Android studio 2.2 puedes analizar directamente el apk. Ir a construir- analizar apk. Seleccione el apk, navegue a androidmanifest.xml. Puedes ver los detalles de androidmanifest.
fuente
La versión de @Mathieu Kotlin sigue:
Esta es una versión kotlin de la respuesta anterior.
fuente
Encontré la AXMLPrinter2, una aplicación Java en el proyecto Android4Me que funciona bien en el AndroidManifest.xml que tenía (e imprime el XML de una forma muy bien formateada). http://code.google.com/p/android4me/downloads/detail?name=AXMLPrinter2.jar
Una nota ... (y el código en esta respuesta de Ribo) no parece manejar todos los archivos XML compilados que he encontrado. Encontré uno donde las cadenas se almacenaban con un byte por carácter, en lugar del formato de doble byte que asume.
fuente
puede ser útil
G es mi clase de aplicación:
fuente
He estado utilizando el código Ribo publicado anteriormente durante más de un año, y nos ha servido bien. Sin embargo, con las actualizaciones recientes (Gradle 3.x), ya no podía analizar el AndroidManifest.xml, estaba obteniendo errores de índice fuera de los límites y, en general, ya no podía analizar el archivo.
Actualización: ahora creo que nuestros problemas fueron con la actualización a Gradle 3.x. Este artículo describe cómo AirWatch tuvo problemas y se puede solucionar mediante el uso de una configuración de Gradle para usar aapt en lugar de aapt2 AirWatch parece ser incompatible con el complemento de Android para Gradle 3.0.0-beta1
Al buscar me encontré con este proyecto de código abierto, y se está manteniendo y pude llegar al punto y leer tanto mis viejos APK que pude analizar previamente como los nuevos APK que la lógica de Ribo arrojó excepciones
https://github.com/xgouchet/AXML
De su ejemplo, esto es lo que estoy haciendo.
fuente
apkanalyzer será útil
publicación original https://stackoverflow.com/a/51905063/1383521
fuente