文件路径:/data/system/packages.xml
PKMS 扫描完目标文件后会创建该文件,当系统进行程序安装、卸载和更新等操作时,均会更新该文件。该文件保存了系统中与 Package 相关的一些信息。
这个文件非常大,大概框架
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<packages>
<version sdkVersion="xx" databaseVersion="xx" fingerprint="xxx" />
<version volumeUuid="xxx" sdkVersion="xx" databaseVersion="xx" fingerprint="xxx"/>
<permission-trees>
...
</permission-trees>
<permissions>
...
</permissions>
<package ...>
...
</package>
<updated-package ...>
...
</updated-package>
<shared-user ...>
...
</shared-user>
<keyset-settings ...>
...
</keyset-settings>
<permission>:包含系统所有定义的权限信息
<package>:包含系统所有安装的 app 的详细信息
<shared-user>:包含所有系统定义的 shareuser的信息
<keyset-setting>:包含已安装app 签名的 public key 信息
- <permission>
- name:包名
- package:申明权限的 package
- protection:表示权限的级别
<permissions>
<item name="android.permission.REAL_GET_TASKS" package="android" protection="18"/>
<item name="android.permission.SEND_RECEIVE_STK_INTENT" package="com.android.stk" protection="2"/>
...
</permission>
- <keyset-setting>
- <keysets>:包含很多<keyset>,每个<keyset>都有一个identifier标号,这个编号对应<keys>中<public-key>中的 identifier
- <keys>:<public-key>中的 value 就是从 apk 包中签名文件提取出来的公钥的值
- <lastIssuedKeyId>和<lastIssuedKeySetId>表示最近一次取出来的公钥所属的 set
<keyset-setting version="1">
<keys>
<public-key identifier="1" value="MIIBIDANBgkq..."
...
</keys>
<keysets>
<keyset identifier="1">
<key-id identifier="1"/>
</keyset/>
...
</keysets>
<lastIssuedKeyId value="58"/>
<lastIssuedKeySetId value="58"/>
</keyset-settings>
- <package>
- name:app 的包名
- codePath:表示这个 apk 文件存放的位置,如果是系统 app,存在 system 分区,第三方 app 存在 data 分区
- nativeLibraryPath:表示 app 使用的.so库存放的位置
- primatyCpuAbi表示app 以哪种 abi 架构运行
- publicFlags 和 privateFlags 根据AndroidManifest.xml中设置生成。android:multiarch
- ft:表示 apk 文件上次被更改时间,it 表示第一次安装时间,ut 表示上次被更新时间。oat 或者 app 重装后,ft 和 ut 可能会改变
- version 是 app 的版本好信息,即 AndroidManifest.xml配置的 android:versioncode
- userId 是为 app 分配的 user id,如使用 shareUserId,则出现 ShareUserId
- <sigs>块中的 count 表示 app 有多少个签名信息,有些 app 可能被多个证书签名。<cert>中的 inde 表示正式序号,若发现新的证书则序号加1,key 表示 app 使用的证书内容的 ascii 码值。PKMS 在扫描 apk 文件过程中,若发现其余之前扫描的 apk 使用相同的签名证书,则会有 inde 而无 key。拥有相同 index 的 package 表示使用相同的前面
<perms>块中是 app 拥有的权限。granted 表示这个权限是否被允许
<proper-signing-keyset>里的 identifier 即<keysets>中 identifier 的值,标明 app 使用哪个公钥
<package name="com.android.provider.telephony codePath="/system/priv-app/TelephonyProvider" nativeLibraryPath="/system/priv-app/TelephonyProvider/lib" primaryCpuAbi="armeabi" publicFlags="805846533" privateFlags="8" ft="11e8dc5d800" it="11e8dc5d800" ut="11e8dc5d800" version="23" sharedUserId="1001">
<sigs count="1">
<cert index="0" key="3082..."
</sigs>
<perms>
<item name="android.permission.SEND_RECEIVE_STK_INTENT" granted="true" flags="0"/>
...
</perms>
<proper-signing-keyset identifier="1" />
</package>
- <shared-user>
- name:包名
- <sigs>同<package>中
- <perms>表示 user 所具有的权限。在开机扫描 apk 文件时,会将所有使用相同 uid 的 app 的权限手机在一起,放到这里。最后将这些权限下发给使用相同 uid 的 app。因此系统中使用相同 uid 的 app 具有一样的权限
<shared-user name="android.uid.system" userId="1000">
<sigs count="1">
<cert index="0"/>
<sigs>
<perm>
<item name="android.permission.REAL_GET_TASK" granted="true" flags="0"/>
...
</perm>
</shared-user>
文件路径:/data/system/packages.list
描述系统中存在的所有非系统自带的 APK 信息,当这些程序有变动时,PKMS 就会更新该文件
打开这个文件,可以发现每一行都是相同排列的内容:
com.android.providers.telephony 1001 0 /data/data/com.android.providers.telephony platform 3002,3004,3009,3003,3001,1021,3005,1000,2002,1015,1023,1010,1007,3006
...
com.tencent.mm 10113 0 /data/data/com.tencent.mm default 3002,3003,3001
用空格区分:
{column0} {column1} {column2} {column3} {column4} {column5}
一共有6列:
column | value | desc |
---|---|---|
column0 | com.android.providers.telephony|com.tencent.mm | 是 app 的包名,即 AndroidManifest.xml文件中定义的package内容。 |
column1 | 1001|10113 | 是 app 使用的 userid,如果没在AndroidManifest.xml中使用 android:sharedUserId,则app 安装时,系统自动给 app 分配 uid,以后此 app 运行便以这 UID 运行。 |
column2 | 0|0 | 指 app 是否处于调式模式,AndroidManifest.xml中android:debuggable指定。一般不特地指定,像比如 android studio 直接 debug 运行 app,这里就是1了。 |
column3 | /data/data/com.android.providers.telephony|/data/data/com.tencent.mm | 指 app 的数据存放路径,一般是"/data/data${package_name}" |
column4 | platform| default | |
column5 | 3002,3004,3009,3003,3001,1021,3005,1000,2002,1015,1023,1010,1007,3006|3002,3003,3001 | app 所属于的user group,如果不属于任何 group 则为 none |