Diese Datei scheint in einem binären XML-Format zu sein. Was ist dieses Format und wie kann es programmgesteuert analysiert werden (im Gegensatz zur Verwendung des aapt-Dump-Tools im SDK)?
Dieses Binärformat wird in der Dokumentation hier nicht behandelt .
Hinweis : Ich möchte von außerhalb der Android-Umgebung auf diese Informationen zugreifen, vorzugsweise von Java aus.
android
android-manifest
jnorris
quelle
quelle
android.content.pm.PackageManager.queryXX
Methoden abgefragt werden (Dokumente: developer.android.com/reference/android/content/pm/… ).Antworten:
Verwenden Sie android-apktool
Es gibt eine Anwendung, die APK-Dateien liest und XMLs in nahezu ursprüngliche Form dekodiert.
Verwendung:
Überprüfen Sie android-apktool für weitere Informationen
quelle
apktool d Gmail.apk && cat Gmail/AndroidManifest.xml
minSdkVersion
und andere Versionsparameter finden Sie auch inGmail/apktool.yml
Diese Java-Methode, die auf Android ausgeführt wird, dokumentiert (was ich interpretieren konnte) das Binärformat der Datei AndroidManifest.xml im APK-Paket. Das zweite Codefeld zeigt, wie decompressXML aufgerufen und das Byte [] aus der App-Paketdatei auf dem Gerät geladen wird. (Es gibt Felder, deren Zweck ich nicht verstehe. Wenn Sie wissen, was sie bedeuten, sagen Sie mir, ich werde die Informationen aktualisieren.)
Diese Methode liest das AndroidManifest zur Verarbeitung in ein Byte []:
Die meisten Apps sind in / system / app gespeichert, das ohne root my Evo lesbar ist, andere Apps befinden sich in / data / app, für deren Anzeige ich root benötigte. Das obige 'Pfad'-Argument wäre ungefähr so: "/system/app/Weather.apk"
quelle
Was ist mit der Verwendung des Android Asset Packaging Tool (aapt) aus dem Android SDK in einem Python-Skript (oder was auch immer)?
Über aapt ( http://elinux.org/Android_aapt ) können Sie tatsächlich Informationen über das APK- Paket und dessen AndroidManifest.xml- Datei abrufen . Insbesondere können Sie die Werte einzelner Elemente eines APK- Pakets über den Unterbefehl 'dump' extrahieren . Beispielsweise können Sie die Benutzerberechtigungen in der Datei AndroidManifest.xml in einem APK- Paket folgendermaßen extrahieren :
Wobei package.apk Ihr .apk- Paket ist.
Darüber hinaus können Sie den Unix-Pipe-Befehl verwenden, um die Ausgabe zu löschen. Beispielsweise:
Hier ein Python-Skript, das dazu programmgesteuert:
Auf ähnliche Weise können Sie andere Informationen (z. B. Paket , App-Name usw.) der AndroidManifest.xml extrahieren :
Wenn Sie stattdessen den gesamten XML-Baum von AndroidManifest analysieren möchten, können Sie dies auf ähnliche Weise mit dem Befehl xmltree tun :
Verwenden von Python wie zuvor:
quelle
Sie können das Tool axml2xml.pl verwenden, das vor einiger Zeit im android-random- Projekt entwickelt wurde. Es generiert die Textmanifestdatei (AndroidManifest.xml) aus der Binärdatei.
Ich sage " textuell " und nicht " original ", weil dieses wie viele Reverse-Engineering-Tools nicht perfekt ist und das Ergebnis nicht vollständig sein wird . Ich gehe davon aus, dass es entweder nie vollständig oder einfach nicht vorwärtskompatibel war (mit neuerem binären Codierungsschema). Unabhängig vom Grund kann das Tool axml2xml.pl nicht alle Attributwerte korrekt extrahieren. Solche Attribute sind minSdkVersion, targetSdkVersion und im Grunde alle Attribute, die auf Ressourcen verweisen (wie Zeichenfolgen, Symbole usw.), dh nur Klassennamen (von Aktivitäten, Diensten usw.) werden korrekt extrahiert.
Sie können diese fehlenden Informationen jedoch weiterhin finden, indem Sie das aapt- Tool in der ursprünglichen Android-App-Datei ( .apk ) ausführen :
quelle
Mit den neuesten SDK-Tools können Sie jetzt ein Tool namens apkanalyzer verwenden, um die AndroidManifest.xml eines APK (sowie andere Teile, z. B. Ressourcen) auszudrucken.
[android sdk]/tools/bin/apkanalyzer manifest print [app.apk]
apkanalyzer
quelle
Überprüfen Sie das folgende WPF-Projekt, das die Eigenschaften korrekt dekodiert.
quelle
apk- parser , https://github.com/caoqianli/apk-parser , ein leichtgewichtiges Gerät für Java ohne Abhängigkeit von aapt oder anderen Binärdateien, eignet sich zum Parsen von binären XML-Dateien und anderen apk-Infos.
quelle
Wenn Sie Python verwenden oder Androguard verwenden, übernimmt die Androguard Androaxml-Funktion diese Konvertierung für Sie. Die Funktion wird in diesem Blog-Beitrag ausführlich beschrieben. Zusätzliche Dokumentation finden Sie hier und Quelle hier .
Verwendung:
quelle
Für den Fall, dass es nützlich ist, hier eine C ++ - Version des von Ribo veröffentlichten Java-Snippets:
quelle
chars
wird durch new char [] zugewiesen, dann aber anstelle des korrekten freigegebendelete[] chars;
. Am Ende des decompressXML ctor muss es seinprt(" end at offset "+toIntString(off));
, sonst wird Zeigerarithmetik verwendet ...Als Referenz hier ist meine Version von Ribos Code. Der Hauptunterschied besteht darin, dass decompressXML () direkt einen String zurückgibt, was für meine Zwecke eine geeignetere Verwendung war.
HINWEIS: Mein einziger Zweck bei der Verwendung der Ribo-Lösung bestand darin, die veröffentlichte Version einer APK-Datei aus der Manifest-XML-Datei abzurufen, und ich bestätige, dass sie für diesen Zweck hervorragend funktioniert.
EDIT [2013.03.16]: Es funktioniert wunderbar IF die Version als Klartext festgelegt ist, aber wenn es Satz auf eine Ressource XML zu beziehen, wird es zeigt sich als ‚Ressourcen 0x1‘ zum Beispiel. In diesem speziellen Fall müssen Sie diese Lösung wahrscheinlich mit einer anderen Lösung koppeln, die die richtige Referenz für Zeichenfolgenressourcen abruft.
Hoffe, es kann auch anderen Menschen helfen.
quelle
In Android Studio 2.2 können Sie die apk direkt analysieren. Gehe zu Build-Analyse apk. Wählen Sie die apk aus, navigieren Sie zu androidmanifest.xml. Sie können die Details von androidmanifest sehen.
quelle
@ Mathieu Kotlin Version folgt:
Dies ist eine Kotlin-Version der obigen Antwort.
quelle
Ich fand, dass AXMLPrinter2, eine Java-App im Android4Me-Projekt, gut für die AndroidManifest.xml funktioniert, die ich hatte (und drucke das XML auf eine schön formatierte Weise aus). http://code.google.com/p/android4me/downloads/detail?name=AXMLPrinter2.jar
Ein Hinweis ... es (und der Code in dieser Antwort von Ribo) scheint nicht jede kompilierte XML-Datei zu verarbeiten, auf die ich gestoßen bin. Ich habe eine gefunden, in der die Zeichenfolgen mit einem Byte pro Zeichen gespeichert wurden, anstatt mit dem angenommenen Doppelbyte-Format.
quelle
es kann hilfreich sein
G ist meine Anwendungsklasse:
quelle
Ich arbeite seit über einem Jahr mit dem oben angegebenen Ribo-Code und er hat uns gute Dienste geleistet. Mit den letzten Updates (Gradle 3.x) war ich jedoch nicht mehr in der Lage, die Datei AndroidManifest.xml zu analysieren, ich bekam Fehler aus dem Index außerhalb der Grenzen und im Allgemeinen war es nicht mehr möglich, die Datei zu analysieren.
Update: Ich glaube jetzt, dass unser Problem beim Upgrade auf Gradle 3.x lag. Dieser Artikel beschreibt, wie AirWatch Probleme hatte und durch die Verwendung einer Gradle-Einstellung zur Verwendung von aapt anstelle von aapt2 behoben werden kann. AirWatch scheint mit dem Android Plugin für Gradle 3.0.0-beta1 nicht kompatibel zu sein
Beim Durchsuchen bin ich auf dieses Open-Source-Projekt gestoßen, das beibehalten wird, und ich konnte auf den Punkt kommen und sowohl meine alten APKs lesen, die ich zuvor analysieren konnte, als auch die neuen APKs, die die Logik von Ribo Ausnahmen auslöste
https://github.com/xgouchet/AXML
Nach seinem Beispiel ist es das, was ich tue
quelle
apkanalyzer wird hilfreich sein
Originalbeitrag https://stackoverflow.com/a/51905063/1383521
quelle