AndroidManifest配置之uses-feature

2023-11-04 23:32

本文主要是介绍AndroidManifest配置之uses-feature,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

uses-feature声明

AndroidManifest中的uses-feature配置用来声明一个app在运行时所依赖的外部的硬件或软件特征(feature),uses-feature还提供了一个required属性配置,表示此项依赖的软硬件特征是否是必须的,当它设置为true表示此app运行时必须使用此项特征,如果没有则无法工作,如果它设置为false,表示应用在运行时需要用到这些特征,但如果没有,应用可能会有一部分功能会受到影响,但大部分功能还是可以正常工作。例如一个拍照app,它使用时必须开启设备的摄像头,在没有摄像头的机器上任何功能都无法使用,这就需要通过uses-feature来声明该应用需要摄像头,并将required设置为true。再比如一个支付app,它支持扫码支付的功能,这项功能同样需要开启设备的摄像头,因此需要通过uses-feature声明该应用需要摄像头,但如果一个设备没有摄像头,仅意味着扫码支付的功能无法使用,其他支付方式仍然可以使用,这时就可以设置required属性为false,表明此项feature的需求不是必须的。

语法

<uses-feature android:name="string"android:required=["true" | "false"]android:glEsVersion="integer" />
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

所属节点

<manifest>
  • 1
  • 1

属性

Android:name 
feature的名字。Android系统支持的feature可以通过 https://developer.android.com/guide/topics/manifest/uses-feature-element.html#features-reference 来查询。其中硬件特征的名字以android.hardware.为前缀,软件特征的名字以android.software.为前缀。

android:required 
android:required属性表示这项feature是否是必须的,它的值只能是true或者false。如果设置为true表示这项feature是必须的,如果没有,应用将无法工作。如果设置为false,表示应用需要这项feature,但如果没有,可能会影响部分功能,但应用还是能够正常工作的。如果没有指定这项属性,则默认为true,即表示此feature是必须的。

android:glEsVersion 
此项属性表示app所依赖的OpenGL ES的版本,它的值是一个整数,高16位表示OpenGL ES的大版本,低16位表示OpenGL ES的小版本。例如 OpenGL ES 3.2版本对应的整数值为0x00030002,完整配置如下。

<!-- Tell the system this app requires OpenGL ES 3.2. -->
<uses-feature android:glEsVersion="0x00030002" android:required="true" />
  • 1
  • 2
  • 1
  • 2

目前Android支持的OpenGL ES版本有1.0, 1.1, 2.0, 3.0, 3.1和 3.2。其中GLES 1.0从Android1.0开始支持,GLES 1.1从Android1.6开始支持,GLES 2.0从Android2.2 (API level 8) 开始支持,GLES 3.0从Android4.3(API level 18)开始支持,GLES 3.1从Android 5.0 (API level 21)开始支持,GLES 3.2则从Android N开始支持。OpenGL ES版本可以向下兼容,这意味着一个Android版本支持到某个OpenGL ES版本,同样可以支持更低的OpenGL ES版本。例如Android4.3支持到GLES 3.0,那么它也可以支持GLES 1.0到GLES 3.0之间的版本。因此可以得出各个Android版本支持的GLES版本区间如下。

Android版本 GLES版本
Android1.0 - Android1.5 GLES 1.0
Android1.6 - Android2.1 GLES 1.0 - GLES 1.1
Android2.2 - Android4.2 GLES 1.0 - GLES 2.0
Android4.3 - Android4.4 GLES 1.0 - GLES 3.0
Android5.0 - Android6.0 GLES 1.0 - GLES 3.1
AndroidN - GLES 1.0 - GLES 3.2

  
通常在AndroidManifest中应该只有一个android:glEsVersion配置,如果配置了多个,则只有版本号最大的那一个会生效,其他配置会被忽略。如果在AndroidManifest中没有配置android:glEsVersion,则表示可以支持到OpenGL ES 1.0,也就是所有的Android系统都支持。

uses-feature的作用

       uses-feature只是对外提供了这样一组信息,表明它所依赖的软硬件特征,这个信息通常是给应用市场使用的,应用市场会读取app的uses-feature设置,然后只给那些满足这组软硬件特征的设备分发这个app。

       Android系统在应用安装时并不会使用这里的信息。例如一个app在uses-feature中声明了需要摄像头,且required为true,那么应用市场在分发app时就不会将该app分发给那些没有摄像头的设备上,一个没有摄像头的设备也不能通过应用市场搜索和下载到该app。但是如果用户通过其他渠道(例如官网)下载该app对应的apk文件到某个设备上,在该设备上安装此apk时,系统并不会检查uses-feature所声明的软硬件特征是否满足,如果该设备没有摄像头,同样可以安装该app。

       不仅如此,Android系统在应用运行时也不会使用这里的信息,所以uses-feature声明对应用的运行也不会产生影响(除非应用自己在代码中去判断某项feature是否满足)。这点和uses-permission是不一样的,Android系统会读取应用的uses-permission,并对应用的运行产生影响。同样以摄像头为例,如果应用某项功能需要用到摄像头,无论uses-feature如何声明,都不会影响到摄像头是否能够使用。虽然如果设备没有摄像头这个硬件,这项功能就无法使用,但是这和uses-feature声明无关。但如果没有通过uses-permission声明摄像头的权限,那么即使有摄像头硬件,也是无法使用摄像头的。

       这里的因果关系是这样的:由于应用没有这项feature就无法工作,所以需要在AndroidManifest中配置uses-feature,让应用市场在分发app时自动过滤掉那些不支持的设备,不是由于配置了uses-feature,导致应用在没有这项feature的设备上无法工作。

