Android SystemConfig相关

SystemConfig在哪里初始化

  它声明在PackageManagerService类的静态方法main()中。在该方法中间定义Injector类对象时,作为它的构造参数。它是调用的SystemConfig.getInstance()实现初始化,之后能通过Injector类对象的getSystemConfig()得到SystemConfig类对象。
  SystemConfig类对象的初始化,是在PackageManagerService的构造函数中调用的。

SystemConfig包含哪些内容

  SystemConfig中的内容是读取的/system/etc/sysconfig、/system/etc/permissions、/vendor/etc/sysconfig、/vendor/etc/permissions、/odm/etc/sysconfig、/odm/etc/permissions、/oem/etc/sysconfig、/oem/etc/permissions、/product/etc/sysconfig、/product/etc/permissions、/system_ext/etc/sysconfig、/system_ext/etc/permissions目录下的".xml"结尾的配置文件获取的;还有"/apex"目录下的子目录的etc/permissions目录下的".xml"结尾的配置文件;如果设置了"ro.boot.product.hardware.sku"系统属性值,还会读取/odm/etc/sysconfig/+属性值 、/odm/etc/permissions/+属性值 这两个对应目录下".xml"结尾的配置文件的值。
  它的内容很多,都在它的成员变量中。

成员变量

  mPermissions:包含一些权限的相关信息,主要是GID相关。
  mSystemPermissions:每个进程指定的权限
  mSplitPermissions:被分离权限的信息
  mGlobalGids:配置给所有包的全局组id
  mSharedLibraries:库相关信息
  mAvailableFeatures:特色的相关信息
  mUnavailableFeatures:不可用的特色的相关信息
  mAllowInPowerSaveExceptIdle:允许在省电模式下运行的应用,除去device idle模式
  mAllowInPowerSave:允许在省电模式下运行的应用,
  mAllowInDataUsageSave:在数据流量节省模式下可以在后台运行的应用
  mAllowUnthrottledLocation:在没有节流器的情况下允许运行后台位置
  mAllowIgnoreLocationSettings:即使应用的位置设置被关闭,也可以获取到位置。
  mAllowImplicitBroadcasts:隐式广播传递给APP在目标O+。
  mLinkedApps:这些应用处理域名验证默认用他们的网站
  mDefaultVrComponents:默认VR模式监听者服务的组件。
  mPackageComponentEnabledState:包中组件类的默认enabled状态。
  mBackupTransportWhitelist:被允许的备份端口service组件。
  mDisabledUntilUsedPreinstalledCarrierAssociatedApps:被禁止的运营商的包直到SIM插入获取运营商特权。
  mDisabledUntilUsedPreinstalledCarrierApps:被禁止直到可以使用的运营商应用的列表。
  mPrivAppPermissions:私有APP权限
  mVendorPrivAppPermissions:私有APP权限,是配置在"/odm"或者"/oem"目录中
  mProductPrivAppPermissions:私有APP权限,是配置在"/product"目录中
  mSystemExtPrivAppPermissions:私有APP权限,是配置在"/system_ext"目录中

  mPrivAppDenyPermissions:私有APP拒绝权限
  mVendorPrivAppDenyPermissions:私有APP拒绝权限,是配置在"/odm"或者"/oem"目录中
  mProductPrivAppDenyPermissions:私有APP拒绝权限,是配置在"/product"目录中
  mSystemExtPrivAppDenyPermissions:私有APP拒绝权限,是配置在"/system_ext"目录中

  mOemPermissions:OEM权限
  mHiddenApiPackageWhitelist:私有API的白名单应用包
  mAllowedAssociations:允许协作的应用。
  mAppDataIsolationWhitelistedApps:APP数据孤立白名单
  mBugreportWhitelistedPackages:Bug报告白名单
  mPackageToUserTypeWhitelist:应用可以安装的用户类型白名单
  mPackageToUserTypeBlacklist:应用可以安装的用户类型黑名单
  mNamedActors:系统预定义的唯一的命名的演员的名字和包名的映射
  mOverlayConfigSignaturePackage:覆盖配置签名的包
  mRollbackWhitelistedPackages:回退应用的白名单
  mWhitelistedStagedInstallers:缓存安装的包的白名单
  mModulesInstallerPackageName:模块安装者的包名
  mAllowedVendorApexes:apex包对应的安装者包

举例使用

  拿权限配置相关信息来举例。
  权限的相关信息,是在PermissionManagerService中的PermissionRegistry类型成员变量mRegistry中,mRegistry里面的信息主要来自配置文件"/data/system/packages.xml"文件。"/data/system/packages.xml"文件里"permissions"标签下有许多权限相关信息。
packages.xml文件权限截图

