如何解析.apk包内的AndroidManifest.xml文件

11 浏览
0 Comments

如何解析.apk包内的AndroidManifest.xml文件

这个文件似乎是以二进制XML格式存储的。这种格式是什么并且如何以编程方式解析它(而不是使用SDK中的aapt dump工具)?

这种二进制格式在这里的文档中没有讨论。

注意:我希望从Android环境外部访问这些信息,最好使用Java。

0
0 Comments

使用android-apktool工具可以解析apk文件并将XML解码为几乎原始的形式。

使用方法如下:

apktool d Gmail.apk && cat Gmail/AndroidManifest.xml

android-apktool的更多信息请参考android-apktool

下面是一个展示其功能的片段:

apktool d Gmail.apk && cat Gmail/AndroidManifest.xml

minSdkVersion和其他版本参数也可以在Gmail/apktool.yml中找到。

如何在Android应用程序中使用这个工具?能否用它从InputStream中获取清单数据(例如: APK文件存在于zip文件中)?

0
0 Comments

如何解析.apk包中的AndroidManifest.xml文件

在Android中解析.apk包中的AndroidManifest.xml文件是一项常见的任务。这个文件包含了应用程序的基本信息,如应用程序的包名、权限、组件等等。然而,由于AndroidManifest.xml是以二进制格式存储的,因此要解析它并提取其中的信息并不是一件容易的事情。

下面是一个Java方法,它可以解析.apk包中的AndroidManifest.xml文件。这个方法使用了一些常量和辅助方法来处理二进制数据,并最终将解析后的结果输出到控制台。

这个方法首先读取.apk包中的AndroidManifest.xml文件到一个字节数组中,然后调用decompressXML方法来解析这个字节数组。decompressXML方法根据AndroidManifest.xml的二进制格式进行解析,并输出解析后的结果。

这个方法的关键部分是decompressXML方法,它使用了一些常量和辅助方法来解析二进制数据。该方法首先读取一些元数据,如字符串表的偏移量和字符串的数量等等。然后,它遍历二进制数据,解析XML标签和属性,并输出结果。

这个方法的实现还包括了一些辅助方法,如compXmlString和LEW等等。这些方法用于处理二进制数据,并将其转换为可读的字符串。

要使用这个方法,只需提供一个.apk文件的路径作为参数,然后调用getIntents方法即可。该方法将读取.apk文件中的AndroidManifest.xml文件,并解析其中的内容。

需要注意的是,这个方法的实现是基于AndroidManifest.xml文件的二进制格式,因此可能会受到Android版本的影响。如果AndroidManifest.xml文件的二进制格式发生了变化,那么这个方法可能无法正常工作。

总结起来,解析.apk包中的AndroidManifest.xml文件是一项常见的任务。通过使用上述方法,我们可以将二进制数据解析为可读的字符串,并从中提取所需的信息。然而,需要注意的是,这个方法可能会受到Android版本的影响,因此在使用时需要谨慎。

0
0 Comments

如何解析.apk包中的AndroidManifest.xml文件

在Android SDK中,可以使用Android Asset Packaging Tool(aapt)将.apk包中的AndroidManifest.xml文件解析为Python脚本。通过aapt,可以检索.apk包和其AndroidManifest.xml文件的信息。特别是,可以通过'dump'子命令提取.apk包中AndroidManifest.xml文件中各个元素的值。例如,可以通过以下方式提取.apk包中AndroidManifest.xml文件中的用户权限:

$ aapt dump permissions package.apk

此处,package.apk是您的.apk包。

此外,还可以使用Unix pipe命令清除输出。例如:

$ aapt dump permissions package.apk | sed 1d | awk '{ print $NF }'

这是一个Python脚本,以编程方式执行上述操作:

import os

import subprocess

#当前目录和文件名:

curpath = os.path.dirname( os.path.realpath(__file__) )

filepath = os.path.join(curpath, "package.apk")

#提取AndroidManifest.xml权限:

command = "aapt dump permissions " + filepath + " | sed 1d | awk '{ print $NF }'"

process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True)

permissions = process.communicate()[0]

print permissions

类似地,可以提取AndroidManifest.xml的其他信息(例如:package、app name等):

#提取APK包信息:

shellcommand = "aapt dump badging " + filepath

process = subprocess.Popen(shellcommand, stdout=subprocess.PIPE, stderr=None, shell=True)

apkInfo = process.communicate()[0].splitlines()

for info in apkInfo:

#包信息:

if string.find(info, "package:", 0) != -1:

print "App Package: " + findBetween(info, "name='", "'")

print "App Version: " + findBetween(info, "versionName='", "'")

continue

#应用程序名称:

if string.find(info, "application:", 0) != -1:

print "App Name: " + findBetween(info, "label='", "'")

continue

def findBetween(s, prefix, suffix):

try:

start = s.index(prefix) + len(prefix)

end = s.index(suffix, start)

return s[start:end]

except ValueError:

return ""

如果要解析整个AndroidManifest XML树,可以使用xmltree命令以类似的方式执行:

aapt dump xmltree package.apk AndroidManifest.xml

使用Python:

#提取AndroidManifest XML树:

shellcommand = "aapt dump xmltree " + filepath + " AndroidManifest.xml"

process = subprocess.Popen(shellcommand, stdout=subprocess.PIPE, stderr=None, shell=True)

xmlTree = process.communicate()[0]

print "Number of Activities: " + str(xmlTree.count("activity"))

print "Number of Services: " + str(xmlTree.count("service"))

print "Number of BroadcastReceivers: " + str(xmlTree.count("receiver"))

这个工具在Android Roms中始终存在吗?它是一个内置的工具吗?

这个工具一直存在于Android Roms中,而且通常是内置的。相比于apktool和AXMLPrinter2,aapt更为可靠和多功能。更不用说它是官方工具了。

0