目录
1. 简介
本文档列出了设备必须满足哪些要求,才能与 Android 7.1 兼容。
本文档按照 RFC2119 中定义的 IETF 标准使用“必须”“不得”“必需”“会”“不会”“应该”“不应”“建议”“可以”和“非强制”字样。
在本文档中,“设备实现者”或“实现者”指的是运行 Android 7.1 的硬件/软件解决方案的开发人员或组织。“设备实现”或“实现”指的是所开发的硬件/软件解决方案。
设备实现必须满足本兼容性定义文档(包括以参考资料的形式纳入的任何文档)中列出的要求,才会被视为与 Android 7.1 兼容。
本定义或第 10 节中所述的软件测试如有未提及、含糊不清或不完整之处,设备实现者需负责确保与现有实现兼容。
因此,Android 开源项目既是参考 Android 实现,也是首选 Android 实现。强烈建议设备实现者尽可能使其实现基于 Android 开源项目提供的“上游”源代码。虽然从理论上来说某些组件可以替换为替代实现,但强烈建议不要这样做,否则通过软件测试的难度会大大增加。实现者需负责确保行为与标准 Android 实现(包括兼容性测试套件及其他内容)完全兼容。最后请注意,本文档明确禁止替换和修改某些组件。
本文档中链接到的许多资源都直接或间接来自 Android SDK,并且与该 SDK 的文档中包含的信息作用相同。如果本兼容性定义文档或兼容性测试套件与 SDK 文档有任何不一致的情况,均以 SDK 文档为准。本文档中链接到的资源内提供的所有技术详细信息都被视为本兼容性定义文档的一部分。
2. 设备类型
虽然 Android 开源项目已应用于多种设备类型和外形规格的实现中,但在对架构和兼容性要求的多个方面进行优化时针对的都是手持设备。从 Android 5.0 开始,Android 开源项目将致力于支持更多设备类型,如本节中所述。
Android 手持设备指的是一种 Android 设备实现,通常拿在手中使用,例如 mp3 播放器、手机和平板电脑。Android 手持设备实现:
- 必须在设备中嵌入触摸屏。
- 必须具有能够使设备实现移动性的电源,例如电池。
Android TV 设备指的是一种 Android 设备实现,是适合用户坐在约 10 英尺远的距离处观看电视节目的娱乐界面(“提供大屏幕娱乐体验的界面”或“距离 10 英尺观看的界面”),可供用户观看数字媒体、影片、电视直播,玩游戏和/或使用应用。这类设备需要满足以下条件:
- 必须具有嵌入式屏幕或包含视频输出端口,例如用于连接显示装置的 VGA、HDMI 或无线端口。
- 必须声明 android.software.leanback 和 android.hardware.type.television 功能。
Android Watch 设备指的是一种应穿戴在身上(也许是戴在手腕上)的 Android 设备实现,并且:
- 必须具有物理对角线长度介于 1.1 到 2.5 英寸之间的屏幕。
- 必须声明 android.hardware.type.watch 功能。
- 必须支持 uiMode = UI_MODE_TYPE_WATCH.
Android Automotive 实现指的是一种车机,它运行 Android 操作系统来实现部分或全部的系统功能和/或信息娱乐功能。Android Automotive 实现:
- 必须具有物理对角线长度等于或大于 6 英寸的屏幕。
- 必须声明 android.hardware.type.automotive 功能。
- 必须支持 uiMode = UI_MODE_TYPE_CAR。
- Android Automotive 实现必须支持
android.car.*
命名空间中的所有公共 API。
不属于上述任何设备类型的所有 Android 设备实现仍必须满足本文档中的所有要求,才能与 Android 7.1 兼容,明确描述为仅适用于上述特定 Android 设备类型的要求除外。
2.1 设备配置
下表按设备类型简要总结了硬件配置方面的主要差异(空单元格表示“可以有”)。下表并未涵盖所有配置;如需了解详情,请参阅介绍硬件的相关章节。
类别 | 功能 | 章节 | 手持设备 | 电视 | 手表 | Automotive | 其他 |
---|---|---|---|---|---|---|---|
输入 | 方向键 | 7.2.2. 非触摸导航 | 必须 | ||||
触摸屏 | 7.2.4. 触摸屏输入 | 必须 | 必须 | 应该 | |||
麦克风 | 7.8.1. 麦克风 | 必须 | 应该 | 必须 | 必须 | 应该 | |
传感器 | 加速度计 | 7.3.1 加速度计 | 应该 | 应该 | 应该 | ||
GPS | 7.3.3. GPS | 应该 | 应该 | ||||
网络连接 | Wi-Fi | 7.4.2. IEEE 802.11 | 应该 | 应该 | 应该 | 应该 | |
Wi-Fi 直连 | 7.4.2.1. Wi-Fi 直连 | 应该 | 应该 | 应该 | |||
蓝牙 | 7.4.3. 蓝牙 | 应该 | 必须 | 必须 | 必须 | 应该 | |
低功耗蓝牙 | 7.4.3. 蓝牙 | 应该 | 必须 | 应该 | 应该 | 应该 | |
移动网络无线装置 | 7.4.5. 最低网络功能 | 应该 | |||||
USB 外围设备/主机模式 | 7.7. USB | 应该 | 应该 | 应该 | |||
输出 | 扬声器和/或音频输出端口 | 7.8.2. 音频输出 | 必须 | 必须 | 必须 | 必须 |
3. 软件
3.1. 受管理 API 兼容性
受管理 Dalvik 字节码执行环境是 Android 应用所需的主要容器。Android 应用编程接口 (API) 是一组 Android 平台接口,可供在受管理运行时环境中运行的应用使用。设备实现必须提供以下 API 的完整实现(包括所有已载述的行为):Android SDK 提供的所有已载述 API,或上游 Android 源代码中所有带“@SystemApi”标记的 API。
设备实现必须支持/保留所有标有 TestApi 注解 (@TestApi) 的类、方法和关联的元素。
除非本兼容性定义文档中明确许可,否则设备实现不得省略任何受管理 API,不得更改 API 接口或签名,不得违背已载述的行为,也不得包含空操作。
本兼容性定义文档允许设备实现省略某些类型的硬件,但前提是 Android 包含适用于它们的 API。如果省略此类硬件,这些 API 仍必须存在并采取合理的行为方式。如需了解针对这种情况的具体要求,请参阅第 7 节。
3.1.1. Android 扩展
Android 支持在使 API 级别版本保持不变的情况下扩展受管理 API。Android 设备实现必须预加载 ExtShared
共享库和 ExtServices
服务(版本不低于每个 API 级别所允许的最低版本)的 AOSP 实现。例如,如果 Android 7.0 设备实现运行的 API 级别为 24,则包含的版本必须至少为 1。
3.2. 软 API 兼容性
除了第 3.1 节中的受管理 API 之外,Android 还包含一个非常重要的运行时专用“软”API,该 API 采用诸如以下形式:intent、权限,以及 Android 应用中在应用编译期间无法被强制执行的其他类似方面。
3.2.1. 权限
设备实现者必须支持并强制采用“权限”参考页面中载述的所有权限常量。请注意,第 9 节列出了与 Android 安全模型相关的其他要求。
3.2.2. build 参数
Android API 在 android.os.Build 类中包含一些用于描述当前设备的常量。为了在各设备实现之间提供一致且有意义的值,下表列出了对这些值的格式的一些其他限制,设备实现必须遵守这些限制。
参数 | 详细信息 |
---|---|
VERSION.RELEASE | 当前正在执行的 Android 系统的版本,采用人类可读懂的格式。此字段的值必须是 7.1 中定义的字符串值之一。 |
VERSION.SDK | 当前正在执行的 Android 系统的版本,采用第三方应用代码可访问的格式。对于 Android 7.1,此字段的值必须为整数 7.1_INT。 |
VERSION.SDK_INT | 当前正在执行的 Android 系统的版本,采用第三方应用代码可访问的格式。对于 Android 7.1,此字段的值必须为整数 7.1_INT。 |
VERSION.INCREMENTAL | 由设备实现者选择的值,用于指定当前正在执行的 Android 系统的具体 build,采用人类可读懂的格式。此值不得重复用于提供给最终用户的不同 build。此字段的一个典型用途是,指明生成相应 build 时使用的是哪个 build 号或哪个源代码控制更改标识符。此字段不得为 null,也不得为空字符串 (""),除此之外,对此字段的具体格式没有任何其他要求。 |
BOARD | 由设备实现者选择的值,用于标识设备使用的具体内部硬件,采用人类可读懂的格式。此字段的一个可能用途是,指明设备主板的具体修订版本。此字段的值必须可编码为 7 位的 ASCII 值,并与正则表达式“^[a-zA-Z0-9_-]+$”匹配。 |
BRAND | 该值用于指明与设备关联的品牌名称,即最终用户所熟知的设备品牌名称。必须采用人类可读懂的格式,并且应表示设备的制造商或设备在营销时所冠的公司品牌。此字段的值必须可编码为 7 位的 ASCII 值,并与正则表达式“^[a-zA-Z0-9_-]+$”匹配。 |
SUPPORTED_ABIS | 原生代码的指令集名称(CPU 类型 + ABI 惯例)。请参阅第 3.3 节 - 原生 API 兼容性。 |
SUPPORTED_32_BIT_ABIS | 原生代码的指令集名称(CPU 类型 + ABI 惯例)。请参阅第 3.3 节 - 原生 API 兼容性。 |
SUPPORTED_64_BIT_ABIS | 原生代码第二个指令集的名称(CPU 类型 + ABI 惯例)。请参阅第 3.3 节 - 原生 API 兼容性。 |
CPU_ABI | 原生代码的指令集名称(CPU 类型 + ABI 惯例)。请参阅第 3.3 节 - 原生 API 兼容性。 |
CPU_ABI2 | 原生代码第二个指令集的名称(CPU 类型 + ABI 惯例)。请参阅第 3.3 节 - 原生 API 兼容性。 |
DEVICE | 由设备实现者选择的值,其中包含开发者名称或代号,用于标识设备的硬件功能和工业设计配置。此字段的值必须可编码为 7 位的 ASCII 值,并与正则表达式“^[a-zA-Z0-9_-]+$”匹配。此设备名称在产品的生命周期内不得更改。 |
FINGERPRINT |
该字符串用于独一无二地标识相应 build。应采用人类可读懂的格式。必须遵从以下模板:
$(BRAND)/$(PRODUCT)/ 例如:
acme/myproduct/ 该指纹不得包含空格。如果上述模板中包含的其他字段内有空白字符,则在 build 指纹中必须将空白字符替换为其他字符,例如下划线 ("_") 字符。此字段的值必须可编码为 7 位的 ASCII 值。 |
HARDWARE | 硬件的名称(来自内核命令行或 /proc),应采用人类可读懂的格式。此字段的值必须可编码为 7 位的 ASCII 值,并与正则表达式“^[a-zA-Z0-9_-]+$”匹配。 |
HOST | 该字符串用于独一无二地标识构建相应 build 时所使用的主机,采用人类可读懂的格式。此字段不得为 null,也不得为空字符串 (""),除此之外,对此字段的具体格式没有任何其他要求。 |
ID | 由设备实现者选择的标识符,表示特定版本,采用人类可读懂的格式。此字段可与 android.os.Build.VERSION.INCREMENTAL 相同,但应是对最终用户来说有充分意义的值,以便他们区分各个软件 build。此字段的值必须可编码为 7 位的 ASCII 值,并与正则表达式“^[a-zA-Z0-9._-]+$”匹配。 |
MANUFACTURER | 产品的原始设备制造商 (OEM) 的商业名称。此字段不得为 null,也不得为空字符串 (""),除此之外,对此字段的具体格式没有任何其他要求。 |
MODEL | 由设备实现者选择的值,其中包含最终用户所熟知的设备名称。此名称应与设备在营销时以及出售给最终用户时使用的名称相同。此字段不得为 null,也不得为空字符串 (""),除此之外,对此字段的具体格式没有任何其他要求。 |
PRODUCT | 由设备实现者选择的值,其中包含具体产品 (SKU) 的开发名称或代号,在同一品牌中必须是唯一的。必须采用人类可读懂的格式,但不一定可供最终用户查看。此字段的值必须可编码为 7 位的 ASCII 值,并与正则表达式“^[a-zA-Z0-9_-]+$”匹配。此产品名称在产品的生命周期内不得更改。 |
SERIAL | 硬件序列号;如果有多款 MODEL 和 MANUFACTURER 相同的设备,则必须为其提供硬件序列号,并且提供的硬件序列号在这些设备中必须是独一无二的。此字段的值必须可编码为 7 位的 ASCII 值,并与正则表达式“^([a-zA-Z0-9]{6,20})$”匹配。 |
TAGS | 由设备实现者选择的一系列标记(用于进一步区分 build),各个标记之间以英文逗号分隔。此字段的值必须是与以下三种典型 Android 平台签名配置对应的值之一:release-keys、dev-keys、test-keys。 |
TIME | 该值用于表示生成相应 build 时的时间戳。 |
TYPE | 由设备实现者选择的值,用于指定相应 build 的运行时配置。此字段的值必须是与以下三种典型 Android 运行时配置对应的值之一:user、userdebug 或 eng。 |
USER | 生成相应 build 的用户(或自动用户)的名称或 ID。此字段不得为 null,也不得为空字符串 (""),除此之外,对此字段的具体格式没有任何其他要求。 |
SECURITY_PATCH | 该值用于指明相应 build 的安全补丁级别。它必须表明相应 build 在任何方面都不容易受到指定的 Android 公共安全公告中所述的任何问题的影响。它必须采用 [YYYY-MM-DD] 格式,并且与 Android 公共安全公告或 Android 安全建议中载述的已定义字符串匹配,例如“2015-11-01”。 |
BASE_OS | 该值表示以下 build 的 FINGERPRINT 参数:除了 Android 公共安全公告中提供的补丁以外,与相应 build 完全相同的 build。它必须报告正确的值,如果这样的 build 不存在,则报告一个空字符串 ("")。 |
3.2.3. intent 兼容性
3.2.3.1. 核心应用 intent
通过 Android intent,应用组件可以请求其他 Android 组件的功能。Android 上游项目包含一系列被视为核心 Android 应用的应用,这些应用可实现多种 intent 模式来执行常见操作。这些核心 Android 应用是:
- 桌面时钟
- 浏览器
- 日历
- 通讯录
- 图库
- GlobalSearch
- 启动器
- 音乐
- 设置
设备实现必须包含核心 Android 应用(适当情况下),或者包含一个组件,该组件能够实现这些核心 Android 应用通过 android:exported
属性以隐式或显式方式提供给其他应用使用的所有 activity 或 Service 组件定义的各种 intent 模式。
3.2.3.2. intent 解析
由于 Android 是一个可扩展的平台,因此设备实现必须允许使用第三方应用替换第 3.2.3.1 节中提到的每种 intent 模式。上游 Android 开源实现默认允许这么做;设备实现者不得为系统应用使用这些 intent 模式的情况附加特殊特权,也不得阻止第三方应用绑定到这些模式并取得对这些模式的控制权。具体来说,此项规定包括但不限于停用“选择器”界面(用户可通过该界面在多个均可处理相同 intent 模式的应用之间进行选择)。
设备实现必须提供一个界面来供用户修改 intent 的默认 activity。
不过,如果默认 activity 为数据 URI 提供更具体的属性,设备实现可以为特定 URI 模式(例如 http://play.google.com)提供默认 activity。例如,与针对“http://”的浏览器核心 intent 模式相比,用于指定数据 URI“http://www.android.com”的 intent 过滤器模式更为具体。
Android 还包含可让第三方应用为某些类型的 Web URI intent 声明权威性默认应用链接行为的机制。如果此类权威声明是在某个应用的 intent 过滤器模式中定义的,则设备实现:
- 必须尝试执行 Digital Asset Links 规范(由上游 Android 开源项目中的软件包管理器实现)中规定的验证步骤,来验证所有 intent 过滤器。
- 必须在应用安装过程中尝试验证 intent 过滤器,并将所有成功通过验证的 URI intent 过滤器设为其 URI 的默认应用处理程序。
- 可以将特定 URI intent 过滤器设置为其 URI 的默认应用处理程序,但前提是这些过滤器成功通过验证,而其他候选 URI 过滤器则未通过验证。如果设备实现进行此项设置,则必须在设置菜单中按 URI 向用户提供适当的模式替换。
- 必须在“设置”中按应用向用户提供应用链接控制,如下所述:
- 用户必须能够整体替换默认应用链接行为,以便应用始终开启、始终询问或永不开启,这必须同样适用于所有候选 URI intent 过滤器。
- 用户必须能够看到候选 URI intent 过滤器列表。
- 设备实现可以按 intent 过滤器提供相应的功能,使用户能够替换已成功通过验证的特定候选 URI intent 过滤器。
- 如果设备实现允许只有部分(而非全部)候选 URI intent 过滤器成功通过验证,则设备实现必须使用户能够查看和替换特定候选 URI intent 过滤器。
3.2.3.3. intent 命名空间
设备实现不得包含任何符合以下条件的 Android 组件:遵从任何使用 ACTION、使用 CATEGORY 或使用 android. 或 com.android. 命名空间中的其他键字符串的新 intent 模式或广播 intent 模式。设备实现者不得添加任何符合以下条件的 Android 组件:遵从任何使用 ACTION、使用 CATEGORY 或使用属于其他组织的软件包空间中的其他键字符串的新 intent 模式或广播 intent 模式。设备实现者不得更改或扩展第 3.2.3.1 节列出的核心应用使用的任何 intent 模式。设备实现可以包含所用命名空间明显与其所属组织关联的 intent 模式。此项规定类似于第 3.6 节中针对 Java 语言类的规定。
3.2.3.4. 广播 intent
第三方应用依赖于平台广播某些 intent 来获悉硬件或软件环境中发生的变化。与 Android 兼容的设备必须广播公共广播 intent 来响应相应的系统事件。如需关于广播 intent 的介绍,请参阅 SDK 文档。
3.2.3.5. 默认应用设置
Android 包含可让用户轻松选择默认应用(例如选择默认的主屏幕应用或短信应用)的设置。在适当的情况下,设备实现必须提供类似的设置菜单,并与 SDK 文档中所述的 intent 过滤器模式和 API 方法兼容(详见下文)。
设备实现:
- 如果设备实现报告 android.software.home_screen,则必须遵从 android.settings.HOME_SETTINGS,以显示主屏幕的默认应用设置菜单
- 如果设备实现报告 android.hardware.telephony,则必须提供一个设置菜单,并且该菜单将调用 android.provider.Telephony.ACTION_CHANGE_DEFAULT intent,以显示用于更改默认短信应用的对话框。
- 如果设备实现报告 android.hardware.nfc.hce,则必须遵从 android.settings.NFC_PAYMENT_SETTINGS intent,以显示触碰付款的默认应用设置菜单。
- 如果设备实现报告
android.hardware.telephony
,则必须遵从 android.telecom.action.CHANGE_DEFAULT_DIALER intent,以显示可让用户更改默认电话应用的对话框。 - 必须遵从 android.settings.ACTION_VOICE_INPUT_SETTINGS intent(如果设备支持 VoiceInteractionService),并显示语音输入和语音助理的默认应用设置菜单。
3.3. 原生 API 兼容性
实现原生代码兼容性是一项颇具挑战性的任务。因此,强烈建议设备实现者使用上游 Android 开源项目中的下述库的实现。
3.3.1. 应用二进制接口
受管理 Dalvik 字节码可以调用应用 .apk 文件中提供的原生代码,以便作为针对相应设备硬件架构编译的 ELF .so 文件。由于原生代码高度依赖于底层处理器技术,因此 Android 在 Android NDK 中定义了一些应用二进制接口 (ABI)。设备实现必须与一个或多个已定义的 ABI 兼容,并与 Android NDK 兼容,如下所示。
如果设备实现支持某个 Android ABI,则:
- 必须支持在受管理环境中运行的代码,以使用标准 Java 原生接口 (JNI) 语义调用原生代码。
- 必须与以下列表中每个必需的库保持源代码兼容(即标头兼容)和二进制兼容(适用于 ABI)。
- 如果支持任何 64 位 ABI,则必须支持对应的 32 位 ABI。
- 必须通过 android.os.Build.SUPPORTED_ABIS、android.os.Build.SUPPORTED_32_BIT_ABIS 和 android.os.Build.SUPPORTED_64_BIT_ABIS 参数准确报告设备支持的原生应用二进制接口 (ABI),其中每个参数报告的都是一个以英文逗号分隔的 ABI 列表,列表中的条目按偏好程度从高到低排序
- 必须(通过上述参数)仅报告最新版 Android NDK ABI 管理文档中所述的那些 ABI,并支持高级 SIMD(也称为 NEON)扩展。
- 应使用上游 Android 开源项目中的源代码和头文件进行构建
请注意,未来版本的 Android NDK 可能会支持更多 ABI。如果设备实现与现有的某个预定义 ABI 不兼容,则不得报告支持任何 ABI。
以下原生代码 API 必须可供包含原生代码的应用使用:
- libandroid.so(原生 Android activity 支持)
- libc(C 库)
- libcamera2ndk.so
- libdl(动态链接器)
- libEGL.so(本机 OpenGL 表面管理)
- libGLESv1_CM.so (OpenGL ES 1.x)
- libGLESv2.so (OpenGL ES 2.0)
- libGLESv3.so (OpenGL ES 3.x)
- libicui18n.so
- libicuuc.so
- libjnigraphics.so
- liblog(Android 日志记录)
- libmediandk.so(本机媒体 API 支持)
- libm(数学库)
- libOpenMAXAL.so(OpenMAX AL 1.0.1 支持)
- libOpenSLES.so(OpenSL ES 1.0.1 音频支持)
- libRS.so
- libstdc++(对 C++ 的最基本支持)
- libvulkan.so (Vulkan)
- libz(Zlib 压缩)
- JNI interface
- 对 OpenGL 的支持(如下所述)
对于上面列出的原生库,设备实现不得添加或移除公共函数。
未在上面列出但在 AOSP 中作为系统库实现和提供的原生库为保留库,不得提供给目标 API 级别为 24 或更高的第三方应用使用。
设备实现可以添加非 AOSP 库并将其作为 API 直接提供给第三方应用,但这些额外的库应该位于 /vendor/lib
或 /vendor/lib64
中且必须在 /vendor/etc/public.libraries.txt
中列出。
请注意,设备实现必须包含 libGLESv3.so,进而必须导出 NDK 版 android-24 中定义的所有 OpenGL ES 3.1 和 Android Extension Pack 函数符号。虽然所有这些符号都必须存在,但是仅必须完全实现与相应设备实际支持的 OpenGL ES 版本和扩展对应的函数。
3.3.1.1. 图形库
Vulkan 是用于绘制高性能 3D 图形的低开销、跨平台 API。设备实现即使不支持 Vulkan API,也必须满足以下要求:
- 必须始终提供一个名为
libvulkan.so
的原生库,该库可导出核心 Vulkan 1.0 API 以及VK_KHR_surface
、VK_KHR_android_surface
和VK_KHR_swapchain
扩展的函数符号。
如果设备实现支持 Vulkan API,则:
- 必须通过
vkEnumeratePhysicalDevices
调用报告一个或多个VkPhysicalDevices
。 - 每个枚举的
VkPhysicalDevices
都必须完全实现 Vulkan 1.0 API。 - 必须报告正确的
PackageManager#FEATURE_VULKAN_HARDWARE_LEVEL
和PackageManager#FEATURE_VULKAN_HARDWARE_VERSION
功能标志。 - 必须通过
libvulkan.so
中的vkEnumerateInstanceLayerProperties
和vkEnumerateDeviceLayerProperties
函数枚举应用软件包原生库目录中名为libVkLayer*.so
的原生库中所含的层。 - 不得枚举应用软件包外的库提供的层,也不得提供其他方式来跟踪或拦截 Vulkan API,除非应用有
android:debuggable=”true”
属性。
如果设备实现不支持 Vulkan API,则:
- 必须通过
vkEnumeratePhysicalDevices
调用报告 0 个VkPhysicalDevices
。 - 不得声明以下任一 Vulkan 功能标志:
PackageManager#FEATURE_VULKAN_HARDWARE_LEVEL
和PackageManager#FEATURE_VULKAN_HARDWARE_VERSION
。
3.3.2. 32 位 ARM 原生代码兼容性
ARMv8 架构废弃了多项 CPU 操作,包括现有原生代码中使用的一些操作。在 64 位 ARM 设备上,以下废弃的操作必须仍可供 32 位原生 ARM 代码使用(通过原生 CPU 支持或软件模拟):
- SWP 和 SWPB 指令
- SETEND 指令
- CP15ISB、CP15DSB 和 CP15DMB 屏障操作
旧版 Android NDK 使用 /proc/cpuinfo 从 32 位 ARM 原生代码中了解 CPU 功能。为了与使用此 NDK 构建的应用兼容,当 32 位 ARM 应用读取 /proc/cpuinfo 时,设备必须在其中添加以下行:
- “Features: ”,后跟设备支持的所有可选 ARMv7 CPU 功能的列表。
- “CPU architecture: ”,后跟一个整数,该整数用于说明设备支持的最高 ARM 架构(例如,对于 ARMv8 设备,该整数为“8”)。
这些要求仅在 32 位 ARM 应用读取 /proc/cpuinfo 时适用。当 64 位 ARM 应用或非 ARM 应用读取 /proc/cpuinfo 时,设备不应对其进行更改。
3.4. Web 兼容性
3.4.1. WebView 兼容性
任何提供 android.webkit.WebView API 完整实现的设备上都必须报告平台功能 android.software.webview,但不得在未完整实现该 API 的设备上报告此功能。Android 开源实现使用 Chromium 项目中的代码来实现 android.webkit.WebView。由于无法为 Web 呈现系统开发综合测试套件,因此设备实现者必须在 WebView 实现中使用 Chromium 的特定上游 build。具体而言:
- 设备 android.webkit.WebView 实现必须基于适用于 Android 7.1 的上游 Android 开源项目中的 Chromium build。该 build 包含一组针对 WebView 的特定功能和安全修复程序。
-
WebView 报告的用户代理字符串必须采用以下格式:
Mozilla/5.0 (Linux; Android $(VERSION); $(MODEL) Build/$(BUILD); wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 $(CHROMIUM_VER) Mobile Safari/537.36
- $(VERSION) 字符串的值必须与 android.os.Build.VERSION.RELEASE 的值相同。
- $(MODEL) 字符串的值必须与 android.os.Build.MODEL 的值相同。
- $(BUILD) 字符串的值必须与 android.os.Build.ID 的值相同。
- $(CHROMIUM_VER) 字符串的值必须是上游 Android 开源项目中的 Chromium 的版本。
- 设备实现可以在用户代理字符串中省略 Mobile。
WebView 组件应支持尽可能多的 HTML5 功能;如果它支持此类功能,则应符合 HTML5 规范。
3.4.2. 浏览器兼容性
独立的浏览器可以基于 WebKit 之外的浏览器技术。不过,即使使用的是替代浏览器应用,向第三方应用提供的 android.webkit.WebView 组件也必须基于 WebKit,如第 3.4.1 节中所述。
实现可以在独立的浏览器应用中附带自定义用户代理字符串。
独立的浏览器应用(无论是基于上游 WebKit 浏览器应用还是第三方替代应用)应支持尽可能多的 HTML5。至少,设备实现必须支持以下与 HTML5 关联的每个 API:
此外,设备实现必须支持 HTML5/W3C webstorage API,并且应支持 HTML5/W3C IndexedDB API。请注意,随着 Web 开发标准制定机构逐渐转变为青睐 IndexedDB 胜过 webstorage,IndexedDB 预计会成为未来版本的 Android 中必需的组件。
3.5. API 行为兼容性
每种 API(受管理 API、软 API、原生 API 和 Web API)的行为都必须与上游 Android 开源项目的首选实现一致。兼容性的一些具体方面如下:
- 设备不得更改标准 intent 的行为或语义。
- 设备不得改变特定类型的系统组件(例如 Service、activity、ContentProvider,等等)的生命周期或生命周期语义。
- 设备不得更改标准权限的语义。
上述列表并不是详尽无遗的。兼容性测试套件 (CTS) 用于测试平台重要部分的行为兼容性,而不是测试整个平台的行为兼容性。实现者需负责确保与 Android 开源项目保持行为兼容。为此,设备实现者应尽可能使用通过 Android 开源项目获得的源代码,而不是重新实现系统的重要部分。
3.6. API 命名空间
Android 遵循 Java 编程语言定义的软件包和类命名空间惯例。为了确保与第三方应用兼容,设备实现者不得对以下软件包命名空间进行任何禁止执行的修改(见下文):
- java.*
- javax.*
- sun.*
- android.*
- com.android.*
禁止执行的修改操作包括:
- 设备实现不得通过更改任何方法或类签名或者通过移除类或类字段的方式,修改 Android 平台上公开提供的 API。
- 设备实现者可以修改 API 的底层实现,但此类修改不得影响任何公开提供的 API 的规定行为和 Java 语言签名。
- 设备实现者不得将任何公开提供的元素(例如类或接口,或者现有类或接口的字段或方法)添加到上述 API。
“公开提供的元素”是指在上游 Android 源代码中使用时不带“@hide”标记的任何构造。换言之,设备实现者不得在上述命名空间中提供新的 API 或更改现有的 API。设备实现者可以执行仅限于内部的修改,但不得向开发者通告或以其他方式公开这些修改。
设备实现者可以添加自定义 API,但任何此类 API 均不得位于归其他组织所有或指代其他组织的命名空间内。例如,设备实现者不得向 com.google.* 或类似命名空间添加 API;只有 Google 可以向此类命名空间添加 API。同样,Google 也不得向其他公司的命名空间添加 API。此外,如果设备实现包含标准 Android 命名空间之外的自定义 API,则必须将这些 API 打包到 Android 共享库中,以便只有明确使用它们的应用(通过 <uses-library> 机制)会受到此类 API 内存使用量增加的影响。
如果设备实现者提议改善上述某个软件包命名空间(例如通过向现有 API 添加实用的新功能,或通过添加新的 API),则实现者应访问 source.android.com,并按照该网站上的信息开始执行贡献更改和代码需要遵循的流程。
请注意,上述限制对应于 Java 编程语言中命名 API 的标准惯例;本节只是为了强调这些惯例,并通过将其纳入本兼容性定义文档来使其具有约束力。
3.7. 运行时兼容性
设备实现必须支持完整的 Dalvik 可执行文件 (DEX) 格式以及 Dalvik 字节码规范和语义。设备实现者应使用 ART、Dalvik 可执行文件格式的参考上游实现,以及该参考实现的软件包管理系统。
设备实现必须配置 Dalvik 运行时,以便根据上游 Android 平台来分配内存,如下表所示。(有关屏幕尺寸和屏幕密度定义,请参阅第 7.1.1 节。)请注意,下面指定的内存值被视为最小值,设备实现可以为每个应用分配更多内存。
屏幕布局 | 屏幕密度 | 最小应用内存 |
---|---|---|
Android Watch | 120 dpi (ldpi) | 32 MB |
160 dpi (mdpi) | ||
213 dpi (tvdpi) | ||
240 dpi (hdpi) | 36 MB | |
280 dpi (280dpi) | ||
320 dpi (xhdpi) | 48 MB | |
360 dpi (360dpi) | ||
400 dpi (400dpi) | 56 MB | |
420 dpi (420dpi) | 64 MB | |
480 dpi (xxhdpi) | 88 MB | |
560 dpi (560dpi) | 112 MB | |
640 dpi (xxxhdpi) | 154 MB | |
小/普通 | 120 dpi (ldpi) | 32 MB |
160 dpi (mdpi) | ||
213 dpi (tvdpi) | 48 MB | |
240 dpi (hdpi) | ||
280 dpi (280dpi) | ||
320 dpi (xhdpi) | 80 MB | |
360 dpi (360dpi) | ||
400 dpi (400dpi) | 96 MB | |
420 dpi (420dpi) | 112 MB | |
480 dpi (xxhdpi) | 128 MB | |
560 dpi (560dpi) | 192 MB | |
640 dpi (xxxhdpi) | 256 MB | |
大 | 120 dpi (ldpi) | 32 MB |
160 dpi (mdpi) | 48 MB | |
213 dpi (tvdpi) | 80 MB | |
240 dpi (hdpi) | ||
280 dpi (280dpi) | 96 MB | |
320 dpi (xhdpi) | 128 MB | |
360 dpi (360dpi) | 160 MB | |
400 dpi (400dpi) | 192 MB | |
420 dpi (420dpi) | 228 MB | |
480 dpi (xxhdpi) | 256 MB | |
560 dpi (560dpi) | 384 MB | |
640 dpi (xxxhdpi) | 512 MB | |
超大 | 120 dpi (ldpi) | 48 MB |
160 dpi (mdpi) | 80 MB | |
213 dpi (tvdpi) | 96 MB | |
240 dpi (hdpi) | ||
280 dpi (280dpi) | 144 MB | |
320 dpi (xhdpi) | 192 MB | |
360 dpi (360dpi) | 240 MB | |
400 dpi (400dpi) | 288 MB | |
420 dpi (420dpi) | 336 MB | |
480 dpi (xxhdpi) | 384 MB | |
560 dpi (560dpi) | 576 MB | |
640 dpi (xxxhdpi) | 768 MB |
3.8. 界面兼容性
3.8.1. 启动器(主屏幕)
Android 包含一个启动器应用(主屏幕),并且支持使用第三方应用替换设备启动器(主屏幕)。允许第三方应用替换设备主屏幕的设备实现必须声明平台功能 android.software.home_screen。
3.8.2. Widget
Android 定义了一个组件类型以及相应的 API 和生命周期,允许应用向最终用户提供“AppWidget”(强烈建议手持设备实现支持该功能)。如果设备实现支持在主屏幕上嵌入 widget,则必须满足以下要求,并声明支持平台功能 android.software.app_widgets。
- 设备启动器必须包含对 AppWidget 的内置支持,并提供用于直接在启动器中添加、配置、查看和移除 AppWidget 的界面功能。
- 设备实现必须能够呈现标准网格大小为 4 x 4 的 widget。如需了解详细信息,请参阅 Android SDK 文档中的应用 widget 设计指南。
- 如果设备实现支持锁定屏幕,则可以支持锁定屏幕上的应用 widget。
3.8.3. 通知
Android 包含一些 API,允许开发者使用设备的硬件和软件功能通知用户值得注意的事件。
一些 API 允许应用使用硬件功能(具体来说是使用声音、振动和指示灯)来发出通知或吸引用户注意。设备实现必须尽可能使用设备实现硬件来支持使用硬件功能的通知(如 SDK 文档中所述)。例如,如果设备实现包含振动器,则必须正确实现振动 API。如果设备实现缺少硬件,则必须将对应的 API 实现为空操作。第 7 节中对此行为进行了进一步的详细说明。
此外,实现必须正确呈现 API 或状态/系统栏图标样式指南中提供的所有资源(图标、动画文件等),但也有可能不显示通知(就 Android TV 设备而言)。设备实现者可以为用户提供替代通知体验,而不使用参考 Android 开源实现提供的体验;不过,此类替代通知系统必须支持现有的通知资源(如上所述)。
Android 支持各种通知,如:
- 内容丰富的通知。持续性通知的互动式视图。
- 浮动通知。互动式视图用户可以执行操作或将其关闭而不离开当前的应用。
- 锁定屏幕通知。在锁定屏幕上显示的通知,可对可见性进行精细控制。
当此类通知设为可见时,Android 设备实现必须正确执行内容丰富的通知和浮动通知,并包含 Android API 中所述的标题/名称、图标和文本。
Android 包含 Notification Listener Service API,任何通知一经发布或更新,此类 API 便可让应用(用户明确启用后)收到其副本。设备实现必须正确及时地将通知完整地发送到所有已安装且用户已启用的此类监听器服务,包括附加到通知对象的所有元数据。
手持设备实现必须支持相应章节中介绍的更新、移除、回复和捆绑通知的行为。
此外,手持设备实现还必须提供:
- 直接在通知栏中控制通知的功能。
- 在通知栏中触发控制面板的可见内容。
- 在内嵌控制面板以及设置应用中屏蔽、静音和重置软件包的通知偏好设置的功能。
必须支持 Notification.Style class
的 6 个直接子类(如 SDK 文档中所述)。
支持 DND(勿扰)功能的设备实现必须满足以下要求:
- 必须实现会响应 ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS intent 的 activity;对于设置为 UI_MODE_TYPE_NORMAL 的实现,它必须是用户可用于授权或拒绝应用访问 DND 政策配置的 activity。
- 当设备实现为用户提供了用于授权或拒绝第三方应用访问 DND 政策配置的方式时,必须随同用户创建的规则和预定义的规则一起显示应用创建的自动 DND 规则。
- 必须遵从随同
NotificationManager.Policy
传递的suppressedVisualEffects
值;如果应用已设置 SUPPRESSED_EFFECT_SCREEN_OFF 或 SUPPRESSED_EFFECT_SCREEN_ON 标志,则应向用户指明 DND 设置菜单中不会显现视觉效果。
3.8.4. 搜索
Android 包含一些可让开发者在其应用中纳入搜索功能以及将其应用中的数据提供给全局系统搜索功能使用的 API。一般来说,此功能会包括一个系统级界面,以便用户输入查询、在用户输入内容时显示建议,以及显示搜索结果。这些 Android API 可让开发者重复使用此界面,以在其应用内提供搜索功能,还可让开发者向通用的全局搜索界面提供搜索结果。
Android 设备实现应包含全局搜索界面,即单个共享的系统级搜索界面,能够在用户输入内容时实时提供建议。设备实现应实现一些 API,以供开发者重复使用此界面,从而在其应用内提供搜索功能。实现全局搜索界面的设备实现必须实现一些 API,让第三方应用在全局搜索模式下运行时可向搜索框中添加建议。如果没有安装任何可利用此功能的第三方应用,则默认行为应为显示 Web 搜索引擎的搜索结果和建议。
Android 设备实现应(而 Android Automotive 实现则必须)在设备上实现辅助程序来处理辅助操作。
Android 还包含一些辅助 API,以便应用选择与设备上的辅助程序分享多少关于当前上下文的信息。支持辅助操作的设备实现必须通过在屏幕边缘显示白光来向最终用户清楚说明何时分享上下文。为了确保向最终用户清楚显示,这种指示必须达到或超过 Android 开源项目实现的持续时间和亮度。
默认情况下,如果满足下列所有要求,则可以使用 Assist and VoiceInteractionService API 对预安装的应用默认停用这种指示:
-
预安装的应用必须仅在用户通过以下方式之一调用应用且该应用正在前台运行时请求分享上下文:
- 启动指令调用
- ASSIST 导航键/按钮/手势输入
-
设备实现必须提供具体途径来启用这种指示,与 3.2.3.5 节中提及的默认语音输入和辅助应用设置菜单之间所需的导航不到两步。
3.8.5. 消息框
应用可以使用“Toast” API 向最终用户显示简短的非模态字符串,这些字符串会在短暂显示后消失。设备实现必须以某种可见性非常高的方式向最终用户显示来自应用的消息框。
3.8.6. 主题
Android 提供“主题背景”这一机制,以供应用在整个 activity 或应用中应用样式。
Android 包含“Holo”主题系列(一组预定义的样式),如果应用开发者想要与 Android SDK 定义的 Holo 主题外观和风格保持一致,则可以使用它们。设备实现不得改变提供给应用的任何 Holo 主题属性。
Android 还包含一个“Material”主题系列(一组定义的样式),如果应用开发者想要在各种不同类型的 Android 设备上与设计主题的外观和风格保持一致,则可以使用它们。设备实现必须支持“Material”主题系列,并且不得改变提供给应用的任何 Material 主题属性或其资源。
Android 还包含一个“Device Default”主题系列(一组已定义的样式),如果应用开发者希望与设备实现者定义的设备主题的外观和风格保持一致,可以使用该主题系列。设备实现可以修改可供应用使用的 Device Default 主题属性。
Android 支持带有半透明系统栏的变体主题,以便应用开发者将其应用内容填充到状态栏和导航栏后面的区域。为了在采用此配置时实现一致的开发者体验,请务必在不同的设备实现之间保持一致的状态栏图标样式。因此,Android 设备实现必须使用白色来显示系统状态图标(例如信号强度和电池电量)以及系统发出的通知,除非相应图标用于指明有问题状态,或者应用使用 SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 标志请求使用浅色状态栏。当应用请求浅色状态栏时,Android 设备实现必须将系统状态图标的颜色更改为黑色(如需了解详情,请参阅 R.style)。
3.8.7. 动态壁纸
Android 定义了一种组件类型以及对应的 API 和生命周期,以便应用向最终用户提供一个或多个动态壁纸。动态壁纸是具备有限输入功能且作为壁纸显示在其他应用之后的动画、图案或类似图片。
如果硬件能够在不限制功能且不会对其他应用造成负面影响的情况下,以合理的帧速率运行所有动态壁纸,则会被视为能够可靠地运行动态壁纸。如果硬件中的限制会导致壁纸和/或应用崩溃、无法正常运行、占用过多 CPU/消耗过多电池电量,或者运行时的帧速率低得令人无法接受,相应硬件会被视为无法运行动态壁纸。例如,有些动态壁纸可能会利用 OpenGL 2.0 或 3.x 上下文来呈现其内容。动态壁纸将无法在不支持多个 OpenGL 上下文的硬件上可靠地运行,因为使用 OpenGL 上下文的动态壁纸可能会与其他同样使用 OpenGL 上下文的应用发生冲突。
如果设备实现能够可靠地运行动态壁纸(如上所述),则应实现动态壁纸;实现之后,设备实现必须报告平台功能标志 android.software.live_wallpaper。
3.8.8. activity 切换
上游 Android 源代码包含概览屏幕,该屏幕是一个系统级界面,可用于切换任务,以及使用缩略图(对应于用户上次离开应用时应用的图形状态)显示用户最近访问的 activity 和任务。如果设备实现包含“最近用过”功能导航键(第 7.2.3 节中对此进行了详细说明),则可以更改该界面,但必须满足以下要求:
- 必须至少支持显示多达 20 个 activity。
- 一次应至少显示 4 个 activity 的名称。
- 必须实现屏幕固定行为,并向用户提供用于开启/关闭该功能的设置菜单。
- 应在“最近用过”中显示亮显颜色、图标和屏幕标题。
- 应显示关闭选项 (x),但可以延迟到用户与屏幕互动之后显示。
- 应实现一个可让用户轻松切换到前一个 activity 的快捷方式。
- 可以将“最近用过”的关联项显示为一组(它们会一起移动)。
- 当用户点按两次“最近用过”功能键时,应触发在最近用过的两个应用之间进行快速切换。
- 当用户长按“最近用过”功能键时,应触发分屏多窗口模式(如果支持的话)。
强烈建议设备实现为概览屏幕使用上游 Android 界面(或类似的基于缩略图的界面)。
3.8.9. 输入管理
Android 支持输入管理,并且支持第三方输入法。如果设备实现允许用户在设备上使用第三方输入法,则设备必须声明平台功能 android.software.input_methods,并支持 IME API(如 Android SDK 文档中所定义)。
如果设备实现声明了 android.software.input_methods 功能,则必须提供一种可供用户使用的机制,以便用户添加和配置第三方输入法。设备实现必须显示设置界面以响应 android.settings.INPUT_METHOD_SETTINGS intent。
3.8.10. 锁定屏幕媒体控件
Remote Control Client API 从 Android 5.0 开始便被废弃了,取而代之的是可让媒体应用与锁定屏幕上显示的播放控件相集成的媒体通知模板。支持锁定屏幕的设备实现(Android Automotive 或 Android Watch 实现除外)必须显示包含媒体通知模板的锁定屏幕通知。
3.8.11. 屏保(之前称为 Dreams)
Android 支持 interactivescreensavers,之前称为 Dreams。当接通电源的设备处于空闲状态或放在桌面基座中时,屏保让用户能够与应用互动。Android Watch 设备可以实现屏保,但其他类型的设备实现应支持屏保,并且应为用户提供用于配置屏保的设置选项,以便响应 android.settings.DREAM_SETTINGS
intent。
3.8.12. 位置信息
如果设备具有能够提供位置坐标的硬件传感器(例如 GPS),则必须在“设置”中的“位置信息”菜单中显示位置信息模式。
3.8.13. Unicode 和字体
Android 支持 Unicode 9.0 中定义的表情符号。所有设备实现都必须能够以彩色字形呈现这些表情符号;此外,如果 Android 设备实现包含 IME,则应向用户提供这些表情符号的输入法。
Android 手持设备应支持 Unicode 技术报告 #51 中指定的肤色和各种家庭表情符号。
Android 支持各种粗细的 Roboto 2 字体(sans-serif-thin、sans-serif-light、sans-serif-medium、sans-serif-black、sans-serif-condensed、sans-serif-condensed-light),必须针对设备上提供的语言、所有的拉丁语、希腊语和西里尔语 Unicode 7.0(包括拉丁语扩展 A、B、C 和 D)以及 Unicode 7.0 的货币符号块中的所有字形纳入所有这些字体。
3.8.14. 多窗口模式
设备实现可以选择不实现任何多窗口模式,但是如果能够同时显示多个 activity,则必须按照 Android SDK 多窗口模式支持文档中所述的应用行为和 API 实现此类多窗口模式,并满足以下要求:
- 应用可以在 AndroidManifest.xml 文件中表明它们是否能够以多窗口模式运行,并且可以通过
android:resizeableActivity
属性以显性方式指出,或通过使 targetSdkVersion 大于 24 以隐性方式指出。在清单中明确将该属性设置为 false 的应用不得在多窗口模式下启动。没有在清单文件中设置该属性的应用(targetSdkVersion 小于 24)可以在多窗口模式下启动,但系统必须发出警告,说明该应用可能无法在多窗口模式下正常运行。 - 如果屏幕高度和宽度均小于 440 dp,则设备实现不得提供分屏或自由窗口模式。
- 屏幕尺寸为
xlarge
的设备实现应支持自由窗口模式。 - Android TV 设备实现必须支持画中画 (PIP) 模式多窗口,并在开启画中画时,将画中画多窗口放在右上角。
- 支持画中画模式多窗口的设备实现必须为画中画窗口分配至少 240x135 dp。
- 如果支持画中画多窗口模式,必须使用
KeyEvent.KEYCODE_WINDOW
键控制画中画窗口;否则,该键必须可供前台 activity 使用。
3.9. 设备管理
Android 包含可让注重安全的应用在系统级执行设备管理功能的功能,例如通过 Android Device Administration API 强制执行密码政策或执行远程清除。设备实现必须提供 DevicePolicyManager 类的实现。支持安全锁定屏幕的设备实现必须实现 Android SDK 文档中定义的所有设备管理政策,并报告平台功能 android.software.device_admin。
3.9.1 设备配置
3.9.1.1 设备所有者配置
如果设备实现声明 android.software.device_admin
功能,则必须实现 Device Policy Client (DPC) 应用的设备所有者应用配置,如下所示:
- 如果设备实现尚未配置任何用户数据,则:
- 必须针对
DevicePolicyManager.isProvisioningAllowed(ACTION_PROVISION_MANAGED_DEVICE)
报告true
。 - 必须能够因应 intent 操作
android.app.action.PROVISION_MANAGED_DEVICE
将 DPC 应用注册为设备所有者应用。 - 如果设备通过
android.hardware.nfc
功能标志声明支持近距离无线通信 (NFC),并且它收到的 NFC 消息中包含 MIME 类型为MIME_TYPE_PROVISIONING_NFC
的记录,则必须将 DPC 应用注册为设备所有者应用。
- 必须针对
- 如果设备实现有用户数据,则:
- 必须针对
DevicePolicyManager.isProvisioningAllowed(ACTION_PROVISION_MANAGED_DEVICE)
报告false
。 - 不得再将任何 DPC 应用注册为设备所有者应用。
- 必须针对
设备实现可以具有执行设备管理功能的预安装应用,但是未经用户或设备管理员的明确同意或操作,不得将此应用设置为设备所有者应用。
3.9.1.2 受管理个人资料配置
如果设备实现声明 android.software.managed_users,则必须能够将设备政策控制器 (DPC) 应用注册为新受管理个人资料的所有者。
受管理个人资料配置流程(该流程由 android.app.action.PROVISION_MANAGED_PROFILE 启动)用户体验必须与 AOSP 实现保持一致。
当设备政策控制器 (DPC) 停用了某项系统功能时,设备实现必须在“设置”界面中提供以下用户可见内容,以便向用户指明这一点:
- 当设备管理员限制了某项设置时,显示一致的图标或其他用户可见内容(例如上游 AOSP 信息图标)来向用户指明这一点。
- 简短的说明消息,由设备管理员通过
setShortSupportMessage
提供。 - DPC 应用图标。
3.9.2 受管理个人资料支持
支持受管理个人资料的设备有如下特点:
- 声明 android.software.device_admin(请参阅 3.9 设备管理)。
- 不是低 RAM 设备(请参阅第 7.6.1 节)。
- 将内部(不可移除的)存储空间分配为共享存储空间(请参阅第 7.6.2 节)。
支持受管理个人资料的设备必须:
- 声明平台功能标志
android.software.managed_users
。 - 通过
android.app.admin.DevicePolicyManager
API 支持受管理个人资料。 - 允许且只允许创建一个受管理个人资料。
- 使用图标标记(类似于 AOSP 上游工作标记)来表示受管理应用和 widget 以及其他带有标记的界面元素(例如“最近用过”和“通知”)。
- 显示通知图标(类似于 AOSP 上游工作标记),以指示用户何时位于受管理个人资料应用中。
- 当设备被唤醒 (ACTION_USER_PRESENT) 且前台应用在受管理个人资料中时,显示表明用户位于受管理个人资料中的消息框。
- 如果存在受管理个人资料,并且该个人资料已由设备政策控制器启用,则在 intent“选择器”中显示可见方式,以便用户将 intent 从受管理个人资料转发给主要用户,反之亦然。
- 如果存在受管理个人资料,则为主要用户和受管理个人资料提供以下用户可见内容:
- 分别计算主要用户和受管理个人资料的耗电量、位置信息、移动流量和存储空间用量。
- 单独管理安装在主要用户或受管理个人资料中的 VPN 应用。
- 单独管理安装在主要用户或受管理个人资料中的应用。
- 单独管理主要用户或受管理个人资料中的账号。
- 如果设备政策控制器允许,则确保预安装的拨号器、通讯录和即时通讯应用可以搜索和查询受管理个人资料(如果存在)以及主要个人资料中的来电者信息。当受管理个人资料中的联系人信息显示在预安装的通话记录、通话界面、进行中和未接来电提醒、通讯录和即时通讯应用中时,它们应带有用于表示受管理个人资料应用的相同标记。
- 必须确保满足适用于启用了多位用户的设备的所有安全性要求(请参阅第 9.5 节),虽然除了主要用户之外,受管理个人资料不算作其他用户。
- 支持指定满足以下要求的单独锁定屏幕,以便向在受管理个人资料中运行的应用授予访问权限。
- 设备实现必须遵从
DevicePolicyManager.ACTION_SET_NEW_PASSWORD
intent,并显示一个界面,以便用户为受管理个人资料配置单独的锁定屏幕凭据。 - 受管理个人资料的锁定屏幕凭据必须使用与父级个人资料相同的凭据存储和管理机制,如 Android 开源项目网站上所述。
- 除非在通过 getParentProfileInstance 返回的
DevicePolicyManager
实例上被调用,否则 DPC 密码政策必须仅适用于受管理个人资料的锁定屏幕凭据。
- 设备实现必须遵从
3.10. 无障碍功能
Android 提供了一个无障碍服务层,以便残障用户更轻松地在设备上进行导航。此外,Android 还提供了一些平台 API,以便无障碍服务实现能够接收针对用户和系统事件的回调并生成替代反馈机制,例如文字转语音、触感反馈,以及轨迹球/方向键导航。
设备实现包括以下要求:
- Android Automotive 实现应提供与默认 Android 实现一致的 Android 无障碍功能框架实现。
- 设备实现(Android Automotive 除外)必须提供与默认 Android 实现一致的 Android 无障碍功能框架实现。
- 设备实现(Android Automotive 除外)必须通过 android.accessibilityservice API 支持第三方无障碍服务实现。
- 设备实现(Android Automotive 除外)必须生成 AccessibilityEvent 并按照与默认 Android 实现一致的方式将这些事件提交到所有已注册的 AccessibilityService 实现
-
设备实现(无音频输出的 Android Automotive 和 Android Watch 设备除外)必须提供一种用户可访问的机制来启用和停用无障碍服务,并且必须显示此界面以响应 android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS intent。
-
强烈建议具有音频输出的 Android 设备实现在设备上提供与 TalkBack** 和开关控制无障碍服务 (https://github.com/google/talkback) 的功能相当甚至更胜一筹的无障碍服务实现。
- 具有音频输出的 Android Watch 设备应在设备上提供与 TalkBack 无障碍服务 (https://github.com/google/talkback) 的功能相当甚至更胜一筹的无障碍服务实现。
- 设备实现应在开箱设置流程中提供一种可让用户启用相关无障碍服务的机制,以及用于调整字体大小、显示区域大小和放大手势的选项。
** 针对文字转语音服务支持的语言。
另请注意,如果存在预加载的无障碍服务,并且相应设备已使用文件级加密 (FBE) 来加密存储,则该服务必须是直接启动感知型 {directBootAware} 应用。
3.11. 文字转语音
Android 包含一些可让应用使用文字转语音 (TTS) 服务的 API,并允许服务提供商提供 TTS 服务实现。如果设备实现报告 android.hardware.audio.output 功能,则必须满足以下与 Android TTS 框架相关的要求。
Android Automotive 实现:
- 必须支持 Android TTS 框架 API。
- 可以支持安装第三方 TTS 引擎。如果支持,合作伙伴必须提供一个可供用户使用的界面,以便用户选择在系统一级使用的 TTS 引擎。
所有其他设备实现:
- 必须支持 Android TTS 框架 API,并且应包含支持设备上可用语言的 TTS 引擎。请注意,上游 Android 开源软件包含功能完善的 TTS 引擎实现。
- 必须支持安装第三方 TTS 引擎。
- 必须提供一个可供用户使用的界面,以便用户选择在系统级使用的 TTS 引擎。
3.12. TV 输入框架
Android TV 输入框架 (TIF) 能够简化向 Android TV 设备传输实时内容的过程。TIF 提供了一个相应的标准 API,以便创建用于控制 Android TV 设备的输入模块。Android TV 设备实现必须支持 TV 输入框架。
支持 TIF 的设备实现必须声明平台功能 android.software.live_tv。
3.12.1. TV 应用
任何声明支持电视直播的设备实现都必须安装 TV 应用。Android 开源项目提供了 TV 应用的实现。
TV 应用必须提供用于安装和使用电视频道的方式,并满足以下要求。
- 设备实必须允许安装和管理基于 TIF 的第三方输入法(第三方输入法)。
- 设备实现可以在外观上区分预安装的基于 TIF 的输入法(已安装的输入法)和第三方输入法。
- 设备实现不得将第三方输入法显示在距离 TV 应用不超过一个导航操作的位置(例如从 TV 应用展开第三方输入法列表)。
3.12.1.1. 电子收视指南
Android TV 设备实现必须显示一个提供信息的互动叠加层,其中必须包含根据 TvContract.Programs 字段中的值生成的电子收视指南 (EPG)。EPG 必须满足以下要求:
- EPG 必须显示来自所有已安装输入法和第三方输入法的信息。
- EPG 可以在外观上区分已安装的输入法和第三方输入法。
- 强烈建议 EPG 以同等的突出程度显示已安装的输入法和第三方输入法。EPG 不得将第三方输入法显示在距离 EPG 中的已安装输入法不超过一个导航操作的位置。
- 更换频道时,设备实现必须显示当前正在播放的节目的 EPG 数据。
3.12.1.2. 导航
TV 应用必须支持通过 Android TV 设备的输入设备(例如遥控器、遥控器应用或游戏控制器)上的方向键、“返回”键和“主屏幕”键导航以下功能:
- 更换电视频道
- 打开 EPG
- 配置和微调基于 TIF 的第三方输入
- 打开“设置”菜单
TV 应用应通过 CEC 将按键事件传递到 HDMI 输入机制。
3.12.1.3. TV 输入应用链接
Android TV 设备实现必须支持 TV 输入应用链接,以便所有输入法都提供从当前 activity 到其他 activity 的 activity 链接(例如从直播节目到相关内容的链接)。如果提供 TV 输入应用链接,则 TV 应用必须显示该链接。
3.12.1.4. 时移
Android TV 设备实现必须支持时移,以便用户暂停和继续播放实时内容。设备实现必须为用户提供一种方式,让他们能够暂停和恢复播放当前正在播放的节目(如果可以对相应节目使用时移功能的话)。
3.12.1.5. TV 录制
强烈建议 Android TV 设备实现支持 TV 录制。如果 TV 输入法支持录制,则 EPG 可以提供录制节目的方式,前提是相关节目没有被禁止录制。设备实现应提供一个界面来播放录制的节目。
3.13. 快捷设置
Android 设备实现应包含一个“快捷设置”界面组件,以便用户快速进行频繁执行或急需执行的操作。
Android 包含 quicksettings
API,可让第三方应用实现用户可以添加的图块以及“快捷设置”界面组件中由系统提供的图块。如果设备实现具有“快捷设置”界面组件,则:
- 必须允许用户向快捷设置中添加第三方应用中的图块,或从中移除图块。
- 不得自动将第三方应用中的图块直接添加到快捷设置中。
- 必须显示第三方应用中的所有用户添加的图块以及系统提供的快捷设置图块。
3.14. 车载界面 API
3.14.1. 车载媒体界面
声明汽车支持的所有设备实现都必须包含界面框架,以支持使用 MediaBrowser API 和 MediaSession API 的第三方应用。
支持依赖于 MediaBrowser 和 MediaSession 的第三方应用的界面框架具有以下外观方面的要求:
- 必须照原样显示 MediaItem 图标和通知图标。
- 必须按照 MediaSession 所述显示这些内容,例如元数据、图标、图像。
- 必须显示应用名称。
- 必须有用于呈现 MediaBrowser 层次结构的抽屉式导航栏。
4. 应用打包兼容性
设备实现必须安装并运行官方 Android SDK 中包含的“aapt”工具生成的 Android“.apk”文件。因此,设备实现应使用参考实现的软件包管理系统。
软件包管理器必须支持使用 APK 签名方案 v2 和 JAR 签名验证“.apk”文件。
设备实现不得通过会导致相应文件无法在其他兼容设备上正确安装和运行的方式扩展 .apk、Android 清单、Dalvik 字节码或 RenderScript 字节码格式。
设备实现不得允许应用(软件包的当前“录制安装程序”除外)在没有任何提示的情况下静默卸载应用,如 SDK 中关于 DELETE_PACKAGE
权限的部分所述。仅有的两个例外应用是:负责处理 PACKAGE_NEEDS_VERIFICATION intent 的系统软件包验证程序应用,和负责处理 ACTION_MANAGE_STORAGE intent 的存储空间管理器应用。
5. 多媒体兼容性
5.1. 媒体编解码器
设备实现:
-
必须支持 Android SDK 文档中指定的核心媒体格式,但此文档中明确允许的情况除外。
-
必须支持下表中定义的媒体格式、编码器、解码器、文件类型和容器格式,并通过 MediaCodecList 报告。
-
还必须能够解码其 CamcorderProfile 中报告的所有配置文件。
-
必须能够对其可编码的所有格式进行解码,其中包括其编码器生成的所有比特流。
编解码器的目标应是最大限度地缩短编解码器延迟时间,也就是说,编解码器:
- 不应使用和存储输入缓冲区,而应在处理之后将其返回。
- 持有已解码缓冲区的时间不应超过相应标准(例如 SPS)指定的时间。
- 持有已编码缓冲区的时间不应超过 GOP 结构所要求的时间。
下表中列出的所有编解码器均作为 Android 开源项目的首选 Android 实现中的软件实现提供。
请注意,Google 和开放手机联盟 (Open Handset Alliance) 均未做过任何关于这些编解码器中没有第三方专利的声明。打算在硬件或软件产品中使用此源代码的用户请注意,实现此代码(包括在开源软件或共享软件中实现此代码)可能需要获得相关专利持有者的专利许可。
5.1.1. 音频编解码器
格式/编解码器 | 编码器 | 解码器 | 详细信息 | 支持的文件类型/容器格式 |
---|---|---|---|---|
MPEG-4 AAC Profile (AAC LC) |
必需 1 | 必需 | 支持单声道/立体声/5.0/5.1 2 内容,标准采样率为 8-48 kHz。 |
|
MPEG-4 HE AAC Profile (AAC+) |
必需 1 (Android 4.1+) |
必需 | 支持单声道/立体声/5.0/5.1 2 内容,标准采样率为 16-48 kHz。 | |
MPEG-4 HE AACv2 Profile(增强型 AAC+) |
必需 | 支持单声道/立体声/5.0/5.1 2 内容,标准采样率为 16-48 kHz。 | ||
AAC ELD(增强型低延迟 AAC) |
必需 1 (Android 4.1+) |
必需 (Android 4.1+) |
支持单声道/立体声内容,标准采样率为 16-48 kHz。 | |
AMR-NB | 必需 3 | 必需 3 | 4.75-12.2 kbps,采样率为 8 kHz | 3GPP (.3gp) |
AMR-WB | 必需 3 | 必需 3 | 有 9 个比特率(介于 6.60-23.85 kbit/s 之间)可供选择,采样率为 16 kHz | |
FLAC |
必需 (Android 3.1+) |
单声道/立体声(非多声道)。采样率最高可达 48 kHz(但对于输出为 44.1 kHz 的设备,建议最高不超过 44.1 kHz,因为 48-44.1 kHz 的降采样器不包含低通滤波器)。建议使用 16 位;对于 24 位,不会应用任何抖动。 | 仅支持 FLAC (.flac) | |
MP3 | 必需 | 单声道/立体声 8-320 Kbps 恒定 (CBR) 或可变比特率 (VBR) | MP3 (.mp3) | |
MIDI | 必需 | MIDI 类型 0 和 1。DLS 版本 1 和 2。XMF 和 Mobile XMF。支持铃声格式 RTTTL/RTX、OTA 和 iMelody |
|
|
Vorbis | 必需 |
|
||
PCM/WAVE |
必需 4 (Android 4.1+) |
必需 | 16 位线性 PCM(比特率最高可达到硬件上限)。设备必须支持以 8000、11025、16000 和 44100 Hz 频率录制原始 PCM 所需的采样率。 | WAVE (.wav) |
Opus |
必需 (Android 5.0+) |
Matroska (.mkv)、Ogg (.ogg) |
1 对于定义 android.hardware.microphone 的设备实现而言是必需的;但对于 Android Watch 设备实现而言则是可选的。
2 可以单声道或立体声进行录制或播放,但是可以通过 android.media.MediaCodec API 中的默认 AAC 音频解码器将多声道音频串流(即超过两个声道)的 AAC 输入缓冲区解码为 PCM,必须支持以下各项:
- 在不缩混的情况下进行解码(例如必须将 5.0 AAC 音频串流解码为五声道 PCM,必须将 5.1 AAC 音频串流解码为六声道 PCM)。
- 动态范围元数据(如 ISO/IEC 14496-3 中“动态范围控制 (DRC)”部分所定义)和用于配置与动态范围相关的音频解码器行为的 android.media.MediaFormat DRC 键。这些 AAC DRC 键是在 API 21 中引入的,分别为:KEY_AAC_DRC_ATTENUATION_FACTOR、KEY_AAC_DRC_BOOST_FACTOR、KEY_AAC_DRC_HEAVY_COMPRESSION、KEY_AAC_DRC_TARGET_REFERENCE_LEVEL 和 KEY_AAC_ENCODED_TARGET_LEVEL
3 对于 Android 手持设备实现而言是必需的。
4 对于定义 android.hardware.microphone 的设备实现(包括 Android Watch 设备实现)而言是必需的。
5.1.2. 图像编解码器
格式/编解码器 | 编码器 | 解码器 | 详细信息 | 支持的文件类型/容器格式 |
---|---|---|---|---|
JPEG | 必需 | 必需 | 基准式 + 渐进式 | JPEG (.jpg) |
GIF | 必需 | GIF (.gif) | ||
PNG | 必需 | 必需 | PNG (.png) | |
BMP | 必需 | BMP (.bmp) | ||
WebP | 必需 | 必需 | WebP (.webp) | |
Raw | 必需 | ARW (.arw)、CR2 (.cr2)、DNG (.dng)、NEF (.nef)、NRW (.nrw)、ORF (.orf)、PEF (.pef)、RAF (.raf)、RW2 (.rw2)、SRW (.srw) |
5.1.3. 视频编解码器
-
编解码器通告 HDR 配置文件支持必须支持解析和处理 HDR 静态元数据。
-
如果媒体编解码器公开支持内部刷新,则必须支持范围在 10-60 帧的刷新周期,并在配置的刷新周期的 20% 内准确运行。
-
视频编解码器必须支持符合以下条件的输出和输入字节缓冲区大小:能够容纳相应标准和配置规定的最大可行压缩帧和未压缩帧,并且不会过度分配。
-
视频编码器和解码器必须支持 YUV420 灵活颜色格式 (COLOR_FormatYUV420Flexible)。
格式/编解码器 | 编码器 | 解码器 | 详细信息 |
支持的文件类型/ 容器格式 |
---|---|---|---|---|
H.263 | 可以 | 可以 |
|
|
H.264 AVC | 必需 2 | 必需 2 | 如需了解详细信息,请参阅第 5.2 节和第 5.3 节 |
|
H.265 HEVC | 必需 5 | 如需了解详情,请参阅第 5.3 节 | MPEG-4 (.mp4) | |
MPEG-2 | 强烈建议 6 | Main Profile | MPEG2-TS | |
MPEG-4 SP | 必需 2 | 3GPP (.3gp) | ||
VP8 3 |
必需 2 (Android 4.3+) |
必需 2 (Android 2.3.3+) |
如需了解详细信息,请参阅第 5.2 节和第 5.3 节 |
|
VP9 |
必需 2 (Android 4.4+) |
如需了解详情,请参阅第 5.3 节 |
|
1 对于包含摄像头硬件且定义 android.hardware.camera 或 android.hardware.camera.front 的设备实现而言是必需的。
2 对于除了 Android Watch 设备之外的设备实现而言是必需的。
3 为了使网络视频串流和视频会议服务的质量达到可接受的水平,设备实现应使用满足要求的硬件 VP8 编解码器。
4 设备实现应支持写入 Matroska WebM 文件。
5 对于 Android Automotive 而言强烈建议;对于 Android Watch 而言可选;对于所有其他设备类型而言则必需。
6 仅适用于 Android TV 设备实现。
5.2. 视频编码
H.264、VP8、VP9 和 HEVC 视频编码器:
- 必须支持可动态配置的比特率。
- 应支持可变帧速率,在这种情况下,视频编码器应根据输入缓冲区的时间戳来确定瞬时帧时长,并根据该帧时长来分配其位存储分区。
H.263 和 MPEG-4 视频编码器应支持可动态配置的比特率。
所有视频编码器应通过两个滑动的窗口实现以下比特率目标:
- 它比帧内 (I-frame) 间隔之间的比特率高出的幅度不应超过 15% 左右。
- 它比采用一个 1 秒的滑窗时的比特率高出的幅度不应超过 100% 左右。
5.2.1. H.263
具有 H.263 编码器的 Android 设备实现必须支持 Baseline Profile Level 45。
5.2.2. H-264
支持 H.264 编解码器的 Android 设备实现:
- 必须支持 Baseline Profile Level 3。
不过,可以选择是否支持 ASO(任意切片顺序)、FMO(灵活宏块顺序)和 RS(冗切片)。此外,为了保持与其他 Android 设备兼容,对于 Baseline Profile,建议编码器不要使用 ASO、FMO 和 RS。 - 必须支持下表中的 SD(标清)视频编码配置文件。
- 应支持 Main Profile Level 4。
- 应支持下表中所列的高清视频编码配置。
- 此外,强烈建议 Android TV 设备以 30 fps 的速率对高清 1080p 视频进行编码。
标清(低画质) | 标清(高画质) | 高清 720p 1 | 高清 1080p 1 | |
---|---|---|---|---|
视频分辨率 | 320 x 240 像素 | 720 x 480 像素 | 1280 x 720 像素 | 1920 x 1080 像素 |
视频帧速率 | 20 fps | 30 fps | 30 fps | 30 fps |
视频比特率 | 384 Kbps | 2 Mbps | 4 Mbps | 10 Mbps |
1 当硬件支持时,但强烈建议 Android TV 设备采用。
5.2.3. VP8
支持 VP8 编解码器的 Android 设备实现必须支持标清视频编码配置文件,并且应支持以下高清视频编码配置文件。
标清(低画质) | 标清(高画质) | 高清 720p 1 | 高清 1080p 1 | |
---|---|---|---|---|
视频分辨率 | 320 x 180 像素 | 640 x 360 像素 | 1280 x 720 像素 | 1920 x 1080 像素 |
视频帧速率 | 30 fps | 30 fps | 30 fps | 30 fps |
视频比特率 | 800 Kbps | 2 Mbps | 4 Mbps | 10 Mbps |
1 当硬件支持时。
5.3. 视频解码
设备实现:
-
对于所有 VP8、VP9、H.264 和 H.265 编解码器,都必须支持通过标准 Android API 在同一视频串流内实时进行动态视频分辨率和帧速率切换,并且能够支持设备上每个编解码器所支持的最大分辨率。
-
支持杜比视界解码器的实现:
- 必须提供具有杜比视界功能的提取器。
-
必须在设备屏幕或标准视频输出端口(例如 HDMI)上正确显示杜比视界内容。
-
提供具有杜比视界功能的提取器的实现必须将向后兼容的基本层(如果存在)的轨道索引设置为与组合的杜比视界层的轨道索引相同。
5.3.1. MPEG-2
具有 MPEG-2 解码器的 Android 设备实现必须支持 Main Profile High Level。
5.3.2. H.263
具有 H.263 解码器的 Android 设备实现必须支持 Baseline Profile Level 30 和 Level 45。
5.3.3. MPEG-4
具有 MPEG-4 解码器的 Android 设备实现必须支持 Simple Profile Level 3。
5.3.4. H.264
具有 H.264 解码器的 Android 设备实现:
- 必须支持 Main Profile Level 3.1 和 Baseline Profile。
可以选择是否支持 ASO(任意切片顺序)、FMO(灵活宏块顺序)和 RS(冗切片)。 - 必须能够对以下视频进行解码:采用下表中所列的标清配置,且使用 Baseline Profile 和 Main Profile Level 3.1(包括 720p30)编码的视频。
- 应能够对采用下表中所列高清配置的视频进行解码。
- 此外,Android TV 设备必须满足以下条件:
- 必须支持 High Profile Level 4.2 和高清 1080p60 解码配置文件。
- 必须能够使用下表中所列的两个高清配置文件对视频进行解码,并使用 Baseline Profile、Main Profile 或 High Profile Level 4.2 进行编码
标清(低画质) | 标清(高画质) | 高清 720p 1 | 高清 1080p 1 | |
---|---|---|---|---|
视频分辨率 | 320 x 240 像素 | 720 x 480 像素 | 1280 x 720 像素 | 1920 x 1080 像素 |
视频帧速率 | 30 fps | 30 fps | 60 fps | 30 fps (60 fps 2 ) |
视频比特率 | 800 Kbps | 2 Mbps | 8 Mbps | 20 Mbps |
1 当 Display.getSupportedModes() 方法报告的高度等于或大于视频分辨率时,这是必需的。
2 对于 Android TV 设备实现而言是必需的。
5.3.5. H.265 (HEVC)
支持第 5.1.3 节中所述的 H.265 编解码器时,Android 设备实现:
- 必须支持 Main Profile Level 3 Main Tier 和下表中所列的标清视频解码配置文件。
- 应支持下表中所列的高清解码配置。
- 必须支持下表中所列的高清解码配置文件(如果有硬件解码器)。
- 此外,Android TV 设备:
- 必须支持高清 720p 解码配置文件。
- 强烈建议支持高清 1080p 解码配置文件。如果支持高清 1080p 解码配置文件,则必须支持 Main Profile Level 4.1 Main Tier。
- 应支持超高清解码配置文件。如果支持超高清解码配置文件,则编解码器必须支持 Main10 Level 5 Main Tier 配置文件。
标清(低画质) | 标清(高画质) | 高清 720p | 高清 1080p | 超高清 | |
---|---|---|---|---|---|
视频分辨率 | 352 x 288 像素 | 720 x 480 像素 | 1280 x 720 像素 | 1920 x 1080 像素 | 3840 x 2160 像素 |
视频帧速率 | 30 fps | 30 fps | 30 fps | 30 fps (60 fps 1 ) | 60 fps |
视频比特率 | 600 Kbps | 1.6 Mbps | 4 Mbps | 5 Mbps | 20 Mbps |
1 对于具有 H.265 硬件解码的 Android TV 设备实现而言是必需的。
5.3.6. VP8
Android 设备实现如果支持第 5.1.3 节中所述的 VP8 编解码器,那么:
- 必须支持下表中的标清解码配置文件。
- 应支持下表中的高清解码配置。
- Android TV 设备必须支持高清 1080p60 解码配置文件。
标清(低画质) | 标清(高画质) | 高清 720p 1 | 高清 1080p 1 | |
---|---|---|---|---|
视频分辨率 | 320 x 180 像素 | 640 x 360 像素 | 1280 x 720 像素 | 1920 x 1080 像素 |
视频帧速率 | 30 fps | 30 fps | 30 fps (60 fps 2 ) | 30 (60 fps 2 ) |
视频比特率 | 800 Kbps | 2 Mbps | 8 Mbps | 20 Mbps |
1 当 Display.getSupportedModes() 方法报告的高度等于或大于视频分辨率时,这是必需的。
2 对于 Android TV 设备实现而言是必需的。
5.3.7. VP9
Android 设备实现如果支持第 5.1.3 节中所述的 VP9 编解码器,那么:
- 必须支持下表中所列的标清视频解码配置文件。
- 应支持下表中所列的高清解码配置。
- 必须支持下表中所列的高清解码配置文件(如果有硬件解码器)。
-
此外,Android TV 设备:
- 必须支持高清 720p 解码配置文件。
- 强烈建议支持高清 1080p 解码配置文件。
- 应支持超高清解码配置文件。如果支持超高清视频解码配置文件,则必须支持 8 位色深,并且应支持 VP9 Profile 2(10 位)。
标清(低画质) | 标清(高画质) | 高清 720p | 高清 1080p | 超高清 | |
---|---|---|---|---|---|
视频分辨率 | 320 x 180 像素 | 640 x 360 像素 | 1280 x 720 像素 | 1920 x 1080 像素 | 3840 x 2160 像素 |
视频帧速率 | 30 fps | 30 fps | 30 fps | 30 fps (60 fps 1 ) | 60 fps |
视频比特率 | 600 Kbps | 1.6 Mbps | 4 Mbps | 5 Mbps | 20 Mbps |
1 对于具有 VP9 硬件解码的 Android TV 设备实现而言是必需的。
5.4. 录音
虽然从 Android 4.3 开始,本节中所述的一些要求列为了“应该”满足的要求,但我们计划在未来版本的兼容性定义中将其更改为“必须”满足的要求。强烈建议现有的及新的 Android 设备满足这些列为“应该”满足的要求,否则在升级到未来版本后将无法与 Android 兼容。
5.4.1. 原始音频捕获
声明 android.hardware.microphone 的设备实现必须允许截取具有以下特征的原始音频内容:
- 格式:线性 PCM、16 位
- 采样率:8000、11025、16000、44100
- 声道:单声道
必须在无需进行升采样的情况下捕获上述采样率,所有降采样均必须包含相应的抗混叠滤波器。
声明 android.hardware.microphone 的设备实现应允许捕获具有以下特征的原始音频内容:
- 格式:线性 PCM、16 位
- 采样率:22050、48000
- 声道:立体声
如果支持捕获上述采样率,则必须在无需进行升采样的情况下完成,采样率高于 16000:22050 或 44100:48000。所有升采样或降采样均必须包含相应的抗混叠滤波器。
5.4.2. 捕获音频串流以进行语音识别
android.media.MediaRecorder.AudioSource.VOICE_RECOGNITION 音频来源必须支持以 44100 或 48000 采样率进行捕获。
除了上述录制规范外,当应用已经开始使用 android.media.MediaRecorder.AudioSource.VOICE_RECOGNITION 音频源录制音频串流时:
- 设备应表现出大致平坦的幅频特性:具体来说就是 ±3 dB,100-4000 Hz。
- 应对音频输入敏感度进行相应设置,以确保频率为 1000 Hz 的 90 dB 声压级 (SPL) 音频源会产生 RMS 为 2500 的 16 位样本。
- 如果麦克风上的 SPL 为 90 dB,PCM 振幅级应能够线性跟踪输入 SPL 在至少 30 dB(-18 dB 到 +12 dB)范围内的变化。
- 当麦克风上是以 90 dB SPL 的 1 kHz 声音进行输入时,总谐波畸变率应小于 1%。
- 必须停用降噪处理(如果有)。
- 必须停用自动增益控制(如果有)。
如果平台支持针对语音识别进行调整的噪音抑制技术,则必须能通过 android.media.audiofx.NoiseSuppressor API 来控制此音频效果。此外,噪音抑制器效果描述符的 UUID 字段必须唯一地标识噪音抑制技术的每个实现。
5.4.3. 捕获音频串流以进行播放重定向
android.media.MediaRecorder.AudioSource 类包含 REMOTE_SUBMIX 音频源。声明 android.hardware.audio.output 的设备必须正确实现 REMOTE_SUBMIX 音频源。这样一来,当应用使用 android.media.AudioRecord API 从该音频源录制时,便可捕获除以下音频串流之外的所有音频串流的混音:
- STREAM_RING
- STREAM_ALARM
- STREAM_NOTIFICATION
5.5. 音频播放
如果设备实现声明 android.hardware.audio.output,则必须符合本节中的要求。
5.5.1. 原始音频播放
设备必须允许播放具有以下特性的原始音频内容:
- 格式:线性 PCM、16 位
- 采样率:8000、11025、16000、22050、32000、44100
- 声道:单声道、立体声
设备应允许播放具有以下特性的原始音频内容:
- 采样率:24000、48000
5.5.2. 音效
Android 为设备实现提供了音效 API。如果设备实现声明 android.hardware.audio.output 功能,则:
- 必须支持 EFFECT_TYPE_EQUALIZER 和 EFFECT_TYPE_LOUDNESS_ENHANCER 实现,这两种实现可通过 AudioEffect 子类(Equalizer、LoudnessEnhancer)进行控制。
- 必须支持可视化工具 API 实现,该实现可通过 Visualizer 类进行控制。
- 应支持 EFFECT_TYPE_BASS_BOOST、EFFECT_TYPE_ENV_REVERB、EFFECT_TYPE_PRESET_REVERB 和 EFFECT_TYPE_VIRTUALIZER 实现,这些实现可通过 AudioEffect 子类(BassBoost、EnvironmentalReverb、PresetReverb 和 Virtualizer)进行控制。
5.5.3. 音频输出音量
Android TV 设备实现必须支持对受支持输出进行系统主音量和数字音频输出音量衰减,压缩音频透传输出(在设备上不进行任何音频解码)除外。
Android Automotive 设备实现应允许按每个音频串流单独调整音频音量(使用通过 AudioAttributes 定义的内容类型或用法,以及 android.car.CarAudioManager
中公开定义的车载音频系统用法)。
5.6. 音频延迟
音频延迟是指音频信号通过系统时的时间延迟。许多类别的应用都依赖于非常短的延迟来实现实时音效。
在本节中,使用以下定义:
- 输出延迟。从应用写入经过 PCM 编码的数据对应的帧到相应声音在设备内置变频器处的环境中播放出来之间的时间间隔,或者从信号通过端口离开设备到可在外部听到相应声音之间的时间间隔。
- 冷输出延迟。当音频输出系统在请求之前已经处于闲置状态且已关闭时,第一帧的输出延迟。
- 连续输出延迟。设备已经开始播放音频时,后续帧的输出延迟。
- 输入延迟。从环境中发出声音到设备内置变频器处的设备捕获到该声音之间的时间间隔,或者从信号通过端口进入设备到应用读取经过 PCM 编码的数据对应的帧之间的时间间隔。
- 输入丢失。输入信号中不可用或无法捕获到的初始部分。
- 冷输入延迟。当音频输入系统在请求之前已经处于闲置状态且已关闭时,输入丢失的时间与第一帧的输入延迟时间的总和。
- 连续输入延迟。设备已经开始捕获音频时,后续帧的输入延迟。
- 冷输出抖动。冷输出延迟值的单独测量结果之间的变化。
- 冷输入抖动。冷输入延迟值的单独测量结果之间的变化。
- 连续往返延迟。连续输入延迟、连续输出延迟,再加一个缓冲期的总和。缓冲期可让应用有时间来处理信号,并有时间来降低输入和输出串流之间的相位差。
- OpenSL ES PCM 缓冲区队列 API。Android NDK 中的一组与 PCM 相关的 OpenSL ES API。
强烈建议声明 android.hardware.audio.output 的设备实现达到或超出以下音频输出要求:
- 冷输出延迟不超过 100 毫秒
- 连续输出延迟不超过 45 毫秒
- 最大限度地减少冷输出抖动
如果设备实现在使用 OpenSL ES PCM 缓冲区队列 API 进行任何初始校准后满足本节中的要求,则对于至少一个受支持音频输出设备的连续输出延迟和冷输出延迟,强烈建议报告对低延迟音频的支持情况,具体方法是通过 android.content.pm.PackageManager 类报告 android.hardware.audio.low_latency 功能。反之,如果设备实现不满足这些要求,则不得报告对低延迟音频的支持情况。
强烈建议包含 android.hardware.microphone 的设备实现满足以下输入音频要求:
- 冷输入延迟不超过 100 毫秒
- 连续输入延迟不超过 30 毫秒
- 连续往返延迟不超过 50 毫秒
- 最大限度地减少冷输入抖动
5.7. 网络协议
设备必须支持 Android SDK 文档中指定的适用于音频和视频播放的媒体网络协议。具体来说,设备必须支持以下媒体网络协议:
-
HTTP(S) 顺序流式传输
必须通过 HTTP(S) 支持第 5.1 节中列出的所有必须支持的编解码器和容器格式 -
HTTP Live Streaming 草案协议(第 7 版)
必须支持以下媒体段格式:
媒体段格式 | 参考 | 必须支持的编解码器 |
---|---|---|
MPEG-2 传输流 | ISO 13818 |
视频编解码器:
和 MPEG-2 的详细信息。 音频编解码器:
|
采用 ADTS 框架和 ID3 标记的 AAC | ISO 13818-7 | 请参阅第 5.1.1 节,了解有关 AAC 及其变体的详细信息 |
WebVTT | WebVTT |
-
RTSP(RTP、SDP)
必须支持以下 RTP 音频视频配置及相关编解码器。有关例外情况,请参阅第 5.1 节中的表格脚注。
配置名称 | 参考 | 必须支持的编解码器 |
---|---|---|
H264 AVC | RFC 6184 | 请参阅第 5.1.3 节,了解有关 H264 AVC 的详细信息 |
MP4A-LATM | RFC 6416 | 请参阅第 5.1.1 节,了解有关 AAC 及其变体的详细信息 |
H263-1998 |
RFC 3551 RFC 4629 RFC 2190 |
请参阅第 5.1.3 节,了解有关 H263 的详细信息 |
H263-2000 | RFC 4629 | 请参阅第 5.1.3 节,了解有关 H263 的详细信息 |
AMR | RFC 4867 | 请参阅第 5.1.1 节,了解有关 AMR-NB 的详细信息 |
AMR-WB | RFC 4867 | 请参阅第 5.1.1 节,了解有关 AMR-WB 的详细信息 |
MP4V-ES | RFC 6416 | 请参阅第 5.1.3 节,了解有关 MPEG-4 SP 的详细信息 |
mpeg4-generic | RFC 3640 | 请参阅第 5.1.1 节,了解有关 AAC 及其变体的详细信息 |
MP2T | RFC 2250 | 请参阅 HTTP Live Streaming 下的 MPEG-2 传输流,了解相关详细信息 |
5.8. 安全媒体
如果设备实现支持安全视频输出且能够支持安全 surface,则必须声明支持 Display.FLAG_SECURE。如果声明支持 Display.FLAG_SECURE 的设备实现也支持无线显示协议,则必须使用强加密机制(如适用于 Miracast 无线显示屏的 HDCP 2.x 或更高版本)来保护链接。同样,如果它们支持有线外部显示设备,则设备实现必须支持 HDCP 1.2 或更高版本。对于支持 4K 分辨率的设备,Android TV 设备实现必须支持 HDCP 2.2;对于更低分辨率的设备,Android TV 设备实现必须支持 HDCP 1.4 或更高版本。上游 Android 开源实现支持满足此要求的无线 (Miracast) 显示屏和有线 (HDMI) 显示屏。
5.9. 乐器数字接口 (MIDI)
如果设备实现支持应用间 MIDI 软件传输(虚拟 MIDI 设备),并且支持 MIDI 采用以下所有支持 MIDI 的硬件传输方式(设备实现会为此类传输提供常规非 MIDI 连接),则强烈建议通过 android.content.pm.PackageManager 类报告支持 android.software.midi 功能。
支持 MIDI 的硬件传输方式:
- USB 主机模式(第 7.7 节:USB)
- USB 外围设备模式(第 7.7 节:USB)
- 发挥核心作用的 MIDI over Bluetooth LE(第 7.4.3 节:蓝牙)
反之,如果设备实现提供常规非 MIDI 连接(采用上面列出的某种支持 MIDI 的硬件传输方式),但不支持 MIDI 采用相应的硬件传输方式,则不得报告支持 android.software.midi 功能。
5.10. 专业音频
如果设备实现满足以下所有要求,则强烈建议通过 android.content.pm.PackageManager 类报告支持 android.hardware.audio.pro 功能。
- 设备实现必须报告支持 android.hardware.audio.low_latency 功能。
- 如第 5.6 节“音频延迟”所述,连续往返音频延迟不得超过 20 毫秒,并且应在至少一条支持的路径上不超过 10 毫秒。
- 如果设备配有 4 导体 3.5 毫米音频插孔,则通过音频插孔路径的连续往返音频延迟不得超过 20 毫秒,在音频插孔路径上的音频延迟应不超过 10 毫秒。
- 设备实现必须包含支持 USB 主机模式和 USB 外围设备模式的 USB 端口。
- USB 主机模式必须实现 USB 音频类。
- 如果设备包含 HDMI 端口,则设备实现必须支持频率为 192 kHz、位深为 20 或 24 的八声道立体声输出,而不丢失位深或重新采样。
- 设备实现必须报告支持 android.software.midi 功能。
- 如果设备配有 4 导体 3.5 毫米音频耳机插孔,则强烈建议设备实现遵循有线音频耳机规范 (v1.1) 的移动设备(耳机插孔)规范一节。
必须使用 OpenSL ES PCM 缓冲区队列 API 来满足延迟时间和 USB 音频方面的要求。
此外,报告支持此功能的设备实现:
- 当音频在播放时,应提供可维持在一定水平的 CPU 性能。
- 应最大限度地降低音频时钟相对于标准时间的不准确性和偏差。
- 应最大限度地降低音频时钟相对于 CPU
CLOCK_MONOTONIC
的偏差(当两者皆处于活动状态时)。 - 应最大限度地缩短在设备内置转换器上的音频延迟。
- 应最大限度地缩短 USB 数字音频的音频延迟时间。
- 应记录所有路径的音频延迟测量结果。
- 应最大限度地降低音频缓冲完成回调输入时间内的抖动,因为此类抖动会影响全 CPU 带宽中可供回调使用的百分比。
- 在正常使用情况下(符合报告的延迟),不应出现音频欠载(输出端)或过载(输入端)。
- 声道间延迟时间差应为零。
- 采用各种传输方式时,都应最大限度地缩短 MIDI 平均延迟。
- 采用各种传输方式时,都应最大限度地降低在有负载状态下的 MIDI 延迟时间变化(抖动)。
- 采用各种传输方式时,都应提供准确的 MIDI 时间戳。
- 应最大限度地降低在设备内置转换器上的音频信号噪声,包括刚完成冷启动后一段时间内的噪声。
- 相应端点输入侧和输出侧(当两者皆处于活动状态时)之间的音频时钟差应为零。相应端点的示例包括设备上的麦克风和扬声器,或音频耳机插孔输入端和输出端。
- 应在同一线程上处理相应端点输入侧和输出侧(当两者皆处于活动状态时)的音频缓冲完成回调,并在从输入回调返回后立即进入输出回调。或者,如果在同一线程上处理回调不可行,则应在进入输入回调后很快进入输出回调,以便应用在输入侧和输出侧拥有一致的时间。
- 应最大限度地减小相应端点输入侧和输出侧 HAL 音频缓冲之间的相位差。
- 应最大限度地缩短触摸延迟时间。
- 应最大限度地降低在有负载状态下的触摸延迟时间变化(抖动)。
5.11. 捕获未处理音频
从 Android 7.0 开始,添加了新的音频源。您可以使用 android.media.MediaRecorder.AudioSource.UNPROCESSED
音频源对其进行访问。在 OpenSL ES 中,可以使用录制预设 SL_ANDROID_RECORDING_PRESET_UNPROCESSED
来访问这些音频。
设备必须满足以下所有要求,才能通过 android.media.AudioManager
属性 PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED 报告支持未处理音频源:
-
设备必须在中频范围内表现出大致平坦的幅频特性,具体来说就是:±10 dB (100 Hz - 7000 Hz)。
-
设备在低频范围内必须表现出适当的振幅等级,具体来说就是:±20 dB (5 Hz - 100 Hz)(与中频范围相比)。
-
设备在高频范围内必须表现出适当的振幅等级,具体来说就是:±30 dB (7000 Hz - 22 KHz)(与中频范围相比)。
-
必须设置音频输入敏感度,以 94 dB 声压级 (SPL) 播放频率为 1000 Hz 的正弦音调源会产生 RMS 为 520 的 16 位的样本(或对于浮点/双精度样本,则为 -36 dB 全标度)。
-
SNR > 60 dB(按照 94 dB SPL 和等效 SPL 自噪声之间的差异进行衡量,A 加权)。
-
当麦克风上是以 90 dB SPL 的 1 kHz 声音进行输入时,总谐波畸变率必须小于 1%。
-
路径中允许的唯一信号处理是将声压级提升到所需范围的声压级倍增器。该声压级倍增器不得对信号路径引入延迟。
-
路径中不允许其他信号处理,如自动增益控制、高通滤波器或回声消除。无论架构中出于任何原因而存在信号处理机制,此类机制都必须处于停用状态,并能够有效避免在信号路径中引入任何延迟。
所有 SPL 测量都直接在接受测试的麦克风旁进行。
对于多麦克风配置,这些要求适用于每个麦克风。
强烈建议尽可能多地满足未处理录音来源信号路径方面的要求;不过,如果设备声称支持未处理的音频来源,则必须满足上述所有要求。
6. 开发者工具和选项兼容性
6.1. 开发者工具
设备实现必须支持 Android SDK 中提供的 Android 开发者工具。与 Android 兼容的设备必须与以下各项兼容:
-
Android 调试桥 (adb)
- 设备实现必须支持所有 adb 功能(如 Android SDK 中所述),包括 dumpsys。
- 设备端 adb 守护程序必须默认处于停用状态,并且必须有一种可供用户使用的机制,以便用户开启 Android 调试桥。如果设备实现省略 USB 外围设备模式,则必须通过局域网(例如以太网或 802.11)实现 Android 调试桥。
- Android 支持安全 adb。安全 adb 能够在经过身份验证的已知主机上启用 adb。设备实现必须支持安全 adb。
-
Dalvik 调试监控服务 (ddms)
- 设备实现必须支持 Android SDK 中所述的所有 ddms 功能。
- 由于 ddms 会使用 adb,因此虽然对 ddms 的支持应默认处于停用状态,但如果用户启用了 Android 调试桥,则必须支持 ddms,如上所述
- Monkey 设备实现必须包含 Monkey 框架,并使其可供应用使用。
-
SysTrace
- 设备实现必须支持 Android SDK 中载述的 Systrace 工具。Systrace 必须默认处于停用状态,并有一个可供用户使用的 Systrace 开启机制。
- 大多数基于 Linux 的系统和 Apple Macintosh 系统都使用标准的 Android SDK 工具识别 Android 设备,而无需其他支持;不过,Microsoft Windows 系统通常需要驱动程序,才能识别新的 Android 设备。(例如,新的供应商 ID 需要适用于 Windows 系统的自定义 USB 驱动程序,有时新的设备 ID 也需要此类驱动程序。)
- 如果标准 Android SDK 中提供的 adb 工具无法识别某个设备实现,设备实现者必须提供相关的 Windows 驱动程序,以便开发者使用 adb 协议连接到设备。对于 32 位和 64 位版本的 Windows XP、Windows Vista、Windows 7、Windows 8 和 Windows 10,必须提供这些驱动程序。
6.2. 开发者选项
Android 支持开发者配置与应用开发相关的设置。设备实现必须支持 android.settings.APPLICATION_DEVELOPMENT_SETTINGS intent,以显示与应用开发相关的设置。上游 Android 实现会默认隐藏“开发者选项”菜单,并允许用户启动该菜单(方法是在设置 > 关于设备 > 版本号菜单项上连按七 [7] 次)。设备实现必须提供一致的开发者选项体验。具体而言,设备实现必须默认隐藏“开发者选项”菜单,而且必须提供一种机制来启用与上游 Android 实现一致的“开发者选项”菜单。
7. 硬件兼容性
如果设备包含特定的硬件组件,而该组件具有针对第三方开发者的相应 API,该设备实现必须实现该 API(如 Android SDK 文档中所定义)。如果 SDK 中的某个 API 需要与某个被规定为可选组件的硬件组件交互,但设备实现不具备该组件,则:
- 仍必须提供该组件 API 的完整类定义(如 SDK 中所述)。
- 该 API 的行为必须以某种合理的方式实现为空操作。
- 在 SDK 文档允许的情况下,API 方法必须返回 null 值。
- 在 SDK 文档不允许返回 null 值的情况下,API 方法必须返回类的空操作实现。
- API 方法不得抛出 SDK 文档中未说明的异常。
这些要求的一个典型适用情况示例就是电话 API:即使在非手机设备上,这些 API 也必须实现为合理的空操作。
对于相同的 build 指纹,设备实现必须能够始终如一地通过 android.content.pm.PackageManager 类中的 getSystemAvailableFeatures() 和 hasSystemFeature(String) 方法报告准确的硬件配置信息。
7.1. 显示和图形
Android 包含一些能够适当地为设备自动调整应用资源和界面布局的方式,以确保第三方应用能够在各种硬件配置上良好地运行。设备必须正确实现本节中详细说明的这些 API 和行为。
本节中的要求提到的单位定义如下:
- 物理对角线尺寸。屏幕亮显部分的两个对角之间的距离(以英寸为单位)。
- 每英寸的点数 (dpi)。1 英寸的线性水平或垂直跨度内包含的像素数。如果列出了 dpi 值,水平 dpi 和垂直 dpi 都必须在该范围内。
- 宽高比。屏幕的长度像素与宽度像素之比。例如,480x854 像素的显示屏的宽高比是 854/480 = 1.779,或约为“16:9”。
- 密度无关像素 (dp)。按 160 dpi 屏幕标准化的虚拟像素单位,计算公式如下:像素 = dps *(密度/160)。
7.1.1. 屏幕配置
7.1.1.1. 屏幕尺寸
Android 界面框架支持多种不同的屏幕尺寸,并且允许应用通过 android.content.res.Configuration.screenLayout(使用 SCREENLAYOUT_SIZE_MASK 参数)查询设备屏幕尺寸(也称为“屏幕布局”)。设备实现必须报告 Android SDK 文档中定义且由上游 Android 平台确定的正确屏幕尺寸。具体而言,设备实现必须根据以下密度无关逻辑像素 (dp) 屏幕尺寸来报告正确的屏幕尺寸。
- 设备的屏幕尺寸必须至少为 426 dp x 320 dp(“小”)(除非是 Android Watch 设备)。
- 如果设备报告的屏幕尺寸为“普通”,则屏幕尺寸必须至少为 480 dp x 320 dp。
- 如果设备报告的屏幕尺寸为“大”,则屏幕尺寸必须至少为 640 dp x 480 dp。
- 如果设备报告的屏幕尺寸为“特大”,则屏幕尺寸必须至少为 960 dp x 720 dp。
此外:
- Android Watch 设备屏幕的物理对角线尺寸必须在 1.1-2.5 英寸的范围内。
- Android Automotive 设备屏幕的物理对角线尺寸不得小于 6 英寸。
- Android Automotive 设备的屏幕尺寸必须至少为 750 dp x 480 dp。
- 对于其他类型的具有物理集成屏幕的 Android 设备实现,其屏幕的物理对角线尺寸必须至少为 2.5 英寸。
在任何时间,设备都不得更改其报告的屏幕尺寸。
应用可以视需要通过 AndroidManifest.xml 文件中的 <supports-screens> 属性来指明其支持的屏幕尺寸。设备实现必须正确执行应用对于“小”“标准”“大”和“特大”屏幕的指定支持(如 Android SDK 文档中所述)。
7.1.1.2. 屏幕宽高比
虽然物理屏幕显示的屏幕宽高比值没有限制,但用于呈现第三方应用且可从通过 DisplayMetrics 报告的值衍生的 Surface 的宽高比必须满足以下要求:
- 如果 uiMode 已配置为 UI_MODE_TYPE_WATCH,则宽高比值可以设置为 1.0 (1:1)。
- 如果第三方应用表示它可以通过 android:resizeableActivity 属性来调整大小,则该宽高比的值没有任何限制。
- 对于所有其他情况,宽高比的值必须在 1.3333 (4:3) 和 1.86(约为 16:9)之间,除非应用已明确表示其通过 maxAspectRatio 元数据值支持更高的屏幕宽高比。
7.1.1.3. 屏幕密度
Android 界面框架定义了一组标准逻辑密度,以便应用开发者确定要采用的应用资源。默认情况下,设备实现必须通过 DENSITY_DEVICE_STABLE API 仅报告以下逻辑 Android 框架密度之一,并且在任何时间此值都必须保持不变;不过,设备可以根据初始启动后用户对显示配置(例如显示区域大小)所做的更改报告不同的任意密度。
- 120 dpi (ldpi)
- 160 dpi (mdpi)
- 213 dpi (tvdpi)
- 240 dpi (hdpi)
- 260 dpi (260dpi)
- 280 dpi (280dpi)
- 300 dpi (300dpi)
- 320 dpi (xhdpi)
- 340 dpi (340dpi)
- 360 dpi (360dpi)
- 400 dpi (400dpi)
- 420 dpi (420dpi)
- 480 dpi (xxhdpi)
- 560 dpi (560dpi)
- 640 dpi (xxxhdpi)
设备实现应定义数值最接近屏幕物理密度的标准 Android 框架密度,除非该逻辑密度会导致报告的屏幕尺寸低于支持的最小值。如果数值最接近物理密度的标准 Android 框架密度会导致屏幕尺寸小于支持的最小兼容屏幕尺寸(宽度为 320 dp),设备实现应报告下一个最低的标准 Android 框架密度。
强烈建议设备实现为用户提供用于更改显示尺寸的设置。如果某个实现可更改设备的显示尺寸,则必须与 AOSP 实现保持一致,如下所示:
- 不得将显示区域大小调整为任何超过原生密度 1.5 倍的尺寸,也不得产生小于 320 dp(相当于资源限定尺寸为 sw320dp)的有效最小屏幕尺寸,以先达到者为准。
- 不得将显示区域大小调整为小于原生密度 0.85 倍的尺寸。
- 为了确保良好的可用性和一致的字体大小,建议提供以下原生显示缩放比例选项(同时遵守上述限制)
- 小:0.85 倍
- 默认值:1 倍(原生显示比例)
- 大:1.15 倍
- 较大:1.3 倍
- 最大:1.45 倍
7.1.2. 显示指标
设备实现必须为 android.util.DisplayMetrics 中定义的所有显示指标报告正确的值,并且无论是使用嵌入式屏幕还是外部屏幕作为默认显示屏,都必须报告相同的值。
7.1.3. 屏幕方向
必须报告支持的屏幕方向(android.hardware.screen.portrait 和/或 android.hardware.screen.landscape),并且必须报告至少一个支持的方向。例如,屏幕固定为横向的设备(例如电视或笔记本电脑)应仅报告 android.hardware.screen.landscape。
报告两个屏幕方向的设备必须根据应用支持动态方向(要么纵屏,要么横屏)。也就是说,设备必须遵从应用对特定屏幕方向的要求。设备实现可以选择纵向或横向作为默认屏幕方向。
无论何时通过 android.content.res.Configuration.orientation、android.view.Display.getOrientation() 或其他 API 查询设备当前方向,设备都必须报告正确的值。
更改方向时,设备不得更改报告的屏幕尺寸或密度。
7.1.4. 2D 和 3D 图形加速
设备实现必须同时支持 OpenGL ES 1.0 和 2.0,Android SDK 文档中对此进行了详细阐述。设备实现应在能支持 OpenGL ES 3.0、3.1 或 3.2 的设备上支持它们。设备实现还必须支持 Android RenderScript(Android SDK 文档中对此进行了详细说明)。
设备实现还必须将自身正确地标识为支持 OpenGL ES 1.0、OpenGL ES 2.0、OpenGL ES 3.0、OpenGL 3.1 或 OpenGL 3.2。也就是说:
- 受管理 API(例如通过 GLES10.getString() 方法)必须报告支持 OpenGL ES 1.0 和 OpenGL ES 2.0。
- 原生 C/C++ OpenGL API(通过 libGLES_v1CM.so、libGLES_v2.so 或 libEGL.so 向应用提供的 API)必须报告支持 OpenGL ES 1.0 和 OpenGL ES 2.0。
- 如果设备实现声明支持 OpenGL ES 3.0、3.1 或 3.2,则必须支持相应的受管理 API,并且必须支持原生 C/C++ API。在声明支持 OpenGL ES 3.0、3.1 或 3.2 的设备实现上,libGLESv2.so 除了导出 OpenGL ES 2.0 函数符号之外,还必须导出相应的函数符号。
Android 还提供了一个具有 Java 接口并原生支持高级图形功能(例如,细分曲面和 ASTC 纹理压缩格式)的 OpenGL ES 扩展包。如果设备支持 OpenGL ES 3.2,Android 设备实现必须支持该扩展包;如果设备不支持 OpenGL ES 3.2,Android 设备实现可以支持该扩展包。如果该扩展包完全受支持,设备必须通过 android.hardware.opengles.aep
功能标志来标明此项支持。
此外,设备实现还可以实现任何所需的 OpenGL ES 扩展。不过,设备实现必须通过 OpenGL ES 受管理 API 和原生 API 报告所支持的所有扩展字符串;反之而言,不得报告不支持的扩展字符串。
请注意,Android 支持应用视需要指定它们需要使用特定 OpenGL 纹理压缩格式。这些格式通常为供应商专用格式。Android 不要求设备实现必须实现任何特定的纹理压缩格式。不过,设备实现应通过 OpenGL API 中的 getString() 方法准确报告所支持的所有纹理压缩格式。
Android 包含一种机制,可让应用使用清单标记 android:hardwareAccelerated 或直接 API 调用声明希望在应用、activity、窗口或视图级别启用 2D 图形硬件加速。
设备实现必须默认启用硬件加速;如果开发者通过以下方式请求停用硬件加速,设备实现必须将其停用:设置 android:hardwareAccelerated="false”,或直接通过 Android View API 停用硬件加速。
此外,设备实现表现出的行为必须与 Android SDK 文档中关于硬件加速的说明一致。
Android 包含一个 TextureView 对象,以便开发者直接将经过硬件加速的 OpenGL ES 纹理作为呈现目标集成到界面层次结构中。设备实现必须支持 TextureView API,并且表现出的行为必须与上游 Android 实现一致。
Android 支持 EGL_ANDROID_RECORDABLE,这是一项 EGLConfig 属性,用于指明 EGLConfig 是否支持呈现到可将图片录制到视频的 ANativeWindow。设备实现必须支持 EGL_ANDROID_RECORDABLE 扩展。
7.1.5. 旧版应用兼容模式
Android 指定了一种“兼容模式”,在该模式下,框架能够以与“标准”屏幕尺寸等效的模式(宽度为 320dp)运行,这是为了服务于不是针对旧版 Android(在实现屏幕尺寸独立性之前发布的旧版 Android)开发的旧应用。
- Android Automotive 不支持旧版应用兼容模式。
- 所有其他设备实现必须支持上游 Android 开放源代码所实现的旧应用兼容模式。也就是说,设备实现不得更改启用该兼容模式的触发条件或阈值,也不得更改该兼容模式本身的行为。
7.1.6. 屏幕技术
Android 平台包含一些可让应用在显示屏上呈现丰富图形的 API。除非本文档中明确许可,否则设备必须支持所有这些 API(具体定义请参见 Android SDK)。
- 设备必须支持能够呈现 16 位彩色图形的显示屏,并且应支持能够呈现 24 位彩色图形的显示屏。
- 设备必须支持能够呈现动画的显示屏。
- 所用显示技术的像素宽高比 (PAR) 必须介于 0.9 到 1.15 之间。也就是说,像素宽高比必须接近方形 (1.0),并且公差在 10-15% 的范围内。
7.1.7. 辅助显示屏
Android 支持用于实现媒体共享功能的辅助显示屏,以及用于访问外接显示屏的开发者 API。如果设备通过有线、无线或嵌入式附加显示屏连接方式支持外接显示屏,设备实现必须按照 Android SDK 文档中所述实现显示屏管理器 API。
7.2. 输入设备
设备必须支持触摸屏,或满足 7.2.2 中列出的非触摸导航方面的要求。
7.2.1. 键盘
设备实现:
- 必须支持输入管理框架(可让第三方开发者创建输入法编辑器,即软键盘),详见 http://developer.android.com。
- 必须提供至少一种软键盘实现(无论是否存在硬键盘);Android Watch 设备除外,其屏幕尺寸不适合显示软键盘。
- 可以包含额外的软键盘实现。
- 可以包含硬件键盘。
- 不得包含与 android.content.res.Configuration.keyboard 中指定的任何格式(QWERTY 或 12 键)都不匹配的硬件键盘。
7.2.2. 非触摸导航
设备实现:
- 如果不是 Android TV 设备,则可以忽略非触摸导航选项(轨迹球、方向键或滚轮)。
- 必须针对 android.content.res.Configuration.navigation 报告正确的值。
- 必须提供与输入管理引擎兼容、用于选择和编辑文字且合理的替代界面机制。上游 Android 开源实现包含一种适合在缺少非触摸导航输入法的设备上使用的选择机制。
7.2.3. 导航键
“主屏幕”“最近用过”和“返回”功能(分别映射到键事件 KEYCODE_HOME、KEYCODE_APP_SWITCH、KEYCODE_BACK)是 Android 导航范式的基本组成部分,因此:
- Android 手持设备实现必须提供“主屏幕”“最近用过”和“返回”功能。
- Android TV 设备实现必须提供“主屏幕”和“返回”功能。
- Android Watch 设备实现必须为用户提供“主屏幕”功能,还必须提供“返回”功能(处于
UI_MODE_TYPE_WATCH
模式时除外)。 - Android Watch 设备实现可以(所有其他 Android 设备类型都不可以)使用长按事件作为键事件
KEYCODE_BACK
,而无需将其发送到前台应用。 - Android Automotive 实现必须提供“主屏幕”功能,并且可以提供“返回”和“最近用过”功能。
- 所有其他类型的设备实现都必须提供“主屏幕”和“返回”功能。
可以通过专用的实体按钮(例如机械或电容式触摸按钮)来实现这些功能,也可以使用位于屏幕上单独部分的专用软件按键、手势、触摸板等来实现。Android 同时支持这两种实现方式。所有这些功能在处于可见状态时,都必须可通过单次操作(例如点按、双击或手势)访问。
“最近用过”功能(如果提供了该功能)必须具有可见的按钮或图标,除非在全屏模式下与其他导航功能一起隐藏起来。这不适用于从较低的 Android 版本升级、具有实体导航按钮且没有“最近用过”按键的设备。
“主屏幕”和“返回”功能(如果提过了这两项功能)必须各有一个可见的按钮或图标,除非在全屏模式下与其他导航功能一起隐藏起来,或者 uiMode UI_MODE_TYPE_MASK 设为 UI_MODE_TYPE_WATCH。
从 Android 4.0 开始,由于操作栏的出现,“菜单”功能被废弃了。因此,搭载 Android 7.1 及更高版本的新设备实现不得为“菜单”功能实现专用的实体按钮。较旧的设备实现不应为“菜单”功能实现专用的实体按钮,但如果实现了实体“菜单”按钮,并且设备运行 targetSdkVersion > 10 的应用,则设备实现:
- 当操作栏处于可见状态时必须在其中显示操作溢出按钮,并且点击该按钮后显示的操作溢出菜单弹出窗口不得为空。对于在 Android 4.4 之前推出但之后升级到 Android 7.1 的设备实现,建议满足此要求。
- 对于在操作栏中选择溢出按钮后弹出的操作溢出菜单,不得修改其位置。
- 对于在选择实体菜单按钮后弹出的操作溢出菜单,可以在屏幕上将其呈现到修改后的位置。
为了实现向后兼容,设备实现必须在 targetSdkVersion 小于 10 时使“菜单”功能可供应用使用,无论是通过实体按钮、软件按键还是手势。应显示此“菜单”功能,除非与其他导航功能一起隐藏起来。
支持辅助操作和/或 VoiceInteractionService
的 Android 设备实现必须能够在其他导航键可见时通过单次交互(例如点按、双击或手势)启动辅助应用。强烈建议将长按“主屏幕”键用作此交互操作。指定的交互必须启动用户选择的辅助应用(也就是实现 VoiceInteractionService 的应用)或处理 ACTION_ASSIST intent 的 activity。
设备实现可以使用屏幕上的单独部分来显示导航键,但如果这样做,必须满足以下要求:
- 设备实现导航键必须位于屏幕上的单独部分,不能供应用使用,并且不得遮住或以其他方式影响屏幕上可供应用使用的部分。
- 如果应用满足第 7.1.1 节中定义的要求,则设备实现必须将显示屏的一部分提供给它们使用。
- 如果应用没有指定系统界面模式,或者指定了 SYSTEM_UI_FLAG_VISIBLE,设备实现必须显示导航键。
- 如果应用指定了 SYSTEM_UI_FLAG_LOW_PROFILE,设备实现必须以不显眼的“低调”(例如调暗)模式显示导航键。
- 如果应用指定了 SYSTEM_UI_FLAG_HIDE_NAVIGATION,设备实现必须隐藏导航键。
7.2.4. 触摸屏输入
设备实现应具有某种指针输入系统(类似于鼠标的输入系统或触摸式输入系统)。不过,如果设备实现不支持指针输入系统,则不得报告 android.hardware.touchscreen 或 android.hardware.faketouch 功能常量。如果设备实现包含指针输入系统,则:
- 应支持完全独立跟踪的指针(如果设备输入系统支持多个指针)。
- 必须报告 android.content.res.Configuration.touchscreen 的值,并且该值要与设备上的具体触摸屏的类型相对应。
Android 支持多种触摸屏、触摸板和模拟触控输入设备。基于触摸屏的设备实现会与屏幕相关联,从而让用户感觉像是在直接操控屏幕上的内容。由于用户直接触摸屏幕,因此系统不需要任何额外的功能来指明所操控的对象。相比之下,模拟触摸界面则提供能够模拟部分触摸屏功能的用户输入系统。例如,驱动屏幕光标的鼠标或遥控器能够模拟触摸操作,但需要用户先指向或聚焦到目标,然后再点击。鼠标、触控板、基于陀螺仪的空中鼠标、陀螺仪指针、操纵杆和多点触控板等多种输入设备都可以支持模拟触摸交互。Android 包含功能常量 android.hardware.faketouch,该常量对应于高保真非触控(即基于指针的)输入设备,例如可以充分模拟触控输入的鼠标或触控板(包括基本手势支持),并且该常量可指明设备支持所模拟的触摸屏功能子集。如果设备实现声明了模拟触控功能,则必须满足第 7.2.5 节中的模拟触控要求。
设备实现必须报告与所用输入法的类型对应的正确功能。如果设备实现包含触摸屏(单点触控或更好的触摸屏),则必须报告平台功能常量 android.hardware.touchscreen。如果设备实现报告平台功能常量 android.hardware.touchscreen,还必须要报告平台功能常量 android.hardware.faketouch。如果设备实现不包含触摸屏(仅依靠指控设备),则不得报告任何触摸屏功能,并且仅在满足第 7.2.5 节中的模拟触控要求时,才能报告 android.hardware.faketouch。
7.2.5. 模拟触控输入
声明支持 android.hardware.faketouch 的设备实现:
- 必须报告指针在屏幕中的绝对 X 和 Y 位置,并在屏幕中显示可见指针。
- 必须通过操作代码(指定在屏幕中按下或松开指针时发生的状态变化)报告触摸事件。
- 必须支持在屏幕中的对象上按下后再松开指针,以便用户模拟点按屏幕中的对象。
- 必须支持于时间阈值内在屏幕中的对象上的同一位置按下、松开、按下后再松开指针,以便用户模拟点按两次屏幕中的对象。
- 必须支持在屏幕中的任意一点按下指针,将指针移动到屏幕中的其他任意一点,然后再松开指针,以便用户模拟触摸拖动操作。
- 必须支持按下指针后允许用户快速将对象移至屏幕中的其他位置,然后在屏幕中松开指针,以便用户快速滑动屏幕中的对象。
如果设备声明支持 android.hardware.faketouch.multitouch.distinct,则必须满足上述关于模拟触摸的要求,并且必须支持对两个或更多个独立的指针输入分别进行跟踪。
7.2.6. 游戏控制器支持
Android TV 设备实现必须支持对游戏控制器进行下列按钮映射。上游 Android 实现包含满足该要求的游戏控制器实现。
7.2.6.1. 按钮映射
Android TV 设备实现必须支持以下按键映射:
按钮 | HID 用法 2 | Android 按钮 |
---|---|---|
A 1 | 0x09 0x0001 | KEYCODE_BUTTON_A (96) |
B 1 | 0x09 0x0002 | KEYCODE_BUTTON_B (97) |
X 1 | 0x09 0x0004 | KEYCODE_BUTTON_X (99) |
Y 1 | 0x09 0x0005 | KEYCODE_BUTTON_Y (100) |
向上方向键 1 向下方向键 1 |
0x01 0x0039 3 | AXIS_HAT_Y 4 |
向左方向键 1 向右方向键 1 |
0x01 0x0039 3 | AXIS_HAT_X 4 |
左肩按钮 1 | 0x09 0x0007 | KEYCODE_BUTTON_L1 (102) |
右肩按钮 1 | 0x09 0x0008 | KEYCODE_BUTTON_R1 (103) |
左摇杆点击 1 | 0x09 0x000E | KEYCODE_BUTTON_THUMBL (106) |
右摇杆点击 1 | 0x09 0x000F | KEYCODE_BUTTON_THUMBR (107) |
主屏幕 1 | 0x0c 0x0223 | KEYCODE_HOME (3) |
返回 1 | 0x0c 0x0224 | KEYCODE_BACK (4) |
1 KeyEvent
2 必须在 Game pad CA (0x01 0x0005) 中声明上述 HID 用法。
3 这种用法的 Logical Minimum 必须为 0,Logical Maximum 必须为 7,Physical Minimum 必须为 0,Physical Maximum 必须为 315,Units 必须为 Degrees,并且 Report Size 必须为 4。逻辑值指从纵轴顺时针旋转的角度;例如,逻辑值为 0 表示不旋转,并且按下了向上按钮,逻辑值为 1 则表示旋转 45 度,并且同时按下了向上和向左键。
模拟控制 1 | HID 用法 | Android 按钮 |
---|---|---|
左触发 | 0x02 0x00C5 | AXIS_LTRIGGER |
右触发 | 0x02 0x00C4 | AXIS_RTRIGGER |
左摇杆 |
0x01 0x0030 0x01 0x0031 |
AXIS_X AXIS_Y |
右摇杆 |
0x01 0x0032 0x01 0x0035 |
AXIS_Z AXIS_RZ |
7.2.7. 遥控器
Android TV 设备实现应提供遥控器,以便用户访问 TV 界面。遥控器可以是实体遥控器,也可以是基于软件、可通过手机或平板电脑访问的遥控器。遥控器必须满足以下要求。
- 提供搜索功能。当用户通过实体遥控器或基于软件的遥控器调用语音搜索时,设备实现必须触发 KEYCODE_SEARCH(如果设备支持辅助程序,则必须触发 KEYCODE_ASSIST)。
- 导航。所有 Android TV 遥控器都必须包含“返回”“主屏幕”和“选择”按钮,并且支持方向键事件。
7.3. 传感器
Android 包含用于访问多种传感器的 API。设备实现通常可以省略这些传感器,如后续小节中所述。如果设备包含某种传感器,而该传感器具有针对第三方开发者的相应 API,则设备实现必须实现该 API,如 Android SDK 文档和 Android 开放源代码文档中关于传感器的部分所述。例如,设备实现:
- 必须根据 android.content.pm.PackageManager 类准确报告是否存在传感器。
- 必须通过 SensorManager.getSensorList() 和类似方法返回准确的受支持传感器列表。
- 对于所有其他传感器 API,必须采取合理的行为(例如,在应用尝试注册监听器时视情况返回 true 或 false,在不存在相应的传感器时不调用传感器监听器,等等)。
- 必须使用 Android SDK 文档中为每种传感器定义的相关国际单位制(公制)值报告所有传感器测量结果。
- 应以纳秒为单位报告事件时间(如 Android SDK 文档中定义),该时间表示事件发生时的时间,与 SystemClock.elapsedRealtimeNano() 时钟同步。强烈建议现有的及新的 Android 设备满足这些要求,以便能够升级到未来平台版本(在未来平台版本中,此组件可能会成为必需组件)。同步误差应在 100 毫秒以内。
- 必须报告传感器数据,并且最大延迟为 100 毫秒 + 2 * sample_time(如果传感器进行流式传输所需的最小延迟为 5 毫秒)+ 2 * sample_time(如果应用处理器处于活动状态)。此延迟不包含任何过滤延迟。
- 必须在启用传感器后的 400 毫秒 + 2 * sample_time 内报告第一个传感器样本。此样本的精度可以为 0。
上述列表并不是详尽无遗的;请以 Android SDK 和 Android 开放源代码文档中关于传感器的部分载述的行为为准。
有些传感器为复合型,也就是说,它们可以从一个或多个其他传感器提供的数据推导出来。(例如,方向传感器和线性加速传感器。)设备实现应实现这些传感器类型,但前提是设备实现包含必要的实体传感器(如传感器类型中所述)。如果设备实现包含复合传感器,则必须实现该传感器,如 Android 开放源代码文档中关于复合传感器的部分所述。
有些 Android 传感器支持“连续”触发模式,在该模式下,传感器会不断返回数据。对于 Android SDK 文档中指明为连续传感器的任何 API,设备实现都必须连续提供周期性数据样本,并且这些样本的抖动应低于 3%,抖动是指连续事件报告的时间戳值之差的标准偏差。
请注意,设备实现必须确保传感器事件数据流不得阻止设备 CPU 进入挂起状态或从挂起状态唤醒。
最后,当多个传感器处于启用状态时,功耗不应超过各个传感器所报告的功耗的总和。
7.3.1. 加速度计
设备实现应包含 3 轴加速度计。强烈建议 Android 手持设备、Android Automotive 实现和 Android Watch 设备包含这种传感器。如果设备实现包含 3 轴加速度计,则:
- 必须实现并报告 TYPE_ACCELEROMETER 传感器。
- 对于 Android Watch 设备,必须能够以至少 50 Hz 的频率报告事件(因为此类设备的功率限制较为严格);对于所有其他设备类型,则为 100 Hz。
- 应以至少 200 Hz 的频率报告事件。
- 必须遵从 Android API 中详述的 Android 传感器坐标系。Android Automotive 实现必须遵从 Android 汽车传感器坐标系。
- 在任意轴上都必须能够测量从自由下落到高达四倍重力加速度 (4g) 的运动过程。
- 分辨率必须至少为 12 位,并且应至少为 16 位。
- 应在使用时进行校准(如果特性随生命周期发生变化)和补偿,并且在设备重新启动后直到再次重新启动之前应保留补偿参数。
- 应进行温度补偿。
- 标准偏差不得高于 0.05 m/s^,其中标准偏差应按每个轴进行计算,并且应使用以最大采样率在至少 3 秒内采集的样本进行计算。
- 应实现 TYPE_SIGNIFICANT_MOTION、TYPE_TILT_DETECTOR、TYPE_STEP_DETECTOR、TYPE_STEP_COUNTER 复合传感器,如 Android SDK 文档中所述。强烈建议现有的及新的 Android 设备实现 TYPE_SIGNIFICANT_MOTION 复合传感器。如果实现了其中任何传感器,它们的功耗总和必须始终低于 4 mW,并且每个传感器的功耗应在设备处于动态时低于 2 mW,在设备处于静态时低于 0.5 mW。
- 如果包含陀螺仪传感器,则必须实现 TYPE_GRAVITY 和 TYPE_LINEAR_ACCELERATION 复合传感器,并且应实现 TYPE_GAME_ROTATION_VECTOR 复合传感器。强烈建议现有的及新的 Android 设备实现 TYPE_GAME_ROTATION_VECTOR 传感器。
- 如果还包含陀螺仪传感器和磁力计传感器,则必须实现 TYPE_ROTATION_VECTOR 复合传感器。
7.3.2. 磁力计
设备实现应包含 3 轴磁力计(罗盘)。如果设备包含 3 轴磁力计,则:
- 必须实现 TYPE_MAGNETIC_FIELD 传感器,并且还应实现 TYPE_MAGNETIC_FIELD_UNCALIBRATED 传感器。强烈建议现有的及新的 Android 设备实现 TYPE_MAGNETIC_FIELD_UNCALIBRATED 传感器。
- 报告事件能够达到的最高频率必须至少为 10 Hz,报告事件应该达到的最高频率必须至少为 50 Hz。
- 必须遵从 Android 传感器坐标系(Android API 中对此进行了详细说明)。
- 饱和之前,在每个轴上的测量范围必须达到 -900 μT 到 +900 μT 之间。
- 必须通过以下方式使硬铁偏移值低于 700 µT,并且应低于 200 µT:将磁力计放在远离动态(电流感应)和静态(磁感应)磁场的位置。
- 分辨率必须等于或高于 0.6 µT,并且应等于或高于 0.2 µT。
- 应进行温度补偿。
- 必须支持在线校准和补偿硬铁偏差,并在设备重新启动后直到再次重新启动之前保留补偿参数。
- 必须采用软铁补偿 - 可以在使用期间或设备生产期间进行校准。
- 标准偏差不应高于 0.5 μT,其中标准偏差应按每个轴进行计算,并且应使用以最大采样率在至少 3 秒内采集的样本进行计算。
- 如果还包括加速度计传感器和陀螺仪传感器,则必须实现 TYPE_ROTATION_VECTOR 复合传感器。
- 如果还实现了加速度计传感器,则可以实现 TYPE_GEOMAGNETIC_ROTATION_VECTOR 传感器。不过,如果实现了该传感器,该传感器消耗的功率必须低于 10 mW;如果该传感器注册了 10 Hz 的批处理模式,则消耗的功率应低于 3 mW。
7.3.3. GPS
设备实现应包含 GPS/GNSS 接收器。如果设备实现包含 GPS/GNSS 接收器,并且通过 android.hardware.location.gps
功能标志向应用报告该功能,则:
- 强烈建议设备在紧急通话期间继续向应用提供正常的 GPS/GNSS 输出,并且该位置信息输出在紧急通话期间不会被阻止。
- 当收到通过
LocationManager#requestLocationUpdate
提交的位置信息请求时,必须支持以至少 1 Hz 的频率输出位置信息。 - 当互联网连接的数据传输速度为 0.5 Mbps 或更快时,在露天条件(信号强,可忽略多路径,HDOP 小于 2)下必须能于 10 秒内确定位置(快速完成首次定位)。为了满足此要求,通常可以采用某种形式的辅助或预测 GPS/GNSS 技术来最大限度地缩短 GPS/GNSS 锁定时间(辅助数据包括参考时间、参考位置和卫星星历/时钟)。
- 完成此类位置计算后,如果设备在一个小时内再次收到位置信息请求,强烈建议设备在露天条件下能于 10 秒内确定其位置,即使后续请求是在无数据连接的情况下和/或设备重启之后发出的也是如此。
- 确定位置之后,在露天条件下,当设备处于静止状态或以小于 1 m/s² 的加速度移动时:
- 必须至少在 95% 的时间内能够确定 20 米以内的位置以及 0.5 m/s 内的速度。
- 必须通过 GnssStatus.Callback 同时跟踪和报告一个星群中的至少 8 颗卫星。
- 应能够同时跟踪多个星群(例如 GPS 以及 Glonass、Beidou、Galileo 中的至少一个)中的至少 24 颗卫星。
- 必须通过测试 API“getGnssYearOfHardware”报告 GNSS 技术生成年份。
- 如果报告的 GNSS 技术生成年份为“2016 年”或更晚,则强烈建议满足且必须满足以下所有要求。
- 必须在发现 GPS 测量结果后立即报告,即使尚未报告通过 GPS/GNSS 计算出的位置。
- 必须报告 GPS 伪距和伪距率,以便在确定位置之后,在露天条件下,当设备处于静止状态或以小于 0.2 m/s2 的加速度移动时,至少在 95% 的时间内能够计算出 20 米以内的位置以及 0.2 m/s 以内的速度。
请注意,虽然上述某些 GPS 要求为“强烈建议”满足的要求,但下一主要版本的《兼容性定义》预计会将它们更改为“必须”满足的要求。
7.3.4. 陀螺仪
设备实现应包含陀螺仪(角度变化传感器)。除非还包含 3 轴加速度计,否则设备不应包含陀螺仪传感器。如果设备实现包含陀螺仪,则:
- 必须实现 TYPE_GYROSCOPE 传感器,并且还应实现 TYPE_GYROSCOPE_UNCALIBRATED 传感器。强烈建议现有的及新的 Android 设备实现 SENSOR_TYPE_GYROSCOPE_UNCALIBRATED 传感器。
- 必须能够测量高达 1,000 度/秒的方向变化。
- 对于 Android Watch 设备,必须能够以至少 50 Hz 的频率报告事件(因为此类设备的功率限制较为严格);对于所有其他设备类型,则为 100 Hz。
- 应以至少 200 Hz 的频率报告事件。
- 分辨率必须为 12 位或更高,并且应等于或高于 16 位。
- 必须进行温度补偿。
- 必须在使用时进行校准和补偿,并且在设备重新启动后直到再次重新启动之前应保留补偿参数。
- 每 Hz 方差不得超过 1e-7 rad^2/s^2(每 Hz 方差,或 rad^2/s)。方差可随采样率而变化,但不得超过该值。也就是说,如果以 1 Hz 的采样率测量陀螺仪的方差,则方差不应超过 1e-7 rad^2/s^2。
- 如果还包含加速度计传感器和磁力计传感器,则必须实现 TYPE_ROTATION_VECTOR 复合传感器。
- 如果包含加速度计传感器,则必须实现 TYPE_GRAVITY 和 TYPE_LINEAR_ACCELERATION 复合传感器,并且应实现 TYPE_GAME_ROTATION_VECTOR 复合传感器。强烈建议现有的及新的 Android 设备实现 TYPE_GAME_ROTATION_VECTOR 传感器。
7.3.5. 气压计
设备实现应包含气压计(环境气压传感器)。如果设备实现包含气压计,则:
- 必须实现并报告 TYPE_PRESSURE 传感器。
- 必须能够以 5 Hz 或更高的频率传送事件。
- 必须具有足以估算海拔高度的精度。
- 必须进行温度补偿。
7.3.6. 温度计
设备实现可以包含环境温度计(温度传感器)。如果包含,则必须将其定义为 SENSOR_TYPE_AMBIENT_TEMPERATURE,并且它测量的必须是环境(室内)温度(以摄氏度为单位)。
设备实现可以(但不应)包含 CPU 温度传感器。如果包含,则必须将其定义为 SENSOR_TYPE_TEMPERATURE,并且它测量的必须是设备 CPU 的温度,而不得测量任何其他温度。请注意,Android 4.0 中废弃了 SENSOR_TYPE_TEMPERATURE 传感器类型。
7.3.7. 光度计
设备实现可以包含光度计(环境光传感器)。
7.3.8. 近程传感器
设备实现可以包含近程传感器。如果设备可进行语音通话,并且在 getPhoneType 中指明的是 PHONE_TYPE_NONE 以外的任何其他值,则应包含近程传感器。如果设备实现包含近程传感器,则:
- 必须在与屏幕相同的方向上测量物体的接近度。也就是说,近程传感器所处的方向必须使其能够检测到屏幕附近的物体,因为此类传感器的主要目的是检测用户正在使用的手机。如果设备实现包含朝向任何其他方向的近程传感器,则不得通过此 API 访问此类传感器。
- 精度必须至少为 1 位。
7.3.9. 高保真传感器
如果设备实现支持一系列可满足本节中列出的所有要求且质量更高的传感器,则必须通过 android.hardware.sensor.hifi_sensors
功能标记来标识此项支持。
声明 android.hardware.sensor.hifi_sensors 的设备必须支持满足下述质量要求的下列所有传感器类型:
- SENSOR_TYPE_ACCELEROMETER
- 测量范围必须至少在 -8g 到 +8g 之间。
- 测量分辨率必须至少为 1024 LSB/G。
- 最小测量频率必须等于或低于 12.5 Hz。
- 最大测量频率必须等于或高于 400 Hz。
- 测量噪声不得高于 400 uG/√Hz。
- 必须实现这种传感器的非唤醒形式,并且至少能够缓冲 3000 个传感器事件。
- 批处理功耗不得高于 3 mW。
- 24 小时静态数据集的静态噪声偏差稳定度应小于等于 15 μg/√Hz。
- 偏差随温度的变化应小于等于 +/- 1mg/°C。
- 最佳拟合线非线性度应小于等于 0.5%,并且灵敏度随温度的变化应小于等于 0.03%/C°。
-
SENSOR_TYPE_GYROSCOPE
- 测量范围必须至少在 -1000 dps 到 +1000 dps 之间。
- 测量分辨率必须至少为 16 LSB/dps。
- 最小测量频率必须等于或低于 12.5 Hz。
- 最大测量频率必须等于或高于 400 Hz。
- 测量噪声不得高于 0.014°/s/√Hz。
- 24 小时静态数据集的静态偏差稳定度应小于 0.0002°/s√Hz。
- 偏差随温度的变化应小于等于 +/- 0.05 °/s/°C。
- 灵敏度随温度的变化应小于等于 0.02%/°C。
- 最佳拟合线非线性度应小于等于 0.2%。
- 噪声密度应小于等于 0.007 °/s/√Hz。
-
SENSOR_TYPE_GYROSCOPE_UNCALIBRATED 具有和 SENSOR_TYPE_GYROSCOPE 相同的质量要求。
- SENSOR_TYPE_GEOMAGNETIC_FIELD
- 测量范围必须至少在 -900 uT 到 +900 uT 之间。
- 测量分辨率必须至少为 5 LSB/uT。
- 最小测量频率必须等于或低于 5 Hz。
- 最大测量频率必须等于或高于 50 Hz。
- 测量噪声不得高于 0.5 uT。
- SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED 具有和 SENSOR_TYPE_GEOMAGNETIC_FIELD 相同的质量要求,此外:
- 必须实现这种传感器的非唤醒形式,并且至少能够缓冲 600 个传感器事件。
- SENSOR_TYPE_PRESSURE
- 测量范围必须至少在 300 hPa 到 1100 hPa 之间。
- 测量分辨率必须至少为 80 LSB/hPa。
- 最小测量频率必须等于或低于 1 Hz。
- 最大测量频率必须等于或高于 10 Hz。
- 测量噪声不得高于 2 Pa/√Hz。
- 必须实现这种传感器的非唤醒形式,并且至少能够缓存 300 个传感器事件。
- 批处理功耗不得高于 2 mW。
- SENSOR_TYPE_GAME_ROTATION_VECTOR
- 必须实现这种传感器的非唤醒形式,并且至少能够缓存 300 个传感器事件。
- 批处理功耗不得高于 4 mW。
- SENSOR_TYPE_SIGNIFICANT_MOTION
- 当设备处于静态时,功耗不得高于 0.5 mW;当设备处于动态时,功耗不得高于 1.5 mW。
- SENSOR_TYPE_STEP_DETECTOR
- 必须实现这种传感器的非唤醒形式,并且至少能够缓存 100 个传感器事件。
- 当设备处于静态时,功耗不得高于 0.5 mW;当设备处于动态时,功耗不得高于 1.5 mW。
- 批处理功耗不得高于 4 mW。
- SENSOR_TYPE_STEP_COUNTER
- 当设备处于静态时,功耗不得高于 0.5 mW;当设备处于动态时,功耗不得高于 1.5 mW。
- SENSOR_TILT_DETECTOR
- 当设备处于静态时,功耗不得高于 0.5 mW;当设备处于动态时,功耗不得高于 1.5 mW。
此类设备还必须满足以下传感器子系统要求:
- 加速度计、陀螺仪传感器和磁力计报告的同一物理事件的事件时间戳之间相差必须在 2.5 毫秒以内。
- 陀螺仪传感器事件时间戳必须与摄像头子系统采用相同的时间基准,并且误差在 1 毫秒以内。
- 当实体传感器上的数据可供应用使用时,高保真传感器必须在 5 毫秒内将样本提供给应用。
- 如果启用了以下传感器的任意组合,当设备处于静态时,功耗不得超过 0.5 mW;当设备处于动态时,功耗不得超过 2.0 mW:
- SENSOR_TYPE_SIGNIFICANT_MOTION
- SENSOR_TYPE_STEP_DETECTOR
- SENSOR_TYPE_STEP_COUNTER
- SENSOR_TILT_DETECTORS
请注意,本节中的所有功耗要求都不包括应用处理器的功耗。它包含的是整个传感器链(传感器、所有辅助电路、所有专用的传感器处理系统,等等)的功耗。
声明 android.hardware.sensor.hifi_sensors 的设备实现还可以支持以下传感器类型,但如果包含这些传感器类型,它们必须满足以下最低缓冲能力要求:
- SENSOR_TYPE_PROXIMITY:100 个传感器事件
7.3.10. 指纹传感器
具有安全锁定屏幕的设备实现应包含指纹传感器。如果设备实现包含指纹传感器,并且具有可供第三方开发者使用的相应 API,则:
- 必须声明支持 android.hardware.fingerprint 功能。
- 必须完全实现相应的 API(如 Android SDK 文档中所述)。
- 错误接受率不得高于 0.002%。
- 强烈建议确保在设备上测得的错误拒绝率低于 10%。
- 对于 1 个已注册的指纹,强烈建议确保延迟时间(即测得的从触摸指纹传感器到屏幕解锁的时间)低于 1 秒。
- 尝试指纹验证的失败次数达到 5 次后,必须限制在至少 30 秒内不能再次进行指纹验证。
- 必须实现有硬件支持的密钥库,并在可信执行环境 (TEE) 中或在具有通向 TEE 的安全信道的芯片上执行指纹匹配。
- 必须对所有可识别的指纹数据进行加密,并对其采用密码形式的身份验证机制,以确保在可信执行环境 (TEE) 之外无法获取、读取或更改这些数据(如 Android 开源项目网站上的实现指南中所述)。
- 必须通过以下方式来防止在没有先建立信任链的情况下添加指纹:让用户确认现有设备凭据(PIN 码/图案/密码,受 TEE 保护)或添加新设备凭据;Android 开源项目实现在框架中提供了可实现这一点的机制。
- 不得允许第三方应用区分各个指纹。
- 必须遵从 DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT 标志。
- 如果从 Android 6.0 之前的版本进行了升级,则必须安全迁移指纹数据以满足上述要求,或者将这些指纹数据移除。
- 应使用 Android 开源项目中提供的 Android 指纹图标。
7.3.11. Android Automotive 专用传感器
android.car.CarSensorManager API
中对 Automotive 专用传感器进行了定义。
7.3.11.1. 用电装置
Android Automotive 实现应将用电装置作为 SENSOR_TYPE_GEAR 提供。
7.3.11.2. 日间/夜间模式
Android Automotive 实现必须支持定义为 SENSOR_TYPE_NIGHT 的日间/夜间模式。此标志的值必须与信息中心的日间/夜间模式一致,并且应基于环境光传感器输入。底层环境光传感器可以与光度计相同。
7.3.11.3. 驾驶状态
Android Automotive 实现必须支持定义为 SENSOR_TYPE_DRIVING_STATUS 的驾驶状态(当车辆完全处于停泊状态时,默认值为 DRIVE_STATUS_UNRESTRICTED)。设备制造商需负责根据产品目标市场的所有适用法律和法规配置 SENSOR_TYPE_DRIVING_STATUS。
7.3.11.4. 车轮转速
Android Automotive 实现必须提供定义为 SENSOR_TYPE_CAR_SPEED 的车速。
7.3.12. 姿势传感器
设备实现可以支持具有 6 个自由度的姿势传感器。建议 Android 手持设备支持这种传感器。如果设备实现支持具有 6 个自由度的姿势传感器,则:
- 必须实现并报告
TYPE_POSE_6DOF
传感器。 - 必须比只使用旋转矢量更准确。
7.4. 数据连接
7.4.1. 电话
在 Android API 和本文档中,“电话”专指与通过 GSM 或 CDMA 网络进行语音通话和发送短信相关的硬件。虽然这些语音通话可能采用也可能不采用分封交换技术,但都是为了使 Android 被视为独立于可通过同一网络实现的所有数据连接。也就是说,Android“电话”功能和 API 专指语音通话和短信。例如,如果设备实现无法打电话或收发短信,无论它们是否使用移动网络进行数据连接,都不得报告“android.hardware.telephony”功能或任何子功能。
Android 可以用在不包含电话硬件的设备上。也就是说,Android 与非电话设备兼容。不过,如果设备实现包含 GSM 或 CDMA 电话,则必须全面支持针对该技术的 API。如果设备实现不包含电话硬件,则必须将所有相关 API 实现为空操作。
7.4.1.1. 号码屏蔽兼容性
Android Telephony 设备实现必须支持号码屏蔽,并且:
- 必须完全实现 BlockedNumberContract 和相应的 API(如 SDK 文档中所述)。
- 必须屏蔽从列入“BlockedNumberProvider”的电话号码打来的所有电话和发来的所有短信,而不与应用进行任何交互。唯一的例外是号码屏蔽被临时解除时(如 SDK 文档中所述)。
- 不得将被屏蔽的呼叫写入平台通话记录提供程序。
- 不得将被屏蔽的短信写入电话提供程序。
- 必须实现被屏蔽号码管理界面,并且该界面通过由 TelecomManager.createManageBlockedNumbersIntent() 方法返回的 intent 打开。
- 不得允许次要用户查看或修改设备上被屏蔽的号码,因为 Android 平台会假设主用户对设备上的电话服务(单个实例)拥有完全控制权。对于次要用户,必须隐藏所有与屏蔽相关的界面,并且仍必须遵从屏蔽列表。
- 当设备更新到 Android 7.0 时,应将被屏蔽的号码迁移到提供程序。
7.4.2. IEEE 802.11 (Wi-Fi)
所有 Android 设备实现都应支持一种或多种形式的 802.11。如果设备实现支持 802.11,并且向第三方应用提供该功能,则必须实现相应的 Android API,并且:
- 必须报告硬件功能标记 android.hardware.wifi。
- 必须实现多播 API(如 SDK 文档中所述)。
- 必须支持多播 DNS (mDNS),并且不得在操作过程中的任何时间过滤 mDNS 数据包 (224.0.0.251),其中包括:
- 即使屏幕未处于活动状态时。
- 即使处于待机状态时(适用于 Android TV 设备实现)。
7.4.2.1. Wi-Fi 直连
设备实现应支持 Wi-Fi 直连(Wi-Fi 点对点)。如果设备实现支持 WLAN 直连,则必须实现相应的 Android API(如 SDK 文档中所述)。如果设备实现支持 Wi-Fi 直连,则:
- 必须报告硬件功能 android.hardware.wifi.direct。
- 必须支持常规的 Wi-Fi 操作。
- 应支持并发的 Wi-Fi 操作和 Wi-Fi 直连操作。
7.4.2.2. WLAN 通道直接链路设置
设备实现应支持 WLAN 通道直接链路设置 (TDLS)(如 Android SDK 文档中所述)。如果设备实现支持 TDLS,并且 TDLS 已由 WiFiManager API 启用,则设备:
- 只在能够使用且有好处时才应使用 TDLS。
- 应进行一些试探,如果使用 TDLS 时的性能可能低于通过 WLAN 接入点连接时的性能,则不应使用 TDLS。
7.4.3. 蓝牙
如果设备实现支持 android.hardware.vr.high_performance
功能,则必须支持蓝牙 4.2 和蓝牙 LE 数据长度扩展。
Android 支持蓝牙和蓝牙低功耗。如果设备实现支持蓝牙和蓝牙低功耗,则必须声明相关的平台功能(分别为 android.hardware.bluetooth 和 android.hardware.bluetooth_le),并实现相应的平台 API。设备实现应实现适合设备的相关蓝牙配置文件,例如 A2DP、AVCP、OBEX 等。
Android Automotive 实现应支持消息访问配置文件 (MAP)。Android Automotive 实现必须支持以下蓝牙配置文件:
- 通过免触摸操作配置文件 (HFP) 拨打电话。
- 通过音频分发配置文件 (A2DP) 播放媒体。
- 通过远程控制配置文件 (AVRCP) 控制媒体播放。
- 使用电话簿访问配置文件 (PBAP) 分享联系人信息。
支持低功耗蓝牙的设备实现:
- 必须声明硬件功能 android.hardware.bluetooth_le。
- 必须启用基于 GATT(通用属性配置)的蓝牙 API(如 SDK 文档中所述)以及 android.bluetooth。
- 强烈建议实现不超过 15 分钟的可解析私有地址 (RPA) 超时,并在超时后轮转地址以保护用户隐私。
- 应支持在实现 ScanFilter API 时将过滤逻辑分流到蓝牙芯片组,并且每当收到通过 android.bluetooth.BluetoothAdapter.isOffloadedFilteringSupported() 方法进行的查询时都必须报告过滤逻辑实现位置的正确值。
- 应支持将批量扫描分载到蓝牙芯片组;但如果不支持,则每当收到通过 android.bluetooth.BluetoothAdapter.isOffloadedScanBatchingSupported() 方法进行的查询时,都必须报告“false”。
- 应支持至少为 4 个槽位的多通告,但如果不支持,则每当收到通过 android.bluetooth.BluetoothAdapter.isMultipleAdvertisementSupported() 方法进行的查询时,都必须报告“false”。
7.4.4. 近距离无线通信
设备实现应包含用于近距离无线通信 (NFC) 的收发器和相关硬件。如果设备实现包含 NFC 硬件,并且计划使其可供第三方应用使用,则:
- 必须通过 android.content.pm.PackageManager.hasSystemFeature() 方法报告 android.hardware.nfc 功能。
- 必须能够通过以下 NFC 标准读取和写入 NDEF 消息:
- 必须能够通过以下 NFC 标准充当 NFC Forum 读取器/写入器(如 NFC Forum 技术规范 NFCForum-TS-DigitalProtocol-1.0 中所定义):
- NfcA (ISO14443-3A)
- NfcB (ISO14443-3B)
- NfcF (JIS X 6319-4)
- IsoDep (ISO 14443-4)
- NFC Forum 代码类型 1、2、3、4(由 NFC Forum 定义)
- 强烈建议能够通过以下 NFC 标准读取和写入 NDEF 消息以及原始数据。请注意,虽然此处说以下 NFC 标准是“强烈建议”遵循的标准,但我们计划在未来版本的兼容性定义中将其更改为“必须”遵循的标准。这些标准在此版本中是非强制性标准,但在未来版本中将成为必须遵从的标准。强烈建议搭载此 Android 版本的现有设备及新设备现在就满足这些要求,以便能够升级到未来的平台版本。
- NfcV (ISO 15693)
- 应能够读取 Thinfilm NFC Barcode 产品的条形码和网址(如果已编码)。
- 必须能够通过以下点对点连接标准和协议传送和接收数据:
- ISO 18092
- LLCP 1.2 (由 NFC Forum 定义)
- SDP 1.0(由 NFC Forum 定义)
- NDEF 推送协议
- SNEP 1.0 (由 NFC Forum 定义)
- 必须支持 Android Beam。
- 必须实现 SNEP 默认服务器。必须使用 android.nfc.ACTION_NDEF_DISCOVERED intent 将默认 SNEP 服务器收到的有效 NDEF 消息发送给应用。在设置中停用 Android Beam 不得导致停止发送收到的 NDEF 消息。
- 必须遵从 android.settings.NFCSHARING_SETTINGS intent,以显示 NFC 共享设置。
- 必须实现 NPP 服务器。必须按照处理默认 SNEP 服务器收到的消息时采用的方式,处理 NPP 服务器收到的消息。
- 必须实现 SNEP 客户端,并且在 Android Beam 处于启用状态时,必须尝试将出站点对点 NDEF 消息发送到默认 SNEP 服务器。如果未找到默认 SNEP 服务器,则该客户端必须尝试将消息发送到 NPP 服务器。
- 必须允许前台 activity 使用 android.nfc.NfcAdapter.setNdefPushMessage、android.nfc.NfcAdapter.setNdefPushMessageCallback 和 android.nfc.NfcAdapter.enableForegroundNdefPush 设置出站点对点 NDEF 消息。
- 在发送出站点对点 NDEF 消息之前,应使用手势或屏幕确认(例如“触摸传输”)。
- 应默认启用 Android Beam,且必须能够使用 Android Beam 收发消息,即使开启了其他专有 NFC 点对点模式
- 如果设备支持蓝牙对象推送配置文件,则必须支持从 NFC 连接切换到蓝牙。使用 android.nfc.NfcAdapter.setBeamPushUris 时,设备实现必须支持将连接切换到蓝牙,方法是实现 NFC Forum 提供的连接切换 1.2 版和使用 NFC 进行安全简单的蓝牙配对 1.0 版规范。此类实现必须实现服务名称为“urn:nfc:sn:handover”的切换 LLCP 服务,以便通过 NFC 交换切换请求/部分记录;并且必须使用蓝牙对象推送配置进行实际的蓝牙数据传输。为了与旧版兼容(与 Android 4.1 设备保持兼容),此类实现应仍接受 SNEP GET 请求,以便通过 NFC 交换切换请求/部分记录。不过,实现本身不应发送关于执行连接切换的 SNEP GET 请求。
- 在 NFC 发现模式下,必须轮询所有支持的技术。
- 当设备处于唤醒状态、屏幕处于活动状态,并且锁定屏幕未锁定时,应采用 NFC 发现模式。
- 必须能够通过以下 NFC 标准充当 NFC Forum 读取器/写入器(如 NFC Forum 技术规范 NFCForum-TS-DigitalProtocol-1.0 中所定义):
(请注意,上面提到的 JIS、ISO 和 NFC Forum 规范没有公开提供的链接。)
Android 支持 NFC 主机卡模拟 (HCE) 模式。如果设备实现包含支持 HCE(适用于 NfcA 和/或 NfcB)的 NFC 控制器芯片组,并且支持应用 ID (AID) 路由,则:
- 必须报告 android.hardware.nfc.hce 功能常量。
- 必须支持 NFC HCE API(如 Android SDK 中所定义)。
如果设备实现包含支持 HCE(适用于 NfcF)的 NFC 控制器芯片组,并且为第三方应用实现该功能,则:
- 必须报告 android.hardware.nfc.hcef 功能常量。
- 必须实现 NfcF 卡模拟 API(如 Android SDK 中所定义)。
此外,设备实现还可以为以下 MIFARE 技术提供读取器/写入器支持。
- MIFARE Classic
- MIFARE Ultralight
- NDEF on MIFARE Classic
请注意,Android 包含针对这些 MIFARE 类型的 API。如果设备实现支持具有读取器/写入器角色的 MIFARE,则:
- 必须实现 Android SDK 中记述的相应 Android API。
- 必须通过 android.content.pm.PackageManager.hasSystemFeature() 方法报告 com.nxp.mifare 功能。请注意,这不是标准的 Android 功能,因此不会在 android.content.pm.PackageManager 类中显示为常量。
- 不得实现对应的 Android API,也不得报告 com.nxp.mifare 功能,除非还实现了本节中所述的一般 NFC 支持。
如果设备实现不包含 NFC 硬件,则不得通过 android.content.pm.PackageManager.hasSystemFeature() 方法声明 android.hardware.nfc 功能,并且必须将 Android NFC API 实现为空操作。
由于 android.nfc.NdefMessage 和 android.nfc.NdefRecord 类表示独立于协议的数据表示格式,因此设备实现必须实现这些 API,即使它们不支持 NFC 或声明 android.hardware.nfc 功能。
7.4.5. 最低网络功能
设备实现必须支持一种或多种形式的数据网络连接。具体而言,设备实现必须支持至少一种能够达到 200Kbit/sec 或更高传输速率的数据标准。满足该要求的技术包括 EDGE、HSPA、EV-DO、802.11g、以太网、蓝牙 PAN 等。
如果采用的物理网络标准(例如以太网)是主要数据连接,设备实现还应支持至少一种常用的无线数据标准,例如 802.11 (WLAN)。
设备可以实现多种形式的数据连接。
设备必须包含 IPv6 网络堆栈,并支持使用受管理 API(例如 java.net.Socket
和 java.net.URLConnection
)以及原生 API(例如 AF_INET6
套接字)进行 IPv6 通信。所需的 IPv6 支持级别取决于网络类型,如下所述:
- 支持 Wi-Fi 网络的设备必须支持通过 Wi-Fi 执行双栈和 IPv6 单栈操作。
- 支持以太网的设备必须支持通过以太网执行双栈操作。
- 支持移动数据网络的设备应支持通过移动数据网络执行 IPv6 操作(IPv6 单栈操作,也可能是双栈操作)。
- 当设备同时连接到多个网络(例如,WLAN 和移动数据网络)时,必须同时满足上述针对连接到的每个网络的要求。
必须默认启用 IPv6。
为了确保 IPv6 通信与 IPv4 一样可靠,即使屏幕未处于活动状态,也不得丢弃发送到设备的单播 IPv6 数据包。可以在硬件或固件中限制冗余的多播 IPv6 数据包(例如完全相同的重复路由器通告)的发送次数(如果必须要这样做以节省电量)。在这种情况下,限制发送次数不得导致设备断开与任何符合 IPv6 标准的网络(使用的 RA 生命周期至少为 180 秒)的 IPv6 连接。
IPv6 连接必须保持低电耗模式。
7.4.6. 同步设置
设备实现必须默认启用主自动同步设置,以便方法 getMasterSyncAutomatically() 返回“true”。
7.4.7. 流量节省程序
强烈建议网络连接按流量计费的设备实现提供流量节省程序模式。
如果设备实现提供流量节省程序模式,则:
-
必须支持
ConnectivityManager
类中的所有 API(如 SDK 文档中所述) -
必须在设置中提供一个界面,以便用户向许可名单中添加应用或从中移除应用。
相反,如果设备实现不提供流量节省程序模式,则:
-
必须返回
ConnectivityManager.getRestrictBackgroundStatus()
的值RESTRICT_BACKGROUND_STATUS_DISABLED
-
不得广播
ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED
-
必须有负责处理
Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS
intent 的 activity,但可以将其实现为空操作。
7.5. 摄像头
设备实现应包含后置摄像头,并且可以包含前置摄像头。后置摄像头指位于设备上背向显示屏一侧的摄像头,也就是说,与传统摄像头一样,它拍摄的是背向设备显示屏一侧的场景。前置摄像头指与设备上的显示屏位于同一侧的摄像头,也就是通常用于拍摄用户自己的摄像头,例如用于视频会议及类似应用的摄像头。
如果设备实现包含至少一个摄像头,那么当摄像头打开着以进行基本预览和静态拍摄时,必须确保应用可以同时分配 3 个大小与设备上分辨率最大的摄像头传感器所生成的图片相同的 RGBA_8888 位图。
7.5.1. 后置摄像头
设备实现应包含后置摄像头。如果设备实现包含至少一个后置摄像头,则:
- 必须报告 android.hardware.camera 和 android.hardware.camera.any 功能标志。
- 分辨率必须至少为 200 万像素。
- 应在摄像头驱动程序中实现硬件自动对焦或软件自动对焦(对应用程序透明)。
- 可以具有固定焦距硬件或 EDOF(扩展景深)硬件。
- 可以包含闪光灯。如果摄像头包含闪光灯,当已在摄像头预览 surface 上注册 android.hardware.Camera.PreviewCallback 实例时,闪光灯不得亮起,除非应用已通过启用 Camera.Parameters 对象的 FLASH_MODE_AUTO 或 FLASH_MODE_ON 属性明确启用闪光灯。请注意,此项限制不适用于设备的内置系统摄像头应用,而仅适用于使用 Camera.PreviewCallback。
7.5.2. 前置摄像头
设备实现可以包含前置摄像头。如果设备实现包含至少一个前置摄像头,则:
- 必须报告功能标志 android.hardware.camera.any 和 android.hardware.camera.front。
- 分辨率不得低于 VGA(640x480 像素)。
- 不得将前置摄像头用作 Camera API 的默认摄像头。Android 中的 Camera API 对前置摄像头提供特定的支持,设备实现不得将该 API 配置为将前置摄像头视为默认后置摄像头,即使它是设备上的唯一摄像头也是如此。
- 可以包含可供后置摄像头使用的功能,例如自动对焦、闪光灯等(如第 7.5.1 节中所述)。
- 必须在 CameraPreview 中水平反映(即镜像)应用显示的串流,如下所述:
- 如果用户能够旋转设备实现(例如通过加速度计自动旋转或通过用户输入手动旋转),必须相对于设备的当前方向水平镜像摄像头预览。
- 如果当前应用已通过调用 android.hardware.Camera.setDisplayOrientation() 方法明确请求旋转摄像头显示,则必须相对于应用指定的方向水平镜像摄像头预览。
- 否则,必须沿着设备的默认水平轴镜像预览。
- 必须按照镜像摄像头预览图像串流时采用的方式,镜像由 postview 显示的图像。如果设备实现不支持 postview,此要求显然不适用。
- 不得镜像最终拍摄的返回到应用回调或提交到媒体存储空间的静态图像或视频串流。
7.5.3. 外接摄像头
设备实现可以支持无需一直连接到设备的外接摄像头。如果设备支持外接摄像头,则:
- 必须声明平台功能标志
android.hardware.camera.external
和android.hardware camera.any
。 - 可以支持多个摄像头。
- 如果通过 USB 端口连接外接摄像头,则必须支持 USB Video Class(UVC 1.0 或更高版本)。
- 应支持 MJPEG 等视频压缩格式,以便传输高品质的未编码串流(即原始照片串流或独立压缩的照片串流)。
- 可以支持基于摄像头的视频编码。如果支持,并发的未编码/MJPEG 流(QVGA 或更高分辨率)必须可供设备实现访问。
7.5.4. Camera API 行为
Android 包含两个用于访问摄像头的 API 包,较新的 android.hardware.camera2 API 使应用可以对摄像头进行较低级别的控制,包括高效的零复制连拍/视频流,以及按帧对曝光、增益、白平衡增益、颜色转换、去噪、锐化等进行控制。
旧版 API 软件包 android.hardware.Camera 在 Android 5.0 中被标记为已废弃,但由于该 API 包应仍可供应用使用,因此 Android 设备实现必须确保继续支持该 API,如本节和 Android SDK 中所述。
设备实现必须为所有可用的摄像头实现摄像头相关 API 的以下行为:
- 如果应用从未调用过 android.hardware.Camera.Parameters.setPreviewFormat(int),设备必须使用 android.hardware.PixelFormat.YCbCr_420_SP 获取提供给应用回调的预览数据。
- 如果应用注册了 android.hardware.Camera.PreviewCallback 实例,并且系统在预览格式为 YCbCr_420_SP 时调用 onPreviewFrame() 方法,那么传递到 onPreviewFrame() 的 byte[] 中的数据必须进一步采用 NV21 编码格式。也就是说,NV21 必须是默认设置。
- 对于 android.hardware.Camera,设备实现必须支持使用 YV12 格式(用 android.graphics.ImageFormat.YV12 常量表示)进行前置摄像头和后置摄像头的摄像头预览。(硬件视频编码器和摄像头可以使用任何原生像素格式,但设备实现必须支持转换为 YV12。)
- 对于 android.hardware.camera2,设备显示必须通过 android.media.ImageReader API 支持使用 android.hardware.ImageFormat.YUV_420_888 和 android.hardware.ImageFormat.JPEG 作为输出格式。
无论设备是否包含硬件自动对焦或其他功能,设备实现仍必须实现 Android SDK 文档中包含的完整 Camera API。例如,没有自动对焦功能的摄像头仍必须调用所有已注册的 android.hardware.Camera.AutoFocusCallback 实例(即使这与非自动对焦摄像头无关)。请注意,这适用于前置摄像头。例如,虽然大多数前置摄像头都不支持自动对焦,但仍必须如所述那样“伪造”API 回调。
如果底层硬件支持相应功能,则设备实现必须识别并遵从 android.hardware.Camera.Parameters 类中定义为常量的每个参数名称。如果设备硬件不支持某项功能,则 API 的行为方式必须与所记述的行为方式一样。反之,设备实现不得遵从或识别传递给 android.hardware.Camera.setParameters() 方法的字符串常量,在 android.hardware.Camera.Parameters 中载述为常量的字符串常量除外。也就是说,设备实现必须支持所有标准摄像头参数(如果硬件允许),并且不得支持自定义摄像头参数类型。例如,如果设备实现支持使用高动态范围 (HDR) 成像技术拍照,则必须支持摄像头参数 Camera.SCENE_MODE_HDR。
因为并非所有设备实现都可以完全支持 android.hardware.camera2 API 的所有功能,所以设备实现必须使用 android.info.supportedHardwareLevel 属性报告正确的支持级别(如 Android SDK 中所述),并报告相应的框架功能标志。
设备实现还必须通过 android.request.availableCapabilities 属性声明 android.hardware.camera2 的各项摄像头功能,并声明相应的功能标志;如果连接的任何摄像头设备支持某项功能,则设备必须定义相应的功能标志。
每当摄像头拍摄了新照片且相应的照片条目已添加到媒体库时,设备实现都必须广播 Camera.ACTION_NEW_PICTURE intent。
每当摄像头录制了新视频且相应的视频条目已添加到媒体库时,设备实现都必须广播 Camera.ACTION_NEW_VIDEO intent。
7.5.5. 摄像头方向
前置摄像头和后置摄像头(如果存在)都必须朝向正确方向,以便摄像头的长度方向与屏幕的长度方向一致。也就是说,当设备处于横向时,摄像头必须横向拍摄。无论设备的自然方向为何,此规则都适用;也就是说,它适用于以横屏为主的设备以及以竖屏为主的设备。
7.6. 内存和存储空间
7.6.1. 最小内存和存储空间
可供设备实现中的内核和用户空间使用的内存必须至少等于或大于下表中指定的最小值。(有关屏幕尺寸和密度的定义,请参阅第 7.1.1 节。)
密度和屏幕尺寸 | 32 位设备 | 64 位设备 |
---|---|---|
Android Watch 设备(由于屏幕较小) | 416MB | 不适用 |
|
512 MB | 816MB |
|
608MB | 944MB |
|
896MB | 1280MB |
|
1344MB | 1824MB |
最小内存值不得包含任何专用于不在内核控制下的硬件组件(例如无线装置、视频等)的内存空间。
对于 ActivityManager.isLowRamDevice(),可供内核和用户空间使用的内存小于 512MB 的设备实现(Android Watch 除外)必须返回值“true”。
Android TV 设备必须至少有 4GB 的非易失性存储空间可用于存储应用专属数据,而其他设备实现则必须至少有 3GB。也就是说,如果是 Android TV 设备,/data 分区必须至少为 4GB,如果是其他设备,则必须至少为 3GB。强烈建议搭载 Android 的设备实现至少有 4GB 的非易失性存储空间可用于存储应用专属数据,以便能够升级到未来的平台版本。
Android API 包含一个内容下载管理器,应用可以使用它下载数据文件。内容下载管理器的设备实现必须能够将至少为 100MB 的各个文件下载到默认的“缓存”位置。
7.6.2. 应用共享的存储空间
设备实现必须为应用提供共享的存储空间,通常也称为“共享的外部存储空间”。
设备实现必须配有默认装载且可直接使用的共享存储空间。如果共享存储空间未装载在 Linux 路径 /sdcard 下,则设备必须包含从 /sdcard 指向实际装载点的 Linux 符号链接。
设备实现可以具有相应的硬件来安装用户可访问的可移动存储设备,例如安全数字 (SD) 卡插槽。如果此插槽用于满足共享存储空间要求,则设备实现:
- 必须实现在没有 SD 卡时警告用户的消息框或弹出界面。
- 必须包含经过 FAT 格式化的 SD 卡(大小为 1GB 或更大),或者在包装箱及购买时提供的其他材料上注明 SD 卡必须单独购买。
- 必须默认装载 SD 卡。
或者,设备实现可以将内部(不可移动的)存储设备分配为共享的存储空间,以供上游 Android 开源项目中包含的应用使用;设备实现应使用这种配置和软件实现。如果设备实现使用内部(不可移动的)存储设备来满足共享的存储空间要求,而该存储设备可以留出空间来存储应用专属数据,则其大小必须至少为 1GB 并装载在 /sdcard 上(或者,如果装载在其他位置,则 /sdcard 必须是指向实际位置的符号链接)。
设备实现必须按照文档中所述,对该共享存储空间强制授予 android.permission.WRITE_EXTERNAL_STORAGE 权限。必须允许任何获得该权限的应用对共享存储空间执行写入操作。
包含多个共享存储空间路径(例如 SD 卡插槽和共享的内部存储空间)的设备实现必须仅允许预安装且具有 WRITE_EXTERNAL_STORAGE 权限的 Android 特权应用对辅助外部存储空间执行写入操作,写入到其软件包专用目录或在通过触发 ACTION_OPEN_DOCUMENT_TREE
intent 返回的 URI
中执行写入操作时除外。
不过,设备实现应通过 Android 的媒体扫描程序服务和 android.provider.MediaStore 透明地公开上述两个存储空间路径中的内容。
无论使用什么形式的共享存储空间,如果设备实现具有支持 USB 外围设备模式的 USB 端口,则必须提供某种机制来从主机计算机访问共享存储空间的内容。设备实现可以使用 USB 大容量存储,但应使用媒体传输协议来满足此项要求。如果设备实现支持媒体传输协议,则:
- 应与 Android MTP 参考主机(Android 文件传输)兼容。
- 应报告 USB 设备类 0x00。
- 应报告 USB 接口名称“MTP”。
7.6.3. 可合并的存储设备
如果可移动存储设备端口位于长期稳定的位置(例如电池盒或其他防护盖内),则强烈建议设备实现来实现可合并的存储设备。
诸如电视之类的设备实现可以通过 USB 端口采用存储,因为该设备应静止不动。但对于本质上为移动设备的其他设备实现,则强烈建议在长期稳定的位置实现可合并的存储设备,因为意外断开连接可能会导致数据丢失/损坏。
7.7. USB
设备实现应支持 USB 外围设备模式,并且应支持 USB 主机模式。
7.7.1. USB 外围设备模式
如果设备实现包含支持外围设备模式的 USB 端口,则:
- 该端口必须可连接到具有标准 A 型或 C 型 USB 端口的 USB 主机。
- 该端口应使用 micro-B 型、micro-AB 型或 Type-C USB 设备规格。强烈建议现有的及新的 Android 设备满足这些要求,以便能够升级到未来的平台版本。
- 该端口应位于设备底部(根据自然方向),或为所有应用(包括主屏幕)启用软件屏幕旋转功能,以便设备在按照该端口位于底部的方位放置时,显示屏能够正确呈现内容。强烈建议现有的及新的 Android 设备满足这些要求,以便能够升级到未来的平台版本。
- 它必须允许与 Android 设备连接的 USB 主机使用 USB 大容量存储或媒体传输协议访问共享存储空间的内容。
- 它应实现 Android SDK 文档中所述的 Android Open Accessory (AOA) API 和规范;如果是 Android 手持设备,则必须实现 AOA API。实现 AOA 规范的设备实现:
- 必须声明支持硬件功能 android.hardware.usb.accessory。
- 必须实现 Android SDK 文档中所述的 USB 音频类。
- USB 大容量存储设备类必须在 USB 大容量存储设备的接口描述
iInterface
字符串末尾添加字符串“android”。
- 应支持在 HS 线性调频和流量传输期间采用 1.5 A 电流(如 USB 电池充电规范 - 修订版 1.2 中所规定)。强烈建议现有的及新的 Android 设备满足这些要求,以便能够升级到未来的平台版本。
- C 型设备必须根据 C 型电阻标准检测 1.5A 和 3.0A 充电器,而且必须检测通告中的变化。
- 强烈建议还另外支持 USB 主机模式的 C 型设备支持 Power Delivery 以进行数据和电源角色交换。
- C 型设备应支持 Power Delivery 以进行高压充电,并且应支持显示输出等替代模式。
- USB 标准设备描述符中 iSerialNumber 的值必须等于 android.os.Build.SERIAL 的值。
- 强烈建议 C 型设备不要支持会修改 Vbus 电压(使其超出默认级别)或改变接收端/源端角色的专有充电方法,因为这样可能会导致充电器或支持标准 USB Power Delivery 方法的设备出现互操作性问题。虽然此处说的是“强烈建议”,但在未来的 Android 版本中,我们可能会要求所有 C 型设备支持与标准 C 型充电器的完整互操作性。
7.7.2. USB 主机模式
如果设备实现包含支持主机模式的 USB 端口,则:
- 应使用 C 型 USB 端口(如果设备实现支持 USB 3.1)。
- 可以使用非标准端口设备规格;但这样做的话,则必须附带一条或多条数据线,以用于将该端口适配到标准 A 型或 Type-C USB 端口。
- 可以使用 micro-AB USB 端口;但这样做的话,则必须附带一条或多条数据线,以用于将该端口适配到标准 A 型或 C 型 USB 端口。
- 强烈建议实现 USB 音频类(如 Android SDK 文档中所述)。
- 必须实现 Android SDK 中所述的 Android USB 主机 API,并且必须声明支持硬件功能 android.hardware.usb.host。
- 应支持在主机模式下给设备充电;为 USB C 型连接器提供至少 1.5A 的源电流(如 [USB C 型数据线和连接器规范 – 修订版 1.2] (http://www.usb.org/developers/docs/usb_31_021517.zip) 的“端接参数”部分中所规定),或为 Micro-AB 型连接器使用充电下行端口 (CDP) 输出电流范围(如 USB 电池充电规范 - 修订版 1.2 中所规定)。
- 强烈建议 USB C 型设备支持 DisplayPort,应支持 USB SuperSpeed 数据传输速率,并且强烈建议支持 Power Delivery 以进行数据角色和电源角色交换。
- 带有任何 A 型或 AB 型端口的设备不得随附用于从该端口转换为 C 型插口的适配器。
- 必须能够识别任何远程连接的 MTP(媒体传输协议)设备,并能通过
ACTION_GET_CONTENT
、ACTION_OPEN_DOCUMENT
和ACTION_CREATE_DOCUMENT
intent 使其内容可访问(如果支持存储访问框架 (SAF))。 - 必须(如果使用 USB C 型端口并支持外围设备模式)实现 USB C 型规范所定义的双重角色端口功能(第 4.5.1.3.3 节)。
- 应实现最适合设备规格的 Try.* 模型(如果支持双重角色端口功能)。例如,手持设备应实现 Try.SNK 模型。
7.8. 音频
7.8.1. 麦克风
设备实现可以省略麦克风。不过,如果设备实现省略了麦克风,则不得报告 android.hardware.microphone 功能常量,并且必须至少要作为空操作来实现录音 API(如第 7 节中所述)。反之,如果设备实现包含麦克风,则:
- 必须报告 android.hardware.microphone 功能常量。
- 必须满足第 5.4 节中的录音要求。
- 必须满足第 5.6 节中的音频延迟要求。
- 强烈建议支持近超声录音(如第 7.8.3 节中所述)。
7.8.2. 音频输出
包含扬声器或带有音频输出外围设备的音频/多媒体输出端口(作为耳机或外部扬声器)的设备实现:
- 必须报告 android.hardware.audio.output 功能常量。
- 必须满足第 5.5 节中的音频播放要求。
- 必须满足第 5.6 节中的音频延迟要求。
- 强烈建议支持近超声播放(如第 7.8.3 节中所述)。
不过,如果设备实现不包含扬声器或音频输出端口,则不得报告 android.hardware.audio 输出功能,而且必须至少要作为空操作来实现与音频输出相关的 API。
Android Watch 设备实现可以但不应包含音频输出,但其他类型的 Android 设备实现则必须包含音频输出并声明 android.hardware.audio.output。
7.8.2.1. 模拟音频端口
为了兼容 Android 生态系统中使用 3.5 毫米音频插头的耳机和其他音频配件,如果设备实现包含一个或多个模拟音频端口,则至少有一个音频端口应为 4 导体 3.5 毫米音频耳机插孔。如果设备实现包含 4 导体 3.5 毫米音频耳机插孔,则:
- 必须支持使用麦克风,通过立体声头戴式耳机和立体声耳机进行音频播放,并且应支持使用麦克风通过立体声耳机进行录音。
- 必须支持具有 CTIA 引脚顺序的 TRRS 音频插头,并且应支持具有 OMTP 引脚顺序的音频插头。
- 必须支持检测插入的音频配件上是否有麦克风(如果设备实现支持麦克风),并广播 android.intent.action.HEADSET_PLUG(额外值麦克风设为 1)。
- 必须支持检测并映射到音频插头上的麦克风导体和接地导体之间的以下 3 个等效阻抗范围的键码:
- 70 欧姆或更小:KEYCODE_HEADSETHOOK
- 210-290 欧姆:KEYCODE_VOLUME_UP
- 360-680 欧姆:KEYCODE_VOLUME_DOWN
- 强烈建议检测音频插头上的麦克风导体和接地导体之间以下范围的等效阻抗,并将其映射到相应的键码:
- 110-180 欧姆:KEYCODE_VOICE_ASSIST
- 必须在插入插头时触发 ACTION_HEADSET_PLUG,但只能在插头上的所有触点都已接触到耳机插孔上各自的相关部分后才能触发。
- 必须能够在 32 欧姆扬声器阻抗上驱动至少 150mV ± 10% 的输出电压。
- 必须具备 1.8V ~ 2.9V 之间的麦克风偏置电压。
7.8.3. 近超声
近超声音频的频带为 18.5 kHz 到 20 kHz。设备实现必须通过 AudioManager.getProperty API 正确报告对近超声音频功能的支持情况,如下所述:
- 如果 PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND 为“true”,则 VOICE_RECOGNITION 和 UNPROCESSED 音频源必须满足以下要求:
- 麦克风在 18.5 kHz 到 20 kHz 频带之间的平均功率响应不得比 2 kHz 下的响应低 15 dB 以上。
- 在 18.5 kHz 到 20 kHz 范围下,-26 dBFS 下音调为 19 kHz 的麦克风不加权信噪比不得低于 50 dB。
- 如果 PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND 为“true”,则扬声器在 18.5 kHz 到 20 kHz 下的平均响应不得比 2 kHz 下的响应低 40 dB 以上。
7.9. 虚拟现实
Android 包含用于构建“虚拟现实”(VR) 应用(提供高品质的移动 VR 体验)的 API 和工具。设备实现必须正确实现本节中详细介绍的这些 API 和行为。
7.9.1. 虚拟现实模式
如果 Android 手持设备实现支持 VR 应用模式(该模式用于处理通知的立体呈现,并会在 VR 应用获得用户聚焦时停用单目系统界面组件),则必须声明 android.software.vr.mode
功能。如果设备声明此功能,则必须包含实现 android.service.vr.VrListenerService
(可由 VR 应用通过 android.app.Activity#setVrModeEnabled
启用)的应用。
7.9.2. 虚拟现实高性能
Android 手持设备实现必须通过 android.hardware.vr.high_performance
功能标志标识支持在较长的用户周期内使用高性能 VR,并满足以下要求。
- 设备实现必须有至少 2 个实体核心。
- 设备实现必须声明 android.software.vr.mode 功能。
- 设备实现可以为前台应用提供专属核心,并且可以支持 Process.getExclusiveCores API 返回专用于最靠前的前台应用的 CPU 核心数。如果支持专用核心,则该核心不得允许任何其他用户空间进程(应用使用的设备驱动程序除外)在其上运行,但在必要时可以允许一些内核进程在其上运行。
- 设备实现必须支持持续性能模式。
- 设备实现必须支持 OpenGL ES 3.2。
- 设备实现必须支持 Vulkan Hardware Level 0,并且应支持 Vulkan Hardware Level 1。
- 设备实现必须实现 EGL_KHR_mutable_render_buffer 和 EGL_ANDROID_front_buffer_auto_refresh、EGL_ANDROID_create_native_client_buffer、EGL_KHR_fence_sync 以及 EGL_KHR_wait_sync,以便它们可用于共享缓冲区模式,并在可用 EGL 扩展列表中公开这些扩展。
- GPU 和显示屏必须能够同步访问共享的前端缓冲区,以便在两个呈现环境中以 60fps 的速率交替呈现 VR 内容时,没有可见的撕裂现象。
- 设备实现必须实现 EGL_IMG_context_priority,并在可用的 EGL 扩展程序列表中公开该扩展程序。
- 设备实现必须实现 GL_EXT_multisampled_render_to_texture、GL_OVR_multiview、GL_OVR_multiview2 和 GL_OVR_multiview_multisampled_render_to_texture,并在可用的 GL 扩展程序列表中公开这些扩展程序。
- 设备实现必须实现 EGL_EXT_protected_content 和 GL_EXT_protected_textures,以用于安全纹理视频播放,并在可用的 EGL 和 GL 扩展程序列表中公开这些扩展程序。
- 设备实现必须支持以至少 3840x2160@30fps-40Mbps 的分辨率和速度(相当于 4 个 1920x1080@30fps-10Mbps 实例或 2 个 1920x1080@60fps-20Mbps 实例)进行 H.264 解码。
- 设备实现必须支持 HEVC 和 VP9,必须能够以至少 1920x1080@30fps-10Mbps 的分辨率和速度进行解码,并且应能够以 3840x2160@30fps-20Mbps 的分辨率和速度进行解码(相当于 4 个 1920x1080@30fps-5Mbps 实例)。
- 强烈建议设备实现支持 android.hardware.sensor.hifi_sensors 功能,并且必须满足与陀螺仪、加速度计和磁力计相关的 android.hardware.hifi_sensors 要求。
- 设备实现必须支持 HardwarePropertiesManager.getDeviceTemperatures API,并返回表层温度的准确值。
- 设备实现必须具有嵌入式屏幕,并且其分辨率必须至少为全高清 (1080p),强烈建议分辨率为四倍高清 (1440p) 或更高。
- 显示屏对角线尺寸必须在 4.7 英寸到 6 英寸之间。
- 显示屏在 VR 模式下的更新频率必须至少为 60 Hz。
- 显示屏的“灰到灰”“白到黑”和“黑到白”切换时间延迟必须小于等于 3 毫秒。
- 显示屏必须支持低持久性模式(持久性小于等于 5 毫秒),持久性指像素发光的时长。
- 设备实现必须支持蓝牙 4.2 和蓝牙 LE 数据长度扩展(第 7.4.3 节)。
8. 性能和功耗
有些最低性能和功耗标准对用户体验至关重要,并且会影响开发者在开发应用时所做的基准假设。Android Watch 设备应符合以下标准,而其他类型的设备实现必须符合以下标准。
8.1. 用户体验一致性
设备实现必须确保应用和游戏享有一致的帧速率和响应时间,从而提供流畅的界面。设备实现必须满足以下要求:
- 一致的帧延迟。帧延迟或帧渲染延迟不一致的发生频率不得超过每秒 5 帧,并且应低于每秒 1 帧。
- 界面延迟。设备实现必须确保实现低延迟用户体验,具体方式是确保滚动完包含 10K 个列表条目的列表(具体定义详见 Android 兼容性测试套件 [CTS])所用的时间不超过 36 秒。
- 任务切换。在启动了多个应用的情况下,如果重新启动已启动且已在运行的应用,所用时间不得超过 1 秒。
8.2. 文件 I/O 访问性能
设备实现必须确保读取和写入操作的内部存储文件访问性能的一致性。
- 顺序写入。设备实现必须确保使用 10 MB 写入缓冲区时 256 MB 文件的顺序写入性能至少为 5 MB/秒。
- 随机写入。设备实现必须确保使用 4 KB 写入缓冲区时 256 MB 文件的随机写入性能至少为 0.5 MB/秒。
- 顺序读取。设备实现必须确保使用 10 MB 写入缓冲区时 256 MB 文件的顺序读取性能至少为 15 MB/秒。
- 随机读取。设备实现必须确保使用 4 KB 写入缓冲区时 256 MB 文件的随机读取性能至少为 3.5 MB/秒。
8.3. 节电模式
Android 6.0 引入了应用待机模式和低电耗模式这两种节电模式来优化电池的使用。必须让最终用户能够看到所有可以不进入这两种模式的豁免应用。此外,这些节电模式的触发、维护、唤醒算法以及全局系统设置的使用不得违背 Android 开源项目。
除了节电模式之外,Android 设备实现还可以实现任意或全部 4 种休眠电源状态(如高级配置与电源接口 [ACPI] 中定义),但如果实现了 S3 和 S4 电源状态,则只有合上实际属于设备一部分的盖子时才会进入这些状态。
8.4. 功耗计算
更准确地计算和报告功耗有助于应用开发者找出能够优化应用功耗模式的措施和工具。因此,设备实现:
- 必须能够跟踪硬件组件的用电量,并将该用电量归因于特定的应用。具体来说,实现:
- 必须提供一个关于各组件功耗的配置文件,其中要定义每种硬件组件的耗电值,以及组件在一段时间内大概消耗的电量(如 Android 开源项目网站上所述)。
- 必须以毫安小时 (mAh) 为单位报告所有功耗值。
- 如果无法将硬件组件的功耗归于某个应用,则应将其归于硬件组件本身。
- 必须按每个进程的 UID 报告 CPU 功耗。Android 开源项目通过
uid_cputime
内核模块实现来满足此要求。
- 必须能让应用开发者通过
adb shell dumpsys batterystats
shell 命令查看此功耗。 - 必须遵从 android.intent.action.POWER_USAGE_SUMMARY intent,并提供一个会显示此功耗的设置菜单。
8.5. 性能稳定
高性能应用在长时间运行时,性能可能会因后台运行的其他应用或由于温度限制导致的 CPU 节流而出现大幅波动。Android 包含可编程接口,以便在设备胜任的情况下,最靠前的前台应用能够请求系统优化资源的分配,来应对这种波动。
设备实现应支持持续性能模式,当通过 Window.setSustainedPerformanceMode()
API 方法请求时,该模式能让最靠前的前台应用长时间保持稳定的性能水平。设备实现必须通过 PowerManager.isSustainedPerformanceModeSupported()
API 方法准确报告对持续性能模式的支持情况。
具有两个或更多个 CPU 核心的设备实现应至少提供一个可供最靠前的前台应用使用的专属核心。如果提供专属核心,则实现必须满足以下要求:
- 实现必须通过
Process.getExclusiveCores()
API 方法报告可预留给最靠前的前台应用使用的专用核心的 ID 号。 - 设备实现不得允许任何用户空间进程(应用使用的设备驱动程序除外)在专用核心上运行,但在必要时可以允许一些内核进程在其上运行。
如果设备实现不支持专属核心,则必须通过 Process.getExclusiveCores()
API 方法返回一个空列表。
9. 安全模型兼容性
设备实现必须实现与 Android 平台安全模型(具体定义请参见 Android 开发者文档 > API 指南 > 安全和权限参考文档)一致的安全模型。设备实现必须支持安装自签名应用,而且无需从任何第三方/权威机构获得任何额外的权限/证书。具体来说,与该 Android 版本兼容的设备必须支持下面几个小节中介绍的安全机制。
9.1. 权限
设备实现必须支持 Android 开发者文档中所定义的 Android 权限模型。具体来说就是,实现必须强制执行定义的每项权限(如 SDK 文档中所述);不得省略、更改或忽略任何权限。实现可以添加额外的权限,但前提是新的权限 ID 字符串不是中 android.* 命名空间内。
protectionLevel
为 'PROTECTION_FLAG_PRIVILEGED' 的权限必须仅授给在系统映像的已列入许可名单的特权路径(如 AOSP 实现中的 system/priv-app
路径)中预加载的应用。
保护级别为“危险”的权限属于运行时权限。targetSdkVersion 高于 22 的应用会在运行时请求这些权限。设备实现:
- 必须显示一个专用界面,以便用户决定是否授予请求的运行时权限;此外还必须提供一个供用户管理运行时权限的界面。
- 这两个界面必须有且只能有一个实现。
- 不得向预安装的应用授予任何运行时权限,除非:
- 可以在应用使用运行时权限之前获得用户同意
- 运行时权限与符合以下条件的某个 intent 模式相关联:已将预安装的应用设为其默认处理程序
9.2. UID 和进程隔离
设备实现必须支持 Android 应用沙盒模型。在该模型中,每个应用都是在单独的进程中作为独一无二的 Unixstyle UID 运行。设备实现必须支持以同一 Linux 用户 ID 运行多个应用,但前提是这些应用已经过适当签名,并采用了适当的构建方式(具体定义请参见安全和权限参考文档)。
9.3. 文件系统权限
设备实现必须支持安全和权限参考中所定义的 Android 文件访问权限模型。
9.4. 替代执行环境
设备实现可以包括运行时环境,此类环境是使用 Dalvik 可执行文件格式或原生代码以外的一些其他软件或技术来执行应用。不过,此类替代执行环境不得损害 Android 安全模型或已安装的 Android 应用的安全性(如本节中所述)。
替代运行时本身必须是 Android 应用,并且遵循标准的 Android 安全模型(如第 9 节中的其他部分所述)。
如果资源受权限保护,但未通过 <uses-permission> 机制在运行时的 AndroidManifest.xml 文件中请求相关权限,则不得授予替代运行时对资源的访问权限。
替代运行时不得允许应用使用受系统应用专用 Android 权限保护的功能。
替代运行时必须遵循 Android 沙盒模型具体来说,替代运行时:
- 应通过 PackageManager 将应用安装到单独的 Android 沙盒(Linux 用户 ID 等)中。
- 可以提供所有使用替代运行时的应用共享的单个 Android 沙盒。
- 使用替代运行时的已安装应用不得重复使用设备上安装的任何其他应用的沙盒,除非通过共享用户 ID 和签名证书的标准 Android 机制。
- 不得与对应于其他 Android 应用的沙盒一起启动,也不得授予或被授予对这些沙盒的访问权限。
- 不得在启动时获得、被授予或向其他应用授予超级用户 (root) 或任何其他用户 ID 的任何权限。
替代运行时的 .apk 文件可以包含在设备实现的系统映像中,但必须已签名,且签名时所用的密钥必须不同于对设备实现随附的其他应用签名时使用的密钥。
安装应用时,替代运行时必须就应用使用的 Android 权限获得用户同意。如果某个应用需要使用具有相应 Android 权限的设备资源(例如摄像头、GPS,等等),则替代运行时必须通知用户,让他们知道该应用将能够访问相应资源。如果运行时环境不会以这种方式记录应用功能,则在安装任何使用该运行时的应用时,运行时环境都必须列出运行时自身拥有的所有权限。
9.5. 多用户支持
Android 支持多用户功能,并支持完全用户隔离。设备实现可以启用多个用户,但启用时必须满足以下与多用户支持相关的要求:
- 启用多用户支持的 Android Automotive 设备实现必须包含访客账号,使用户无需登录即可使用车载系统提供的所有功能。
- 未声明 android.hardware.telephony 功能标志的设备实现必须支持受限配置文件,该功能可让设备所有者管理设备上的其他用户以及他们可以使用的功能。借助受限配置文件,设备所有者可以快速设置供其他用户使用的单独环境,同时还能在可于这些环境中运行的应用内管理更精细的限制。
- 反之,声明 android.hardware.telephony 功能标记的设备实现不得支持受限配置文件,但必须与用来允许/禁止其他用户访问语音通话和短信的控件的 AOSP 实现一致。
- 设备实现必须为每个用户实现与 Android 平台安全模型(如 API 指南的安全和权限参考文档中所定义)一致的安全模型。
- Android 设备上的每个用户实例都必须具有单独且隔离的外部存储目录。设备实现可以将多个用户的数据存储在相同的卷或文件系统上。不过,设备实现必须确保归指定用户所有且以其名义运行的应用不能列出、读取或写入任何其他用户拥有的数据。请注意,可移动介质(例如 SD 卡插槽)可以允许一个用户通过主机 PC 访问另一个用户的数据。因此,如果设备实现使用可移动介质作为外部存储空间 API,则必须使用仅存储在只有系统可以访问的不可移动介质上的密钥对 SD 卡中的内容进行加密(如果启用了多用户功能)。因为这样会使主机 PC 无法读取相应介质,所以设备实现将需要切换到 MTP 或类似系统,才能授权主机 PC 访问当前用户的数据。因此,如果将可移动介质用作主要的外部存储设备,则设备实现可以但不应启用多用户。
9.6. 付费短信警告
Android 支持针对任何外发付费短信向用户发出警告。付费短信是指发送到已向运营商注册且可能让用户付费的服务的短信。声明支持 android.hardware.telephony 的设备实现必须在向通过设备的 /data/misc/sms/codes.xml 文件中定义的正则表达式识别出的号码发送短信之前警告用户。上游 Android 开源项目提供了一个满足此要求的实现。
9.7. 内核安全功能
Android 沙盒包含使用安全增强型 Linux (SELinux) 强制访问控制 (MAC) 系统、seccomp 沙盒功能以及 Linux 内核中其他安全功能的功能。SELinux 或任何其他在 Android 框架下实现的安全功能:
- 必须保持与现有应用的兼容性。
- 当检测到安全违规行为并成功阻止时,不得有可见的界面;但当发生未阻止的安全违规行为且该行为导致成功的漏洞利用时,可以有可见的界面。
- 不应可由用户或开发者配置。
如果将任何用于配置政策的 API(例如 Device Administration API)提供给可能会影响其他应用的应用使用,则相应 API 不得允许使用会破坏兼容性的配置。
设备必须实现 SELinux,或者如果使用除 Linux 以外的内核,则必须实现一个等效的强制访问控制系统。设备还必须满足以下要求,这些要求通过上游 Android 开源项目中的参考实现来满足。
设备实现:
- 必须将 SELinux 设置为全局强制模式。
- 必须在强制模式下配置所有域。不允许使用宽容模式域,包括特定于设备/供应商的域。
- 对于 AOSP SELinux 网域以及特定于设备/供应商的网域,不得修改、省略或替换上游 Android 开源项目 (AOSP) 中提供的 system/sepolicy 文件夹中存在的 neverallow 规则,并且政策必须在所有 neverallow 规则都存在的情况下进行编译。
- 必须将媒体框架拆分为多个进程,以便能够更精细地为每个进程授予访问权限(如 Android 开源项目网站上所述)。
设备实现应保留上游 Android 开源项目的 system/sepolicy 文件夹中提供的默认 SELinux 政策,并且应仅针对自己的设备特定配置向此政策进一步添加内容。设备实现必须与上游 Android 开源项目兼容。
设备必须实现一种允许使用多线程程序中的可配置政策对系统调用进行过滤的内核应用沙盒机制。上游 Android 开源项目通过启用采用 threadgroup 同步 (TSYNC) 的 seccomp-BPF(如 source.android.com 上的“内核配置”部分所述)来满足此要求。
9.8. 隐私权
如果设备在系统中实现了用于捕获屏幕上显示的内容和/或录制设备上播放的音频流的功能,则每当该功能处于启用状态并且正在捕获/录制内容时,设备必须持续通知用户。
如果设备实现具有默认通过代理服务器或 VPN 网关路由网络数据流量的机制(例如,在授予 android.permission.CONTROL_VPN 的情况下预加载 VPN 服务),则设备实现必须在启用该机制之前征求用户的同意。如果相应 VPN 由设备政策控制器通过 DevicePolicyManager.setAlwaysOnVpnPackage()
启用,则不用征求用户同意;在这种情况下,用户不需要单独表示同意,只需收到通知即可。
设备实现必须搭载用户添加的空证书授权机构 (CA) 存储,并且必须为系统可信 CA 存储预安装根证书,这些证书与上游 Android 开源项目中提供的相同。
当通过 VPN 路由设备或安装了用户根 CA 时,实现必须向用户显示一条警告,指明网络流量可能受到监控。
如果设备实现具有支持 USB 外围设备模式的 USB 端口,则必须呈现界面来征求用户的同意,然后才能允许通过 USB 端口访问共享存储空间的内容。
9.9. 数据存储加密
如果设备实现支持安全锁定屏幕(如第 9.11.1 节中所述),则设备必须支持对应用专属数据(/data 分区)以及应用共享存储分区(/sdcard 分区,如果它是设备的永久不可移除部分)进行数据存储加密。
如果设备实现支持数据存储加密且高级加密标准 (AES) 加密性能高于 50 MiB/s,必须在用户完成开箱即用的设置体验时默认启用数据存储加密。如果设备实现已发布,且搭载的是版本较低且默认停用加密功能的 Android,则由于此类设备无法通过系统软件更新来满足该要求,因此可以不遵守该要求。
设备实现应通过实现文件级加密 (FBE) 来满足上述数据存储加密要求。
9.9.1. 直接启动
所有设备都必须实现直接启动模式 API,即使它们不支持存储加密也是如此。具体而言,LOCKED_BOOT_COMPLETED 和 ACTION_USER_UNLOCKED intent 必须仍向直接启动感知型应用广播信号来表明设备加密 (DE) 和凭据加密 (CE) 存储位置可供用户使用。
9.9.2. 文件级加密
如果设备实现支持 FBE,则:
- 启动时不得要求用户提供凭据,并且在广播 LOCKED_BOOT_COMPLETED 消息后允许直接启动感知型应用访问设备加密 (DE) 存储空间。
- 只有在用户已通过提供凭据(例如密码、PIN 码、图案或指纹)解锁设备并且系统已广播 ACTION_USER_UNLOCKED 消息后,才能允许访问凭据加密 (CE) 存储空间。设备实现不得提供任何在用户未提供凭据的情况下解锁受 CE 保护的存储空间的方法。
- 必须支持启动时验证,并确保 DE 密钥以加密形式绑定到设备的硬件信任根。
- 必须支持使用 AES 算法(密钥长度为 256 位,且采用 XTS 模式)对文件内容进行加密。
- 必须支持使用 AES 算法(密钥长度为 256 位,且采用 CBC-CTS 模式)对文件名进行加密。
- 可以支持使用替代加密方式、密钥长度和模式对文件内容和文件名进行加密,但默认情况下必须使用强制支持的加密方式、密钥长度和模式。
- 应将预加载的必需应用(例如闹钟、电话和 Messenger)设为直接启动感知型应用。
用于保护 CE 和 DE 存储区域的密钥:
- 必须以加密形式绑定到由硬件支持的密钥库。CE 密钥必须绑定到用户的锁定屏幕凭据。如果用户未指定锁定屏幕凭据,则 CE 密钥必须绑定到默认密码。
- 必须是独一无二的,也就是说,任何用户的 CE 或 DE 密钥都不能与其他用户的 CE 或 DE 密钥相同。
上游 Android 开源项目提供了该功能的首选实现(基于 Linux 内核 EXT4 加密功能)。
9.9.3. 完整磁盘加密
如果设备实现支持全盘加密 (FDE),则必须使用 AES 算法,密钥长度必须为 128 位(或更长),且必须采用专为存储加密设计的模式(例如 AES-XTS、AES-CBC-ESSIV)。无论何时,加密密钥均不得在未加密的情况下被写入存储。必须让用户可以使用 AES 对加密密钥进行加密(除非它正在使用中),并使用一种慢扩展算法(例如 PBKDF2 或 scrypt)对锁定屏幕凭据进行了扩展。如果用户未指定锁定屏幕凭据或已停用密码加密,则系统应使用默认密码封装加密密钥。如果设备提供了由硬件支持的 Keystore,则密码扩展算法必须以加密形式绑定到该 Keystore。不得将加密密钥发送到设备以外的位置(即使已使用用户密码和/或硬件绑定密钥进行封装也是如此)。上游 Android 开源项目提供了该功能的首选实现(基于 Linux 内核功能 dm-crypt)。
9.10. 设备完整性
以下要求旨在确保设备完整性状态的透明性。
设备实现必须通过系统 API 方法 PersistentDataBlockManager.getFlashLockState() 正确报告其引导加载程序所处的状态是否允许刷写系统映像。FLASH_LOCK_UNKNOWN
状态专用于从不存在这种新系统 API 方法的较低 Android 版本进行升级的设备实现。
启动时验证是一项旨在保证设备软件完整性的功能。如果设备实现支持该功能,则必须:
- 声明平台功能标志 android.software.verified_boot。
- 对每个启动序列执行验证。
- 从作为信任根的不可变硬件密钥开始验证,一直验证到系统分区。
- 在下一阶段中执行代码之前,实现每个验证阶段以检查下一阶段中所有字节的完整性和真实性。
- 使用与 NIST 针对哈希算法 (SHA-256) 和公钥大小 (RSA-2048) 给出的最新建议一样强大的验证算法。
- 当系统验证失败时,不得允许完成启动,除非用户同意仍然尝试启动,在这种情况下,不得使用任何未经验证的存储块中的数据。
- 不得允许修改设备上经过验证的分区,除非用户已明确解锁引导加载程序。
上游 Android 开源项目提供了该功能的首选实现(基于 Linux 内核功能 dm-verity)。
自 Android 6.0 起,高级加密标准 (AES) 加密性能高于 50 MiB/s 的设备实现必须支持验证启动以实现设备完整性。
如果设备实现已发布,搭载的是版本较低的 Android 且不支持启动时验证,则由于此类设备无法通过系统软件更新来支持这项功能,因此可以不遵守该要求。
9.11. 密钥和凭据
Android 密钥库系统允许应用开发者将加密密钥存储在容器中,并通过 KeyChain API 或 Keystore API 在加密操作中使用它们。
所有 Android 设备实现都必须满足以下要求:
- 不应限制可以生成的密钥数,并且必须至少允许导入超过 8192 个密钥。
- 锁定屏幕身份验证机制必须对尝试次数加以限制,并采用指数退避算法。尝试的失败次数超过 150 次后,每次尝试的延迟必须至少为 24 小时。
- 如果设备实现支持安全锁定屏幕,则必须使用安全硬件备份密钥库实现,并满足以下要求:
- 必须具有 RSA、AES、ECDSA 和 HMAC 加密算法以及 MD5、SHA1 和 SHA-2 系列哈希函数的实现,以便建立一个与在内核上及更上层运行的代码安全隔离的区域,并在该区域中正确支持 Android 密钥库系统支持的算法。安全隔离必须能够阻止内核或用户空间代码可能会借以获取隔离环境内部状态的所有潜在机制,包括 DMA。上游 Android 开源项目 (AOSP) 通过使用 Trusty 实现来满足此要求,但也可以使用其他基于 ARM TrustZone 的解决方案,或使用经过第三方审核的基于 Hypervisor 的适当隔离方法的安全实现。
- 必须在隔离的执行环境中执行锁定屏幕身份验证,并且只有在成功通过验证后,才允许使用与身份验证绑定的密钥。上游 Android 开源项目提供了可用于满足此要求的 Gatekeeper 硬件抽象层 (HAL) 和 Trusty。
请注意,如果设备实现已发布,且搭载的是版本较低的 Android,则此类设备无需满足具有由硬件支持的密钥库这一要求,除非它声明了 android.hardware.fingerprint
功能(该功能需要由硬件支持的密钥库)。
9.11.1. 安全锁定屏幕
设备实现可以添加或修改用于解锁锁定屏幕的身份验证方法,但仍必须满足以下要求:
- 如果身份验证方法基于已知密钥,则不得将其当作安全锁定屏幕,除非它满足以下全部要求:
- 允许的最短输入内容长度的熵必须大于 10 位。
- 所有可能的输入内容的最大熵必须大于 18 位。
- 不得替换 AOSP 中实现和提供的任何现有身份验证方法(PIN 码、图案或密码)。
- 当设备政策控制器 (DPC) 应用已通过
DevicePolicyManager.setPasswordQuality()
方法(具有比PASSWORD_QUALITY_SOMETHING
限制性更强的质量常量)设置密码质量政策时,这些方法必须处于停用状态。
- 如果身份验证方法基于实体令牌或位置信息,则不得将其当作安全锁定屏幕,除非它满足以下全部要求:
- 必须具有回退机制,以使用符合以下条件的主要身份验证方法之一:基于已知密钥,且满足被视为安全锁定屏幕需满足的要求。
- 当设备政策控制器 (DPC) 应用已通过
DevicePolicyManager.setKeyguardDisabledFeatures(KEYGUARD_DISABLE_TRUST_AGENTS)
方法或DevicePolicyManager.setPasswordQuality()
方法(具有比PASSWORD_QUALITY_UNSPECIFIED
限制性更强的质量常量)设置政策时,这些方法必须处于停用状态,并且仅允许使用主要身份验证方法来解锁屏幕。
- 如果身份验证方法基于生物识别技术,则不得将其当作安全锁定屏幕,除非它满足以下全部要求:
- 必须具有回退机制,以使用符合以下条件的主要身份验证方法之一:基于已知密钥,且满足被视为安全锁定屏幕需满足的要求。
- 当设备政策控制器 (DPC) 应用已通过调用
DevicePolicyManager.setKeyguardDisabledFeatures(KEYGUARD_DISABLE_FINGERPRINT)
方法设置锁屏功能政策时,它们必须处于停用状态,并且仅允许使用主要身份验证方法解锁屏幕。 - 必须具有与指纹传感器所需的错误接受率相等或更严格的错误接受率(如第 7.3.10 节中所述);否则当设备政策控制器 (DPC) 应用已通过
DevicePolicyManager.setPasswordQuality()
方法(具有比PASSWORD_QUALITY_BIOMETRIC_WEAK
限制性更强的质量常量)设置密码质量政策时,这些方法必须处于停用状态,并且仅允许使用主要身份验证方法来解锁屏幕。
- 如果身份验证方法不能当作安全锁定屏幕,则:
- 必须针对
KeyguardManager.isKeyguardSecure()
和KeyguardManager.isDeviceSecure()
方法返回false
。 - 当设备政策控制器 (DPC) 应用已通过
DevicePolicyManager.setPasswordQuality()
方法(具有比PASSWORD_QUALITY_UNSPECIFIED
限制性更强的质量常量)设置密码质量政策时,这些方法必须处于停用状态。 - 不得重置
DevicePolicyManager.setPasswordExpirationTimeout()
设置的密码有效期定时器。 - 如果应用已调用
KeyGenParameterSpec.Builder.setUserAuthenticationRequired(true)
,则这些方法不得对访问密钥库进行身份验证。
- 必须针对
- 如果身份验证方法基于实体令牌、位置信息,或基于错误接受率比指纹传感器所要求的错误接受率更高(如第 7.3.10 节中所述)的生物识别信息,则:
- 不得重置
DevicePolicyManager.setPasswordExpirationTimeout()
设置的密码有效期定时器。 - 如果应用已调用
KeyGenParameterSpec.Builder.setUserAuthenticationRequired(true)
,则这些方法不得对访问密钥库进行身份验证。
- 不得重置
9.12. 数据删除
设备必须为用户提供一种机制来执行“恢复出厂设置”,以允许用户逻辑删除和物理删除不包括以下内容的所有数据:
- 系统映像
- 系统映像所需的所有操作系统文件
所有用户生成的数据都必须删除。这种机制必须符合数据删除的相关业界标准(例如 NIST SP800-88),且必须用于实现第 3.9 节“设备管理”中所述的 wipeData() API(Android Device Administration API 的一部分)。
设备可提供用于执行逻辑数据清空操作的快速数据擦除功能。
9.13. 安全启动模式
Android 提供了一种模式,可让用户启动到仅允许运行预安装的系统应用而停用所有第三方应用的模式。这种模式称为“安全启动模式”,它可以让用户卸载可能有害的第三方应用。
对于 Android 设备实现,强烈建议实现安全启动模式并满足以下要求:
-
设备实现应为用户提供一个适当的选项,可让用户从启动菜单(用于访问该菜单的工作流程不同于正常启动所需的工作流程)进入安全启动模式。
-
设备实现必须为用户提供一个进入安全启动模式的选项,并确保在进入该模式时不会被设备上安装的第三方应用中断,除非第三方应用是设备政策控制器,并且已将
UserManager.DISALLOW_SAFE_BOOT
标志设置为 true。 -
设备实现必须让用户能够在安全模式下卸载任何第三方应用。
9.14. Automotive 车载系统隔离
Android Automotive 设备应与关键车载子系统交换数据(例如使用车载 HAL 来实现交换),以便通过车载网络(如 CAN 总线)收发消息。Android Automotive 设备实现必须在 Android 框架层下实现安全功能,以防止 Android 框架或第三方应用与车载子系统之间进行恶意或无意交互。这些安全功能如下所示:
- 对来自 Android 框架车载子系统的消息进行把关,例如将允许的消息类型和消息来源列入许可名单。
- 监控来自 Android 框架或第三方应用的拒绝服务攻击。这是为了防范恶意软件利用流量对车载网络进行泛洪攻击,此类攻击可能会导致车载子系统无法正常运行。
10. 软件兼容性测试
设备实现必须通过本节中所述的所有测试。
不过请注意,任何软件测试包都不是详尽无遗的。因此,强烈建议设备实现者尽可能避免对可从 Android 开源项目获得的 Android 参考实现和首选实现进行更改。这样有助于最大限度地降低引入 bug 的风险,从而避免造成需要进行返工和潜在设备更新的不兼容问题。
10.1. 兼容性测试套件
设备实现必须通过 Android 开源项目提供的 Android 兼容性测试套件 (CTS) 的测试(使用设备上最终交付的软件)。此外,设备实现者应尽可能多地使用 Android 开放源代码树中的参考实现,并且对于 CTS 中不明确的情况,以及参考源代码中部分内容的任何重新实现,都必须确保兼容性。
CTS 能够在实际设备上运行。与所有软件一样,CTS 自身也可能包含 bug。CTS 的版本发布独立于本兼容性定义,我们可能会针对 Android 7.1 发布多个 CTS 修订版本。设备实现必须通过设备软件发布时可用的最新 CTS 版本的测试。
10.2. CTS 验证程序
设备实现必须正确执行 CTS 验证程序中的所有适用用例。CTS 验证程序包含在兼容性测试套件中,以便人工操作员运行该验证程序来测试无法由自动化系统测试的功能,例如测试摄像头和传感器能否正常工作。
CTS 验证程序中包含针对多种硬件(其中包括一些选配硬件)的测试。设备实现必须通过针对其具备的硬件的所有测试;例如,如果某款设备具备加速度计,则必须正确执行 CTS 验证程序中的加速度计测试用例。对于本兼容性定义文档中注明为选配的功能,可跳过或省略相应的测试用例。
如上所述,每款设备和每个 build 都必须正确运行 CTS 验证程序。不过,由于很多 build 非常相似,因此设备实现者可能不会对只有细微差别的 build 明确运行 CTS 验证程序。具体来说,如果设备实现与某个已通过 CTS 验证程序测试的实现只是在所包含的语言区域、品牌信息等方面存在差别,则可以省略 CTS 验证程序测试。
11. 可更新软件
设备实现必须包含可用于替换整个系统软件的机制。该机制不需要执行“实时”升级 - 也就是说,可能需要重新启动设备。
可以使用任何方法,但前提是相应方法可以替换设备上预安装的整个软件。例如,以下任何方法都可以满足此要求:
- “无线下载 (OTA)”(通过重新启动进行离线更新)。
- 从主机 PC 上通过 USB 进行“网络共享”更新。
- 通过重新启动进行“离线”更新,以及通过可移动存储设备上的文件进行更新。
不过,如果设备实现支持 802.11 或蓝牙 PAN(个人局域网)配置等不按流量计费的数据连接,则必须支持 OTA 下载(通过重新启动进行离线更新)。
使用的更新机制必须支持在不擦除用户数据的情况下进行更新。也就是说,更新机制必须保留应用专属数据和应用共享数据。请注意,上游 Android 软件包含满足此要求的更新机制。
对于搭载 Android 6.0 及更高版本的设备实现,更新机制应支持在 OTA 之后验证系统映像是否为与预期结果完全相同的二进制文件。上游 Android 开源项目中基于块的 OTA 实现(从 Android 5.1 开始添加了此实现)可满足此要求。
此外,设备实现还应支持 A/B 系统更新。AOSP 使用启动控件 HAL 实现了此功能。
在设备实现发布后,如果在其合理的产品生命周期内发现其中存在错误,并且经与 Android 兼容性团队磋商后确定该错误会影响第三方应用的兼容性,设备实现者必须通过可按上述机制应用的可用软件更新来更正该错误。
Android 包含一些可让设备所有者应用(如果存在)控制系统更新安装的功能。为了方便起见,对于报告 android.software.device_admin 的设备,系统更新子系统必须实现 SystemUpdatePolicy 类中所述的行为。
12. 文档更新日志
有关对此版本中的兼容性定义所做变更的摘要,请参阅:
有关对各节所做变更的摘要,请参阅:
12.1. 更新日志查看提示
变更的标记说明如下:
-
CDD
对兼容性要求所做的重大更改。 -
Docs
与美观性或 build 相关的更改。
为了最便捷地查看相关更改,请将 pretty=full
和 no-merges
网址参数附加到更新日志网址。
13. 与我们联系
您可以加入 android-compatibility 论坛,发帖咨询或提出您认为本文档未涵盖的任何问题。