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.rhkb.cn/news/256311.html

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

相关文章

计算机网络——网络安全

计算机网络——网络安全 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c; [跳转到网站](https://www.captainbed.cn/qianqiu) 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 网络安全何…

PyTorch深度学习实战(26)——多对象实例分割

PyTorch深度学习实战&#xff08;26&#xff09;——多对象实例分割 0. 前言1. 获取并准备数据2. 使用 Detectron2 训练实例分割模型3. 对新图像进行推断小结系列链接 0. 前言 我们已经学习了多种图像分割算法&#xff0c;在本节中&#xff0c;我们将学习如何使用 Detectron2 …

单页404源码

<!doctype html> <html> <head> <meta charset"utf-8"> <title>简约 404错误页</title><link rel"shortcut icon" href"./favicon.png"><style> import url("https://fonts.googleapis.co…

C# 字体大小的相关问题

设置字体大小无法这么写&#xff0c; button1.Font.Size 20&#xff1b; 这个是只读属性&#xff1b; 把字体大小改为16&#xff0c; button2.Font new Font(button2.Font.Name, 16); 程序运行的时候先看一下窗体和控件的默认字体尺寸&#xff0c;都是9&#xff1b;然后点b…

jsp教务管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 教务管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

人脸追踪案例及机器学习认识

1.人脸追踪机器人初制 用程序控制舵机运动的方法与机械臂项目完全相同。 由于摄像头的安装方式为上下倒转安装&#xff0c;我们在编写程序读取图像时需使用 flip 函数将 图像上下翻转。 现在&#xff0c;只需要使用哈尔特征检测得到人脸在图像中的位置&#xff0c;再指示舵机运…

Docker容器输入汉字触发自动补全

一、描述 输入汉字自动触发补全&#xff1a; Display all 952 possibilities? (y or n)是因为容器中没有中文字符集和中文字体导致的&#xff0c;安装中文字体&#xff0c;并设置字符集即可。 二、解决 1、安装字符集 &#xff08;1&#xff09;查看系统支持的字符集 lo…

使用Cargo创建、编译与运行Rust项目

在 Rust 开发中&#xff0c;Cargo 是一个非常重要的工具&#xff0c;它负责项目的构建、管理和依赖管理。以下是如何使用 Cargo 创建、编译和运行 Rust 项目的详细步骤。 1. 创建新项目 首先确保你已经在计算机上安装了 Rust 和 Cargo。然后&#xff0c;在命令行中输入以下命…

HarmonyOS 横屏调试与真机横屏运行

我们有些程序 需要横屏才能执行出效果 我们在预览器上 点击如下图指向出 就进入一个横屏调试了 但 我们真机运行 依旧是竖着的 我们如下图 找到 module.json5 在 abilities 下面 第一个对象 最下面 加上 "orientation": "landscape"然后 我们再真机运…

【深度学习】基于多层感知机的手写数字识别

案例2&#xff1a;构建自己的多层感知机: MNIST手写数字识别 相关知识点: numpy科学计算包&#xff0c;如向量化操作&#xff0c;广播机制等 1 任务目标 1.1 数据集简介 ​ MNIST手写数字识别数据集是图像分类领域最常用的数据集之一&#xff0c;它包含60,000张训练图片&am…

算法沉淀——位运算(leetcode真题剖析)

算法沉淀——位运算 常用位运算总结1.基础位运算2.确定一个数中第x位是0还是13.将一个数的第x位改成14.将一个数的第x位改成05.位图6.提取一个数最右边的17.删掉一个数最右边的18.异或运算9.基础例题 力扣题目讲解01.面试题 01.01. 判定字符是否唯一02.丢失的数字03.两整数之和…

opencv mat用法赋值克隆的操作和一些基本属性

//Mat基本结构 (头部 数据部分) //赋值的话 就是修改了指针位置 但还是指向了原来数据 并没创建数据 本质上并没有变 //只有克隆或者拷贝时 它才会真正复制一份数据 //代码实现 //创建方法 - 克隆 //Mat m1 src.clone(); //复制 //Mat m2; //src.copyTo(m2); //赋值法 …

Git的基础操作指令

目录 1 前言 2 指令 2.1 git init 2.2 touch xxx 2.3 git status 2.4 git add xxx 2.5 git commit -m xxxx 2.5 git log及git log --prettyoneline --all --graph --abbrev-commit 2.6 rm xxx 2.7 git reset --hard xxx(含小技巧) 2.8 git reflog 2.9 mv xxx yyy 1…

Verilog刷题笔记30

题目&#xff1a; You are provided with a BCD one-digit adder named bcd_fadd that adds two BCD digits and carry-in, and produces a sum and carry-out. 解题&#xff1a; module top_module( input [399:0] a, b,input cin,output cout,output [399:0] sum );reg [99…

Stream流学习笔记

Stream流 创建流中间操作1、filter2、map3、distinct4、sorted5、limit6、skip7、flatMap 终结操作1、forEach2、count3、max&min4、collect5、查找与匹配 创建流 单例集合&#xff1a;集合对象.stream() List<Integer> list new ArrayList<>(); Stream<…

海外云手机——平台引流的重要媒介

随着互联网的飞速发展&#xff0c;跨境电商、短视频引流以及游戏行业等领域正经历着迅猛的更新换代。在这个信息爆炸的时代&#xff0c;流量成为至关重要的资源&#xff0c;而其中引流环节更是关乎业务成功的关键。海外云手机崭露头角&#xff0c;成为这一传播过程中的重要媒介…

jsp课程教学管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 课程教学管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

Codeforces Round 923 (Div. 3) E. Klever Permutation (Java)

比赛链接&#xff1a;Round 923 (Div. 3) EE题传送门&#xff1a;E. Klever Permutation 题目&#xff1a;E. Klever Permutation 样例 #1 样例输入 #1 5 2 2 3 2 10 4 13 4 7 4样例输出 #1 2 1 1 3 2 1 8 4 10 2 7 5 9 3 6 4 10 1 13 5 9 2 12 6 8 3 11 7 1 6 3 7 2 5 4分…

CSS 2D转换 3D动画 3D转换

目录 2D转换(transform): 移动translate: 旋转rotate: 缩放scale&#xff1a; CSS3动画&#xff08;transform&#xff09;&#xff1a; 动画常用的属性&#xff1a; 将长图片利用盒子实现动画的效果&#xff1a; 3D转换&#xff1a; 透视perspective&#xff1a; 旋转r…

蓝牙BLE学习-蓝牙广播

1.概念 什么叫做广播&#xff0c;顾名思义就像广场上的大喇叭一样&#xff0c;不停的向外传输着信号。不同的是&#xff0c;大喇叭传输的是音频信号&#xff0c;而蓝牙传输的是射频信号。 BLE使用的是无线电波传递信息&#xff0c;就是将数据编码&#xff0c;调制到射频信号中发…