Android N之hasSystemFeature

来源:互联网 发布:mr数据与信令相关联 编辑:程序博客网 时间:2024/05/22 12:17

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


经查,上述3个NFC相关的feature定义均位于/system/etc/permission中,蓝牙相关的bluetooth和bluetooth_le也在其中,/oem目录下为空。



挑其中一个看看,android.hardware.nfc.hce.xml:

<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2013 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.--><!-- This feature indicates that the device supports host-based     NFC card emulation --><permissions>    <feature name="android.hardware.nfc.hce" /></permissions>

那么这些/system/etc/permission中的xml文件最终来源是哪儿呢 ?

答案是:frameworks/native/data/etc/中定义,编译目标的宏控制是否加入编译目标


编译系统如下:

PRODUCT_COPY_FILES += \    $(NFCEE_ACCESS_PATH):system/etc/nfcee_access.xml \    frameworks/native/data/etc/android.hardware.nfc.xml:system/etc/permissions/android.hardware.nfc.xml \    frameworks/native/data/etc/android.hardware.nfc.hce.xml:system/etc/permissions/android.hardware.nfc.hce.xmlPRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.location.gps.xml:system/etc/permissions/android.hardware.location.gps.xmlPRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.wifi.xml:system/etc/permissions/android.hardware.wifi.xmlPRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.wifi.direct.xml:system/etc/permissions/android.hardware.wifi.direct.xmlPRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.bluetooth.xml:system/etc/permissions/android.hardware.bluetooth.xmlPRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.bluetooth_le.xml:system/etc/permissions/android.hardware.bluetooth_le.xml