1、 packages.xml
存在 /data/system/
文件夹下,记录了系统中所有安装的应用信息,包括基本信息、签名和权限等信息。当系统中的APK安装、删除、升级时,文件就会被更新。当运行时权限选择授权时也会做权限的更新
packages.xml文件中主要的信息分为下面几个部分:
- permission块: 里面包含了系统中所有定义的权限的信息
- package块:里面包含了系统中所有安装的app的详细信息
- shared-user块:里面包含了所有系统定义的shareuser的信息
- keyset-settings块:里面包含了已安装app签名的public key信息
PackageManagerService调用Settings.java来做权限更新与持久化。
2、packages-backup.xml
听名字就知道,它是上一个文件的备份,存在 /data/system/
文件夹下,同样记录了系统中所有安装的应用信息,包括基本信息、签名和权限等信息。当系统中的APK安装、删除、升级时,文件就会被更新。当运行时权限选择授权时也会做权限的更新
3、default-permission.xml
default-permissions.xml
存在/system/etc/default-permissions/
文件夹下。Android开机后,除了根据上次开机的记录(runtime-permissions.xml)授予运行时权限外,一些系统重要的组件也需要提前授予运行时权限,最常见的时为系统重要功能的默认组件提前授予运行时权限,例如系统会为默认的浏览器提前授予位置相关的运行时权限。
提前授权的步骤分三步:
- 系统特权组件授权;
- 系统默认组件授权;
- 特定文件指定授权。
default-permission.xml 中的fixed表示授权后是否可以被非系统组件修改权限
//DefaultPermissionGrantPolicy.java负责默认权限授予工作
public void grantDefaultPermissions(int userId) {
DelayingPackageManagerCache pm = new DelayingPackageManagerCache();
grantPermissionsToSysComponentsAndPrivApps(pm, userId);
grantDefaultSystemHandlerPermissions(pm, userId);
grantDefaultPermissionExceptions(pm, userId);
// Apply delayed state
pm.apply();
}
4、 runtime-permission.xml
runtime-permission.xml
存在/data/misc_de/0/apexdata/com.android.permission/
文件夹下,会记录APP运行时所有的权限配置,运行时权限含有危险权限,此类权限授予应用对受限数据的额外访问权限,或允许应用执行对系统和其他应用具有更严重影响的受限操作。因此,需要先在应用中请求运行时权限,然后才能访问受限数据或执行受限操作。请勿假定这些权限之前已经授予过,务必仔细检查,并根据需要在每次访问之前请求这些权限。系统会为某些运行时权限分配 dangerous 保护级别。
底层是通过RuntimePermissionsPersistenceImpl调用Settings来实现运行时权限授权更新的。
5、appops.xml
通过AppOpsService来做权限持久化