Как проанализировать файл AndroidManifest.xml внутри пакета .apk - PullRequest
165 голосов
/ 20 января 2010

Этот файл представлен в двоичном формате XML.Что это за формат и как его можно проанализировать программно (в отличие от использования инструмента aapt dump в SDK)?

Этот двоичный формат не обсуждается в документации здесь .

Примечание : я хочу получить доступ к этой информации из-за пределов среды Android, желательнос Java.

Ответы [ 15 ]

1 голос
/ 30 ноября 2016

В Android Studio 2.2 вы можете напрямую анализировать apk. Перейти к сборке - проанализировать apk. Выберите apk, перейдите к androidmanifest.xml. Вы можете увидеть детали androidmanifest.

0 голосов
/ 21 ноября 2018

apkanalyzer будет полезен

@echo off

::##############################################################################
::##
::##  apkanalyzer start up script for Windows
::##
::##  converted by ewwink
::##
::##############################################################################

::Attempt to set APP_HOME

SET SAVED=%cd%
SET APP_HOME=C:\android\sdk\tools
SET APP_NAME="apkanalyzer"

::Add default JVM options here. You can also use JAVA_OPTS and APKANALYZER_OPTS to pass JVM options to this script.
SET DEFAULT_JVM_OPTS=-Dcom.android.sdklib.toolsdir=%APP_HOME%

SET CLASSPATH=%APP_HOME%\lib\dvlib-26.0.0-dev.jar;%APP_HOME%\lib\util-2.2.1.jar;%APP_HOME%\lib\jimfs-1.1.jar;%APP_HOME%\lib\annotations-13.0.jar;%APP_HOME%\lib\ddmlib-26.0.0-dev.jar;%APP_HOME%\lib\repository-26.0.0-dev.jar;%APP_HOME%\lib\sdk-common-26.0.0-dev.jar;%APP_HOME%\lib\kotlin-stdlib-1.1.3-2.jar;%APP_HOME%\lib\protobuf-java-3.0.0.jar;%APP_HOME%\lib\apkanalyzer-cli.jar;%APP_HOME%\lib\gson-2.3.jar;%APP_HOME%\lib\httpcore-4.2.5.jar;%APP_HOME%\lib\dexlib2-2.2.1.jar;%APP_HOME%\lib\commons-compress-1.12.jar;%APP_HOME%\lib\generator.jar;%APP_HOME%\lib\error_prone_annotations-2.0.18.jar;%APP_HOME%\lib\commons-codec-1.6.jar;%APP_HOME%\lib\kxml2-2.3.0.jar;%APP_HOME%\lib\httpmime-4.1.jar;%APP_HOME%\lib\annotations-12.0.jar;%APP_HOME%\lib\bcpkix-jdk15on-1.56.jar;%APP_HOME%\lib\jsr305-3.0.0.jar;%APP_HOME%\lib\explainer.jar;%APP_HOME%\lib\builder-model-3.0.0-dev.jar;%APP_HOME%\lib\baksmali-2.2.1.jar;%APP_HOME%\lib\j2objc-annotations-1.1.jar;%APP_HOME%\lib\layoutlib-api-26.0.0-dev.jar;%APP_HOME%\lib\jcommander-1.64.jar;%APP_HOME%\lib\commons-logging-1.1.1.jar;%APP_HOME%\lib\annotations-26.0.0-dev.jar;%APP_HOME%\lib\builder-test-api-3.0.0-dev.jar;%APP_HOME%\lib\animal-sniffer-annotations-1.14.jar;%APP_HOME%\lib\bcprov-jdk15on-1.56.jar;%APP_HOME%\lib\httpclient-4.2.6.jar;%APP_HOME%\lib\common-26.0.0-dev.jar;%APP_HOME%\lib\jopt-simple-4.9.jar;%APP_HOME%\lib\sdklib-26.0.0-dev.jar;%APP_HOME%\lib\apkanalyzer.jar;%APP_HOME%\lib\shared.jar;%APP_HOME%\lib\binary-resources.jar;%APP_HOME%\lib\guava-22.0.jar

