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

那么这些/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




更多相关文章

  1. ViewPage第三课自定义viewpage
  2. Android之拨打接挂电话功能实现
  3. Android自定义View
  4. android添加hid设备驱动
  5. [置顶] Android:自定义View实现绚丽的圆形进度条
  6. 跨应用绑定Service
  7. Android(安卓)Annotations(1)
  8. Android(安卓)检查更新、下载、安装功能的实现
  9. Android(安卓)GridView 方格中图标与文字如何同时存在

随机推荐

  1. Android踩坑日记:自定义水平和圆形Progres
  2. 【极客之作】快到极致的Android模拟器—
  3. Android中Recyclerview或ListView列表条
  4. Android(安卓)recycleview实现左右切换时
  5. Android(安卓)状态栏, 标题栏, 导航栏,系
  6. Android开机启动Service或Activity或应用
  7. Xamarin Mono For Android 4.6.07004看不
  8. Android常见Exception解决方法
  9. Android Native C development (1) -- En
  10. Android的四种存储方式: sharedpreference