设为首页 加入收藏

TOP

[Android][Framework]裁剪SystemServer服务以及关闭SystemFeature(四)
2019-08-31 00:05:23 】 浏览:92
Tags:Android Framework 裁剪 SystemServer 服务 以及 关闭 SystemFeature
rrayList<FeatureInfo> res = new ArrayList<>(mAvailableFeatures.values()); final FeatureInfo fi = new FeatureInfo(); fi.reqGlEsVersion = SystemProperties.getInt("ro.opengles.version", FeatureInfo.GL_ES_VERSION_UNDEFINED); res.add(fi); return new ParceledListSlice<>(res); } } @Override public boolean hasSystemFeature(String name, int version) { synchronized (mPackages) { final FeatureInfo feat = mAvailableFeatures.get(name); if (feat == null) { return false; } else { return feat.version >= version; } } }

这里的逻辑都是通过mAvailableFeatures得到所有的feature,查找该成员变量的相关代码

final ArrayMap<String, FeatureInfo> mAvailableFeatures;

SystemConfig systemConfig = SystemConfig.getInstance();
mGlobalGids = systemConfig.getGlobalGids();
mSystemPermissions = systemConfig.getSystemPermissions();
mAvailableFeatures = systemConfig.getAvailableFeatures();

了解到,首先获取一个SystemConfig的单例,然后通过getAvailableFeatures方法获取可用的feature。

SystemConfig.java

// These are the features this devices supports that were read from the
// system configuration files.
final ArrayMap<String, FeatureInfo> mAvailableFeatures = new ArrayMap<>();

public ArrayMap<String, FeatureInfo> getAvailableFeatures() {
    return mAvailableFeatures;
}

private void addFeature(String name, int version) {
    FeatureInfo fi = mAvailableFeatures.get(name);
    if (fi == null) {
        fi = new FeatureInfo();
        fi.name = name;
        fi.version = version;
        mAvailableFeatures.put(name, fi);
    } else {
        fi.version = Math.max(fi.version, version);
    }
}

private void removeFeature(String name) {
    if (mAvailableFeatures.remove(name) != null) {
        Slog.d(TAG, "Removed unavailable feature " + name);
    }
}

根据mAvailableFeatures的注释,设备支持的feature是从配置文件里读取出来的。调用读取配置文件的地方是:

SystemConfig() {
    // Read configuration from system
    readPermissions(Environment.buildPath(
        Environment.getRootDirectory(), "etc", "sysconfig"), ALLOW_ALL);
    // Read configuration from the old permissions dir
    readPermissions(Environment.buildPath(
        Environment.getRootDirectory(), "etc", "permissions"), ALLOW_ALL);
    // Allow ODM to customize system configs around libs, features and apps
    int odmPermissionFlag = ALLOW_LIBS | ALLOW_FEATURES | ALLOW_APP_CONFIGS;
    readPermissions(Environment.buildPath(
        Environment.getOdmDirectory(), "etc", "sysconfig"), odmPermissionFlag);
    readPermissions(Environment.buildPath(
        Environment.getOdmDirectory(), "etc", "permissions"), odmPermissionFlag);
    // Only allow OEM to customize features
    readPermissions(Environment.buildPath(
        Environment.getOemDirectory(), "etc", "sysconfig"), ALLOW_FEATURES);
    readPermissions(Environment.buildPath(
        Environment.getOemDirectory(), "etc", "permissions"), ALLOW_FEATURES);
}

到此就很明白了,它是读取了几个目录:

  • /system/etc/permission
  • /system/etc/sysconfig
  • /oem/etc/permission
  • /oem/etc/sysconfig
  • /odm/etc/permission
  • /odm/etc/sysconfig

然后遍历xml文件,进行解析处理。SystemFeature就是解析的Feature标签。

最后再总结一下加载流程:

屏蔽SystemFeature

知道原理就好做了,在系统扫描的几个目录中使用grep命令查找控制打印机的字串,找到:

/system/etc/permission/handheld_core_hardware.xml

    <!-- basic system services -->
    <feature name="an
首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Android BottomNavigationBar导航.. 下一篇android FragmentTabhost导航分页

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目