Этот файл представлен в двоичном формате XML. Что это за формат и как его можно анализировать программно (в отличие от использования инструмента aapt dump в SDK)?
Этот двоичный формат не обсуждается в документации здесь .
Примечание . Я хочу получить доступ к этой информации из-за пределов среды Android, предпочтительно из Java.
android
android-manifest
jnorris
источник
источник
android.content.pm.PackageManager.queryXX
методов (docs: developer.android.com/reference/android/content/pm/… ).Ответы:
Используйте Android-apktool
Есть приложение, которое читает файлы apk и декодирует XML-файлы в почти оригинальную форму.
Использование:
Проверьте Android-apktool для получения дополнительной информации
источник
apktool d Gmail.apk && cat Gmail/AndroidManifest.xml
minSdkVersion
и другие параметры версии также можно найти вGmail/apktool.yml
Этот Java-метод, который работает на Android, документирует (о чем я смог интерпретировать) двоичный формат файла AndroidManifest.xml в пакете .apk. Во втором блоке кода показано, как вызвать depressXML и как загрузить byte [] из файла пакета приложения на устройстве. (Есть поля, назначение которых я не понимаю, если вы знаете, что они значат, скажите мне, я обновлю информацию.)
Этот метод считывает AndroidManifest в байт [] для обработки:
Большинство приложений хранятся в / system / app, который доступен для чтения без root моего Evo, другие приложения находятся в / data / app, и мне нужен был root для просмотра. Приведенный выше аргумент 'path' будет выглядеть примерно так: "/system/app/Weather.apk"
источник
Как насчет использования Инструмента упаковки активов Android (aapt) из Android SDK в сценарий Python (или любой другой)?
Действительно, через aapt ( http://elinux.org/Android_aapt ) вы можете получить информацию о пакете .apk и его файле AndroidManifest.xml . В частности, вы можете извлечь значения отдельных элементов пакета .apk с помощью подкоманды dump . Например, вы можете извлечь пользовательские разрешения в файле AndroidManifest.xml внутри пакета .apk следующим образом:
Где package.apk - это ваш пакет .apk .
Кроме того, вы можете использовать команду канала Unix, чтобы очистить вывод. Например:
Вот скрипт Python, который программно для этого:
Аналогичным образом вы можете извлечь другую информацию (например, пакет , имя приложения и т. Д.) Из AndroidManifest.xml :
Если вместо этого вы хотите проанализировать все дерево XML AndroidManifest, вы можете сделать это аналогичным образом, используя команду xmltree :
Использование Python, как и раньше:
источник
Вы можете использовать инструмент axml2xml.pl , разработанный некоторое время назад в рамках проекта android-random . Он сгенерирует файл текстового манифеста (AndroidManifest.xml) из двоичного файла.
Я говорю « текстовый », а не « оригинальный », потому что, как и многие инструменты реинжиниринга, этот не идеален, и результат не будет полным . Я предполагаю, что он никогда не был полным или просто несовместимым (с более новой схемой двоичного кодирования). Независимо от причины, инструмент axml2xml.pl не сможет правильно извлечь все значения атрибутов. Такими атрибутами являются minSdkVersion, targetSdkVersion и в основном все атрибуты, которые ссылаются на ресурсы (например, строки, значки и т. Д.), Т. Е. Правильно извлекаются только имена классов (действий, служб и т. Д.).
Однако вы все еще можете найти эту недостающую информацию, запустив инструмент aapt в исходном файле приложения Android ( .apk ):
источник
С последними SDK-Tools вы можете теперь использовать инструмент под названием apkanalyzer для распечатки AndroidManifest.xml APK (а также других частей, таких как ресурсы).
[android sdk]/tools/bin/apkanalyzer manifest print [app.apk]
apkanalyzer
источник
Проверьте этот следующий проект WPF, который правильно декодирует свойства.
источник
apk-parser, https://github.com/caoqianli/apk-parser , облегченный impl для java, без зависимости для aapt или других binarys, подходит для разбора двоичных xml-файлов и другой информации apk.
источник
Если вы используете Python или используете Androguard , функция Androguard Androaxml сделает это преобразование за вас. Эта функция подробно описана в этом блоге , с дополнительной документацией здесь и источником здесь .
Использование:
источник
В случае, если это полезно, вот C ++-версия фрагмента Java, опубликованного Ribo:
источник
chars
выделяется новым char [], но затем free'd вместо правильногоdelete[] chars;
. В конце декомпрессионного XML-кода это должно бытьprt(" end at offset "+toIntString(off));
, в противном случае используется арифметика указателя ...для справки - моя версия кода Рибо. Основное отличие состоит в том, что метод deppressXML () напрямую возвращает строку, которая для моих целей была более подходящей.
ПРИМЕЧАНИЕ: моей единственной целью при использовании решения Ribo было получение опубликованной версии файла .APK из XML-файла Manifest, и я подтверждаю, что для этой цели он прекрасно работает.
РЕДАКТИРОВАТЬ [2013-03-16]: Он прекрасно работает, если версия установлена в виде простого текста, но если она настроена для ссылки на Resource XML, она будет отображаться, например, как «Resource 0x1». В этом конкретном случае вам, вероятно, придется связать это решение с другим решением, которое будет извлекать правильную ссылку на строковый ресурс.
Надеюсь, что это может помочь и другим людям.
источник
В Android Studio 2.2 вы можете напрямую анализировать apk. Перейти к сборке - проанализировать apk. Выберите apk, перейдите к androidmanifest.xml. Вы можете увидеть детали androidmanifest.
источник
@ Матье Котлин версия следует:
Это котлин версия ответа выше.
источник
Я обнаружил, что AXMLPrinter2, Java-приложение в проекте Android4Me, отлично работает на имеющемся у меня AndroidManifest.xml (и выводит XML в хорошо отформатированном виде). http://code.google.com/p/android4me/downloads/detail?name=AXMLPrinter2.jar
Одно замечание ... он (и код этого ответа от Рибо), кажется, не обрабатывает каждый скомпилированный XML-файл, с которым я столкнулся. Я нашел один, где строки хранились с одним байтом на символ, а не двухбайтовым форматом, который он принимает.
источник
это может быть полезно
G мой класс приложения:
источник
Я работал с кодом Рибо, опубликованным выше, более года, и он нам хорошо послужил. Однако с последними обновлениями (Gradle 3.x) я больше не мог анализировать AndroidManifest.xml, я получал индекс из-за ошибок границ, и в целом он больше не мог анализировать файл.
Обновление: теперь я считаю, что наши проблемы были с обновлением до Gradle 3.x. В этой статье описывается, как у AirWatch возникали проблемы, и как их можно исправить с помощью настройки Gradle для использования aapt вместо aapt2. AirWatch кажется несовместимым с плагином Android для Gradle 3.0.0-бета1.
В поисках вокруг я наткнулся на этот проект с открытым исходным кодом, и он поддерживается, и я смог добраться до сути и прочитать как мои старые APK, которые я мог предварительно проанализировать, так и новые APK, которые по логике из Ribo выдавали исключения
https://github.com/xgouchet/AXML
Из его примера это то, что я делаю
источник
apkanalyzer будет полезен
оригинальный пост https://stackoverflow.com/a/51905063/1383521
источник