Android添加SystemFeature系统特性

原文参考:Android系统添加SystemFeature方法_特立独行的博客-优快云博客

前言:

Android系统可以通过hasSystemFeature方法来判断系统是否支持特定模块功能,从而进行不同的逻辑运行,当定制系统或系统裁剪时,需要对系统提供的Feature进行自定义和裁剪。

一、Android初始化Features

在SystemServer.java中初始化,会根据Feature初始化很多service,有些service不需要,可以通过配置Feature启动或者不启动。

 

 feature目录一般在: framework/native/data/etc 和 frameworks/base/data/etc

二、添加自定义Feature 
系统Feature定义在frameworks/native/data/etc目录下,该目录下的xml文件会被打包复制到系统镜像system/etc/permissions目录下,所以添加自定义Feature的方法就是在frameworks/native/data/etc添加自定义的xml文件,并将该xml文件复制到系统镜像。 
xml文件格式参照:frameworks\native\data\etc\android.hardware.bluetooth.xml 

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2011 The Android Open Source Project     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
  
          http://www.apache.org/licenses/LICENSE-2.0
  
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->
<!-- Adds the feature indicating support for the Bluetooth API -->
<permissions>
    <feature name="android.hardware.bluetooth" />
</permissions>

编译到系统镜像 

device/qcom/common/base.mk

PRODUCT_COPY_FILES := \
    frameworks/native/data/etc/android.hardware.bluetooth.xml:system/etc/permissions/android.hardware.bluetooth.xml

移除Featrue示例 ://移除闪光灯

diff --git a/frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml b/frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml
old mode 100644
new mode 100755
index ab81cd9..d44b28d
--- a/frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml
+++ b/frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml
@@ -20,5 +20,5 @@
     <feature name="android.hardware.camera.any" />
     <feature name="android.hardware.camera" />
     <feature name="android.hardware.camera.autofocus" />
-    <feature name="android.hardware.camera.flash" />
+    <!-- <feature name="android.hardware.camera.flash" /> -->
 </permissions>

三、获取hasSystemFeature原理

当我们判断某一功能打开与否时,一般会有个确认本功能是否支持的过程,以便与为相关的功能初始化其他的环境,例如:蓝牙/NFC。

例如,NFC HCE

两个的声明如下:


    /**

     * Feature for {@link #getSystemAvailableFeatures} and

     * {@link #hasSystemFeature}: The device can communicate using Near-Field

     * Communications (NFC).

     */

    @SdkConstant(SdkConstantType.FEATURE)

    public static final String FEATURE_NFC = "android.hardware.nfc";

 

    /**

     * Feature for {@link #getSystemAvailableFeatures} and

     * {@link #hasSystemFeature}: The device supports host-

     * based NFC card emulation.

     *

     * TODO remove when depending apps have moved to new constant.

     * @hide

     * @deprecated

     */

    @Deprecated

    @SdkConstant(SdkConstantType.FEATURE)

    public static final String FEATURE_NFC_HCE = "android.hardware.nfc.hce";

 

    /**

     * Feature for {@link #getSystemAvailableFeatures} and

     * {@link #hasSystemFeature}: The device supports host-

     * based NFC card emulation.

     */

    @SdkConstant(SdkConstantType.FEATURE)

    public static final String FEATURE_NFC_HOST_CARD_EMULATION = "android.hardware.nfc.hce";

 

    /**

     * Feature for {@link #getSystemAvailableFeatures} and

     * {@link #hasSystemFeature}: The device supports host-

     * based NFC-F card emulation.

     */

    @SdkConstant(SdkConstantType.FEATURE)

    public static final String FEATURE_NFC_HOST_CARD_EMULATION_NFCF = "android.hardware.nfc.hcef";

针对“android.hardware.nfc.hce”,有两个静态变量对应,其中一个已经过时,但是为了兼容老版本,仍做保留。这些feature的出处来自与SystemConfig


    public PackageManagerService(Context context, Installer installer,

            boolean factoryTest, boolean onlyCore) {

        EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START,

                SystemClock.uptimeMillis());

 

        /** M: Mtprof tool @{ */

        //mMTPROFDisable = "1".equals(SystemProperties.get("ro.mtprof.disable"));

        mMTPROFDisable = false;

        addBootEvent("Android:PackageManagerService_Start");

        /** @} */

 

        if (mSdkVersion <= 0) {

            Slog.w(TAG, "**** ro.build.version.sdk not set!");

        }

 

        //......

 

        mOnPermissionChangeListeners = new OnPermissionChangeListeners(

                FgThread.get().getLooper());

 

        getDefaultDisplayMetrics(context, mMetrics);

 

        SystemConfig systemConfig = SystemConfig.getInstance();

        mGlobalGids = systemConfig.getGlobalGids();

        mSystemPermissions = systemConfig.getSystemPermissions();

        mAvailableFeatures = systemConfig.getAvailableFeatures();//来源

 

 

    }

 

    @Override

    public boolean hasSystemFeature(String name, int version/*0*/) {

        synchronized (mPackages) {

            final FeatureInfo feat = mAvailableFeatures.get(name);

            if (feat == null) {

                return false;

            } else {

                return feat.version >= version;

            }

        }

    }

由以上知,hasSystemFeature实质上是通过PackagesManagerService从SystemConfig读取到的mAvailableFeatures中查询是否存在,或者版本更新。

问题:那么SystemConfig又是从哪里读取到的呢?


    public static SystemConfig getInstance() {

        synchronized (SystemConfig.class) {

            if (sInstance == null) {

                sInstance = new SystemConfig();

            }

            return sInstance;

        }

    }

SystemConfig是个单例

SystemConfig


从以上可知,SystemConfig是从/system/etc/和/oem/etc/目录下的sysconfig或者permission中扫描读取文件内容,看是否具有相关的"feature"。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值