Android命令pm从哪里获取信息?

时间:2016-08-26 19:23:35

标签: android shell android-6.0-marshmallow

这是我关于StackOverflow的第一个问题,因为它与我原来的SE网站不同。

一些背景信息

在Android上,存在一个命令dir /b /s *COMPLETE*.PDF >Q:\"Personal Folders"\Advertising\"Data Updates"\ePrint\test.csv 。这是软件包管理器的简称,它可以对APK文件执行各种操作,例如安装和卸载应用程序,管理其权限以及根据各种标准列出已安装的软件包。

在我的项目中,一个shell脚本用于备份Android应用程序' APK文件,我非常依赖pm列出已安装的应用并获取其APK路径。简单地列出它们只需要大约一秒钟。但是,为了获得每条路径,每个应用程序花费一秒钟,在我看来,这太多了。

猜测

我最初怀疑像pm这样一个使用频繁的工具必须在我发布pm的任何时候从头开始重建整个软件包列表,所以我深入挖掘并找到一个文件似乎包含已安装的软件包的整个列表,包括系统和第三方。此文件位于 / data / system / 文件夹下,名为 packages.list (在CyanogenMod 13操作系统上找到的信息,由Android 6.0.1提供支持)。

该文件中的一行如下所示:

pm list packages

。我需要的部分,似乎是第一个和第四个字段,虽然第四个是应用程序数据的路径,而不是APK的路径。这可能表明我的猜测是错误的。

问题

我的问题是:它是否存在一个文件,当com.android.providers.telephony 1001 0 /data/data/com.android.providers.telephony platform 3002,3003,3001 程序加载有关包的信息时,用户是否希望查找它们?

由于索引超过100个应用程序只需要一秒钟,与查找程序包的位置(也占用一秒钟,但基于每个应用程序)相比,可能是路径是不知怎的"发现"在运行时,而不是从数据库中检索?

我无法找到此二进制文件的源代码。提前谢谢。

1 个答案:

答案 0 :(得分:0)

事实证明我猜错了 - 有问题的文件不是 /data/system/packages.list ,但 /data/system/packages.xml

在文件中的条目中,我能够找到我操作系统中安装的每个软件包及其APK路径。然后,我使用grep以下列方式过滤文件:

cat /data/system/packages.xml | grep "package name" > packages.txt

,它产生了一个伪XML文件,其中只包含与安装的软件包有关的字段。接下来,我继续创建实际的明文字典,使用以下过程:

IFS=$'\n'

packages="$(cat packages.txt)"
echo -n "$(cat /dev/null)" > packages.txt

for i on $packages; do
 package_name="${i//*package name=\"/}"
 package_name="${package_name//\"*/}"

 package_path="${i//*codePath=\"/}"
 package_path="${package_path//\"*/}"
 package_path="$package_path $(ls $package_path | grep "\.apk$")"

 echo "$package_name:$package_path" >> packages.txt
done

unset IFS packages i package_name package_path

。我将ls $package_path | grep "\.apk$"package_path的输出连接在一起的大胆之处在于,对于已安装的应用,应用的目录中只有一个APK文件,因此没有错误是可能的。

将此知识留在此处以供将来参考。