Android 开发之系统 packages 文件解析

packages.xml && packages.list 全解析

Android 系统中保存 app 信息的两个配置文件,packages.xmlpackages.list,此两个文件的初始路径为:/data/system/packages.xml/data/system/packages.list。系统中所有安装的app的基本信息在这里都能体现出来。这里以Android 6.0为基础来分析, 不同的Android版本, 可能内容会稍有出入, 但是基本上是相同的。


1. packages.list

packages.list 文件位于 /data/system 目录下,该文件记录了系统中所有应用程序的基本信息,包含如下基本信息:

  • 应用包名。
    + 应用程序可以在其所在工程的 build.gradle 文件中:applicationId 来定义。
  • 应用运行过程中的 userId
    + 应用程序可以在其所在工程的 AndroidManifext.xml 里使用 android:sharedUserId 属性指定 UID, 在 app 安装的时候, 系统会给这个 app 自动分配一uid,以后app运行时, 就用这个 UID 运行。
  • 该应用是否处于 debugable 状态。
    + 应用程序可以在其所在工程的 AndroidManifext.xmlapplication 标签下使用属性 android:debuggable="true|false" 来指定。其中 true 在这里的体现是 1,false 的体现是 0,新建 Android Studio 工程时,这个默认为 false
  • 该应用的数据存放位置。
    + 默认一般都存放在 /data/data/$packageName/ 目录下。
    + 厂商预制的应用中,部分特殊的会申请其他的存储区域,比如原生的 SettingsProvider 程序,会因版本的不同,申请不同的存储区域和存储方式。
  • 该应用的 SE-Info 信息
  • 该应用的共享分组,如果一个app不属于任何group, 这里的值是None。

该文件的内容和格式相对简单,内容格式如下:

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

2. packages.xml

打开 packages.xml 文件,会发现这个文件非常的长,所以先列出这个文件的框架,以便对它有个整体的认知。

<?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 文件中主要的信息分为下面几个部分:

  • permission块: 里面包含了系统中所有定义的权限的信息
  • package块:里面包含了系统中所有安装的app的详细信息
  • shared-user块:里面包含了所有系统定义的shareuser的信息
  • keyset-settings块:里面包含了已安装app签名的public key信息

下面详细看下每块中的具体类容。

2.1 permissions

permissions块的类容如下:

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

它里面定义了系统中所有的申明的权限信息, 每个 item 块代表一个权限。name 表示权限的名字, package 表示申明权限的package, protection表示权限的级别, 如normal, dangerous之类的

2.2 keyset-settings

先看看keyset-settings块的内容:

<keyset-settings version="1">
    <keys>
        <public-key identifier="1" value="MIIBIjANBgkqhki..." />
        ...
    </keys>
    <keysets>
        <keyset identifier="1">
            <key-id identifier="1" />
        </keyset>
        ...
    </keysets>
    <lastIssuedKeyId value="9" />
    <lastIssuedKeySetId value="9" />
</keyset-settings>

另:

  • keyset-settings 块里收集了所有 app 签名的公钥信息, 和后面介绍的 package 块中的信息有关联。
  • keysets 块中包含了很多 keyset, 每个 keyset 都有一个编号用 identifier 表示, keyset 里包含的 key-id 里的 identifier 和上面 keys 中 public-key 的 identifier 的值相对应。
  • keys 块中 public-key 里的 value 值就是从 apk 包里的签名文件里提取出来的的公钥的值。
  • lastIssuedKeyId 和 lastIssuedKeySetId 表示的是最近一次取出来的公钥所属的 set 编号。

2.3 package

package 块内容如下:

<package name="com.tencent.qqmusictv" codePath="/data/app/qqmusictv" nativeLibraryPath="/data/app/qqmusictv/lib" primaryCpuAbi="armeabi" publicFlags="941112933" privateFlags="0" ft="15f00a383c8" it="15f00a383c8" ut="15f00a383c8" version="134" userId="10044">
    <sigs count="1">
        <cert index="6" key="30820247308201b0a003020..." />
    </sigs>
    <perms>
        <item name="android.permission.WRITE_SETTINGS" granted="true" flags="0" />
        ...
    </perms>
    <proper-signing-keyset identifier="7" />
</package>

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

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

2.4 shared-user

以 android.uid.system 为例。

<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.ACCESS_CACHE_FILESYSTEM" granted="true" flags="0" />
        ... ...
        <item name="android.permission.DELETE_PACKAGES" granted="true" flags="0" />
    </perms>
</shared-user>
  • name 表示这个 shared-user 的名字, userId表示这个user在系统中的编号, 具体可以查看 Process.java
  • sigs 和 package 块里的意思相同
  • perms 表示这个user所具有的权限。在开机扫描 apk 文件时, 它会将所有使用了相同 uid 的 app 的权限收集到一起, 然后放在这里。并且最后还会把这些权限再下发给那些使用了相同 uid 的 app。最后的结果就是, 系统中使用相同 uid 的 app, 它们具有一样的权限。

2.5 updated-package: 代表更新后的包信息。举个栗子:

  • 系统预装了一个 A 版本酷狗音乐, 该应用具备主动升级功能, 如果该应用迭代了新功能测试完成, 通过后发布, 该应用会进行一个更新, 更新后, 系统 /data/system/packages.xml 中便多出了一个关于酷狗音乐的 update-package 的标签, 该标签的内容, 反映了更新后的应用的基础信息。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容