Android XML文件中权限的读取与生效

权限读取:

(SystemConfig.java 中)

readPermission()中readPermissionsFromXml() 解析xml读取所需权限到它的数组变量ArrayMap<String, PermissionEntry> mPermissions 并提供此变量的接口 getPermissions()

(PermissionManagerService.java 中)

getPermissions()将权限读到数组变量 ArrayMap<String, SystemConfig.PermissionEntry> permConfig 并对此变量循环使用 mSettings.putPermissionLocked(perm.name, bp) 添加新权限名单到对象

mSettings 的 mPermissions成员变量中 即( PermissionSettings.java 中的数组变量 ArrayMap<String, BasePermission> mPermissions )并在

(PermissionSettings.java 中)

getPermissionLocked(String permName)

【而PermissionManagerService中的SystemConfig的对象是获取的单例,所以PermissionManagerService的成员变量mSettings在初始化后与SystemConfig.java中的变量mPermissions单向保持同步】

 

权限生效

PMS 中permissionManager.updateAllPermissions(StorageManager.UUID_PRIVATE_INTERNAL, false);
↓调用
PermissionManagerService.java 中
updateAllPermissions(@Nullable String volumeUuid, boolean sdkUpdated, @NonNull PermissionCallback callback)
↓调用
updatePermissions(final @Nullable String changingPkgName, final @Nullable AndroidPackage changingPkg, final @Nullable String replaceVolumeUuid, @UpdatePermissionFlags int flags, final @Nullable PermissionCallback callback)
↓调用
restorePermissionState(@NonNull AndroidPackage pkg, boolean replace, @Nullable String packageOfInterest, @Nullable PermissionCallback callback)
↓调用
mSettings.getPermission(permissionName) 和 mSettings.getPermissionLocked(permName);获取SystemConfig.java 中从xml中读取的权限列表 【mSettings是PermissionSettings对象】

 

 

权限标签类型

/system/etc/permissions/platform.xml中出现的标签种类则较为多样,它们的含义分别是:

  • <group>:根据name获取gid
  • <permission >标签:把属性name所描述的权限赋予给<group>标签中属性gid所表示的用户组,一个权限可以有一个或多个group对象,当一个APK授权于这个这个权限时,它同时属于这几个组
  • <assign-permission>标签:把属性name所描述的权限赋予给uid属性所表示的用户
  • <split-permission>标签:一个权限可以扩展出一个新的权限
  • <library>标签:除framework中动态库以外的,所有系统会自动加载的动态库
  • <feature>标签:硬件支持的一些feature
  • <oem-permission>标签:oem厂商自己定义的一些权限
  • <privapp-permission>标签:来自system、vendor、product、system_ext的privapp权限分别存储,这是防止供应商分区中的xml授权于系统分区中的私有应用权限

最后将上面xml解析出来的数据做如下存储:

 

各类权限存储位置

  • <group>标签gid属性的值会存放在mGlobalGids数组中;
  • <permission>标签,解析得到的值会存放在mPermissions集合中;
  • <assign-permission>标签解析得到的值会存放在mSystemPermissions中;
  • <split-permission>存储在mSplitPermissions
  • <library>标签解析得到的值会存放在mSharedLibraries中;
  • <feature>存储在mAvaliableFeatures
  • <oem-permission>存储在mOemPermissions
  • <privapp-permission>会根据不同的存储路径,分别存储在mVendorPrivAppPermissions、mProductPrivAppPermissions、mSystemExtPrivAppPermissions、mPrivAppPermissions
  • <app-link> 存储在mLinkedApps

 

判断权限类型以及如何配置

/frameworks/base/core/res/AndroidManifest.xml 从这个文件中查询对应权限,判断是否需要动态申请,以及是否需要配置到手机xml中并放入etc/permissions目录下来生效。如:

posted @ 2022-03-15 19:09  小汀  阅读(595)  评论(0编辑  收藏  举报