Comment analyser la AndroidManifest.xml fichier à l'intérieur d'un .package apk
Ce fichier semble être dans un format XML binaire. Qu'est-ce que ce format et comment peut-il être analysé par programme (par opposition à l'aide de la aapt outil de vidage dans le SDK)?
Ce format binaire n'est pas discuté dans la documentation ici.
Note: je veux accéder à ces informations à partir de l'extérieur de l'Android de l'environnement, de préférence à partir de Java.
- Qu'est-ce que le cas d'utilisation spécifiques, vous êtes après? Beaucoup de l'information manifeste dans votre propre application peut être interrogé à l'aide de
android.content.pm.PackageManager.queryXX
méthodes (docs: developer.android.com/reference/android/content/pm/...). - Je ne suis pas dans un environnement Android. Je veux lire un .apk fichier, extraire les AndroidManifest.xml et de l'analyser en tant que XML.
- J'ai développé un APK extractor qui ne dépend pas de AAPT. Il comprend un analyseur de ce qui peut analyser n'importe quel Android Binaire contenu XML- code.google.com/p/apk-extractor
Vous devez vous connecter pour publier un commentaire.
Utiliser android-apktool
Il existe une application qui lit les fichiers apk et décode les XMLs de forme proche de l'originale.
Utilisation:
Vérifier android-apktool pour plus d'informations
apktool d Gmail.apk && cat Gmail/AndroidManifest.xml
minSdkVersion
et d'autres version de paramètres peuvent également être trouvés dansGmail/apktool.yml
Cette méthode Java qui s'exécute sur un Android, des documents (ce que j'ai pu interpréter environ) le format binaire de l'AndroidManifest.xml fichier dans le .package apk. La deuxième boîte de code montre comment appeler decompressXML et comment charger le byte[] à partir de l'app package de fichier sur le périphérique. (Il y a des champs dont le but, je ne comprends pas, si vous savez ce qu'ils signifient, dites-moi, je vais mettre à jour l'info.)
Cette méthode lit la AndroidManifest dans un byte[] pour le traitement:
La plupart des applications sont stockées dans /system/app qui est lisible sans racine de mon Evo, d'autres applications sont dans /data/app que j'ai eu besoin de la racine de voir. Le 'chemin' argument ci-dessus serait quelque chose comme: "/system/app/Météo.apk"
Que sur l'utilisation de l' Android Asset Outil de Conditionnement (aapt), à partir de l'Android SDK, en Python (ou autre) script?
Par aapt (http://elinux.org/Android_aapt), en effet, vous pouvez récupérer des informations sur le .apk paquet et sur ses AndroidManifest.xml fichier. En particulier, vous pouvez extraire les valeurs des éléments individuels d'un .apk paquet par le biais du 'dump' sous-commande. Par exemple, vous pouvez extraire le l'utilisateur les autorisations dans le AndroidManifest.xml fichier à l'intérieur d'un .apk paquet de cette façon:
Où paquet.apk est votre .apk paquet.
En outre, vous pouvez utiliser l'Unix de tuyau de commande pour désactiver la sortie. Par exemple:
Ici un script Python pour de programme:
Une manière similaire, vous pouvez extraire d'autres informations (par exemple, paquet, nom de l'application, etc...) de la AndroidManifest.xml:
Si vous souhaitez analyser l'ensemble de la AndroidManifest arbre XML, vous pouvez le faire d'une manière similaire à l'aide de la xmltree commande:
À l'aide de Python comme avant:
Vous pouvez utiliser axml2xml.pl outil développé il y a un moment dans android-aléatoire projet. Il va générer le texte du fichier de manifeste (AndroidManifest.xml) à partir de binaires.
Je dis "textuelle" et non pas "original" parce que comme beaucoup de rétro-ingénierie d'outils de celui-ci n'est pas parfaite et le résultat ne être complet. Je présume que soit il n'a jamais été complète ou tout simplement pas compatible (avec les nouveaux binaires schéma de codage). Quelle que soit la raison, axml2xml.pl outil ne sera pas en mesure d'extraire toutes les valeurs d'attribut correctement. Ces attributs sont minSdkVersion, targetSdkVersion et, fondamentalement, tous les attributs que sont le référencement des ressources (comme les chaînes, les icônes, etc.), c'est à dire uniquement les noms de classe (d'activités, de services, etc.) sont extraites correctement.
Cependant, vous pouvez toujours trouver ces informations manquantes par l'exécution de aapt outil sur l'original de l'application Android fichier (.apk):
Cochez cette suite Projet WPF qui décode les propriétés correctement.
apk-analyseur, https://github.com/caoqianli/apk-parser, un léger impl pour java, avec aucune dépendance pour aapt ou d'autres binarys, est bon pour analyser binaire des fichiers xml, et d'autres apk infos.
Avec le dernier SDK-Outils, vous pouvez maintenant utiliser un outil appelé le apkanalyzer imprimer le AndroidManifest.xml de un APK (ainsi que d'autres parties, comme les ressources).
[android sdk]/tools/bin/apkanalyzer manifest print [app.apk]
apkanalyzer
Dans le cas où c'est utile, voici une version C++ de la Java extrait posté par Ribo:
chars
est alloué par new char[], mais ensuite libre avais, au lieu de le corrigerdelete[] chars;
. À la fin de la decompressXML ctor il doit êtreprt(" end at offset "+toIntString(off));
, sinon de l'arithmétique des pointeurs est utilisé...Si votre en Python ou de l'utilisation Androguard, le Androguard Androaxml fonction permettra de faire la conversion pour vous. La fonctionnalité est détaillée dans ce blog, avec d'autres la documentation ici et source ici.
Utilisation:
pour référence, voici ma version de la Ribo du code. La principale différence est que decompressXML() renvoie directement une Chaîne de caractères, qui pour ma part était plus approprié d'utilisation.
NOTE: mon seul but dans l'utilisation de Ribo la solution était d'aller chercher un .Fichier APK de la version publiée à partir du fichier Manifeste XML, et je confirme que, pour cet effet, il fonctionne à merveille.
MODIFIER [2013-03-16]: Il fonctionne à merveille SI la version est définie en tant que texte brut, mais si elle est définie pour faire référence à une Ressource XML, il va se montrer comme des "Ressources 0x1' par exemple. Dans ce cas, vous devrez probablement le couple de cette solution à une autre solution qui permettra d'aller chercher la bonne chaîne de référence de la ressource.
Espère que cela peut aider d'autres personnes aussi.
Dans Android studio 2.2 vous pouvez analyser directement l'apk. Goto construire - analyser apk. Sélectionnez l'apk, accédez à androidmanifest.xml. Vous pouvez voir les détails de androidmanifest.
J'ai trouvé le AXMLPrinter2, une application Java à la Android4Me projet de beaux travaux sur la AndroidManifest.xml que j'ai eu (et imprime le XML dans un bien formaté façon).
http://code.google.com/p/android4me/downloads/detail?name=AXMLPrinter2.jar
Une note.. (et le code sur cette réponse de Ribo) ne semble pas gérer tous les compilées fichier XML que je suis venu à travers. J'en ai trouvé un où les cordes ont été enregistrés avec un octet par caractère, plutôt que le double octet de format qu'elle suppose.
il peut être utile
G est ma classe d'Application :
J'ai été en cours d'exécution avec la Ribo code affiché ci-dessus pour plus d'un an, et il nous a bien servi. Avec les récentes mises à jour (Gradle 3.x) mais, je n'étais plus en mesure d'analyser les AndroidManifest.xml je commençais à l'indice hors limites erreurs, et en général, il n'était plus en mesure d'analyser le fichier.
Mise à jour: maintenant, je crois que nos questions a été mise à jour pour Gradle 3.x. Cet article décrit comment AirWatch a eu des problèmes et peut être fixé à l'aide d'un Gradle paramètre à utiliser aapt au lieu de aapt2 AirWatch semble être incompatible avec Android Plugin Gradle 3.0.0-beta1
Dans la recherche, je suis tombé sur ce projet open source, et il est maintenu et j'ai été en mesure de faire le point et de lire mes deux vieux Apk que j'ai pu précédemment analysé, et le nouveau Apk que la logique de Ribo a jeté les exceptions
https://github.com/xgouchet/AXML
De son exemple, c'est ce que je fais
apkanalyzer sera utile
post original https://stackoverflow.com/a/51905063/1383521