Android Framework 包管理子系统(02)PackageManagerService关键文件解读

112 篇文章 83 订阅

该系列文章总纲链接:专题分纲目录 Android Framework 包管理子系统


本章关键点总结 & 说明:

导图是不断迭代的,这里主要关注➕ PkgMS关键文件部分即可。这里主要是对几个核心文件的各个标签进行解读和分析。

关于PkgMS,关键的文件比如:package.xml文件、packages.list文件、AndroidManifest文件的解析离不开文件构造的基础,本章节主要是对 这些文件进行解读。

1 package.xml文件解读

packages.xml里面记录了系统当中安装的APK的所有属性,权限等信息。当系统中的APK安装、删除、升级时,文件就会被更新

1.1 案例package.xml

1.2 标签解读

文件的模型如下所示:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<packages>
    <version ... />
    <version ... />

    <permissions>
        <item name="xxxS" package="xxx" protection="xx" />
        ... ...
    </permissions>

    <package xxx>
        ...
    </package>
    ...

    <shared-user xxx>
        ...
    </shared-user>
    ...

    <keyset-settings version="1">
        ...
    </keyset-settings>
</packages>

packages.xml文件信息分为下面几部分:

  1. permission块: 系统中所有定义的权限信息
  2. package块:系统中所有安装的app的详细信息
  3. shared-user块:所有系统定义的shareuser的信息
  4. keyset-settings块:已安装app签名的public key信息

1.2.1 permission标签解读

<permissions>
    ...
    <item name="android.permission.REMOTE_AUDIO_PLAYBACK" package="android" protection="2" />
    ...
</permissions>

permission标签 定义了系统中所有的申明的权限信息息:

  1. item 代表一个权限
  2. name 权限名字
  3. package 表示申明权限的package
  4. protection 表示权限级别

1.2.2 package标签解读

package块里包含了每个app的详细信息,具体说明如下:

  1. name :app的包名
  2. codePath :这个apk文件存放的位置,如果是系统app, 在system分区,否则在data分区
  3. nativeLibraryPath :app使用的.so库存放的位置,primaryCpuAbi表示app以哪种abi架构运行
  4. publicFlags和privateFlags:根据AndroidManifest.xml里的设置来生成
  5. 时间相关:ft表示apk文件上次被更改的时间,it表示app第一次安装的时间,ut表示app上次被更新时间
  6. version是app的版本号信息, <=等于=> AndroidManifest.xml里配置的android:versioncode
  7. userId是为app分配的user id (如果有使用shareUserId, 这里出现的就是SharedUserId)。
  8. sigs块里的count表示这个app有多少个签名信息,有的app可能会被多个证书签名。cert里的index表示这个app使用的证书的序号,当系统发现一个新的证书,这个号就会加1,key是app使用的证书内容的ascii码值。PKMS在扫apk文件过程中,如果发现它和之前扫描到的apk使用的是相同的签名证书,这里就只会有个index的值,并没有key的值。拥有相同的index的package, 表明它们使用的是相同的签名。
  9. perms:这个app拥有的权限, 对于一般的app,这些权限是在AndroidManifest.xml里写明的;那些使用了相同UID的app, 这里的权限就是所有使用相同UID的app申请的权限的总和。 granted表示这个权限是不是已经被允许。
  10. proper-signing-keyset里的identifier:上面说的keysets里identifier的值。用来标明这个app使用的是哪个公钥。

1.2.3 shared-user标签解读

<shared-user name="android.uid.system" userId="1000">
    <sigs count="1">
        <cert index="1" />
    </sigs>
	...
    <perms>
        <item name="android.permission.REAL_GET_TASKS"  granted="true" flags="0" />
        <item name="android.permission.DELETE_PACKAGES" granted="true" flags="0" />
		...
    </perms>
</shared-user>

这里以android.uid.system为例,解读该文件几个关键标签,如下所示:

  1. name:shared-user名字(可以是android.uid.*),userId表示这个user在系统中的编号
  2. sigs:同package标签
  3. perms:说明该user所具有的权限。在开机扫描apk文件时,将所有使用了相同uid的app的权限收集到一起,然后放在这里。后面会把这些权限再下发给那些使用了相同uid的app。即:系统中使用相同uid的app,它们具有一样的权限。

1.2.4 keyset-setting标签解读

<keyset-settings version="1">
    <keys>
        <public-key identifier="1" value="一串随机码..." />
        ...
    </keys>
    <keysets>
        <keyset identifier="1">
            <key-id identifier="1" />
        </keyset>
        ...
    </keysets>
    <lastIssuedKeyId value="9" />
    <lastIssuedKeySetId value="9" />
</keyset-settings>
  1. keyset-settings块里收集了所有app签名的公钥信息。
  2. keysets 包含 很多keyset。
  3. keyset 每个都有一个编号用identifier表示,keyset中的key-id中的identifier和上面keys中public-key的identifier的值相对应。同时keys块中public-key里的value值就是从apk包里的签名文件里提取出来的的公钥的值。
  4. lastIssuedKeyId和lastIssuedKeySetId表示的是最近一次取出来的公钥所属的set编号。

2 package.list文件解读

packages.list文件内容相对简单。打开packages.list文件后如下所示:

com.android.packageinstaller 10025 0 /data/data/com.android.packageinstaller platform 1028,3003,2001

这里用空格符分了6列,分别包含了app以下相关的信息,按列来分:

  1. 包名,也就是AndroidManifest.xml文件中的package=”xxx.xxx.xxx”设置的内容。
  2. userid, 如果没有在AndroidManifext.xml里使用android:sharedUserId属性指定UID, 在app安装时系统会给这个app自动分配一个uid,以后app运行时就用这个UID。
  3. 调试模式,由AndroidManifext.xml里android:debuggable指定。
  4. 数据存放路径,一般是”/data/data/${package_name}”这样的文件夹。
  5. seinfo信息,与SEAndroid机制相关。
  6. user group, 如果一个app不属于任何group, 这里的值是None。

3 AndroidManifest文件解读

这一部分之前本来想自己亲自写,后来发现,有一篇描述AndroidManifest文件 非常全面;可以直接参考,链接如下:

Android manifest之manifest标签详细介绍

转载链接源自:https://www.cnblogs.com/ttzm/p/7220975.html

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图王大胜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值