SET APP_ARGS=%*
::Collect all arguments for the java command, following the shell quoting and substitution rules
SET APKANALYZER_OPTS=%DEFAULT_JVM_OPTS% -classpath %CLASSPATH% com.android.tools.apk.analyzer.ApkAnalyzerCli %APP_ARGS%

::Determine the Java command to use to start the JVM.
SET JAVACMD="java"
where %JAVACMD% >nul 2>nul
if %errorlevel%==1 (
  echo ERROR: 'java' command could be found in your PATH.
  echo Please set the 'java' variable in your environment to match the
  echo location of your Java installation.
  echo.
  exit /b 0
)

:: execute apkanalyzer

%JAVACMD% %APKANALYZER_OPTS%

оригинальный пост https://stackoverflow.com/a/51905063/1383521

0 голосов
/ 06 декабря 2017

Я работаю с кодом Рибо, опубликованным выше, более года, и он нам хорошо послужил.Однако с последними обновлениями (Gradle 3.x) я больше не мог анализировать AndroidManifest.xml, я получал индекс из-за ошибок границ, и в целом он больше не мог анализировать файл.

Обновление: Теперь я считаю, что наши проблемы были связаны с обновлением до Gradle 3.x.В этой статье описывается, как в AirWatch возникали проблемы, и как их можно исправить с помощью параметра Gradle, чтобы использовать aapt вместо aapt2 AirWatch кажется несовместимым с плагином Android для Gradle 3.0.0-beta1

В поисках вокруг я наткнулся на этот проект с открытым исходным кодом, и он поддерживается, и я смог добраться до точки и прочитать как мои старые APK, которые я мог предварительно проанализировать, так и новые APK, которые по логике из Ribo выдавали исключения

https://github.com/xgouchet/AXML

Из его примера это то, что я делаю

  zf = new ZipFile(apkFile);

  //Getting the manifest
  ZipEntry entry = zf.getEntry("AndroidManifest.xml");
  InputStream is = zf.getInputStream(entry);

     // Read our manifest Document
     Document manifestDoc = new CompressedXmlParser().parseDOM(is);

     // Make sure we got a doc, and that it has children
     if (null != manifestDoc && manifestDoc.getChildNodes().getLength() > 0) {
        //
        Node firstNode = manifestDoc.getFirstChild();

        // Now get the attributes out of the node
        NamedNodeMap nodeMap = firstNode.getAttributes();

        // Finally to a point where we can read out our values
        versionName = nodeMap.getNamedItem("android:versionName").getNodeValue();
        versionCode = nodeMap.getNamedItem("android:versionCode").getNodeValue();
     }
0 голосов
/ 17 сентября 2017

это может быть полезно

public static int vCodeApk(String path) {
    PackageManager pm = G.context.getPackageManager();
    PackageInfo info = pm.getPackageArchiveInfo(path, 0);
    return info.versionCode;
    //        Toast.makeText(this, "VersionCode : " + info.versionCode + ", VersionName : " + info.versionName, Toast.LENGTH_LONG).show();
}

G - мой класс приложения:

public class G extends Application {
0 голосов
/ 14 февраля 2013

Я обнаружил, что AXMLPrinter2, Java-приложение в проекте Android4Me, отлично работает на имеющемся у меня AndroidManifest.xml (и выводит XML в хорошо отформатированном виде). http://code.google.com/p/android4me/downloads/detail?name=AXMLPrinter2.jar

Одна заметка ... она (и код этого ответа от Рибо), похоже, не обрабатывает каждый скомпилированный XML-файл, с которым я столкнулся. Я нашел один, где строки хранились с одним байтом на символ, а не двухбайтовым форматом, который он принимает.

...