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 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中的内容就如同它的名字一样,是配置。它们最终是要添加到对应的相关数据中去。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python贝尔多项式

文章目录 Bell数和Bell多项式第二类Bell多项式 Bell数和Bell多项式 Bell&#xff0c;即所有包含 n n n个对象的有限集合的子集数之和&#xff0c;可通过递推式进行定义 B n ∑ k 0 n − 1 ( n − 1 k ) B k , B 0 1 B_n\sum^{n-1}_{k0}\begin{pmatrix} n-1\\k \end{pmatrix…

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

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

LabVIEW伺服阀性能参数测试

LabVIEW伺服阀性能参数测试 伺服阀作为电液伺服系统中的核心元件&#xff0c;其性能参数的准确测试对保证系统整体性能至关重要。开发了一种基于LabVIEW软件开发的伺服阀性能参数测试系统&#xff0c;提高测试的自动化程度和精确性&#xff0c;同时降低操作复杂度和成本。 传…

python + numpy test

1. 2. What is the correct syntax to output the type of a variable or object in Python? Syntax of the Python type() functionThe type() function 3. upper() 全大写 lower() 全小写 4. 接下来是Numpy部分 1. What is a correct syntax to check the number of di…

一条 SQL 查询语句是如何执行的

MySQL 的基本架构示意图 大体来说&#xff0c;MySQL 可以分为 Server 层和存储引擎层两部分 Server 层包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函数等…

YOLOv8算法改进【NO.101】引入最新的损失函数Focaler-IoU

前 言 YOLO算法改进系列出到这&#xff0c;很多朋友问改进如何选择是最佳的&#xff0c;下面我就根据个人多年的写作发文章以及指导发文章的经验来看&#xff0c;按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通&#xff1a; 第一…

VitePress-12-markdown中使用vue的语法

前言 VitePress 中&#xff0c;markdown文档最终都会转换成为 html文件&#xff0c;我们在访问的时候&#xff0c;也是直接访问的 xxx.html 文件。而且&#xff0c;markdown文档会被作为 [vue单文件] 进行处理&#xff0c;因此&#xff0c;我们我们可以在文档中使用 vue 语法&…

C#,雷卡曼数(Recamán Number)的算法与源代码

1 雷卡曼数&#xff08;Recamn Number&#xff09; 雷卡曼数&#xff08;Recamn Number&#xff09;&#xff0c;即Recaman序列被定义如下&#xff1a; (1) a[0]0; (2) 如果a[m-1]-m>0并且这个值在序列中不存在&#xff0c;则a[m]a[m-1]-m; (3) 否则a[m]a[m-1]m; 雷卡曼序…

c#安全-nativeAOT

文章目录 前记AOT测试反序列化Emit 前记 JIT\AOT JIT编译器&#xff08;Just-in-Time Complier&#xff09;,AOT编译器&#xff08;Ahead-of-Time Complier&#xff09;。 AOT测试 首先编译一段普通代码 using System; using System.Runtime.InteropServices; namespace co…

【Linux系统学习】5.Linux实用操作 下

7.虚拟机配置固定IP 7.1 为什么需要固定IP 当前我们虚拟机的Linux操作系统&#xff0c;其IP地址是通过DHCP服务获取的。 DHCP&#xff1a;动态获取IP地址&#xff0c;即每次重启设备后都会获取一次&#xff0c;可能导致IP地址频繁变更 原因1&#xff1a;办公电脑IP地址变化无所…

嵌入式学习之Linux入门篇笔记——12,Linux文件系统概念

配套视频学习链接&#xff1a;http://【【北京迅为】嵌入式学习之Linux入门篇】 https://www.bilibili.com/video/BV1M7411m7wT/?p4&share_sourcecopy_web&vd_sourcea0ef2c4953d33a9260910aaea45eaec8 1.什么是文件系统&#xff1f; 操作系统中负责管理和存储文件系统…

飞天使-linux操作的一些技巧与知识点9-zabbix6.0 容器之纸飞机告警设置

