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

相关推荐
-SOLO-14 分钟前
备份apk 工具
android
私人珍藏库5 小时前
【Android】BotHub-多模型AI机器人聚合库-内置免费模型
android·人工智能·智能手机·app·工具·多功能
普马萨特5 小时前
Wi-Fi 扫描频率限制与 Android 演进全解析
android
张拭心6 小时前
Android 17 新特性:后台音频交互限制加强
android·前端
张拭心6 小时前
Android 17 新特性:ProfilingManager 新触发器
android·前端
张拭心6 小时前
Android 17 新特性:MessageQueue 无锁实现
android·前端
brycegao6 小时前
如何搭建标准化 Git 工具流,保障 Android 团队代码质量
android·ci/cd
AI科技星6 小时前
数术江湖·全卷合集 - 硬核江湖・数理史诗
android·人工智能·架构·概率论·学习方法
五月君_6 小时前
安卓也支持了!微信链接 Claude Code 保姆级教程
android·微信
柚鸥ASO优化6 小时前
一篇讲透安卓ASO!开发者千万别只盯着iOS了
android·ios·aso优化