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目录下来生效。如:
本文来自博客园,作者:小汀,转载请注明原文链接:https://www.cnblogs.com/1118zjg/p/16009904.html