Ce fichier semble être au format XML binaire. Quel est ce format et comment peut-il être analysé par programme (par opposition à l'utilisation de l'outil de vidage aapt dans le SDK)?
Ce format binaire n'est pas abordé dans la documentation ici .
Remarque : je souhaite accéder à ces informations depuis l'extérieur de l'environnement Android, de préférence depuis Java.
android
android-manifest
jnorris
la source
la source
android.content.pm.PackageManager.queryXX
méthodes (docs: developer.android.com/reference/android/content/pm/… ).Réponses:
Utilisez android-apktool
Il existe une application qui lit les fichiers apk et décode les XML à leur forme presque originale.
Usage:
Vérifiez android-apktool pour plus d'informations
la source
apktool d Gmail.apk && cat Gmail/AndroidManifest.xml
minSdkVersion
et d'autres paramètres de version peuvent également être trouvés dansGmail/apktool.yml
Cette méthode Java, qui s'exécute sur un Android, documente (ce que j'ai pu interpréter) le format binaire du fichier AndroidManifest.xml dans le package .apk. La deuxième zone de code montre comment appeler decompressXML et comment charger l'octet [] à partir du fichier de package d'application sur l'appareil. (Il y a des champs dont je ne comprends pas le but, si vous savez ce qu'ils signifient, dites-moi, je mettrai à jour les informations.)
Cette méthode lit le AndroidManifest dans un octet [] pour le traitement:
La plupart des applications sont stockées dans / system / app qui est lisible sans root my Evo, d'autres applications sont dans / data / app que j'avais besoin de root pour voir. L'argument 'path' ci-dessus serait quelque chose comme: "/system/app/Weather.apk"
la source
Qu'en est-il de l'utilisation de l' outil Android Asset Packaging (aapt), du SDK Android, dans un script Python (ou autre)?
Grâce à aapt ( http://elinux.org/Android_aapt ), en effet, vous pouvez récupérer des informations sur le package .apk et sur son fichier AndroidManifest.xml . En particulier, vous pouvez extraire les valeurs d'éléments individuels d'un package .apk via la sous-commande 'dump' . Par exemple, vous pouvez extraire les autorisations utilisateur dans le fichier AndroidManifest.xml à l'intérieur d'un package .apk de cette manière:
Où package.apk est votre package .apk .
De plus, vous pouvez utiliser la commande Unix pipe pour effacer la sortie. Par exemple:
Voici un script Python qui à cela par programme:
De la même manière, vous pouvez extraire d'autres informations (par exemple, le package , le nom de l'application , etc.) du fichier AndroidManifest.xml :
Si à la place vous souhaitez analyser l'intégralité de l'arborescence XML AndroidManifest, vous pouvez le faire de la même manière en utilisant la commande xmltree :
Utiliser Python comme avant:
la source
Vous pouvez utiliser l' outil axml2xml.pl développé il y a quelque temps dans le projet android-random . Il générera le fichier manifeste textuel (AndroidManifest.xml) à partir du fichier binaire.
Je dis " textuel " et non " original " car, comme beaucoup d'outils de rétro-ingénierie, celui-ci n'est pas parfait et le résultat ne sera pas complet . Je suppose que cela n'a jamais été une fonctionnalité complète ou tout simplement pas compatible avec l'avant (avec le nouveau schéma de codage binaire). Quelle que soit la raison, l' outil axml2xml.pl ne pourra pas extraire correctement toutes les valeurs d'attribut. Ces attributs sont minSdkVersion, targetSdkVersion et fondamentalement tous les attributs qui référencent des ressources (comme des chaînes, des icônes, etc.), c'est-à-dire que seuls les noms de classe (d'activités, de services, etc.) sont extraits correctement.
Cependant, vous pouvez toujours trouver ces informations manquantes en exécutant l' outil aapt sur le fichier d'application Android d'origine ( .apk ):
la source
Avec les derniers outils SDK, vous pouvez désormais utiliser un outil appelé apkanalyzer pour imprimer le fichier AndroidManifest.xml d'un APK (ainsi que d'autres parties, telles que des ressources).
[android sdk]/tools/bin/apkanalyzer manifest print [app.apk]
apkanalyzer
la source
Vérifiez ce projet WPF suivant qui décode correctement les propriétés.
la source
apk-parser, https://github.com/caoqianli/apk-parser , un impl léger pour java, sans dépendance pour aapt ou d'autres binaires, est bon pour analyser les fichiers binaires xml et d'autres informations apk.
la source
Si vous utilisez Python ou utilisez Androguard , la fonction Androguard Androaxml effectuera cette conversion pour vous. La fonctionnalité est détaillée dans cet article de blog , avec une documentation supplémentaire ici et source ici .
Usage:
la source
Au cas où cela serait utile, voici une version C ++ de l'extrait de code Java publié par Ribo:
la source
chars
est alloué par le nouveau char [], mais ensuite libéré, au lieu du correctdelete[] chars;
. À la fin du contrôleur decompressXML, il doit êtreprt(" end at offset "+toIntString(off));
, sinon l'arithmétique du pointeur est utilisée ...pour référence voici ma version du code de Ribo. La principale différence est que decompressXML () renvoie directement une chaîne, ce qui pour mes besoins était une utilisation plus appropriée.
REMARQUE: mon seul objectif en utilisant la solution de Ribo était de récupérer la version publiée d'un fichier .APK à partir du fichier XML Manifest, et je confirme qu'à cette fin, cela fonctionne parfaitement.
EDIT [16/03/2013]: Cela fonctionne à merveille SI la version est définie en texte brut, mais si elle est définie pour faire référence à un XML de ressource, elle apparaîtra comme «Ressource 0x1» par exemple. Dans ce cas particulier, vous devrez probablement coupler cette solution à une autre solution qui récupérera la référence de ressource de chaîne appropriée.
J'espère que cela peut aussi aider d'autres personnes.
la source
Dans Android studio 2.2, vous pouvez analyser directement l'apk. Aller à la construction - analyser apk. Sélectionnez l'apk, accédez à androidmanifest.xml. Vous pouvez voir les détails d'Androidmanifest.
la source
La version @Mathieu Kotlin suit:
Ceci est une version kotlin de la réponse ci-dessus.
la source
J'ai trouvé AXMLPrinter2, une application Java sur le projet Android4Me pour fonctionner correctement sur le fichier AndroidManifest.xml que j'avais (et imprime le XML d'une manière bien formatée). http://code.google.com/p/android4me/downloads/detail?name=AXMLPrinter2.jar
Une note ... il (et le code sur cette réponse de Ribo) ne semble pas gérer tous les fichiers XML compilés que j'ai rencontrés. J'en ai trouvé un où les chaînes étaient stockées avec un octet par caractère, plutôt que le format à deux octets qu'il suppose.
la source
ça peut être utile
G est ma classe d'application:
la source
J'utilise le code Ribo affiché ci-dessus depuis plus d'un an et cela nous a bien servi. Cependant, avec les mises à jour récentes (Gradle 3.x), je ne pouvais plus analyser le fichier AndroidManifest.xml, je recevais des erreurs d'index hors limites et, en général, il n'était plus en mesure d'analyser le fichier.
Mise à jour: je crois maintenant que nos problèmes concernaient la mise à niveau vers Gradle 3.x. Cet article décrit comment AirWatch a rencontré des problèmes et peut être résolu en utilisant un paramètre Gradle pour utiliser aapt au lieu de aapt2 AirWatch semble être incompatible avec Android Plugin for Gradle 3.0.0-beta1
En cherchant autour de moi, je suis tombé sur ce projet open source, et il est en cours de maintenance et j'ai pu aller droit au but et lire mes anciens APK que je pouvais auparavant analyser, et les nouveaux APK que la logique de Ribo a jetés des exceptions
https://github.com/xgouchet/AXML
De son exemple, c'est ce que je fais
la source
apkanalyzer sera utile
publication originale https://stackoverflow.com/a/51905063/1383521
la source