packages.xml文件权限相关截图

  这里主要配置的权限名称、包名还有保护等级这些内容。是不包括上面提到的GID相关信息的。
  系统是先读取的SystemConfig的相关文件获取信息,然后将信息添加到mRegistry中。后面再读取的"/data/system/packages.xml"文件,最后将两者合并得到对应权限信息。

先读取的SystemConfig的相关文件

  在SystemConfig初始化时,会读取相关文件,这里以"/system/etc/permissions/platform.xml"文件为例,得到权限信息。并且将它们放在SystemConfig对象的成员变量ArrayMap<String, PermissionEntry>类型mPermissions中。
platform.xml中权限信息截图

packages.xml文件权限相关截图

  mPermissions的值类型PermissionEntry有成员变量int[] gids,它对应着截图中的"group"标签,进程Uid组。这其中是字符类型,最后会转化成整数类型。并且放入int[] gids。PermissionEntry还有一个成员变量boolean类型 perUser。也是通过
packages.xml文件配置的,它会配置在"permission"标签中。
  SystemConfig对象初始化完毕之后,这些权限相关信息就在mPermissions中了。
  PermissionManagerService在初始化时,会想将SystemConfig对象的mPermissions中的权限信息加入PermissionManagerService类对象的成员变量mRegistry中。相关代码如下:

        // propagate permission configurationfinal ArrayMap<String, SystemConfig.PermissionEntry> permConfig =SystemConfig.getInstance().getPermissions();synchronized (mLock) {for (int i=0; i<permConfig.size(); i++) {final SystemConfig.PermissionEntry perm = permConfig.valueAt(i);Permission bp = mRegistry.getPermission(perm.name);if (bp == null) {bp = new Permission(perm.name, "android", Permission.TYPE_CONFIG);mRegistry.addPermission(bp);}if (perm.gids != null) {bp.setGids(perm.gids, perm.perUser);}}}

  它会将mPermissions中的PermissionEntry类型转变成Permission类型,并将类型设置为Permission.TYPE_CONFIG,代表它是可以配置的。并且将gids和perUser设置到Permission对象中。Permission对象会添加到mRegistry中。
  "/data/system/packages.xml"文件中的权限相关信息读取是在SystemConfig初始化之后。
  "/data/system/packages.xml"的信息读取是在Settings对象的初始化中。它的相关信息读取之后,会存出在Settings对象的成员变量LegacyPermissionSettings类型 mPermissions中,确切地说是在mPermissions的成员变量ArrayMap<String, LegacyPermission>类型mPermissions中。
  之后,PermissionManagerService会调用readLegacyPermissions(@NonNull LegacyPermissionSettings legacyPermissionSettings)将LegacyPermissionSettings类型 mPermissions中数据和SystemConfig中的权限信息合并。

    private void readLegacyPermissions(@NonNull LegacyPermissionSettings legacyPermissionSettings) {for (int readPermissionOrPermissionTree = 0; readPermissionOrPermissionTree < 2;readPermissionOrPermissionTree++) {final List<LegacyPermission> legacyPermissions = readPermissionOrPermissionTree == 0? legacyPermissionSettings.getPermissions(): legacyPermissionSettings.getPermissionTrees();synchronized (mLock) {final int legacyPermissionsSize = legacyPermissions.size();for (int i = 0; i < legacyPermissionsSize; i++) {final LegacyPermission legacyPermission = legacyPermissions.get(i);final Permission permission = new Permission(legacyPermission.getPermissionInfo(), legacyPermission.getType());if (readPermissionOrPermissionTree == 0) {// Config permissions are currently read in PermissionManagerService// constructor. The old behavior was to add other attributes to the config// permission in LegacyPermission.read(), so equivalently we can add the// GIDs to the new permissions here, since config permissions created in// PermissionManagerService constructor get only their names and GIDs there.final Permission configPermission = mRegistry.getPermission(permission.getName());if (configPermission != null&& configPermission.getType() == Permission.TYPE_CONFIG) {permission.setGids(configPermission.getRawGids(),configPermission.areGidsPerUser());}mRegistry.addPermission(permission);} else {mRegistry.addPermissionTree(permission);}}}}}

  可以看到循环2次,还有权限树的相关处理,权限树的相关信息也是来自"/data/system/packages.xml"文件。我们先说权限。参数legacyPermissionSettings.getPermissions()里面是从"/data/system/packages.xml"中读出来的权限信息,而mRegistry目前是从"/system/etc/permissions/platform.xml"读出来的。所以接下来就是处理两者之间的信息合并。并且重新添加到mRegistry中,这里是使用的addPermission方法,mRegistry中存储的是类似Map,相同名字的就直接覆盖了。

总结

  从以上可知,SystemConfig中的内容就如同它的名字一样,是配置。它们最终是要添加到对应的相关数据中去。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/463002.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索未来:集成存储器计算(IMC)与深度神经网络(DNN)的机遇与挑战

开篇部分&#xff1a;人工智能、深度神经网络与内存计算的交汇 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为科技领域的一股强大力量&#xff0c;而深度神经网络&#xff08;DNN&#xff09;则是AI的核心引擎之一。DNN是一种模仿人类神经系统运作…

【Spring】springmvc如何处理接受http请求

目录 ​编辑 1. 背景 2. web项目和非web项目 3. 环境准备 4. 分析链路 5. 总结 1. 背景 今天开了一篇文章“SpringMVC是如何将不同的Request路由到不同Controller中的&#xff1f;”&#xff1b;看完之后突然想到&#xff0c;在请求走到mvc 之前服务是怎么知道有请求进来…

【数据分享】1901~2022中国1km逐月潜在蒸散发数据集

大家新年好啊&#xff01;今天给大伙儿分享的是1901~2022中国1km逐月潜在蒸散发数据集&#xff0c;收藏一下&#xff0c;过完年再看&#xff01;当然了&#xff0c;如果有问题的朋友&#xff0c;可以添加俺微信交流。 1 数据简介 数据集为中国逐月潜在蒸散发&#xff0c;空间分…

机器学习系列——(二十二)结语

随着我们的机器学习系列的探索画上句号&#xff0c;我们不禁感慨于这一领域的广阔和深邃。从最初的基础概念到复杂的算法&#xff0c;从理论的探讨到实际应用的示例&#xff0c;我们一起经历了一段非凡的旅程。机器学习不仅是当前技术创新的核心驱动力之一&#xff0c;也是塑造…

第6章 智能租房——前期准备

学习目标 了解智能租房项目&#xff0c;能够说出项目中各模块包含的功能 熟悉智能租房项目的开发模式与运行机制&#xff0c;能够复述项目的开发模式与运行机制 掌握智能租房项目的创建&#xff0c;能够独立创建智能租房项目 掌握智能租房项目的配置&#xff0c;能够为智能租…

Leecode之环形链表进阶

一.题目及剖析 https://leetcode.cn/problems/linked-list-cycle-ii/description/ 这道题就是找到链表中环的入口 二.思路引入 假设起点到环的入口的距离为L, 环的长度为C, 入口到相遇点的距离为C - N 设定一个快慢指针,速度分别为2, 1 则有 (L kC - N) 2*(L C - N) 即…

python 爬虫篇(3)---->Beautiful Soup 网页解析库的使用(包含实例代码)

Beautiful Soup 网页解析库的使用 文章目录 Beautiful Soup 网页解析库的使用前言一、安装Beautiful Soup 和 lxml二、Beautiful Soup基本使用方法标签选择器1 .string --获取文本内容2 .name --获取标签本身名称3 .attrs[] --通过属性拿属性的值标准选择器find_all( name , at…

深入解析Linux中HTTP代理的工作原理

亲爱的Linux探险家们&#xff0c;准备好一起探索HTTP代理背后的神秘面纱了吗&#xff1f;在这个数字世界里&#xff0c;HTTP代理就像是一个神秘的中间人&#xff0c;默默地在你和互联网之间穿梭&#xff0c;为你传递信息。那么&#xff0c;这个神秘的中间人到底是如何工作的呢&…

SpringBoot源码解读与原理分析(二十)IOC容器的刷新(一)

文章目录 7 IOC容器的刷新7.1 初始化前的预处理7.1.1 初始化属性配置7.1.2 初始化早期事件的集合 7.2 初始化BeanFactory7.2.1 注解驱动的refreshBeanFactory7.2.2 XML驱动的refreshBeanFactory7.2.3 获取BeanFactory 7.3 BeanFactory的预处理配置7.3.1 ApplicationContextAwar…

sqli.labs靶场(54-65关)

54、第五十四关 提示尝试是十次后数据库就重置&#xff0c;那我们尝试union 原来是单引号闭合 id-1 union select 1,database(),(select group_concat(table_name) from information_schema.tables where table_schemadatabase()) -- 数据库&#xff1a;challenges&#xff0c…

【Maven】依赖、构建管理 继承与聚合 快速学习(3.6.3 )

文章目录 Maven是什么&#xff1f;一、Maven安装和配置本地配置文件设置idea配置本地maven 二、基于IDEA的Maven工程创建2.1 Maven工程GAVP属性2.2 Idea构建Maven JavaEE工程 三、Maven工程项目结构说明四、Maven核心功能依赖和构建管理4.1 依赖管理和配置4.2 依赖传递和冲突4.…

基于tomcat运行jenkins常见的报错处理

目录 1.jenkins.util.SystemProperties$Listener错误 升级jdk11可能遇到的坑 2.java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration 3.There were errors checking the update sites: UnknownHostException:updates.jenkins.i…