9.4 解析Packages.xml获取系统信息" class="reference-link">9.4 解析Packages.xml获取系统信息
熟悉Android开机启动流程的读者应该知道,在系统初始化的时候,PackageManager的底层实现类PackageManagerService会去扫描系统中的一些特定的目录,并解析其中的Apk文件。同时,Android把它获得的应用信息,保存在XML文件中,做成一个应用的花名册,当系统中的Apk安装、删除、升级时,它也会被更新。这个小册子,就是位于/data/system/目录下 的——packages.xml文件,如图9.9所示。
图9.9 packages.xml文件
通过ADB Pull命令将它导出到本地,如图9.10所示。
图9.10 导出packages.xml文件
打开packages.xml文件,信息量非常大,以至于让人眼花缭乱,无从下手,如图9.11所示。
图9.11 packages.xml文件内容
由于packages.xml文件非常复杂,所以先来了解一下这个文件所包含的信息点标签。
标签
permissions标签定义了目前系统中的所有权限,并分为两类:系统定义的(package属性为Android)和Apk定义的(package属性为Apk的包名),如下所示。
- <item name="android.permission.BROADCAST_CALLLOG_INFO" package="com.android.
- server.telecom" protection="18" />
- <item name="android.permission.BIND_TV_INPUT" package="android" protection=
- "18" />
标签
package标签代表了一个Apk的属性。
- <package name="com.example.android.lnotifications"
- codePath="/data/app/com.example.android.lnotifications-1"
- nativeLibraryPath="/data/app/com.example.android.lnotifications-1/lib"
- flags="572998" ft="14a00552a08" it="14a00552d3c"
- ut="14a00552d3c" version="1" userId="10059">
- <sigs count="1">
- <cert index="3" />
- </sigs>
- <perms>
- <item name="android.permission.READ_CONTACTS" />
- <item name="android.permission.READ_CALL_LOG" />
- </perms>
- <proper-signing-keyset identifier="54" />
- <signing-keyset identifier="54" />
- </package>
其中各节点信息的含义如下所示。
name:Apk的包名。
codePath:Apk安装路径。主要有/system/app和/data/app两种。/system/app存放系统级别的Apk或者是厂商定制的Apk,/data/app存放用户安装的第三方Apk。
userId:用户ID。
version:版本号。
标签
对应Apk的AndroidManifest文件中的<uses-permission>标签,记录Apk的权限信息。
通过packages.xml文件中的这些标签,可以获取到很多手机内应用的信息,通常在进行系统层开发的时候,可以通过packages.xml文件来获取很多有价值的信息。
