Android(安卓)N之hasSystemFeature
16lz
2021-01-25
当我们判断某一功能打开与否时,一般会有个确认本功能是否支持的过程,以便与为相关的功能初始化其他的环境,例如:蓝牙/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
更多相关文章
- ViewPage第三课自定义viewpage
- Android之拨打接挂电话功能实现
- Android自定义View
- android添加hid设备驱动
- [置顶] Android:自定义View实现绚丽的圆形进度条
- 跨应用绑定Service
- Android(安卓)Annotations(1)
- Android(安卓)检查更新、下载、安装功能的实现
- Android(安卓)GridView 方格中图标与文字如何同时存在
随机推荐
- Android踩坑日记:自定义水平和圆形Progres
- 【极客之作】快到极致的Android模拟器—
- Android中Recyclerview或ListView列表条
- Android(安卓)recycleview实现左右切换时
- Android(安卓)状态栏, 标题栏, 导航栏,系
- Android开机启动Service或Activity或应用
- Xamarin Mono For Android 4.6.07004看不
- Android常见Exception解决方法
- Android Native C development (1) -- En
- Android的四种存储方式: sharedpreference