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文件权限相关截图

这里主要配置的权限名称、包名还有保护等级这些内容。是不包括上面提到的GID相关信息的。

系统是先读取的SystemConfig的相关文件获取信息,然后将信息添加到mRegistry中。后面再读取的"/data/system/packages.xml"文件,最后将两者合并得到对应权限信息。

先读取的SystemConfig的相关文件

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

packages.xml文件权限相关截图

mPermissions的值类型PermissionEntry有成员变量int[] gids,它对应着截图中的"group"标签,进程Uid组。这其中是字符类型,最后会转化成整数类型。并且放入int[] gids。PermissionEntry还有一个成员变量boolean类型 perUser。也是通过

packages.xml文件配置的,它会配置在"permission"标签中。

SystemConfig对象初始化完毕之后,这些权限相关信息就在mPermissions中了。

PermissionManagerService在初始化时,会想将SystemConfig对象的mPermissions中的权限信息加入PermissionManagerService类对象的成员变量mRegistry中。相关代码如下:

java 复制代码
        // 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中的权限信息合并。

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

相关推荐
selt79112 小时前
Redisson之RedissonLock源码完全解析
android·java·javascript
Yao_YongChao13 小时前
Android MVI处理副作用(Side Effect)
android·mvi·mvi副作用
非凡ghost14 小时前
JRiver Media Center(媒体管理软件)
android·学习·智能手机·媒体·软件需求
席卷全城14 小时前
Android 推箱子实现(引流文章)
android
齊家治國平天下14 小时前
Android 14 系统中 Tombstone 深度分析与解决指南
android·crash·系统服务·tombstone·android 14
maycho12316 小时前
MATLAB环境下基于双向长短时记忆网络的时间序列预测探索
android
思成不止于此16 小时前
【MySQL 零基础入门】MySQL 函数精讲(二):日期函数与流程控制函数篇
android·数据库·笔记·sql·学习·mysql
brave_zhao17 小时前
达梦数据库(DM8)支持全文索引功能,但并不直接兼容 MySQL 的 FULLTEXT 索引语法
android·adb
sheji341617 小时前
【开题答辩全过程】以 基于Android的网上订餐系统为例,包含答辩的问题和答案
android
easyboot17 小时前
C#使用SqlSugar操作mysql数据库
android·sqlsugar