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

相关文章

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

mysql-8.0.30压缩包版安装和配置MySQL环境过程

《mysql-8.0.30压缩包版安装和配置MySQL环境过程》该文章介绍了如何在Windows系统中下载、安装和配置MySQL数据库,包括下载地址、解压文件、创建和配置my.ini文件、设置环境变量... 目录压缩包安装配置下载配置环境变量下载和初始化总结压缩包安装配置下载下载地址:https://d

gradle安装和环境配置全过程

《gradle安装和环境配置全过程》本文介绍了如何安装和配置Gradle环境,包括下载Gradle、配置环境变量、测试Gradle以及在IntelliJIDEA中配置Gradle... 目录gradle安装和环境配置1 下载GRADLE2 环境变量配置3 测试gradle4 设置gradle初始化文件5 i

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

最新版IDEA配置 Tomcat的详细过程

《最新版IDEA配置Tomcat的详细过程》本文介绍如何在IDEA中配置Tomcat服务器,并创建Web项目,首先检查Tomcat是否安装完成,然后在IDEA中创建Web项目并添加Web结构,接着,... 目录配置tomcat第一步,先给项目添加Web结构查看端口号配置tomcat    先检查自己的to