• 9.4 解析Packages.xml获取系统信息" level="2">9.4 解析Packages.xml获取系统信息

    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.4 解析Packages.xml获取系统信息 - 图1 图9.9 packages.xml文件

    通过ADB Pull命令将它导出到本地,如图9.10所示。

    9.4 解析Packages.xml获取系统信息 - 图2 图9.10 导出packages.xml文件

    打开packages.xml文件,信息量非常大,以至于让人眼花缭乱,无从下手,如图9.11所示。

    9.4 解析Packages.xml获取系统信息 - 图3 图9.11 packages.xml文件内容

    由于packages.xml文件非常复杂,所以先来了解一下这个文件所包含的信息点标签。

    • 标签

    permissions标签定义了目前系统中的所有权限,并分为两类:系统定义的(package属性为Android)和Apk定义的(package属性为Apk的包名),如下所示。

    1. <item name="android.permission.BROADCAST_CALLLOG_INFO" package="com.android.
    2.  
    3. server.telecom" protection="18" />
    4. <item name="android.permission.BIND_TV_INPUT" package="android" protection=
    5.  
    6. "18" />
    • 标签

    package标签代表了一个Apk的属性。

    1. <package name="com.example.android.lnotifications"
    2. codePath="/data/app/com.example.android.lnotifications-1"
    3.  
    4. nativeLibraryPath="/data/app/com.example.android.lnotifications-1/lib"
    5. flags="572998" ft="14a00552a08" it="14a00552d3c"
    6. ut="14a00552d3c" version="1" userId="10059">
    7. <sigs count="1">
    8. <cert index="3" />
    9. </sigs>
    10. <perms>
    11. <item name="android.permission.READ_CONTACTS" />
    12. <item name="android.permission.READ_CALL_LOG" />
    13. </perms>
    14. <proper-signing-keyset identifier="54" />
    15. <signing-keyset identifier="54" />
    16. </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文件来获取很多有价值的信息。