Google Play app过滤机制

       当用户打开Google Play浏览或查找应用时,Google Play会对用户可见的app进行过滤,用户在Google Play上只能够看到和下载到那些能够和用户设备相兼容的app。根据uses-feature声明的软硬件特征来过滤app是其中的一种方式。

       当开发者上传apk文件到Google Play后,Google Play会读取apk文件中AndroidManifest,根据uses-feature,uses-sdk,uses-permission,uses-library等配置信息来评估此app所需要的features,然后根据这些信息生成一份元数据和该apk版本关联起来,保存到数据库中。

       当用户打开设备上的Google Play应用时,Google Play应用会通过getSystemAvailableFeatures()获取到当前设备所支持的软硬件特征,然后将此列表发送给Google Play,之后当用户在这台设备上通过Google Play浏览或查找应用时,Google Play会将每个应用所需要的feature和用户设备支持的feature做比较。只有那些所有需要的feature在当前设备上都支持的app才会显示出来,如果一个app所需要的某个feature不能被当前设备满足,那么在这台设备上就不会显示这个app。

对Google Play审核的影响

Google Play要求app必须显式的声明所有需要的features,尤其是那些通过uses-permission可以推断出来的features。例如在uses-permission中声明了CAMERA权限,那么显然app需要使用摄像头,而如果这时又没有声明和摄像头有关的uses-feature,那么Google Play会认为app没有声明所有需要的features,可能会导致审核失败。

feature信息的代码表示

Android SDK中用FeatureInfo类来表示feature信息,它主要包含如下成员变量和方法。相关说明已经包含在注释中。

public class FeatureInfo implements Parcelable {/*** 此feature的名字,例如"android.hardware.camera"。* 所有的feature除了OpenGL ES版本外都有一个对应的名字* 这些名字可以在PackageManager类中找到对应的常量,都是以FEATURE_开头,* 例如"android.hardware.camera"对应的常量是PackageManager.FEATURE_CAMERA。* 对OpenGL ES版本featuer,这里的name的值是null*/public String name;/*** reqGlEsVersion的默认值*/public static final int GL_ES_VERSION_UNDEFINED = 0;/*** GLES版本,高16位表示GLES的大版本,低16位表示GLES的小版本。* 只有在名字为null时才有效*/public int reqGlEsVersion;/*** 表示当前应用需要此feature*/public static final int FLAG_REQUIRED = 0x0001;/*** 表示当前应用是否需要此feature,可以是0或者FLAG_REQUIRED*/public int flags;……这里省略了构造方法和序列化方法……/*** 将reqGlEsVersion转换为字符串格式的版本号,如0x00010002会返回1.2*/public String getGlEsVersion() {int major = ((reqGlEsVersion & 0xffff0000) >> 16);int minor = reqGlEsVersion & 0x0000ffff;return String.valueOf(major)+"."+String.valueOf(minor);}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

通过代码获取feature信息

正如前面所说,一个app配置的use-feature信息是给应用市场使用的,对app自身来说通常并不需要获取这些信息。不过如果确实需要这些信息,也是可以通过代码来获取的。

  1. 获取当前设备支持的所有features

    FeatureInfo[] f = getPackageManager().getSystemAvailableFeatures();
    • 1
    • 1
  2. 判断当前设备是否支持某项feature

    boolean b = getPackageManager().hasSystemFeature(featureName);
    • 1
    • 1
  3. 获取当前app的uses-feature配置

    try {String packageName = getPackageName();PackageInfo p = getPackageManager().getPackageInfo(packageName, PackageManager.GET_CONFIGURATIONS);FeatureInfo[] f = p.reqFeatures;
    } catch (NameNotFoundException e) {e.printStackTrace();
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这里也可以用来获取当前设备上已经安装的其他app的uses-feature配置,只需要将packageName换成需要获取的app对应的包名即可。获取其他app的uses-feature配置不需要特别的权限,设备上已安装的任意一个app都可以获取。

参考链接

  1. https://developer.android.com/guide/topics/manifest/uses-feature-element.html

这篇关于AndroidManifest配置之uses-feature的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/345937

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

mysql8.0.43使用InnoDB Cluster配置主从复制

《mysql8.0.43使用InnoDBCluster配置主从复制》本文主要介绍了mysql8.0.43使用InnoDBCluster配置主从复制,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录1、配置Hosts解析(所有服务器都要执行)2、安装mysql shell(所有服务器都要执行)3、

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

JDK8(Java Development kit)的安装与配置全过程

《JDK8(JavaDevelopmentkit)的安装与配置全过程》文章简要介绍了Java的核心特点(如跨平台、JVM机制)及JDK/JRE的区别,重点讲解了如何通过配置环境变量(PATH和JA... 目录Java特点JDKJREJDK的下载,安装配置环境变量总结Java特点说起 Java,大家肯定都

linux配置podman阿里云容器镜像加速器详解

《linux配置podman阿里云容器镜像加速器详解》本文指导如何配置Podman使用阿里云容器镜像加速器:登录阿里云获取专属加速地址,修改Podman配置文件并移除https://前缀,最后拉取镜像... 目录1.下载podman2.获取阿里云个人容器镜像加速器地址3.更改podman配置文件4.使用po

Vue3 如何通过json配置生成查询表单

《Vue3如何通过json配置生成查询表单》本文给大家介绍Vue3如何通过json配置生成查询表单,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录功能实现背景项目代码案例功能实现背景通过vue3实现后台管理项目一定含有表格功能,通常离不开表单

mybatis映射器配置小结

《mybatis映射器配置小结》本文详解MyBatis映射器配置,重点讲解字段映射的三种解决方案(别名、自动驼峰映射、resultMap),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定... 目录select中字段的映射问题使用SQL语句中的别名功能使用mapUnderscoreToCame

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java