文章目录 zabbix 告警纸飞机方式webhook 方式 zabbix 告警纸飞机方式 第一种方式参考 https://blog.csdn.net/yetugeng/article/details/99682432bash-4.4$ cat telegram.sh #!/bin/bashMSG$1TOKEN"61231432278:AAsdfsdfsdfsdHUxBwPSINc2kfOGhVik" CHAT_ID-41dsdde…

|Python新手小白低级教程|第十九章:函数(1)

文章目录 前言一、概说二、方法def简介1.示例&#xff1a;使用def关键字制作功能函数——找最大最小2.代码剖析示例代码Part 1示例代码Part 2示例代码Part 3练习1.1制作函数 三、灵活使用函数1.制作一种函数&#xff0c;函数名和格式为even_num(a,b)&#xff0c;输入a&#xff…

VSTO打包Word插件WPS也支持

启动AdvancedInstallerPortable.exe打包软件 选择“加载项” 选择“office加载项”之后点“创建项目” 四、输入自已的插件名和公司名 任选一种包类型 五、选择包的保存位置 勾选“vsto office加载项” 六、选择要打包的项目debug文件夹 选择相应版本 配置相应环境 选择语言 添…

《雾锁王国》服务器怎么搭建,阿里云一键部署雾锁王国新手教程

上次讲了怎么搭建幻兽帕鲁服务器&#xff0c;今天讲讲如何搭建雾锁王国服务器&#xff0c;其实方法也非常简单&#xff0c;跟幻兽帕鲁一样&#xff0c;都是可以通过一键部署的方式来搭建的。 下面将会讲两种搭建《雾锁王国》服务器的方式&#xff0c;一种是你没有买过服务器&a…

苹果推出新型开源AI图像编辑模型“MGIE”;可汗学院辅助学习的GPT,Prompt 质量非常高

&#x1f989; AI新闻 &#x1f680; 苹果推出新型开源AI图像编辑模型“MGIE” 摘要&#xff1a;苹果公司最近发布了一个名为“MGIE”的开源人工智能模型&#xff0c;旨在通过自然语言指令对图片进行编辑。MGIE&#xff0c;全称MLLM-Guided Image Editing&#xff0c;依赖于多…

政安晨:示例演绎机器学习中(深度学习)神经网络的数学基础——快速理解核心概念(一){两篇文章讲清楚}

进入人工智能领域免不了与算法打交道&#xff0c;算法依托数学基础&#xff0c;很多小伙伴可能新生畏惧&#xff0c;不用怕&#xff0c;算法没那么难&#xff0c;也没那么玄乎&#xff0c;未来人工智能时代说不得人人都要了解算法、应用算法。 本文试图以一篇文章&#xff0c;…

【Leetcode】LCP 30. 魔塔游戏

文章目录 题目思路代码结果 题目 题目链接 小扣当前位于魔塔游戏第一层&#xff0c;共有 N 个房间&#xff0c;编号为 0 ~ N-1。每个房间的补血道具/怪物对于血量影响记于数组 nums&#xff0c;其中正数表示道具补血数值&#xff0c;即血量增加对应数值&#xff1b;负数表示怪…

Netty应用(四) 之 Reactor模型 零拷贝

目录 6.Reactor模型 6.1 单线程Reactor 6.2 主从多线程Reactor (主--->Boss | 从--->Worker | 一主多从机制) 7.扩展与补充 8.Reactor模型的实现 8.1 多线程Reactor模型的实现&#xff08;一个Boss线程&#xff0c;一个Worker线程&#xff09; 8.2 多线程Reactor模…

GEE数据——美国农业部LANDFIRE (LF)数据集2.3.0版本

地面火灾数据集 LANDFIRE (LF)&#xff0c;即 "地貌火灾和资源管理规划工具"&#xff0c;是美国农业部森林服务局、美国内政部地质调查局和大自然保护协会的野地火灾管理项目之间的共享项目。前言 – 人工智能教程 LANDFIRE (LF) 图层是利用基于大量实地参考数据、…