Android SystemConfig相关

news2024/11/20 9:48:45

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 configuration
        final 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.coloradmin.cn/o/1442545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【动态规划】【C++算法】LeetCoce996正方形数组的数目

作者推荐 【动态规划】【前缀和】【C算法】LCP 57. 打地鼠 本文涉及知识点 动态规划汇总 LeetCoce996正方形数组的数目 给定一个非负整数数组 A&#xff0c;如果该数组每对相邻元素之和是一个完全平方数&#xff0c;则称这一数组为正方形数组。 返回 A 的正方形排列的数目…

从Socket中解析Http协议实现通信

在网络协议中&#xff0c;Socket是连接应用层和运输层的中间层&#xff0c;主要作用为了通信。Http协议是应用层上的封装协议。我们可以通过Http协议的规范解析Socket中数据&#xff0c;完成Http通信。 首先&#xff0c;我们先回顾一下Http协议的规范。主要复习一下&#xff0c…

电脑数据误删如何恢复?9 个Windows 数据恢复方案

无论您是由于软件或硬件故障、网络犯罪还是意外删除而丢失数据&#xff0c;数据丢失都会带来压力和令人不快。 如今的企业通常将其重要数据存储在云或硬盘上。但在执行其中任何一项操作之前&#xff0c;您很有可能会丢失数据。 数据丢失的主要原因是意外删除&#xff0c;任何…

Linux匿名管道

目录 1.原理 1.直接原理 2.本质原理 2.管道接口 3.管道中的四种情况 1.读写端正常&#xff0c;管道如果为空&#xff0c;读端就要堵塞 2.读写端正常&#xff0c;管道如果被写满&#xff0c;写端就要堵塞 3.读端正常&#xff0c;写端关闭&#xff0c;读端就会读到0&#…

Mysql Day03

多表设计 一对多 在多的一方添加外键约束&#xff0c;关联另外一方主键 一对一 任意一方添加外键约束&#xff0c;关联另外一方主键 多对多 建立第三张中间表&#xff0c;中间表至少包含两个外键&#xff0c;分别关联两方主键 idstu_idcourse_id 1 11 2 12313421524 案…

机器学习系列6-逻辑回归

重点&#xff1a; 1.逻辑回归模型会生成概率。 2. 对数损失是逻辑回归的损失函数。 3. 逻辑回归被许多从业者广泛使用。 # 1.逻辑回归&#xff1a;计算概率 **许多问题需要将概率估算值作为输出。逻辑回归是一种非常高的概率计算机制。** 实际上&#xff0c;您可以通过以下两种…

test222

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏&#xff1a;《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…

记:STM32F4参考手册-存储器和总线架构

STM32F4参考手册-存储器和总线架构 系统架构 主系统由32位多层AHB总线矩阵构成&#xff0c;可实现以下部分部分的互连&#xff1a; 八条主控总线&#xff1a; Cortex-M4F内核I总线、D总线和S总线 DMA1存储器总线 DMA2存储器总线 DMA2外设总线 以太网DMA总线 USB OTG HS DMA总线…

【Python中Selenium元素定位的各种方法】

1、元素定位操作&#xff1a; 2、创建浏览器驱动操作&#xff0c;导入By模块&#xff1a; from selenium import webdriver # 用于界面与浏览器互动 from selenium.webdriver.common.by import By # 用于元素定位 driver webdriver.Chrome() # 调用Chrome类&#xff0c;创…

【Java EE初阶十一】文件操作(IO)

1. 认识文件 所谓的文件是一个广义的概念&#xff0c;可以代表很多东西&#xff1b;在操作系统里面&#xff0c;会把很多的硬件设备和软件设备都抽象成“文件”&#xff0c;统一进行管理&#xff1b;但是大部分情况下&#xff0c;我们读到的文件&#xff0c;都是指硬盘的文件&a…

计算机网络第6章(应用层)

6.1、应用层概述 我们在浏览器的地址中输入某个网站的域名后&#xff0c;就可以访问该网站的内容&#xff0c;这个就是万维网WWW应用&#xff0c;其相关的应用层协议为超文本传送协议HTTP 用户在浏览器地址栏中输入的是“见名知意”的域名&#xff0c;而TCP/IP的网际层使用IP地…

如何让内网client通过公网地址访问内网server?

第一步&#xff0c;实现任意公网用户访问内网server。按教育网规矩&#xff0c;公网过来的流量要访问校内网的server必须从教育专线&#xff08;路由器接口G0/0/1)进入。 第二步&#xff0c;实现内网主机通过公网地址210.43.2.3能够访问内网server192.168.1.2&#xff0c;图中①…

动漫风博客介绍页面源码

动漫风博客介绍页面源码&#xff0c;HTML源码&#xff0c;图片背景有淡入切换特效 蓝奏云&#xff1a;https://wfr.lanzout.com/iIDZu1nrmjve

科研绘图-半小提琴图-

文章目录 前言1.软件安装-Origin 20222.绘制半小提琴图3.绘制径向条形图 前言 本文叙述记录的是一些科研绘图的实现方法&#xff0c;具体介绍从软件安装到实现图表绘制的详细过程。 1.软件安装-Origin 2022 Origin是一款具有丰富绘图功能的科研绘图软件&#xff0c;安装过程…

百卓Smart管理平台 uploadfile.php 文件上传漏洞(CVE-2024-0939)

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

基于opencv-python模板匹配的银行卡号识别(附源码)

目录 介绍 数字模板处理 银行卡图片处理 导入数字模板 模板匹配及结果 介绍 我们有若干个银行卡图片和一个数字模板图片&#xff0c;如下图 我们的目的就是通过对银行卡图片进行一系列图像操作使得我们可以用这个数字模板检测出银行卡号。 数字模板处理 首先我们先对数…

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(六)NodeJS入门——http模块

047_http模块_获取请求行和请求头 hello&#xff0c;大家好&#xff0c;那第二节我们来介绍一下如何在这个服务当中来提取 HTT 请求报文的相关内容。首先先说一下关于报文的提取的方法&#xff0c;我在这个文档当中都已经记录好了&#xff0c;方便大家后续做一个快速的查阅。 …

Python速成篇(基础语法)下(新年快乐♥)

引言 一天不学编程手就痒&#xff0c;今天是除夕&#xff0c;学C艹vector的话就没时间出去玩了&#xff0c;所以就写写博客。今天要讲的内容是关于&#xff0c;list&#xff08;列表&#xff09;&#xff0c;tuple&#xff08;元组&#xff09;&#xff0c;字典&#xff08;di…

C#,巴都万数列(Padonve Number)的算法与源代码

1 巴都万数列&#xff08;Padovan Sequence&#xff09; 巴都万数列&#xff08;Padovan Sequence&#xff09;是一个整数数列。 首数个值为1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37 ... 此数列以建筑师理察巴都万命名&#xff0c;他的论文Dom&#xff08;1994年&a…

Select 选择器 el-option 回显错误 value

离谱 回显的内容不是 label 而是 value 的值 返回官方看说明&#xff1a; v-model的值为当前被选中的el-option的 value 属性值 value / v-model 绑定值有3种类型 boolean / string / number 根据自身代码猜测是&#xff1a;tableData.bookId 与 item.id 类型不一致导致 &…