1. 简介
本文档列举了设备与 Android 9 兼容必须满足的要求。
“必须 (MUST)”、“禁止 (MUST NOT)”、“必需 (REQUIRED)”、“应 (SHALL)”、“不应 (SHALL NOT)”、“应该 (SHOULD)”、“不应该 (SHOULD NOT)”、“建议 (RECOMMENDED)”、“可以 (MAY)” 和“可选 (OPTIONAL)” 的用法均符合 RFC2119 中定义的 IETF 标准。
在本文档中,“设备实现方”或“实现方”是指开发运行 Android 9 的硬件/软件解决方案的个人或组织。“设备实现”或“实现”是指如此开发的硬件/软件解决方案。
要被视为与 Android 9 兼容,设备实现必须满足本兼容性定义中提出的要求,包括通过引用并入的任何文档。
如果本定义或第 10 节中描述的软件测试中存在未提及、含义模糊或不完整之处,设备实现方有责任确保与现有实现兼容。
因此,Android 开源项目既是 Android 的参考实现,也是首选实现。强烈建议设备实现方尽可能基于 Android 开源项目提供的“上游”源代码进行实现。虽然有些组件在理论上可以替换为其他实现,但强烈建议不要采用这种做法,因为通过软件测试将变得更加困难。实现方有责任确保与标准 Android 实现完全行为兼容,包括且不限于兼容性测试套件。最后请注意,本文档明确禁止某些组件替换和修改。
本文档中链接的许多资源直接或间接来源于 Android SDK,并且在功能上与该 SDK 文档中的信息相同。如果本兼容性定义或兼容性测试套件与 SDK 文档不一致,则以 SDK 文档为准。本文档中链接资源中提供的任何技术细节均被视为本兼容性定义的一部分。
1.1 文档结构
1.1.1. 按设备类型划分的要求
第 2 节包含适用于特定设备类型的所有要求。第 2 节的每个小节都专门针对一种特定的设备类型。
普遍适用于任何 Android 设备实现的所有其他要求都列在第 2 节之后的章节中。这些要求在本文档中被称为“核心要求”。
1.1.2. 要求 ID
要求 ID 仅针对“必须 (MUST)”要求分配。
- ID 仅针对“必须 (MUST)”要求分配。
- “强烈建议 (STRONGLY RECOMMENDED)”的要求标记为 [SR],但不分配 ID。
- ID 由以下部分组成:设备类型 ID - 条件 ID - 要求 ID(例如 C-0-1)。
每个 ID 的定义如下
- 设备类型 ID(详见2. 设备类型)
- C:核心(适用于任何 Android 设备实现的要求)
- H:Android 手持设备
- T:Android 电视设备
- A:Android 汽车实现
- Tab:Android 平板电脑实现
- 条件 ID
- 当要求为无条件时,此 ID 设置为 0。
- 当要求为有条件时,第一个条件分配为 1,并且在同一节和同一设备类型中,数字递增 1。
- 要求 ID
- 此 ID 从 1 开始,并在同一节和同一条件下递增 1。
1.1.3. 第 2 节中的要求 ID
第 2 节中的要求 ID 以对应的节 ID 开头,后跟上述要求 ID。
- 第 2 节中的 ID 由以下部分组成:节 ID / 设备类型 ID - 条件 ID - 要求 ID(例如 7.4.3/A-0-1)。
2. 设备类型
虽然 Android 开源项目提供的软件堆栈可用于各种设备类型和外形规格,但有一些设备类型具有相对更完善的应用分发生态系统。
本节介绍这些设备类型,以及适用于每种设备类型的其他要求和建议。
不属于任何所述设备类型的所有 Android 设备实现仍必须满足本兼容性定义其他章节中的所有要求。
2.1 设备配置
有关不同设备类型硬件配置的主要差异,请参阅本节后面特定于设备的要求。
2.2. 手持设备要求
Android 手持设备是指通常用手持握的 Android 设备实现,例如 MP3 播放器、手机或平板电脑。
如果 Android 设备实现满足以下所有条件,则归类为手持设备
- 具有提供移动性的电源,例如电池。
- 物理对角屏幕尺寸在 2.5 到 8 英寸之间。
本节其余部分中的附加要求特定于 Android 手持设备实现。
2.2.1. 硬件
手持设备实现
如果手持设备实现通过 Configuration.isScreenHdr()
声称支持高动态范围显示,则它们
- [7.1.4.5/H-1-1] 必须声明支持
EGL_EXT_gl_colorspace_bt2020_pq
、EGL_EXT_surface_SMPTE2086_metadata
、EGL_EXT_surface_CTA861_3_metadata
、VK_EXT_swapchain_colorspace
和VK_EXT_hdr_metadata
扩展。
手持设备实现
- [7.1.5/H-0-1] 必须包含对传统应用兼容模式的支持,该模式由上游 Android 开源代码实现。也就是说,设备实现不得更改激活兼容模式的触发器或阈值,也不得更改兼容模式本身的行为。
- [7.2.1/H-0-1] 必须包含对第三方输入法编辑器 (IME) 应用的支持。
- [7.2.3/H-0-1] 必须提供“主屏幕”、“最近用过的应用”和“返回”功能。
- [7.2.3/H-0-2] 必须将“返回”功能 (
KEYCODE_BACK
) 的正常和长按事件都发送到前台应用。这些事件不得被系统占用,并且可以由 Android 设备外部触发(例如,连接到 Android 设备的外部硬件键盘)。 - [7.2.4/H-0-1] 必须支持触摸屏输入。
- [7.2.4/H-SR] 强烈建议在长按
KEYCODE_MEDIA_PLAY_PAUSE
或KEYCODE_HEADSETHOOK
时启动用户选择的辅助应用,即实现 VoiceInteractionService 的应用,或处理ACTION_ASSIST
的 Activity(如果前台 Activity 不处理这些长按事件)。 - [7.3.1/H-SR] 强烈建议包含 3 轴加速度计。
如果手持设备实现包含 3 轴加速度计,则它们
- [7.3.1/H-1-1] 必须能够以至少 100 Hz 的频率报告事件。
如果手持设备实现包含陀螺仪,则它们
- [7.3.4/H-1-1] 必须能够以至少 100 Hz 的频率报告事件。
可以进行语音通话并在 getPhoneType
中指示除 PHONE_TYPE_NONE
之外的任何值的手持设备实现
- [7.3.8/H] 应该包含距离传感器。
手持设备实现
如果手持设备实现包含按流量计费的连接,则它们
- [7.4.7/H-1-1] 必须提供流量节省程序模式。
手持设备实现
- [7.6.1/H-0-1] 必须至少有 4GB 的非易失性存储空间可用于应用专用数据(又名“/data”分区)。
- [7.6.1/H-0-2] 当内核和用户空间可用的内存少于 1GB 时,必须为
ActivityManager.isLowRamDevice()
返回“true”。
如果手持设备实现声明仅支持 32 位 ABI
-
[7.6.1/H-1-1] 如果默认显示使用高达 qHD(例如 FWVGA)的帧缓冲区分辨率,则内核和用户空间可用的内存必须至少为 416MB。
-
[7.6.1/H-2-1] 如果默认显示使用高达 HD+(例如 HD、WSVGA)的帧缓冲区分辨率,则内核和用户空间可用的内存必须至少为 592MB。
-
[7.6.1/H-3-1] 如果默认显示使用高达 FHD(例如 WSXGA+)的帧缓冲区分辨率,则内核和用户空间可用的内存必须至少为 896MB。
-
[7.6.1/H-4-1] 如果默认显示使用高达 QHD(例如 QWXGA)的帧缓冲区分辨率,则内核和用户空间可用的内存必须至少为 1344MB。
如果手持设备实现声明支持任何 64 位 ABI(无论是否支持任何 32 位 ABI)
-
[7.6.1/H-5-1] 如果默认显示使用高达 qHD(例如 FWVGA)的帧缓冲区分辨率,则内核和用户空间可用的内存必须至少为 816MB。
-
[7.6.1/H-6-1] 如果默认显示使用高达 HD+(例如 HD、WSVGA)的帧缓冲区分辨率,则内核和用户空间可用的内存必须至少为 944MB。
-
[7.6.1/H-7-1] 如果默认显示使用高达 FHD(例如 WSXGA+)的帧缓冲区分辨率,则内核和用户空间可用的内存必须至少为 1280MB。
-
[7.6.1/H-8-1] 如果默认显示使用高达 QHD(例如 QWXGA)的帧缓冲区分辨率,则内核和用户空间可用的内存必须至少为 1824MB。
请注意,上述“内核和用户空间可用的内存”是指除已专用于硬件组件(如无线装置、视频等,这些组件不受设备实现中内核的控制)的任何内存之外提供的内存空间。
如果手持设备实现包含内核和用户空间可用的内存小于或等于 1GB 的内存,则它们
- [7.6.1/H-9-1] 必须声明功能标记
android.hardware.ram.low
。 - [7.6.1/H-9-2] 必须至少有 1.1 GB 的非易失性存储空间用于应用专用数据(又名“/data”分区)。
如果手持设备实现包含内核和用户空间可用的内存超过 1GB 的内存,则它们
- [7.6.1/H-10-1] 必须至少有 4GB 的非易失性存储空间可用于应用专用数据(又名“/data”分区)。
- 应该声明功能标记
android.hardware.ram.normal
。
手持设备实现
如果手持设备实现包含支持外围设备模式的 USB 端口,则它们
- [7.7.1/H-1-1] 必须实现 Android 开放配件 (AOA) API。
手持设备实现
如果手持设备实现能够满足支持 VR 模式的所有性能要求并包含对 VR 模式的支持,则它们
- [7.9.1/H-1-1] 必须声明
android.hardware.vr.high_performance
功能标记。 - [7.9.1/H-1-2] 必须包含一个实现
android.service.vr.VrListenerService
的应用,该应用可由 VR 应用通过android.app.Activity#setVrModeEnabled
启用。
2.2.2. 多媒体
手持设备实现必须支持以下音频编码
- [5.1.1/H-0-1] AMR-NB
- [5.1.1/H-0-2] AMR-WB
- [5.1.1/H-0-3] MPEG-4 AAC Profile (AAC LC)
- [5.1.1/H-0-4] MPEG-4 HE AAC Profile (AAC+)
- [5.1.1/H-0-5] AAC ELD(增强型低延迟 AAC)
手持设备实现必须支持以下音频解码
手持设备实现必须支持以下视频编码并使其可供第三方应用使用
手持设备实现必须支持以下视频解码
2.2.3. 软件
手持设备实现
- [3.2.3.1/H-0-1] 必须具有一个应用来处理
ACTION_GET_CONTENT
、ACTION_OPEN_DOCUMENT
、ACTION_OPEN_DOCUMENT_TREE
和ACTION_CREATE_DOCUMENT
Intent(如 SDK 文档中所述),并为用户提供使用DocumentsProvider
API 访问文档提供程序数据的途径。 - [3.4.1/H-0-1] 必须提供
android.webkit.Webview
API 的完整实现。 - [3.4.2/H-0-1] 必须包含用于常规用户网页浏览的独立浏览器应用。
- [3.8.1/H-SR] 强烈建议实现默认启动器,以支持应用内固定快捷方式、微件和 widgetFeatures。
- [3.8.1/H-SR] 强烈建议实现默认启动器,以通过 ShortcutManager API 提供对第三方应用提供的其他快捷方式的快速访问。
- [3.8.1/H-SR] 强烈建议包含一个默认启动器应用,用于显示应用图标的标记。
- [3.8.2/H-SR] 强烈建议支持第三方应用微件。
- [3.8.3/H-0-1] 必须允许第三方应用通过
Notification
和NotificationManager
API 类通知用户重要事件。 - [3.8.3/H-0-2] 必须支持富通知。
- [3.8.3/H-0-3] 必须支持浮动通知。
- [3.8.3/H-0-4] 必须包含通知栏,为用户提供直接控制通知的能力(例如,回复、稍后提醒、关闭、阻止),通过用户途径(例如操作按钮或 AOSP 中实现的控制面板)。
- [3.8.3/H-0-5] 必须在通知栏中显示通过
RemoteInput.Builder setChoices()
提供的选项。 - [3.8.3/H-SR] 强烈建议在通知栏中显示通过
RemoteInput.Builder setChoices()
提供的第一个选项,而无需额外的用户互动。 - [3.8.3/H-SR] 强烈建议在用户展开通知栏中的所有通知时,在通知栏中显示通过
RemoteInput.Builder setChoices()
提供的所有选项。 - [3.8.4/H-SR] 强烈建议在设备上实现一个助手来处理 Assist 操作。
如果手持设备实现支持 Assist 操作,则它们
- [3.8.4/H-SR] 强烈建议使用长按
HOME
键作为指定互动来启动辅助应用,如第 7.2.3 节中所述。必须启动用户选择的辅助应用,即实现VoiceInteractionService
的应用,或处理ACTION_ASSIST
Intent 的 Activity。
如果 Android 手持设备实现支持锁屏,则它们
- [3.8.10/H-1-1] 必须显示锁屏通知,包括媒体通知模板。
如果手持设备实现支持安全锁屏,则它们
- [3.9/H-1-1] 必须实现 Android SDK 文档中定义的全部设备管理政策。
- [3.9/H-1-2] 必须通过
android.software.managed_users
功能标记声明对受管理个人资料的支持,除非设备配置为使其报告自身为低 RAM 设备,或者将其内部(不可移动)存储空间分配为共享存储空间。
手持设备实现
- [3.10/H-0-1] 必须支持第三方辅助功能服务。
- [3.10/H-SR] 强烈建议在设备上预加载辅助功能服务,其功能与 talkback 开源项目中提供的“切换控制”和“TalkBack”(针对预安装的文本转语音引擎支持的语言)辅助功能服务的功能相当或更高。
- [3.11/H-0-1] 必须支持安装第三方 TTS 引擎。
- [3.11/H-SR] 强烈建议包含一个 TTS 引擎,以支持设备上可用的语言。
- [3.13/H-SR] 强烈建议包含“快捷设置”UI 组件。
如果 Android 手持设备实现声明支持 FEATURE_BLUETOOTH
或 FEATURE_WIFI
,则它们
- [3.16/H-1-1] 必须支持伴侣设备配对功能。
2.2.4. 性能和功耗
- [8.1/H-0-1] 一致的帧延迟。不一致的帧延迟或渲染帧的延迟每秒不得发生超过 5 帧,并且应该低于每秒 1 帧。
- [8.1/H-0-2] 用户界面延迟。设备实现必须通过在 36 秒内滚动 Android 兼容性测试套件 (CTS) 中定义的 1 万个列表条目来确保低延迟用户体验。
- [8.1/H-0-3] 任务切换。当启动多个应用后,重新启动已运行的应用时,启动时间必须少于 1 秒。
手持设备实现
- [8.2/H-0-1] 必须确保至少 5 MB/秒的顺序写入性能。
- [8.2/H-0-2] 必须确保至少 0.5 MB/秒的随机写入性能。
- [8.2/H-0-3] 必须确保至少 15 MB/秒的顺序读取性能。
- [8.2/H-0-4] 必须确保至少 3.5 MB/秒的随机读取性能。
如果手持设备实现包含用于改进设备电源管理的功能(这些功能包含在 AOSP 中或扩展了 AOSP 中包含的功能),则它们
手持设备实现
- [8.4/H-0-1] 必须提供每个组件的功耗配置文件,该文件定义了每个硬件组件的电流消耗值以及组件随时间推移造成的大概电池耗电量,如 Android 开源项目网站中所述。
- [8.4/H-0-2] 必须以毫安时 (mAh) 为单位报告所有功耗值。
- [8.4/H-0-3] 必须报告每个进程的 UID 的 CPU 功耗。Android 开源项目通过
uid_cputime
内核模块实现满足此要求。 - [8.4/H-0-4] 必须通过
adb shell dumpsys batterystats
shell 命令向应用开发者提供此功耗信息。 - [8.4/H] 如果无法将硬件组件功耗归因于应用,则应该归因于硬件组件本身。
如果手持设备实现包含屏幕或视频输出,则它们
- [8.4/H-1-1] 必须遵守
android.intent.action.POWER_USAGE_SUMMARY
Intent 并显示一个设置菜单,其中显示此功耗信息。
2.2.5. 安全模式
手持设备实现
- [9.1/H-0-1] 必须允许第三方应用通过
android.permission.PACKAGE_USAGE_STATS
权限访问使用情况统计信息,并提供用户可访问的机制来响应android.settings.ACTION_USAGE_ACCESS_SETTINGS
Intent 来授予或撤消对此类应用的访问权限。
当手持设备实现支持安全锁屏时,它们
- [9.11/H-1-1] 必须允许用户选择最短的睡眠超时时间(即从解锁状态到锁定状态的过渡时间),即 15 秒或更短。
- [9.11/H-1-2] 必须提供用户途径来隐藏通知并停用除9.11.1 安全锁屏中描述的主要身份验证之外的所有形式的身份验证。AOSP 以锁定模式满足此要求。
2.3. 电视要求
Android 电视设备是指一种 Android 设备实现,它是一种娱乐界面,用于为坐在约十英尺(“后仰式”或“10 英尺用户界面”)外的用户使用数字媒体、电影、游戏、应用和/或直播电视。
如果 Android 设备实现满足以下所有条件,则归类为电视
- 已提供一种机制来远程控制显示屏上呈现的用户界面,显示屏可能位于距离用户十英尺远的位置。
- 具有对角线长度大于 24 英寸的嵌入式屏幕显示屏,或者包含视频输出端口,例如 VGA、HDMI、DisplayPort 或用于显示的无线端口。
本节其余部分中的附加要求特定于 Android 电视设备实现。
2.3.1. 硬件
电视设备实现
- [7.2.2/T-0-1] 必须支持 D-pad。
- [7.2.3/T-0-1] 必须提供“主屏幕”和“返回”功能。
- [7.2.3/T-0-2] 必须将“返回”功能 (
KEYCODE_BACK
) 的正常和长按事件都发送到前台应用。 - [7.2.6.1/T-0-1] 必须包含对游戏控制器的支持并声明
android.hardware.gamepad
功能标记。 - [7.2.7/T] 应该提供一个遥控器,用户可以通过该遥控器访问非触摸导航和核心导航键输入。
如果电视设备实现包含陀螺仪,则它们
- [7.3.4/T-1-1] 必须能够以至少 100 Hz 的频率报告事件。
电视设备实现
- [7.4.3/T-0-1] 必须支持蓝牙和低功耗蓝牙 (Bluetooth LE)。
- [7.6.1/T-0-1] 必须至少有 4 GB 的非易失性存储空间可用于应用程序私有数据(也称为“/data”分区)。
如果电视设备实现包括支持主机模式的 USB 端口,则它们
- [7.5.3/T-1-1] 必须包含对外接摄像头的支持,该摄像头通过此 USB 端口连接,但不一定始终连接。
如果电视设备实现是 32 位的
-
[7.6.1/T-1-1] 如果使用以下任何密度,则内核和用户空间可用的内存必须至少为 896MB
- 小型/普通屏幕上 400dpi 或更高
- 大型屏幕上 xhdpi 或更高
- 超大型屏幕上 tvdpi 或更高
如果电视设备实现是 64 位的
-
[7.6.1/T-2-1] 如果使用以下任何密度,则内核和用户空间可用的内存必须至少为 1280MB
- 小型/普通屏幕上 400dpi 或更高
- 大型屏幕上 xhdpi 或更高
- 超大型屏幕上 tvdpi 或更高
请注意,上述“内核和用户空间可用的内存”是指除已专用于硬件组件(如无线装置、视频等,这些组件不受设备实现中内核的控制)的任何内存之外提供的内存空间。
电视设备实现
2.3.2. 多媒体
电视设备实现必须支持以下音频编码格式
- [5.1/T-0-1] MPEG-4 AAC Profile (AAC LC)
- [5.1/T-0-2] MPEG-4 HE AAC Profile (AAC+)
- [5.1/T-0-3] AAC ELD (增强型低延迟 AAC)
电视设备实现必须支持以下视频编码格式
电视设备实现
- [5.2.2/T-SR] 强烈建议支持以每秒 30 帧的速度对 720p 和 1080p 分辨率的视频进行 H.264 编码。
电视设备实现必须支持以下视频解码格式
- [5.3.3/T-0-1] MPEG-4 SP
- [5.3.4/T-0-2] H.264 AVC
- [5.3.5/T-0-3] H.265 HEVC
- [5.3.6/T-0-4] VP8
- [5.3.7/T-0-5] VP9
强烈建议电视设备实现支持以下视频解码格式
- [5.3.1/T-SR] MPEG-2
电视设备实现必须支持 H.264 解码,如第 5.3.4 节所述,在标准视频帧速率和分辨率下,最高且包括
- [5.3.4.4/T-1-1] 具有 Baseline Profile 的高清 1080p,每秒 60 帧
- [5.3.4.4/T-1-2] 具有 Main Profile 的高清 1080p,每秒 60 帧
- [5.3.4.4/T-1-3] 具有 High Profile Level 4.2 的高清 1080p,每秒 60 帧
具有 H.265 硬件解码器的电视设备实现必须支持 H.265 解码,如第 5.3.5 节所述,在标准视频帧速率和分辨率下,最高且包括
- [5.3.5.4/T-1-1] 具有 Main Profile Level 4.1 的高清 1080p,每秒 60 帧
如果具有 H.265 硬件解码器的电视设备实现支持 H.265 解码和 UHD 解码配置文件,则它们
- [5.3.5.5/T-2-1] 必须支持 UHD 解码配置文件,每秒 60 帧,具有 Main10 Level 5 Main Tier 配置文件。
电视设备实现必须支持 VP8 解码,如第 5.3.6 节所述,在标准视频帧速率和分辨率下,最高且包括
- [5.3.6.4/T-1-1] 高清 1080p,每秒 60 帧解码配置文件
具有 VP9 硬件解码器的电视设备实现必须支持 VP9 解码,如第 5.3.7 节所述,在标准视频帧速率和分辨率下,最高且包括
- [5.3.7.4/T-1-1] 高清 1080p,每秒 60 帧,配置文件 0(8 位颜色深度)
如果具有 VP9 硬件解码器的电视设备实现支持 VP9 解码和 UHD 解码配置文件,则它们
- [5.3.7.5/T-2-1] 必须支持 UHD 解码配置文件,每秒 60 帧,配置文件 0(8 位颜色深度)。
- [5.3.7.5/T-2-1] 强烈建议支持 UHD 解码配置文件,每秒 60 帧,配置文件 2(10 位颜色深度)。
电视设备实现
- [5.5.3/T-0-1] 必须包括对系统主音量和受支持输出上的数字音频输出音量衰减的支持,压缩音频直通输出(设备上未进行音频解码)除外。
- [5.8/T-0-1] 必须设置 HDMI 输出模式,以便为所有有线显示器选择可以支持的最大分辨率,刷新率为 50Hz 或 60Hz。
- [5.8/T-SR] 强烈建议为所有有线显示器提供用户可配置的 HDMI 刷新率选择器。
- [5.8/T-SR] 强烈建议支持同时解码安全流。至少,强烈建议同时解码两个流。
- [5.8] 应该根据设备销售地区的视频刷新率,将 HDMI 输出模式刷新率设置为 50Hz 或 60Hz,适用于所有有线显示器。
如果电视设备实现支持 UHD 解码并支持外接显示器,则它们
- [5.8/T-1-1] 必须支持 HDCP 2.2。
如果电视设备实现不支持 UHD 解码但支持外接显示器,则它们
- [5.8/T-2-1] 必须支持 HDCP 1.4。
2.3.3. 软件
电视设备实现
- [3/T-0-1] 必须声明功能
android.software.leanback
和android.hardware.type.television
。 - [3.4.1/T-0-1] 必须提供
android.webkit.Webview
API 的完整实现。
如果 Android 电视设备实现支持锁屏,则它们
- [3.8.10/T-1-1] 必须显示锁屏通知,包括媒体通知模板。
电视设备实现
- [3.8.14/T-SR] 强烈建议支持画中画 (PIP) 模式多窗口。
- [3.10/T-0-1] 必须支持第三方辅助功能服务。
- [3.10/T-SR] 强烈建议在设备上预加载辅助功能服务,其功能应与 Switch Access 和 TalkBack(对于预装的文本转语音引擎支持的语言)辅助功能服务相当或超出,这些服务在 talkback 开源项目中提供。
如果电视设备实现报告功能 android.hardware.audio.output
,则它们
电视设备实现
- [3.12/T-0-1] 必须支持电视输入框架 (TV Input Framework)。
2.3.4. 性能和功耗
- [8.1/T-0-1] 一致的帧延迟。不一致的帧延迟或渲染帧的延迟不得超过每秒 5 帧的情况,并且应该低于每秒 1 帧。
- [8.2/T-0-1] 必须确保顺序写入性能至少为 5MB/s。
- [8.2/T-0-2] 必须确保随机写入性能至少为 0.5MB/s。
- [8.2/T-0-3] 必须确保顺序读取性能至少为 15MB/s。
- [8.2/T-0-4] 必须确保随机读取性能至少为 3.5MB/s。
如果电视设备实现包含 AOSP 中包含的或扩展 AOSP 中包含的功能的设备电源管理改进功能,则它们
电视设备实现
- [8.4/T-0-1] 必须提供每个组件的功耗配置文件,该文件定义了每个硬件组件的 电流消耗值 以及组件随时间推移造成的大致电池损耗,如 Android 开源项目站点中所述。
- [8.4/T-0-2] 必须以毫安时 (mAh) 为单位报告所有功耗值。
- [8.4/T-0-3] 必须报告每个进程的 UID 的 CPU 功耗。Android 开源项目通过
uid_cputime
内核模块实现来满足此要求。 - [8.4/T] 如果无法将硬件组件功耗归因于应用程序,则应该将其归因于硬件组件本身。
- [8.4/T-0-4] 必须通过
adb shell dumpsys batterystats
shell 命令向应用开发者提供此功耗信息。
2.4. 手表要求
Android 手表设备是指旨在佩戴在身上(可能在手腕上)的 Android 设备实现。
如果 Android 设备实现满足以下所有条件,则将其归类为手表
- 屏幕物理对角线长度在 1.1 到 2.5 英寸之间。
- 提供佩戴在身上的机制。
本节其余部分的其他要求特定于 Android 手表设备实现。
2.4.1. 硬件
手表设备实现
-
[7.1.1.1/W-0-1] 必须具有物理对角线尺寸在 1.1 到 2.5 英寸范围内的屏幕。
-
[7.2.3/W-0-1] 必须向用户提供主页功能,并在非
UI_MODE_TYPE_WATCH
模式下提供返回功能。 -
[7.2.4/W-0-1] 必须支持触摸屏输入。
-
[7.3.1/W-SR] 强烈建议包括 3 轴加速度计。
-
[7.4.3/W-0-1] 必须支持蓝牙。
-
[7.6.1/W-0-1] 必须至少有 1 GB 的非易失性存储空间可用于应用程序私有数据(也称为“/data”分区)。
-
[7.6.1/W-0-2] 内核和用户空间可用的内存必须至少为 416 MB。
-
[7.8.1/W-0-1] 必须包括麦克风。
-
[7.8.2/W] 可以但不应该有音频输出。
2.4.2. 多媒体
无其他要求。
2.4.3. 软件
手表设备实现
- [3/W-0-1] 必须声明功能
android.hardware.type.watch
。 - [3/W-0-2] 必须支持 uiMode = UI_MODE_TYPE_WATCH。
手表设备实现
声明 android.hardware.audio.output
功能标志的手表设备实现
- [3.10/W-1-1] 必须支持第三方辅助功能服务。
- [3.10/W-SR] 强烈建议在设备上预加载辅助功能服务,其功能应与 Switch Access 和 TalkBack(对于预装的文本转语音引擎支持的语言)辅助功能服务相当或超出,这些服务在 talkback 开源项目中提供。
如果手表设备实现报告功能 android.hardware.audio.output,则它们
2.4.4. 性能和功耗
如果手表设备实现包含 AOSP 中包含的或扩展 AOSP 中包含的功能的设备电源管理改进功能,则它们
手表设备实现
- [8.4/W-0-1] 必须提供每个组件的功耗配置文件,该文件定义了每个硬件组件的 电流消耗值 以及组件随时间推移造成的大致电池损耗,如 Android 开源项目站点中所述。
- [8.4/W-0-2] 必须以毫安时 (mAh) 为单位报告所有功耗值。
- [8.4/W-0-3] 必须报告每个进程的 UID 的 CPU 功耗。Android 开源项目通过
uid_cputime
内核模块实现来满足此要求。 - [8.4/W-0-4] 必须通过
adb shell dumpsys batterystats
shell 命令向应用开发者提供此功耗信息。 - [8.4/W] 如果无法将硬件组件功耗归因于应用程序,则应该将其归因于硬件组件本身。
2.5. 汽车要求
Android 汽车实现是指将 Android 作为操作系统运行的车辆主机,用于系统和/或信息娱乐功能的全部或一部分。
如果 Android 设备实现声明了功能 android.hardware.type.automotive
或满足以下所有条件,则将其归类为汽车
- 嵌入为汽车车辆的一部分,或可插入汽车车辆。
- 使用驾驶员座椅排中的屏幕作为主显示屏。
本节其余部分的其他要求特定于 Android 汽车设备实现。
2.5.1. 硬件
汽车设备实现
- [7.1.1.1/A-0-1] 必须具有物理对角线尺寸至少为 6 英寸的屏幕。
-
[7.1.1.1/A-0-2] 必须具有至少 750 dp x 480 dp 的屏幕尺寸布局。
-
[7.2.3/A-0-1] 必须提供主页功能,并且可以提供返回和最近任务功能。
-
[7.2.3/A-0-2] 必须将返回功能的普通和长按事件 (
KEYCODE_BACK
) 发送到前台应用程序。 -
[7.3.1/A-SR] 强烈建议包括 3 轴加速度计。
如果汽车设备实现包括 3 轴加速度计,则它们
如果汽车设备实现包括陀螺仪,则它们
- [7.3.4/A-1-1] 必须能够以至少 100 Hz 的频率报告事件。
汽车设备实现
- [7.3.11/A-0-1] 必须提供当前档位作为
SENSOR_TYPE_GEAR
。
汽车设备实现
- [7.3.11.2/A-0-1] 必须支持定义为
SENSOR_TYPE_NIGHT
的日/夜模式。 - [7.3.11.2/A-0-2]
SENSOR_TYPE_NIGHT
标志的值必须与仪表板日/夜模式一致,并且应该基于环境光传感器输入。 -
底层的环境光传感器可以与 光度计 相同。
-
[7.3.11.4/A-0-1] 必须提供由
SENSOR_TYPE_CAR_SPEED
定义的车速。 -
[7.3.11.5/A-0-1] 必须提供由
SENSOR_TYPE_PARKING_BRAKE
定义的驻车制动状态。 -
[7.4.3/A-0-1] 必须支持蓝牙,并且应该支持低功耗蓝牙 (Bluetooth LE)。
- [7.4.3/A-0-2] Android 汽车实现必须支持以下蓝牙配置文件
- 通过免提配置文件 (HFP) 进行电话呼叫。
- 通过音频分发配置文件 (A2DP) 进行媒体播放。
- 通过远程控制配置文件 (AVRCP) 进行媒体播放控制。
- 使用电话簿访问配置文件 (PBAP) 进行联系人共享。
-
[7.4.3/A-SR] 强烈建议支持消息访问配置文件 (MAP)。
-
[7.4.5/A] 应该包括对基于蜂窝网络的移动数据连接的支持。
-
[7.4.5/A] 可以使用系统 API
NetworkCapabilities#NET_CAPABILITY_OEM_PAID
常量来表示应该可供系统应用使用的网络。 -
[7.6.1/A-0-1] 必须至少有 4 GB 的非易失性存储空间可用于应用程序私有数据(也称为“/data”分区)。
汽车设备实现
- [7.6.1/A] 应该格式化数据分区,以提高闪存存储的性能和寿命,例如使用
f2fs
文件系统。
如果汽车设备实现通过内部不可移动存储的一部分提供共享外部存储,则它们
- [7.6.1/A-SR] 强烈建议减少在外部存储上执行操作的 I/O 开销,例如使用
SDCardFS
。
如果汽车设备实现是 32 位的
-
[7.6.1/A-1-1] 如果使用以下任何密度,则内核和用户空间可用的内存必须至少为 512MB
- 小型/普通屏幕上 280dpi 或更低
- 超大型屏幕上 ldpi 或更低
- 大型屏幕上 mdpi 或更低
-
[7.6.1/A-1-2] 如果使用以下任何密度,则内核和用户空间可用的内存必须至少为 608MB
- 小型/普通屏幕上 xhdpi 或更高
- 大型屏幕上 hdpi 或更高
- 超大型屏幕上 mdpi 或更高
-
[7.6.1/A-1-3] 如果使用以下任何密度,则内核和用户空间可用的内存必须至少为 896MB
- 小型/普通屏幕上 400dpi 或更高
- 大型屏幕上 xhdpi 或更高
- 超大型屏幕上 tvdpi 或更高
-
[7.6.1/A-1-4] 如果使用以下任何密度,则内核和用户空间可用的内存必须至少为 1344MB
- 小型/普通屏幕上 560dpi 或更高
- 大型屏幕上 400dpi 或更高
- 超大型屏幕上 xhdpi 或更高
如果汽车设备实现是 64 位的
-
[7.6.1/A-2-1] 如果使用以下任何密度,则内核和用户空间可用的内存必须至少为 816MB
- 小型/普通屏幕上 280dpi 或更低
- 超大型屏幕上 ldpi 或更低
- 大型屏幕上 mdpi 或更低
-
[7.6.1/A-2-2] 如果使用以下任何密度,则内核和用户空间可用的内存必须至少为 944MB
- 小型/普通屏幕上 xhdpi 或更高
- 大型屏幕上 hdpi 或更高
- 超大型屏幕上 mdpi 或更高
-
[7.6.1/A-2-3] 如果使用以下任何密度,则内核和用户空间可用的内存必须至少为 1280MB
- 小型/普通屏幕上 400dpi 或更高
- 大型屏幕上 xhdpi 或更高
- 超大型屏幕上 tvdpi 或更高
-
[7.6.1/A-2-4] 如果使用以下任何密度,则内核和用户空间可用的内存必须至少为 1824MB
- 小型/普通屏幕上 560dpi 或更高
- 大型屏幕上 400dpi 或更高
- 超大型屏幕上 xhdpi 或更高
请注意,上述“内核和用户空间可用的内存”是指除已专用于硬件组件(如无线装置、视频等,这些组件不受设备实现中内核的控制)的任何内存之外提供的内存空间。
汽车设备实现
- [7.7.1/A] 应该包括支持外围设备模式的 USB 端口。
汽车设备实现
- [7.8.1/A-0-1] 必须包括麦克风。
汽车设备实现
- [7.8.2/A-0-1] 必须具有音频输出并声明
android.hardware.audio.output
。
2.5.2. 多媒体
汽车设备实现必须支持以下音频编码
- [5.1/A-0-1] MPEG-4 AAC Profile (AAC LC)
- [5.1/A-0-2] MPEG-4 HE AAC Profile (AAC+)
- [5.1/A-0-3] AAC ELD (增强型低延迟 AAC)
汽车设备实现必须支持以下视频编码
汽车设备实现必须支持以下视频解码
强烈建议汽车设备实现支持以下视频解码
- [5.3/A-SR] H.265 HEVC
2.5.3. 软件
汽车设备实现
-
[3/A-0-1] 必须声明功能
android.hardware.type.automotive
。 -
[3/A-0-2] 必须支持 uiMode =
UI_MODE_TYPE_CAR
。 -
[3/A-0-3] 必须支持
android.car.*
命名空间中的所有公共 API。 -
[3.4.1/A-0-1] 必须提供
android.webkit.Webview
API 的完整实现。 -
[3.8.3/A-0-1] 当第三方应用程序请求时,必须显示使用
Notification.CarExtender
API 的通知。 -
[3.13/A-SR] 强烈建议包括快速设置 UI 组件。
如果汽车设备实现包括一键通按钮,则它们
- [3.8.4/A-1-1] 必须使用一键通按钮的短按作为指定的交互方式来启动用户选择的助手应用,换句话说,即实现
VoiceInteractionService
的应用。
汽车设备实现
2.5.4. 性能和功耗
如果汽车设备实现包含 AOSP 中包含的或扩展 AOSP 中包含的功能的设备电源管理改进功能,则它们
汽车设备实现
- [8.2/A-0-1] 必须报告每个进程的 UID 读取和写入到非易失性存储的字节数,以便开发者可以通过 System API
android.car.storagemonitoring.CarStorageMonitoringManager
获取统计信息。Android 开源项目通过uid_sys_stats
内核模块来满足此要求。 - [8.4/A-0-1] 必须提供每个组件的功耗配置文件,该文件定义了每个硬件组件的 电流消耗值 以及组件随时间推移造成的大致电池损耗,如 Android 开源项目站点中所述。
- [8.4/A-0-2] 必须以毫安时 (mAh) 为单位报告所有功耗值。
- [8.4/A-0-3] 必须报告每个进程的 UID 的 CPU 功耗。Android 开源项目通过
uid_cputime
内核模块实现来满足此要求。 - [8.4/A] 如果无法将硬件组件功耗归因于应用程序,则应该将其归因于硬件组件本身。
- [8.4/A-0-4] 必须通过
adb shell dumpsys batterystats
shell 命令向应用开发者提供此功耗信息。
2.5.5. 安全模型
如果汽车设备实现支持多用户,则它们
- [9.5/A-1-1] 必须包括访客帐户,该帐户允许车辆系统提供的所有功能,而无需用户登录。
如果汽车设备实现支持安全锁屏,则它们
- [9.9.2/A-1-1] 必须支持每个用户特定身份验证密钥的加密。基于文件的加密 (FBE) 是一种实现方式。
汽车设备实现
- [9.14/A-0-1] 必须对来自 Android 框架车辆子系统的消息进行门控,例如,允许允许的消息类型和消息源列表。
- [9.14/A-0-2] 必须防范来自 Android 框架或第三方应用程序的拒绝服务攻击。这可以防止恶意软件用流量淹没车辆网络,这可能会导致车辆子系统发生故障。
2.6. 平板电脑要求
Android 平板电脑设备是指满足以下所有条件的 Android 设备实现
- 通常用双手握持使用。
- 不具有翻盖或可转换配置。
- 与设备一起使用的任何物理键盘实现都必须通过标准连接方式连接。
- 具有提供移动性的电源,例如电池。
- 具有 7 到 18 英寸物理对角线屏幕尺寸。
平板电脑设备实现具有与手持设备实现类似的要求。例外情况在相应章节中以 * 标出,并在本节中注明以供参考。
2.4.1. 硬件
屏幕尺寸
- [7.1.1.1/Tab-0-1] 必须具有 7 到 18 英寸范围内的屏幕。
最低内存和存储(第 7.6.1 节)
手持设备要求中列出的小型/普通屏幕的屏幕密度不适用于平板电脑。
USB 外围设备模式(第 7.7.1 节)
如果平板电脑设备实现包括支持外围设备模式的 USB 端口,则它们
- [7.7.1/Tab] 可以实现 Android 开放附件 (AOA) API。
虚拟现实模式(第 7.9.1 节)
虚拟现实高性能(第 7.9.2 节)
虚拟现实要求不适用于平板电脑。
3. 软件
3.1. 托管 API 兼容性
托管 Dalvik 字节码执行环境是 Android 应用程序的主要载体。Android 应用程序编程接口 (API) 是暴露给在托管运行时环境中运行的应用程序的 Android 平台接口集。
设备实现
-
[C-0-1] 必须提供 Android SDK 或上游 Android 源代码中任何使用“@SystemApi”标记修饰的 API 暴露的任何文档化 API 的完整实现,包括所有文档化行为。
-
[C-0-2] 必须支持/保留 TestApi 注解 (@TestApi) 标记的所有类、方法和关联元素。
-
[C-0-3] 除非本兼容性定义明确允许,否则不得省略任何托管 API,更改 API 接口或签名,偏离文档化行为,或包含空操作。
-
[C-0-4] 即使省略了 Android 包含 API 的某些硬件功能,也必须保持 API 的存在并以合理的方式运行。有关此场景的具体要求,请参阅第 7 节。
-
[C-0-5] 必须限制第三方应用程序对隐藏 API 的使用,隐藏 API 定义为在 android 命名空间中使用
@hidden
注解修饰但未使用@SystemAPI
或@TestApi
的 API,如 SDK 文档中所述,并且每个隐藏 API 都应与 AOSP 中相应 API 级别分支的prebuilts/runtime/appcompat/
路径中的临时列表和拒绝列表文件提供的受限列表相同。但是,它们- 可以,如果设备实现上缺少隐藏 API 或以不同方式实现,则将隐藏 API 移至拒绝列表或从所有受限列表中省略。
- 可以,如果 AOSP 中尚不存在隐藏 API,则将隐藏 API 添加到任何受限列表。
- 可以实现动态更新机制,将隐藏 API 从受限列表移至限制较少的列表,但允许列表除外。
3.1.1. Android 扩展
Android 包含对扩展托管 API 的支持,同时保持相同的 API 级别版本。
- [C-0-1] Android 设备实现**必须**预加载共享库
ExtShared
和服务ExtServices
的 AOSP 实现,且版本必须高于或等于每个 API 级别允许的最低版本。例如,运行 API 级别 24 的 Android 7.0 设备实现**必须**至少包含版本 1。
3.1.2. Android 库
由于 Apache HTTP 客户端弃用,设备实现
- [C-0-1] **禁止**将
org.apache.http.legacy
库放置在 bootclasspath 中。 - [C-0-2] 仅当应用满足以下条件之一时,**才必须**将
org.apache.http.legacy
库添加到应用 classpath 中- 目标 API 级别为 28 或更低。
- 在其清单文件中声明需要该库,方法是将
<uses-library>
的android:name
属性设置为org.apache.http.legacy
。
AOSP 实现满足这些要求。
3.2. 软 API 兼容性
除了 第 3.1 节 中的托管 API 之外,Android 还包含一个重要的运行时“软”API,其形式包括 intent、权限以及 Android 应用的类似方面,这些方面无法在应用编译时强制执行。
3.2.1. 权限
3.2.2. Build 参数
Android API 在 android.os.Build 类 中包含许多常量,旨在描述当前设备。
- [C-0-1] 为了在设备实现中提供一致的、有意义的值,下表包含对这些值的格式的额外限制,设备实现**必须**遵守这些限制。
参数 | 详情 |
---|---|
VERSION.RELEASE | 当前正在运行的 Android 系统的版本,采用人类可读的格式。此字段**必须**具有 9 中定义的字符串值之一。 |
VERSION.SDK | 当前正在运行的 Android 系统的版本,采用第三方应用程序代码可访问的格式。对于 Android 9,此字段**必须**具有整数值 9_INT。 |
VERSION.SDK_INT | 当前正在运行的 Android 系统的版本,采用第三方应用程序代码可访问的格式。对于 Android 9,此字段**必须**具有整数值 9_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 | **必须**返回 "UNKNOWN"。 |
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 参数的值,该 build 与此 build 完全相同,除了 Android 公共安全公告中提供的补丁程序。它**必须**报告正确的值,如果不存在此类 build,则报告空字符串 ("")。 |
BOOTLOADER | 设备实现者选择的值,用于标识设备中使用的特定内部引导加载程序版本,采用人类可读的格式。此字段的值**必须**编码为 7 位 ASCII,并与正则表达式“^[a-zA-Z0-9._-]+$”匹配。 |
getRadioVersion() | **必须**(是或返回)设备实现者选择的值,用于标识设备中使用的特定内部无线/调制解调器版本,采用人类可读的格式。如果设备没有任何内部无线/调制解调器,则**必须**返回 NULL。此字段的值**必须**编码为 7 位 ASCII,并与正则表达式“^[a-zA-Z0-9._-,]+$”匹配。 |
getSerial() | **必须**(是或返回)硬件序列号,该序列号**必须**在具有相同 MODEL 和 MANUFACTURER 的设备之间可用且唯一。此字段的值**必须**编码为 7 位 ASCII,并与正则表达式“^[a-zA-Z0-9._-,]+$”匹配。 |
3.2.3. Intent 兼容性
3.2.3.1. 核心应用 Intent
Android intent 允许应用程序组件从其他 Android 组件请求功能。Android 上游项目包含一个被视为核心 Android 应用程序的应用程序列表,这些应用程序实现了几个 intent 模式来执行常见操作。
-
[C-0-1] 设备实现**必须**预加载一个或多个应用程序或服务组件,其中包含针对 AOSP 中以下核心 Android 应用程序定义的所有公共 intent 过滤器模式的 intent 处理程序
- 桌面时钟
- 浏览器
- 日历
- 联系人
- 图库
- GlobalSearch
- 启动器
- 音乐
- 设置
3.2.3.2. Intent 解析
-
[C-0-1] 由于 Android 是一个可扩展的平台,因此设备实现**必须**允许第三方应用程序覆盖 第 3.2.3.1 节 中引用的每个 intent 模式,但 Settings 除外。上游 Android 开源实现默认允许这样做。
-
[C-0-2] 设备实现者**禁止**将特殊权限附加到系统应用程序对这些 intent 模式的使用,或阻止第三方应用程序绑定并取得对这些模式的控制权。此项禁止特别包括但不限于禁用“选择器”用户界面,该界面允许用户在所有处理相同 intent 模式的多个应用程序之间进行选择。
-
[C-0-3] 设备实现**必须**为用户提供一个用户界面,以便用户修改 intent 的默认 Activity。
-
但是,当默认 Activity 为数据 URI 提供更具体的属性时,设备实现**可以**为特定的 URI 模式(例如 http://play.google.com)提供默认 Activity。例如,指定数据 URI “http://www.android.com” 的 intent 过滤器模式比浏览器的核心 intent 模式 “http://” 更具体。
Android 还包含一种机制,供第三方应用为某些类型的 Web URI intent 声明权威默认 应用链接行为。当此类权威声明在应用的 intent 过滤器模式中定义时,设备实现
- [C-0-4] **必须**尝试通过执行上游 Android 开源项目中的软件包管理器实现的 Digital Asset Links 规范 中定义的验证步骤来验证任何 intent 过滤器。
- [C-0-5] **必须**尝试在应用程序安装期间验证 intent 过滤器,并将所有成功验证的 URI intent 过滤器设置为其 URI 的默认应用处理程序。
- **可以**将特定的 URI intent 过滤器设置为其 URI 的默认应用处理程序,如果它们已成功验证,但其他候选 URI 过滤器验证失败。如果设备实现这样做,则**必须**在设置菜单中为用户提供适当的按 URI 模式覆盖。
- **必须**在“设置”中为用户提供每个应用的“应用链接”控件,如下所示
- [C-0-6] 用户**必须**能够全面地覆盖应用的默认应用链接行为,使其为:始终打开、始终询问或从不打开,这必须平等地应用于所有候选 URI intent 过滤器。
- [C-0-7] 用户**必须**能够查看候选 URI intent 过滤器的列表。
- 如果设备实现允许某些候选 URI intent 过滤器成功验证,而另一些候选 URI 过滤器可能验证失败,则设备实现**可以**为用户提供按 intent 过滤器覆盖特定成功验证的候选 URI intent 过滤器的能力。
- [C-0-8] 如果设备实现让某些候选 URI intent 过滤器成功验证,而另一些候选 URI 过滤器可能失败,则设备实现**必须**为用户提供查看和覆盖特定候选 URI intent 过滤器的能力。
3.2.3.3. Intent 命名空间
- [C-0-1] 设备实现**禁止**包含任何 Android 组件,该组件使用
android.
或com.android.
命名空间中的 ACTION、CATEGORY 或其他键字符串来处理任何新的 intent 或广播 intent 模式。 - [C-0-2] 设备实现者**禁止**包含任何 Android 组件,该组件使用属于其他组织的软件包空间中的 ACTION、CATEGORY 或其他键字符串来处理任何新的 intent 或广播 intent 模式。
- [C-0-3] 设备实现者**禁止**更改或扩展 第 3.2.3.1 节 中列出的核心应用使用的任何 intent 模式。
- 设备实现**可以**包含使用与其自身组织明确且明显关联的命名空间的 intent 模式。此项禁止类似于 第 3.6 节 中为 Java 语言类指定的禁止。
3.2.3.4. 广播 Intent
第三方应用程序依赖于平台广播某些 intent,以通知它们硬件或软件环境中的更改。
设备实现
- [C-0-1] **必须**响应 SDK 文档中描述的适当系统事件来广播公共广播 intent。请注意,此要求与第 3.5 节不冲突,因为 SDK 文档中也描述了后台应用程序的限制。
3.2.3.5. 默认应用设置
Android 包括设置,为用户提供了一种简单的方式来选择其默认应用程序,例如主屏幕或短信。
在有意义的情况下,设备实现**必须**提供类似的设置菜单,并且与 SDK 文档中描述的 intent 过滤器模式和 API 方法兼容,如下所示。
如果设备实现报告 android.software.home_screen
,则它们
- [C-1-1] **必须**遵守
android.settings.HOME_SETTINGS
intent 以显示主屏幕的默认应用设置菜单。
如果设备实现报告 android.hardware.telephony
,则它们
-
[C-2-1] **必须**提供一个设置菜单,该菜单将调用
android.provider.Telephony.ACTION_CHANGE_DEFAULT
intent 以显示用于更改默认短信应用程序的对话框。 -
[C-2-2] **必须**遵守
android.telecom.action.CHANGE_DEFAULT_DIALER
intent 以显示一个对话框,允许用户更改默认电话应用程序。- **必须**对除紧急呼叫之外的来电和去电使用用户选择的默认电话应用的 UI,紧急呼叫将使用预安装的电话应用。
-
[C-2-3] **必须**遵守 android.telecom.action.CHANGE_PHONE_ACCOUNTS intent,以提供用户操作来配置与
PhoneAccounts
关联的ConnectionServices
,以及电信服务提供商将用于拨打去电的默认 PhoneAccount。AOSP 实现通过在“通话”设置菜单中包含“通话帐户选项”菜单来满足此要求。
如果设备实现报告 android.hardware.nfc.hce
,则它们
- [C-3-1] **必须**遵守 android.settings.NFC_PAYMENT_SETTINGS intent 以显示用于“点击支付”的默认应用设置菜单。
如果设备实现支持 VoiceInteractionService
并且同时安装了多个使用此 API 的应用程序,则它们
- [C-4-1] **必须**遵守
android.settings.ACTION_VOICE_INPUT_SETTINGS
intent 以显示用于语音输入和辅助功能的默认应用设置菜单。
3.2.4. 副显示屏上的 Activity
如果设备实现允许在副显示屏上启动正常的 Android Activity,则它们
- [C-1-1] **必须**设置
android.software.activities_on_secondary_displays
功能标志。 - [C-1-2] **必须**保证与在主显示屏上运行的 Activity 类似的 API 兼容性。
- [C-1-3] 当启动新 Activity 时未通过
ActivityOptions.setLaunchDisplayId()
API 指定目标显示屏时,**必须**将新 Activity 放置在与启动它的 Activity 相同的显示屏上。 - [C-1-4] 当移除带有
Display.FLAG_PRIVATE
标志的显示屏时,**必须**销毁所有 Activity。 - [C-1-5] 如果
VirtualDisplay
本身已调整大小,则**必须**相应地调整其上所有 Activity 的大小。 - **可以**在主显示屏上显示 IME(输入法编辑器,一种使用户能够输入文本的用户控件),当副显示屏上的文本输入字段获得焦点时。
- **应该**在副显示屏上独立于主显示屏实现输入焦点,当支持触摸或按键输入时。
- **应该**具有
android.content.res.Configuration
,该配置与显示屏对应,以便在副显示屏上启动 Activity 时能够正确显示、正常运行并保持兼容性。
如果设备实现允许在副显示屏上启动正常的 Android Activity,并且主显示屏和副显示屏具有不同的 android.util.DisplayMetrics
- [C-2-1] **禁止**在副显示屏上允许不可调整大小的 Activity(在
AndroidManifest.xml
中具有resizeableActivity=false
)和目标 API 级别为 23 或更低的应用。
如果设备实现允许在副显示屏上启动正常的 Android Activity,并且副显示屏具有 android.view.Display.FLAG_PRIVATE 标志
- [C-3-1] 只有该显示屏的所有者、系统以及已在该显示屏上的 Activity **才能**启动到该显示屏。每个人都可以启动到具有 android.view.Display.FLAG_PUBLIC 标志的显示屏。
3.3. 本机 API 兼容性
本机代码兼容性具有挑战性。因此,设备实现者
- [SR] **强烈建议**使用来自上游 Android 开源项目的以下库的实现。
3.3.1. 应用程序二进制接口
托管的 Dalvik 字节码可以调用应用程序 .apk
文件中提供的本机代码,该文件是为适当的设备硬件架构编译的 ELF .so
文件。由于本机代码高度依赖于底层处理器技术,因此 Android 在 Android NDK 中定义了许多应用程序二进制接口 (ABI)。
设备实现
- [C-0-1] **必须**与一个或多个已定义的 ABI 兼容,并实现与 Android NDK 的兼容性。
- [C-0-2] **必须**包含对在托管环境中运行的代码调用本机代码的支持,使用标准的 Java 本机接口 (JNI) 语义。
- [C-0-3] **必须**与下面列表中的每个必需库在源兼容性(即,标头兼容性)和二进制兼容性(对于 ABI)方面兼容。
- [C-0-5] **必须**通过
android.os.Build.SUPPORTED_ABIS
、android.os.Build.SUPPORTED_32_BIT_ABIS
和android.os.Build.SUPPORTED_64_BIT_ABIS
参数准确报告设备支持的本机应用程序二进制接口 (ABI),每个参数都是以逗号分隔的 ABI 列表,从最优先到最不优先排序。 -
[C-0-6] **必须**通过上述参数报告以下 ABI 列表的子集,并且**禁止**报告列表中不存在的任何 ABI。
-
armeabi
-
armeabi-v7a
-
arm64-v8a
-
x86
-
x86-64
-
[C-0-7] **必须**使以下所有库(提供本机 API)可供包含本机代码的应用使用
-
libaaudio.so (AAudio 本机音频支持)
- 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 (数学库)
- libneuralnetworks.so (神经网络 API)
- libOpenMAXAL.so (OpenMAX AL 1.0.1 支持)
- libOpenSLES.so (OpenSL ES 1.0.1 音频支持)
- libRS.so
- libstdc++ (对 C++ 的最低限度支持)
- libvulkan.so (Vulkan)
- libz (Zlib 压缩)
- JNI 接口
-
-
[C-0-8] **禁止**添加或删除上面列出的本机库的公共函数。
- [C-0-9] **必须**在
/vendor/etc/public.libraries.txt
中列出直接向第三方应用公开的其他非 AOSP 库。 - [C-0-10] **禁止**向目标 API 级别为 24 或更高的第三方应用公开在 AOSP 中作为系统库实现和提供的任何其他本机库,因为它们是保留的。
- [C-0-11] **必须**导出所有 OpenGL ES 3.1 和 Android Extension Pack 函数符号,如 NDK 中定义的那样,通过
libGLESv3.so
库。请注意,虽然必须存在所有符号,但第 7.1.4.1 节更详细地描述了何时期望每个相应函数的完整实现的要求。 - [C-0-12] **必须**导出核心 Vulkan 1.0 函数符号以及
VK_KHR_surface
、VK_KHR_android_surface
、VK_KHR_swapchain
、VK_KHR_maintenance1
和VK_KHR_get_physical_device_properties2
扩展的函数符号,通过libvulkan.so
库。请注意,虽然必须存在所有符号,但第 7.1.4.2 节更详细地描述了何时期望每个相应函数的完整实现的要求。 - **应该**使用上游 Android 开源项目中提供的源代码和头文件构建
请注意,未来的 Android 版本可能会引入对其他 ABI 的支持。
3.3.2. 32 位 ARM 本机代码兼容性
如果设备实现报告支持 armeabi
ABI,则它们
- [C-3-1] **必须**同时支持
armeabi-v7a
并报告其支持,因为armeabi
仅用于向后兼容旧应用。
如果设备实现报告支持 armeabi-v7a
ABI,对于使用此 ABI 的应用,它们
-
[C-2-1] **必须**在
/proc/cpuinfo
中包含以下行,并且**不应**在同一设备上更改这些值,即使它们被其他 ABI 读取也是如此。-
Features:
,后跟设备支持的任何可选 ARMv7 CPU 功能的列表。 -
CPU architecture:
,后跟一个整数,描述设备支持的最高 ARM 架构(例如,ARMv8 设备的 “8”)。
-
-
[C-2-2] **必须**始终保持以下操作可用,即使 ABI 在 ARMv8 架构上实现的情况下,也需要通过本机 CPU 支持或通过软件模拟来实现
- SWP 和 SWPB 指令。
- SETEND 指令。
- CP15ISB、CP15DSB 和 CP15DMB 屏障操作。
-
[C-2-3] **必须**包含对 Advanced SIMD(又名 NEON)扩展的支持。
3.4. Web 兼容性
3.4.1. WebView 兼容性
如果设备实现提供 android.webkit.Webview
API 的完整实现,则它们
- [C-1-1] **必须**报告
android.software.webview
。 - [C-1-2] **必须**使用来自 Android 9 分支上游 Android 开源项目的 Chromium 项目构建,以实现
android.webkit.WebView
API。 -
[C-1-3] 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/$(BUILD)” **可以**省略,但如果它存在,则 $(BUILD) 字符串**必须**与 android.os.Build.ID 的值相同。
- $(CHROMIUM_VER) 字符串的值**必须**是上游 Android 开源项目中的 Chromium 版本。
- 设备实现**可以**在用户代理字符串中省略 Mobile。
-
WebView 组件**应该**包含对尽可能多的 HTML5 功能的支持,并且如果它支持该功能,则**应该**符合 HTML5 规范。
3.4.2. 浏览器兼容性
如果设备实现包含用于常规 Web 浏览的独立浏览器应用程序,则它们
- [C-1-1] **必须**支持与 HTML5 关联的以下每个 API
- [C-1-2] **必须**支持 HTML5/W3C webstorage API,并且**应该**支持 HTML5/W3C IndexedDB API。请注意,由于 Web 开发标准机构正在转向支持 IndexedDB 而不是 webstorage,因此 IndexedDB 有望在未来的 Android 版本中成为必需的组件。
- **可以**在独立浏览器应用程序中发布自定义用户代理字符串。
- **应该**在独立浏览器应用程序(无论是基于上游 WebKit 浏览器应用程序还是第三方替代品)上尽可能多地实现对 HTML5 的支持。
但是,如果设备实现不包含独立的浏览器应用程序,则它们
- [C-2-1] **仍然必须**支持 第 3.2.3.1 节 中描述的公共 intent 模式。
3.5. API 行为兼容性
设备实现
- [C-0-9] **必须**确保 API 行为兼容性应用于所有已安装的应用,除非它们受到 第 3.5.1 节 中描述的限制。
- [C-0-10] **禁止**实施允许列表方法,该方法仅确保设备实现者选择的应用的 API 行为兼容性。
每种 API 类型(托管、软、本机和 Web)的行为都必须与 Android 开源项目的上游首选实现保持一致。一些特定的兼容性领域是
- [C-0-1] 设备**禁止**更改标准 intent 的行为或语义。
- [C-0-2] 设备**禁止**更改特定类型的系统组件(例如 Service、Activity、ContentProvider 等)的生命周期或生命周期语义。
- [C-0-3] 设备**禁止**更改标准权限的语义。
- 设备**禁止**更改对后台应用程序强制执行的限制。更具体地说,对于后台应用
- [C-0-4] 它们**必须**停止执行由应用程序注册的回调,这些回调用于接收来自
GnssMeasurement
和GnssNavigationMessage
的输出。 - [C-0-5] 它们**必须**限制通过
LocationManager
API 类或WifiManager.startScan()
方法提供给应用程序的更新频率。 - [C-0-6] 如果应用程序的目标 API 级别为 25 或更高,则**禁止**允许为应用程序清单中的标准 Android intent 的隐式广播注册广播接收器,除非广播 intent 需要
"signature"
或"signatureOrSystem"
protectionLevel
权限,或者在 豁免列表 上。 - [C-0-7] 如果应用程序的目标 API 级别为 25 或更高,则**必须**停止应用程序的后台服务,就像应用程序调用了服务的
stopSelf()
方法一样,除非该应用程序被放置在临时允许列表中以处理对用户可见的任务。 - [C-0-8] 如果应用程序的目标 API 级别为 25 或更高,则**必须**释放应用程序持有的唤醒锁。
- [C-0-4] 它们**必须**停止执行由应用程序注册的回调,这些回调用于接收来自
- [C-0-9] 设备**必须**返回以下安全提供程序作为
Security.getProviders()
方法的前七个数组值,按给定的顺序和给定的名称(由Provider.getName()
返回)和类返回,除非应用程序已通过insertProviderAt()
或removeProvider()
修改了列表。设备**可以**在下面指定的提供程序列表之后返回其他提供程序。-
AndroidNSSP -
android.security.net.config.NetworkSecurityConfigProvider
-
AndroidOpenSSL -
com.android.org.conscrypt.OpenSSLProvider
-
CertPathProvider -
sun.security.provider.CertPathProvider
-
AndroidKeyStoreBCWorkaround -
android.security.keystore.AndroidKeyStoreBCWorkaroundProvider
-
BC -
com.android.org.bouncycastle.jce.provider.BouncyCastleProvider
-
HarmonyJSSE -
com.android.org.conscrypt.JSSEProvider
-
AndroidKeyStore -
android.security.keystore.AndroidKeyStoreProvider
-
AndroidNSSP -
以上列表并非详尽无遗。兼容性测试套件 (CTS) 测试了平台行为兼容性的重要部分,但并非全部。实现者有责任确保与 Android 开源项目的行为兼容性。因此,设备实现者**应该**尽可能使用通过 Android 开源项目提供的源代码,而不是重新实现系统的重要部分。
3.5.1. 后台限制
如果设备实现实现了 AOSP 中包含的应用限制或扩展了应用限制,则它们
- [C-SR] **强烈建议**提供用户操作,让用户可以在其中查看受限应用的列表。
- [C-1-2] **必须**提供用户操作,以打开/关闭每个应用的限制。
- [C-1-3] **禁止**在没有系统运行状况不良行为证据的情况下自动应用限制,但**可以**在检测到系统运行状况不良行为(如卡住的唤醒锁、长时间运行的服务和其他标准)时对应用应用限制。标准**可以**由设备实现者确定,但**必须**与应用对系统运行状况的影响相关。其他与系统运行状况纯粹无关的标准,例如应用在市场上的受欢迎程度不足,**禁止**用作标准。
- [C-1-4] 当用户手动关闭应用限制时,**禁止**自动应用应用限制,并且**可以**建议用户应用应用限制。
- [C-1-5] 如果应用限制自动应用于某个应用,则**必须**通知用户。
- [C-1-6] 对于受限应用调用此 API,必须返回
true
ActivityManager.isBackgroundRestricted()
。 - [C-1-7] 不得限制用户明确使用的顶部前台应用。
- [C-1-8] 当用户明确开始使用曾经受限的应用时,必须取消对成为顶部前台应用的限制。
3.6. API 命名空间
Android 遵循 Java 编程语言定义的软件包和类命名空间约定。为确保与第三方应用的兼容性,设备实现方不得对这些软件包命名空间进行任何禁止的修改(见下文)
-
java.*
-
javax.*
-
sun.*
-
android.*
-
androidx.*
-
com.android.*
也就是说,他们
- [C-0-1] 不得通过更改任何方法或类签名,或删除类或类字段来修改 Android 平台上公开的 API。
- [C-0-2] 不得在上述命名空间的 API 中添加任何公开的元素(例如类或接口,或现有类或接口的字段或方法)或测试或系统 API。“公开的元素”是指任何未使用上游 Android 源代码中使用的“@hide”标记修饰的构造。
设备实现方可以修改 API 的底层实现,但此类修改
- [C-0-3] 不得影响任何公开 API 的声明行为和 Java 语言签名。
- [C-0-4] 不得向开发者宣传或以其他方式公开。
但是,设备实现方可以在标准 Android 命名空间之外添加自定义 API,但自定义 API
- [C-0-5] 不得位于其他组织拥有或引用的命名空间中。例如,设备实现方不得向
com.google.*
或类似命名空间添加 API:只有 Google 可以这样做。同样,Google 不得向其他公司的命名空间添加 API。 - [C-0-6] 必须打包在 Android 共享库中,以便只有显式使用它们的应用程序(通过 <uses-library> 机制)才会受到此类 API 增加的内存使用量的影响。
如果设备实现方建议改进上述软件包命名空间之一(例如通过向现有 API 添加有用的新功能,或添加新的 API),则实现方应访问 source.android.com 并根据该网站上的信息开始贡献更改和代码的流程。
请注意,上述限制对应于 Java 编程语言中命名 API 的标准约定;本节旨在加强这些约定,并通过将其纳入此兼容性定义使其具有约束力。
3.7. 运行时兼容性
设备实现
-
[C-0-1] 必须支持完整的 Dalvik Executable (DEX) 格式和 Dalvik 字节码规范和语义。
-
[C-0-2] 必须根据上游 Android 平台配置 Dalvik 运行时以分配内存,并按照下表指定。(有关屏幕尺寸和屏幕密度定义,请参阅第 7.1.1 节。)
-
应使用 Android RunTime (ART),它是 Dalvik Executable Format 的参考上游实现,以及参考实现的软件包管理系统。
-
应在各种执行模式和目标架构下运行模糊测试,以确保运行时的稳定性。请参阅 Android 开源项目网站中的 JFuzz 和 DexFuzz。
请注意,下面指定的内存值被认为是最小值,设备实现可以为每个应用程序分配更多内存。
屏幕布局 | 屏幕密度 | 最小应用内存 |
---|---|---|
Android Watch | 120 dpi (ldpi) | 32MB |
160 dpi (mdpi) | ||
213 dpi (tvdpi) | ||
240 dpi (hdpi) | 36MB | |
280 dpi (280dpi) | ||
320 dpi (xhdpi) | 48MB | |
360 dpi (360dpi) | ||
400 dpi (400dpi) | 56MB | |
420 dpi (420dpi) | 64MB | |
480 dpi (xxhdpi) | 88MB | |
560 dpi (560dpi) | 112MB | |
640 dpi (xxxhdpi) | 154MB | |
小/普通 | 120 dpi (ldpi) | 32MB |
160 dpi (mdpi) | ||
213 dpi (tvdpi) | 48MB | |
240 dpi (hdpi) | ||
280 dpi (280dpi) | ||
320 dpi (xhdpi) | 80MB | |
360 dpi (360dpi) | ||
400 dpi (400dpi) | 96MB | |
420 dpi (420dpi) | 112MB | |
480 dpi (xxhdpi) | 128MB | |
560 dpi (560dpi) | 192MB | |
640 dpi (xxxhdpi) | 256MB | |
大 | 120 dpi (ldpi) | 32MB |
160 dpi (mdpi) | 48MB | |
213 dpi (tvdpi) | 80MB | |
240 dpi (hdpi) | ||
280 dpi (280dpi) | 96MB | |
320 dpi (xhdpi) | 128MB | |
360 dpi (360dpi) | 160MB | |
400 dpi (400dpi) | 192MB | |
420 dpi (420dpi) | 228MB | |
480 dpi (xxhdpi) | 256MB | |
560 dpi (560dpi) | 384MB | |
640 dpi (xxxhdpi) | 512MB | |
超大 | 120 dpi (ldpi) | 48MB |
160 dpi (mdpi) | 80MB | |
213 dpi (tvdpi) | 96MB | |
240 dpi (hdpi) | ||
280 dpi (280dpi) | 144MB | |
320 dpi (xhdpi) | 192MB | |
360 dpi (360dpi) | 240MB | |
400 dpi (400dpi) | 288MB | |
420 dpi (420dpi) | 336MB | |
480 dpi (xxhdpi) | 384MB | |
560 dpi (560dpi) | 576MB | |
640 dpi (xxxhdpi) | 768MB |
3.8. 用户界面兼容性
3.8.1. 启动器(主屏幕)
Android 包含一个启动器应用程序(主屏幕)并支持第三方应用程序替换设备启动器(主屏幕)。
如果设备实现允许第三方应用程序替换设备主屏幕,则它们
- [C-1-1] 必须声明平台功能
android.software.home_screen
。 - [C-1-2] 当第三方应用程序使用
<adaptive-icon>
标签提供其图标,并且调用PackageManager
方法来检索图标时,必须返回AdaptiveIconDrawable
对象。
如果设备实现包含支持应用内快捷方式固定的默认启动器,则它们
- [C-2-1] 对于
ShortcutManager.isRequestPinShortcutSupported()
必须报告true
。 - [C-2-2] 在通过
ShortcutManager.requestPinShortcut()
API 方法添加应用程序请求的快捷方式之前,必须具有用户提示。 - [C-2-3] 必须支持 应用快捷方式页面 上记录的固定快捷方式以及动态和静态快捷方式。
相反,如果设备实现不支持应用内快捷方式固定,则它们
- [C-3-1] 对于
ShortcutManager.isRequestPinShortcutSupported()
必须报告false
。
如果设备实现实现了一个默认启动器,该启动器通过 ShortcutManager API 提供对第三方应用程序提供的其他快捷方式的快速访问,则它们
- [C-4-1] 必须支持所有记录的快捷方式功能(例如静态和动态快捷方式、固定快捷方式),并完全实现
ShortcutManager
API 类的 API。
如果设备实现包含显示应用程序图标徽章的默认启动器应用程序,则它们
- [C-5-1] 必须遵守
NotificationChannel.setShowBadge()
API 方法。换句话说,如果值设置为true
,则显示与应用程序图标关联的可视提示,并且当应用程序的所有通知渠道都将值设置为false
时,不显示任何应用程序图标徽章方案。 - 当第三方应用程序通过使用专有 API 表明支持专有徽章方案时,可以覆盖应用程序图标徽章,但应使用 SDK 中描述的通知徽章 API 提供的资源和值,例如
Notification.Builder.setNumber()
和Notification.Builder.setBadgeIconType()
API。
3.8.2. 小部件
Android 通过定义组件类型以及相应的 API 和生命周期来支持第三方应用小部件,从而允许应用程序向最终用户公开 “AppWidget”。
如果设备实现支持第三方应用小部件,则它们
- [C-1-1] 必须声明对平台功能
android.software.app_widgets
的支持。 - [C-1-2] 必须包含对 AppWidget 的内置支持,并公开用户界面提示,以直接在启动器中添加、配置、查看和移除 AppWidget。
- [C-1-3] 必须能够渲染标准网格尺寸中 4 x 4 的小部件。有关详细信息,请参阅 Android SDK 文档中的 App Widget 设计指南。
- 可以支持锁定屏幕上的应用程序小部件。
如果设备实现支持第三方应用小部件和应用内快捷方式固定,则它们
- [C-2-1] 对于
AppWidgetManager.html.isRequestPinAppWidgetSupported()
必须报告true
。 - [C-2-2] 在通过
AppWidgetManager.requestPinAppWidget()
API 方法添加应用程序请求的快捷方式之前,必须具有用户提示。
3.8.3. 通知
Android 包含 Notification
和 NotificationManager
API,允许第三方应用程序开发者通知用户值得注意的事件,并使用设备的硬件组件(例如声音、振动和灯光)和软件功能(例如通知栏、系统栏)来吸引用户的注意力。
3.8.3.1. 通知的呈现
如果设备实现允许第三方应用程序通知用户值得注意的事件,则它们
- [C-1-1] 必须支持使用硬件功能的通知,如 SDK 文档中所述,并在设备实现硬件允许的范围内。例如,如果设备实现包含振动器,则必须正确实现振动 API。如果设备实现缺少硬件,则必须将相应的 API 实现为无操作。此行为在第 7 节中有更详细的说明。
- [C-1-2] 必须正确渲染 API 中或状态/系统栏 图标样式指南中提供的所有资源(图标、动画文件等),尽管它们可以为通知提供与参考 Android 开源实现提供的用户体验不同的用户体验。
- [C-1-3] 必须遵守并正确实现 API 中描述的更新、移除和分组通知的行为。
- [C-1-4] 必须提供 SDK 中记录的 NotificationChannel API 的完整行为。
- [C-1-5] 必须为用户提供每个渠道和应用包级别的阻止和修改特定第三方应用通知的用户提示。
- [C-1-6] 还必须为用户提供显示已删除通知渠道的用户提示。
- [C-1-7] 必须正确渲染通过 Notification.MessagingStyle 提供的所有资源(图像、贴纸、图标等)以及通知文本,而无需额外的用户交互。例如,必须显示通过 android.app.Person 在通过 setGroupConversation 设置的群组对话中提供的所有资源,包括图标。
- [C-SR] 强烈建议在用户多次关闭某个第三方应用程序的每个渠道和应用程序包级别的通知后,自动显示用户提示以阻止该通知。
- 应支持富通知。
- 应将一些较高优先级的通知呈现为浮动通知。
- 应具有用户提示以暂停通知。
- 可以仅管理第三方应用程序何时可以通知用户值得注意的事件的可见性和时间,以减轻驾驶员分心等安全问题。
如果设备实现支持富通知,则它们
- [C-2-1] 必须使用通过
Notification.Style
API 类及其子类提供的完全相同的资源作为呈现的资源元素。 - 应呈现
Notification.Style
API 类及其子类中定义的每个资源元素(例如图标、标题和摘要文本)。
如果设备实现支持浮动通知:则它们
- [C-3-1] 当呈现浮动通知时,必须使用
Notification.Builder
API 类中描述的浮动通知视图和资源。 - [C-3-2] 必须按照 SDK 中的描述,将通过
Notification.Builder.addAction()
提供的操作与通知内容一起显示,而无需额外的用户交互。
3.8.3.2. 通知侦听器服务
Android 包含 NotificationListenerService
API,允许应用程序(一旦用户明确启用)在发布或更新时接收所有通知的副本。
如果设备实现报告功能标志 android.hardware.ram.normal
,则它们
- [C-1-1] 必须正确且及时地将通知完整地更新到所有此类已安装且用户启用的侦听器服务,包括附加到 Notification 对象的所有元数据。
- [C-1-2] 必须遵守
snoozeNotification()
API 调用,并在 API 调用中设置的暂停持续时间之后关闭通知并进行回调。
如果设备实现具有暂停通知的用户提示,则它们
- [C-2-1] 必须通过标准 API(例如
NotificationListenerService.getSnoozedNotifications()
)正确反映暂停的通知状态。 - [C-2-2] 必须使此用户提示可用于暂停每个已安装的第三方应用程序的通知,除非它们来自持久/前台服务。
3.8.3.3. DND(请勿打扰)
如果设备实现支持 DND 功能,则它们
- [C-1-1] 必须实现一个活动,该活动将响应 intent ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS,对于具有 UI_MODE_TYPE_NORMAL 的实现,它必须是一个活动,用户可以在其中授予或拒绝应用程序访问 DND 策略配置。
- [C-1-2] 必须在设备实现提供了用户授予或拒绝第三方应用程序访问 DND 策略配置的方式时,显示应用程序创建的 自动 DND 规则 以及用户创建和预定义的规则。
- [C-1-3] 必须遵守沿
NotificationManager.Policy
传递的suppressedVisualEffects
值,并且如果应用程序设置了任何 SUPPRESSED_EFFECT_SCREEN_OFF 或 SUPPRESSED_EFFECT_SCREEN_ON 标志,则应向用户指示视觉效果在 DND 设置菜单中被抑制。
3.8.4. 搜索
Android 包含 API,允许开发者将 搜索 集成到他们的应用程序中,并将他们应用程序的数据公开到全局系统搜索中。一般来说,此功能包含一个单一的、系统范围的用户界面,允许用户输入查询,在用户键入时显示建议,并显示结果。Android API 允许开发者重用此界面以在他们自己的应用程序中提供搜索,并允许开发者向公共全局搜索用户界面提供结果。
- Android 设备实现应包含全局搜索,这是一个单一的、共享的、系统范围的搜索用户界面,能够实时响应用户输入的建议。
如果设备实现实现了全局搜索界面,则它们
- [C-1-1] 必须实现 API,允许第三方应用程序在全局搜索模式下运行时向搜索框添加建议。
如果未安装任何使用全局搜索的第三方应用程序
- 默认行为应是显示 Web 搜索引擎结果和建议。
Android 还包含 Assist API,允许应用程序选择与设备上的助手共享多少当前上下文信息。
如果设备实现支持 Assist 操作,则它们
- [C-2-1] 必须通过以下方式之一向最终用户清楚地指示何时共享上下文:
- 每次 Assist 应用程序访问上下文时,在屏幕边缘周围显示白光,其持续时间和亮度满足或超过 Android 开源项目实现的持续时间和亮度。
- 对于预安装的 Assist 应用程序,提供一个用户提示,该提示距离 默认语音输入和助手应用程序设置菜单 不到两次导航,并且仅当用户通过热词或 Assist 导航键输入显式调用 Assist 应用程序时才共享上下文。
- [C-2-2] 如 第 7.2.3 节 中所述,启动 Assist 应用程序的指定交互必须启动用户选择的 Assist 应用程序,换句话说,即实现
VoiceInteractionService
的应用程序,或处理ACTION_ASSIST
intent 的活动。
3.8.5. 警报和 Toast
应用程序可以使用 Toast
API 向最终用户显示短暂的非模态字符串,这些字符串会在短暂的时间后消失,并使用 TYPE_APPLICATION_OVERLAY
窗口类型 API 将警报窗口显示为覆盖在其他应用程序之上的叠加层。
如果设备实现包含屏幕或视频输出,则它们
-
[C-1-1] 必须为用户提供用户提示,以阻止应用程序显示使用
TYPE_APPLICATION_OVERLAY
的警报窗口。AOSP 实现通过在通知栏中设置控件来满足此要求。 -
[C-1-2] 必须遵守 Toast API,并以某种高度可见的方式向最终用户显示来自应用程序的 Toast。
3.8.6. 主题
Android 提供“主题”作为一种机制,供应用程序在整个 Activity 或应用程序中应用样式。
Android 包含“Holo”和“Material”主题系列,作为一组定义的样式,供应用程序开发者使用,如果他们想要匹配 Android SDK 定义的 Holo 主题外观和感觉。
如果设备实现包含屏幕或视频输出,则它们
- [C-1-1] 不得更改暴露给应用程序的任何 Holo 主题属性。
- [C-1-2] 必须支持“Material”主题系列,并且不得更改暴露给应用程序的任何 Material 主题属性 或其资源。
Android 还包含“Device Default”主题系列,作为一组定义的样式,供应用程序开发者使用,如果他们想要匹配设备实现方定义的设备主题的外观和感觉。
- 设备实现可以修改暴露给应用程序的 Device Default 主题属性。
Android 支持具有半透明系统栏的变体主题,这允许应用程序开发者用他们的应用程序内容填充状态栏和导航栏后面的区域。为了在这种配置中实现一致的开发者体验,重要的是在不同的设备实现中保持状态栏图标样式。
如果设备实现包含系统状态栏,则它们
- [C-2-1] 必须对系统状态图标(例如信号强度和电池电量)以及系统发出的通知使用白色,除非图标指示存在问题的状态或应用程序使用 SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 标志请求浅色状态栏。
- [C-2-2] 当应用程序请求浅色状态栏时,Android 设备实现必须将系统状态图标的颜色更改为黑色(有关详细信息,请参阅 R.style)。
3.8.7. 动态壁纸
Android 定义了一个组件类型以及相应的 API 和生命周期,允许应用程序向最终用户公开一个或多个 “动态壁纸”。动态壁纸是动画、图案或类似的图像,具有有限的输入功能,作为壁纸显示在其他应用程序后面。
如果硬件能够以合理的帧速率可靠地运行所有动态壁纸,且对其他应用程序没有不利影响,并且功能不受限制,则认为该硬件能够可靠地运行动态壁纸。如果硬件的限制导致壁纸和/或应用程序崩溃、故障、消耗过多的 CPU 或电池电量,或以低得无法接受的帧速率运行,则认为该硬件无法运行动态壁纸。例如,某些动态壁纸可能使用 OpenGL 2.0 或 3.x 上下文来渲染其内容。动态壁纸将无法在不支持多个 OpenGL 上下文的硬件上可靠运行,因为动态壁纸对 OpenGL 上下文的使用可能会与也使用 OpenGL 上下文的其他应用程序冲突。
- 能够如上所述可靠运行动态壁纸的设备实现应实现动态壁纸。
如果设备实现实现了动态壁纸,则它们
- [C-1-1] 必须报告平台功能标志 android.software.live_wallpaper。
3.8.8. 活动切换
上游 Android 源代码包含 概览屏幕,这是一个系统级的用户界面,用于任务切换和显示最近访问的活动和任务,使用用户上次离开应用程序时应用程序图形状态的缩略图图像。
包含 第 7.2.3 节 中详细介绍的最近使用应用功能导航键的设备实现可以更改界面。
如果包含 第 7.2.3 节 中详细介绍的最近使用应用功能导航键的设备实现更改了界面,则它们
- [C-1-1] 必须至少支持最多 7 个显示的活动。
- 应至少一次显示 4 个活动的标题。
- [C-1-2] 必须实现 屏幕固定行为,并为用户提供设置菜单以切换该功能。
- 应在最近使用应用中显示高亮颜色、图标、屏幕标题。
- 应显示关闭提示(“x”),但可以延迟到用户与屏幕交互时再显示。
- 应实现快捷方式以轻松切换到上一个活动。
- 当最近使用应用功能键被点击两次时,应触发最近使用的两个应用程序之间的快速切换操作。
- 如果支持分屏多窗口模式,则在长按最近使用应用功能键时,应触发分屏多窗口模式。
- 可以显示关联的最近使用应用作为一个一起移动的组。
- [SR] 强烈建议对概览屏幕使用上游 Android 用户界面(或类似的基于缩略图的界面)。
3.8.9. 输入管理
Android 包含对 输入管理 和对第三方输入法编辑器的支持。
如果设备实现允许用户在设备上使用第三方输入法,则它们
- [C-1-1] 必须声明平台功能 android.software.input_methods 并支持 Android SDK 文档中定义的 IME API。
- [C-1-2] 必须提供用户可访问的机制,以响应 android.settings.INPUT_METHOD_SETTINGS intent 添加和配置第三方输入法。
如果设备实现声明了 android.software.autofill
功能标志,则它们
- [C-2-1] 必须完全实现
AutofillService
和AutofillManager
API,并遵守android.settings.REQUEST_SET_AUTOFILL_SERVICE
intent,以显示默认应用程序设置菜单,供用户启用和禁用自动填充并更改默认自动填充服务。
3.8.10. 锁屏媒体控制
Remote Control Client API 从 Android 5.0 开始已弃用,取而代之的是 媒体通知模板,它允许媒体应用程序与锁定屏幕上显示的播放控件集成。
3.8.11. 屏幕保护程序(以前称为 Dreams)
Android 包含对 交互式屏幕保护程序 的支持,以前称为 Dreams。屏幕保护程序允许用户在连接到电源的设备处于空闲状态或停靠在桌面底座中时与应用程序交互。Android Watch 设备可以实现屏幕保护程序,但其他类型的设备实现应包括对屏幕保护程序的支持,并提供设置选项供用户响应 android.settings.DREAM_SETTINGS
intent 配置屏幕保护程序。
3.8.12. 位置信息
如果设备实现包含能够提供位置坐标的硬件传感器(例如 GPS),则它们
- [C-1-2] 必须在“设置”中的“位置信息”菜单中显示 当前位置信息的开启状态。
- [C-1-3] 不得在“设置”中的“位置信息”菜单中显示 位置信息模式。
3.8.13. Unicode 和字体
Android 包含对 Unicode 10.0 中定义的表情符号字符的支持。
如果设备实现包含屏幕或视频输出,则它们
- [C-1-1] 必须能够以彩色字形渲染这些表情符号字符。
- [C-1-2] 必须包含对以下内容的支持
- Roboto 2 字体,具有不同的粗细—sans-serif-thin、sans-serif-light、sans-serif-medium、sans-serif-black、sans-serif-condensed、sans-serif-condensed-light,适用于设备上可用的语言。
- 完整 Unicode 7.0 覆盖范围的拉丁文、希腊文和西里尔文,包括 Latin Extended A、B、C 和 D 范围,以及 Unicode 7.0 的货币符号块中的所有字形。
- 应该 (SHOULD) 支持 Unicode Technical Report #51 中指定的肤色和多元家庭表情符号。
如果设备实现包含 IME,则
- 应该 (SHOULD) 为用户提供针对这些表情符号字符的输入法。
3.8.14. 多窗口 (Multi-windows)
如果设备实现具有同时显示多个活动的功能,则
- [C-1-1] 必须 (MUST) 按照 Android SDK 多窗口模式支持文档 中描述的应用行为和 API 来实现此类多窗口模式,并满足以下要求
- [C-1-2] 应用可以通过在
AndroidManifest.xml
文件中指明它们是否能够在多窗口模式下运行,可以通过显式地将android:resizeableActivity
属性设置为true
,或者通过隐式地将 targetSdkVersion 设置为 > 24。在其 manifest 文件中显式地将此属性设置为false
的应用,必须 (MUST NOT) 不在多窗口模式下启动。targetSdkVersion < 24 且未设置android:resizeableActivity
属性的旧应用可以 (MAY) 在多窗口模式下启动,但系统必须 (MUST) 提供警告,指出该应用在多窗口模式下可能无法按预期工作。 - [C-1-3] 如果屏幕高度 < 440 dp 且屏幕宽度 < 440 dp,则必须 (MUST NOT) 提供分屏或自由窗口模式。
- 屏幕尺寸为
xlarge
的设备实现应该 (SHOULD) 支持自由窗口模式。
如果设备实现支持多窗口模式,以及分屏模式,则
- [C-2-1] 必须 (MUST) 预加载一个 可调整大小 (resizeable) 的启动器作为默认启动器。
- [C-2-2] 如果启动器应用是焦点窗口,则必须 (MUST) 裁剪分屏多窗口的停靠活动,但应该 (SHOULD) 显示其某些内容。
- [C-2-3] 必须 (MUST) 遵循第三方启动器应用声明的
AndroidManifestLayout_minWidth
和AndroidManifestLayout_minHeight
值,并且在显示停靠活动的部分内容的过程中,不得 (MUST NOT) 覆盖这些值。
如果设备实现支持多窗口模式和画中画 (picture-in-picture) 多窗口模式,则
- [C-3-1] 当应用符合以下条件时,必须 (MUST) 在画中画多窗口模式下启动活动:* 目标 API 级别为 26 或更高,并声明了
android:supportsPictureInPicture
* 目标 API 级别为 25 或更低,并同时声明了android:resizeableActivity
和android:supportsPictureInPicture
。 - [C-3-2] 必须 (MUST) 通过
setActions()
API 公开其 SystemUI 中的操作,这些操作由当前的 PIP 活动指定。 - [C-3-3] 必须 (MUST) 支持大于或等于 1:2.39 且小于或等于 2.39:1 的宽高比,这些宽高比由 PIP 活动通过
setAspectRatio()
API 指定。 - [C-3-4] 必须 (MUST) 使用
KeyEvent.KEYCODE_WINDOW
来控制 PIP 窗口;如果未实现 PIP 模式,则该键必须 (MUST) 可用于前台活动。 - [C-3-5] 必须 (MUST) 提供用户操作界面,以阻止应用在 PIP 模式下显示;AOSP 实现通过在通知栏中设置控件来满足此要求。
- [C-3-6] 当
Configuration.uiMode
配置为UI_MODE_TYPE_TELEVISION
时,必须 (MUST) 为 PIP 窗口分配最小宽度和高度为 108 dp,以及最小宽度为 240 dp 和高度为 135 dp。
3.8.15. 显示屏凹口 (Display Cutout)
Android 支持 SDK 文档中描述的显示屏凹口 (Display Cutout)。DisplayCutout
API 定义了显示屏边缘上不用于显示内容的一个区域。
如果设备实现包含显示屏凹口,则
- [C-1-1] 必须 (MUST) 仅在设备的短边上具有凹口。相反,如果设备的宽高比为 1.0(1:1),则必须 (MUST NOT) 具有凹口。
- [C-1-2] 每个边缘必须 (MUST NOT) 有多个凹口。
- [C-1-3] 必须 (MUST) 遵循应用通过
WindowManager.LayoutParams
API 设置的显示屏凹口标志,如 SDK 中所述。 - [C-1-4] 必须 (MUST) 为
DisplayCutout
API 中定义的所有凹口指标报告正确的值。
3.9. 设备管理 (Device Administration)
Android 包含一些功能,允许具有安全意识的应用通过 Android 设备管理 API 在系统级别执行设备管理功能,例如强制执行密码策略或执行远程擦除。
如果设备实现实现了 Android SDK 文档中定义的全部 设备管理 策略,则
- [C-1-1] 必须 (MUST) 声明
android.software.device_admin
功能。 - [C-1-2] 必须 (MUST) 支持 第 3.9.1 节 和 第 3.9.1.1 节 中描述的设备所有者配置 (device owner provisioning)。
3.9.1 设备配置 (Device Provisioning)
3.9.1.1 设备所有者配置 (Device owner provisioning)
如果设备实现声明了 android.software.device_admin
功能,则
- [C-1-1] 必须 (MUST) 支持将设备策略客户端 (Device Policy Client, DPC) 注册为 设备所有者 (Device Owner) 应用,如下所述
- 当设备实现尚未配置任何用户数据时,它
- [C-1-3] 必须 (MUST) 为
DevicePolicyManager.isProvisioningAllowed(ACTION_PROVISION_MANAGED_DEVICE)
报告true
。 - [C-1-4] 必须 (MUST) 响应 intent 操作
android.app.action.PROVISION_MANAGED_DEVICE
,将 DPC 应用注册为设备所有者应用。 - [C-1-5] 如果设备通过功能标志
android.hardware.nfc
声明支持近场通信 (Near-Field Communications, NFC),并且接收到包含 MIME 类型为MIME_TYPE_PROVISIONING_NFC
的记录的 NFC 消息,则必须 (MUST) 将 DPC 应用注册为设备所有者应用。
- [C-1-3] 必须 (MUST) 为
- 当设备实现具有用户数据时,它
- [C-1-6] 必须 (MUST) 为
DevicePolicyManager.isProvisioningAllowed(ACTION_PROVISION_MANAGED_DEVICE)
报告false
。 - [C-1-7] 必须 (MUST NOT) 再将任何 DPC 应用注册为设备所有者应用。
- [C-1-6] 必须 (MUST) 为
- 当设备实现尚未配置任何用户数据时,它
- [C-1-2] 在配置过程中,必须 (MUST) 要求进行某些肯定的操作,以同意将应用设置为设备所有者。同意可以通过用户操作或在配置期间通过某种编程方式获得,但不应 (MUST NOT) 硬编码或阻止使用其他设备所有者应用。
如果设备实现声明了 android.software.device_admin
,但也包含专有的设备所有者管理解决方案,并提供一种机制来将在其解决方案中配置的应用提升为标准 Android DevicePolicyManager API 认可的标准“设备所有者”的“设备所有者等效物”,则
- [C-2-1] 必须 (MUST) 制定一个流程,以验证要提升的特定应用是否属于合法的企业设备管理解决方案,并且该应用已在其专有解决方案中配置为具有与“设备所有者”等效的权限。
- [C-2-2] 在将 DPC 应用注册为“设备所有者”之前,必须 (MUST) 显示与
android.app.action.PROVISION_MANAGED_DEVICE
发起的流程相同的 AOSP 设备所有者同意披露信息。 - 可以 (MAY) 在将 DPC 应用注册为“设备所有者”之前,设备上存在用户数据。
3.9.1.2 受管理个人资料配置 (Managed profile provisioning)
如果设备实现声明了 android.software.managed_users
功能,则
-
[C-1-1] 必须 (MUST) 实现允许设备策略控制器 (Device Policy Controller, DPC) 应用成为新的API 受管理个人资料 (Managed Profile) 的所有者。
-
[C-1-2] 受管理个人资料配置过程(由 android.app.action.PROVISION_MANAGED_PROFILE 发起的流程)的用户体验必须 (MUST) 与 AOSP 实现保持一致。
-
[C-1-3] 必须 (MUST) 在“设置”中提供以下用户操作界面,以向用户指示设备策略控制器 (DPC) 何时禁用了特定的系统功能
- 一致的图标或其他用户操作界面(例如上游 AOSP 信息图标),以表示特定设置何时受到设备管理员的限制。
- 简短的解释消息,由设备管理员通过
setShortSupportMessage
提供。 - DPC 应用的图标。
3.9.2 受管理个人资料支持 (Managed Profile Support)
如果设备实现声明了 android.software.managed_users
功能,则
- [C-1-1] 必须 (MUST) 通过
android.app.admin.DevicePolicyManager
API 支持受管理个人资料。 - [C-1-2] 必须 (MUST) 允许创建且仅允许 创建一个受管理个人资料。
- [C-1-3] 必须 (MUST) 使用图标徽章(类似于 AOSP 上游工作徽章)来表示受管理的应用和小部件以及其他带徽章的 UI 元素,如“最近使用”和“通知”。
- [C-1-4] 必须 (MUST) 显示通知图标(类似于 AOSP 上游工作徽章),以指示用户何时位于受管理个人资料应用中。
- [C-1-5] 如果设备唤醒 (ACTION_USER_PRESENT) 且前台应用位于受管理个人资料中,则必须 (MUST) 显示一个 toast 消息,指示用户位于受管理个人资料中。
- [C-1-6] 如果存在受管理个人资料,则必须 (MUST) 在 Intent “选择器 (Chooser)” 中显示一个视觉操作界面,以允许用户在设备策略控制器启用时,将 intent 从受管理个人资料转发到主用户,或反之亦然。
- [C-1-7] 如果存在受管理个人资料,则必须 (MUST) 为主用户和受管理个人资料公开以下用户操作界面
- 分别核算主用户和受管理个人资料的电池、位置信息、移动数据和存储使用情况。
- 独立管理主用户或受管理个人资料中安装的 VPN 应用。
- 独立管理主用户或受管理个人资料中安装的应用。
- 独立管理主用户或受管理个人资料中的帐户。
- [C-1-8] 必须 (MUST) 确保预安装的拨号器、联系人和消息应用可以搜索和查找来自受管理个人资料(如果存在)以及来自主个人资料的来电者信息(如果设备策略控制器允许)。
- [C-1-9] 必须 (MUST) 确保它满足适用于启用多用户的设备的所有安全要求(请参阅第 9.5 节),即使受管理个人资料不计为除主用户之外的另一个用户。
- [C-1-10] 必须 (MUST) 支持指定一个单独的锁屏,以满足以下要求,从而授予对在受管理个人资料中运行的应用的访问权限。
- 设备实现必须 (MUST) 遵循
DevicePolicyManager.ACTION_SET_NEW_PASSWORD
intent,并显示一个界面来配置受管理个人资料的单独锁屏凭据。 - 受管理个人资料的锁屏凭据必须 (MUST) 使用与父个人资料相同的凭据存储和管理机制,如 Android Open Source Project 站点 上所述。
- 除非在 getParentProfileInstance 返回的
DevicePolicyManager
实例上调用,否则 DPC 密码策略 必须 (MUST) 仅应用于受管理个人资料的锁屏凭据。
- 设备实现必须 (MUST) 遵循
- 当来自受管理个人资料的联系人显示在预安装的通话记录、通话中 UI、正在进行和未接来电通知、联系人和消息应用中时,它们应该 (SHOULD) 带有与指示受管理个人资料应用相同的徽章。
3.9.3 受管理用户支持 (Managed User Support)
如果设备实现声明了 android.software.managed_users
功能,则
- [C-1-1] 当
isLogoutEnabled
返回true
时,必须 (MUST) 提供用户操作界面,以便在多用户会话中从当前用户注销并切换回主用户。用户操作界面必须 (MUST) 可从锁屏界面访问,而无需解锁设备。
3.10. 无障碍功能 (Accessibility)
Android 提供了一个无障碍功能层,帮助残障用户更轻松地导航他们的设备。此外,Android 还提供平台 API,使无障碍功能服务实现能够接收用户和系统事件的回调,并生成替代反馈机制,例如文本转语音、触觉反馈和轨迹球/方向键导航。
如果设备实现支持第三方无障碍功能服务,则
- [C-1-1] 必须 (MUST) 提供 Android 无障碍功能框架的实现,如 accessibility APIs SDK 文档中所述。
- [C-1-2] 必须 (MUST) 生成无障碍功能事件,并将适当的
AccessibilityEvent
传递给所有已注册的AccessibilityService
实现,如 SDK 中所述。 - [C-1-3] 必须 (MUST) 遵循
android.settings.ACCESSIBILITY_SETTINGS
intent,以提供用户可访问的机制,从而在预安装的无障碍功能服务之外启用和禁用第三方无障碍功能服务。 - [C-1-4] 当启用的无障碍功能服务声明了
AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON
时,必须 (MUST) 在系统的导航栏中添加一个按钮,允许用户控制无障碍功能服务。请注意,对于没有系统导航栏的设备实现,此要求不适用,但设备实现应该 (SHOULD) 提供用户操作界面来控制这些无障碍功能服务。
如果设备实现包含预安装的无障碍功能服务,则
- [C-2-1] 当数据存储使用基于文件的加密 (File Based Encryption, FBE) 进行加密时,必须 (MUST) 将这些预安装的无障碍功能服务实现为 Direct Boot Aware 应用。
- 应该 (SHOULD) 在开箱即用设置流程中提供一种机制,供用户启用相关的无障碍功能服务,以及调整字体大小、显示尺寸和放大手势的选项。
3.11. 文本转语音 (Text-to-Speech)
Android 包含一些 API,允许应用使用文本转语音 (TTS) 服务,并允许服务提供商提供 TTS 服务的实现。
如果设备实现报告了 android.hardware.audio.output
功能,则
- [C-1-1] 必须 (MUST) 支持 Android TTS 框架 API。
如果设备实现支持安装第三方 TTS 引擎,则
- [C-2-1] 必须 (MUST) 提供用户操作界面,允许用户选择一个 TTS 引擎以在系统级别使用。
3.12. 电视输入框架 (TV Input Framework)
Android 电视输入框架 (Television Input Framework, TIF) 简化了向 Android 电视设备交付直播内容的过程。TIF 提供了一个标准 API,用于创建控制 Android 电视设备的输入模块。
如果设备实现支持 TIF,则
- [C-1-1] 必须 (MUST) 声明平台功能
android.software.live_tv
。 - [C-1-2] 必须 (MUST) 支持所有 TIF API,以便使用这些 API 和 第三方 TIF 输入 服务的应用可以安装并在设备上使用。
3.13. 快速设置 (Quick Settings)
Android 提供了一个快速设置 UI 组件,可以快速访问常用或紧急需要的操作。
如果设备实现包含快速设置 UI 组件,则
- [C-1-1] 必须 (MUST) 允许用户从第三方应用添加或移除通过
quicksettings
API 提供的图块。 - [C-1-2] 必须 (MUST NOT) 将来自第三方应用的图块直接自动添加到“快速设置”中。
- [C-1-3] 必须 (MUST) 将用户添加的所有来自第三方应用的图块与系统提供的快速设置图块一起显示。
3.14. 媒体 UI (Media UI)
如果设备实现包含支持依赖于 MediaBrowser
和 MediaSession
的第三方应用的 UI 框架,则
- [C-1-1] 必须 (MUST) 不加更改地显示 MediaItem 图标和通知图标。
- [C-1-2] 必须 (MUST) 按照 MediaSession 的描述显示这些项目,例如,元数据、图标、图像。
- [C-1-3] 必须 (MUST) 显示应用标题。
- [C-1-4] 必须 (MUST) 具有一个抽屉或其他机制来呈现 MediaBrowser 层次结构,并为 MediaBrowser 层次结构提供用户操作界面。
- [C-1-5] 对于
MediaSession.Callback#onMediaButtonEvent
,必须 (MUST) 将双击KEYCODE_HEADSETHOOK
或KEYCODE_MEDIA_PLAY_PAUSE
视为KEYCODE_MEDIA_NEXT
。
3.15. 即时应用 (Instant Apps)
设备实现必须 (MUST) 满足以下要求
- [C-0-1] 必须 (MUST) 仅向即时应用授予
android:protectionLevel
设置为"instant"
的权限。 - [C-0-2] 除非满足以下条件之一,否则即时应用必须 (MUST NOT) 通过 隐式 intent 与已安装的应用交互
- 组件的 intent 模式过滤器已公开并具有 CATEGORY_BROWSABLE
- 操作是 ACTION_SEND、ACTION_SENDTO、ACTION_SEND_MULTIPLE 之一
- 目标通过 android:visibleToInstantApps 显式公开
- [C-0-3] 除非组件通过 android:visibleToInstantApps 公开,否则即时应用必须 (MUST NOT) 与已安装的应用显式交互。
- [C-0-4] 除非即时应用显式连接到已安装的应用,否则已安装的应用必须 (MUST NOT) 查看设备上有关即时应用的详细信息。
3.16. 伴侣设备配对 (Companion Device Pairing)
Android 包含对伴侣设备配对的支持,以更有效地管理与伴侣设备的关联,并提供 CompanionDeviceManager
API,供应用访问此功能。
如果设备实现支持伴侣设备配对功能,则
- [C-1-1] 必须 (MUST) 声明功能标志
FEATURE_COMPANION_DEVICE_SETUP
。 - [C-1-2] 必须 (MUST) 确保
android.companion
包中的 API 已完全实现。 - [C-1-3] 必须 (MUST) 提供用户操作界面,供用户选择/确认伴侣设备存在且可操作。
3.17. 重量级应用 (Heavyweight Apps)
如果设备实现声明了 FEATURE_CANT_SAVE_STATE
功能,则
- [C-1-1] 必须 (MUST) 一次在系统中只运行一个指定了
cantSaveState
的已安装应用。如果用户在未显式退出的情况下离开此类应用(例如,在离开活动活动时按 Home 键,而不是在系统中没有剩余活动活动时按 Back 键),则设备实现必须 (MUST) 像对待其他预期保持运行的事物(如前台服务)一样,优先考虑 RAM 中的该应用。当此类应用在后台运行时,系统仍然可以对其应用电源管理功能,例如限制 CPU 和网络访问。 - [C-1-2] 一旦用户启动第二个声明了
cantSaveState
属性的应用,则必须 (MUST) 提供 UI 操作界面来选择不参与正常状态保存/恢复机制的应用。 - [C-1-3] 不得 (MUST NOT) 对指定了
cantSaveState
的应用应用其他策略更改,例如更改 CPU 性能或更改调度优先级。
如果设备实现未声明 FEATURE_CANT_SAVE_STATE
功能,则
- [C-1-1] 必须 (MUST) 忽略应用设置的
cantSaveState
属性,并且不得 (MUST NOT) 基于该属性更改应用行为。
4. 应用打包兼容性 (Application Packaging Compatibility)
设备实现
- [C-0-1] 必须 (MUST) 能够安装和运行由 官方 Android SDK 中包含的 “aapt” 工具生成的 Android “.apk” 文件。
- 由于上述要求可能具有挑战性,因此建议 (RECOMMENDED) 设备实现使用 AOSP 参考实现的软件包管理系统。
设备实现
- [C-0-2] 必须 (MUST) 支持使用 APK Signature Scheme v3、APK Signature Scheme v2 和 JAR 签名 来验证 “.apk” 文件。
- [C-0-3] 不得 (MUST NOT) 以阻止这些文件在其他兼容设备上正确安装和运行的方式扩展 .apk、Android Manifest、Dalvik 字节码 或 RenderScript 字节码格式。
-
[C-0-4] 不得 (MUST NOT) 允许除软件包的当前“记录安装程序 (installer of record)”以外的应用在没有任何用户确认的情况下静默卸载应用,如 SDK 中关于
DELETE_PACKAGE
权限的文档中所述。唯一的例外是处理 PACKAGE_NEEDS_VERIFICATION intent 的系统软件包验证程序应用,以及处理 ACTION_MANAGE_STORAGE intent 的存储管理器应用。 -
[C-0-5] 必须 (MUST) 具有一个 activity 来处理
android.settings.MANAGE_UNKNOWN_APP_SOURCES
intent。 -
[C-0-6] 除非 请求安装 的应用满足以下所有要求,否则不得 (MUST NOT) 从未知来源安装应用程序包
- 它必须 (MUST) 声明
REQUEST_INSTALL_PACKAGES
权限,或者将android:targetSdkVersion
设置为 24 或更低。 - 它必须 (MUST) 已获得用户授予的从未知来源安装应用的权限。
- 它必须 (MUST) 声明
-
应该 (SHOULD) 提供用户操作界面,以允许每个应用授予/撤销从未知来源安装应用的权限,但如果设备实现不想允许用户拥有此选择权,则可以 (MAY) 选择将其实现为无操作 (no-op) 并为
startActivityForResult()
返回RESULT_CANCELED
。但是,即使在这种情况下,它们也应该 (SHOULD) 向用户表明为什么没有提供这种选择。 -
[C-0-7] 必须 (MUST) 在启动已被同一系统 API
PackageManager.setHarmfulAppWarning
标记为可能有害的应用中的 activity 之前,向用户显示一个警告对话框,其中包含通过系统 APIPackageManager.setHarmfulAppWarning
提供的警告字符串。 - 应该 (SHOULD) 提供用户操作界面,以选择在警告对话框中卸载或启动应用程序。
5. 多媒体兼容性 (Multimedia Compatibility)
设备实现
- [C-0-1] 必须 (MUST) 支持 第 5.1 节 中定义的每种媒体格式、编码器、解码器、文件类型和容器格式,以及
MediaCodecList
声明的每种编解码器。 - [C-0-2] 必须 (MUST) 声明和报告对第三方应用可通过
MediaCodecList
使用的编码器、解码器的支持。 - [C-0-3] 必须 (MUST) 能够解码并向第三方应用提供它可以编码的所有格式。这包括其编码器生成的所有比特流及其
CamcorderProfile
中报告的配置文件。
设备实现
- 应该 (SHOULD) 力求最小的编解码器延迟,换句话说,它们
- 应该 (SHOULD NOT) 消耗和存储输入缓冲区,并且仅在处理完后才返回输入缓冲区。
- 应该 (SHOULD NOT) 将解码后的缓冲区保留的时间超过标准(例如 SPS)指定的时间。
- 应该 (SHOULD NOT) 将编码后的缓冲区保留的时间超过 GOP 结构所需的时间。
以下部分中列出的所有编解码器都在 Android 开源项目的首选 Android 实现中作为软件实现提供。
请注意,Google 和开放手机联盟均未声明这些编解码器不受第三方专利的约束。那些打算在硬件或软件产品中使用此源代码的人员应注意,此代码的实现(包括在开源软件或共享软件中)可能需要获得相关专利持有人的专利许可。
5.1. 媒体编解码器 (Media Codecs)
5.1.1. 音频编码 (Audio Encoding)
有关更多详细信息,请参阅 5.1.3. 音频编解码器详细信息 (Audio Codecs Details)。
如果设备实现声明了 android.hardware.microphone
功能,则必须 (MUST) 支持以下音频编码
- [C-1-1] PCM/WAVE
5.1.2. 音频解码 (Audio Decoding)
有关更多详细信息,请参阅 5.1.3. 音频编解码器详细信息 (Audio Codecs Details)。
如果设备实现声明支持 android.hardware.audio.output
功能,则它们必须 (must) 支持解码以下音频格式
- [C-1-1] MPEG-4 AAC Profile (AAC LC)
- [C-1-2] MPEG-4 HE AAC Profile (AAC+)
- [C-1-3] MPEG-4 HE AACv2 Profile (enhanced AAC+)
- [C-1-4] AAC ELD (enhanced low delay AAC,增强型低延迟 AAC)
- [C-1-11] xHE-AAC (ISO/IEC 23003-3 Extended HE AAC Profile,包括 USAC Baseline Profile 和 ISO/IEC 23003-4 Dynamic Range Control Profile)
- [C-1-5] FLAC
- [C-1-6] MP3
- [C-1-7] MIDI
- [C-1-8] Vorbis
- [C-1-9] PCM/WAVE
- [C-1-10] Opus
如果设备实现支持通过 android.media.MediaCodec
API 中的默认 AAC 音频解码器将多声道流(即两个以上声道)的 AAC 输入缓冲区解码为 PCM,则必须 (MUST) 支持以下内容
- [C-2-1] 解码必须 (MUST) 在没有下混 (downmixing) 的情况下执行(例如,5.0 AAC 流必须解码为五个声道的 PCM,5.1 AAC 流必须解码为六个声道的 PCM)。
- [C-2-2] 动态范围元数据必须 (MUST) 与 ISO/IEC 14496-3 中的“动态范围控制 (Dynamic Range Control, 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
。
当解码 USAC 音频时,MPEG-D (ISO/IEC 23003-4)
- [C-3-1] 响度和 DRC 元数据必须 (MUST) 按照 MPEG-D DRC 动态范围控制配置文件级别 1 进行解释和应用。
- [C-3-2] 解码器必须 (MUST) 根据使用以下
android.media.MediaFormat
键设置的配置来运行:KEY_AAC_DRC_TARGET_REFERENCE_LEVEL
和KEY_AAC_DRC_EFFECT_TYPE
。
MPEG-4 AAC、HE AAC 和 HE AACv2 配置文件解码器
- 可以 (MAY) 支持使用 ISO/IEC 23003-4 动态范围控制配置文件进行响度和动态范围控制。
如果支持 ISO/IEC 23003-4,并且解码后的比特流中同时存在 ISO/IEC 23003-4 和 ISO/IEC 14496-3 元数据,则
- ISO/IEC 23003-4 元数据应 (SHALL) 优先。
5.1.3. 音频编解码器详细信息 (Audio Codecs Details)
格式/编解码器 (Format/Codec) | 详情 | 支持的文件类型/容器格式 (Supported File Types/Container Formats) |
---|---|---|
MPEG-4 AAC Profile (AAC LC) |
支持单声道/立体声/5.0/5.1 内容,标准采样率从 8 kHz 到 48 kHz。 |
|
MPEG-4 HE AAC Profile (AAC+) | 支持单声道/立体声/5.0/5.1 内容,标准采样率从 16 kHz 到 48 kHz。 | |
MPEG-4 HE AACv2 Profile (enhanced AAC+,增强型 AAC+) |
支持单声道/立体声/5.0/5.1 内容,标准采样率从 16 kHz 到 48 kHz。 | |
AAC ELD (enhanced low delay AAC,增强型低延迟 AAC) | 支持单声道/立体声内容,标准采样率从 16 kHz 到 48 kHz。 | |
USAC | 支持单声道/立体声内容,标准采样率从 7.35 kHz 到 48 kHz。 | MPEG-4 (.mp4, .m4a) |
AMR-NB | 4.75 到 12.2 kbps,采样率 @ 8 kHz | 3GPP (.3gp) |
AMR-WB | 9 种速率,从 6.60 kbit/s 到 23.85 kbit/s,采样率 @ 16 kHz | |
FLAC | 单声道/立体声(无多声道)。采样率高达 48 kHz(但在具有 44.1 kHz 输出的设备上建议高达 44.1 kHz,因为 48 kHz 到 44.1 kHz 的降采样器不包含低通滤波器)。建议使用 16 位;24 位不应用抖动。 | 仅限 FLAC (.flac) |
MP3 | 单声道/立体声 8-320Kbps 恒定比特率 (CBR) 或可变比特率 (VBR) | MP3 (.mp3) |
MIDI | MIDI 类型 0 和 1。DLS 版本 1 和 2。XMF 和 Mobile XMF。支持铃声格式 RTTTL/RTX、OTA 和 iMelody |
|
Vorbis |
|
|
PCM/WAVE | 16 位线性 PCM(速率高达硬件限制)。设备必须 (MUST) 支持原始 PCM 录音的采样率,频率为 8000、11025、16000 和 44100 Hz。 | WAVE (.wav) |
Opus | Matroska (.mkv), Ogg(.ogg) |
5.1.4. 图像编码 (Image Encoding)
有关更多详细信息,请参阅 5.1.6. 图像编解码器详细信息 (Image Codecs Details)。
设备实现**必须**支持以下图像编码:
- [C-0-1] JPEG
- [C-0-2] PNG
- [C-0-3] WebP
5.1.5. 图像解码
有关更多详细信息,请参阅 5.1.6. 图像编解码器详细信息 (Image Codecs Details)。
设备实现**必须**支持以下图像解码:
- [C-0-1] JPEG
- [C-0-2] GIF
- [C-0-3] PNG
- [C-0-4] BMP
- [C-0-5] WebP
- [C-0-6] Raw
- [C-0-7] HEIF (HEIC)
5.1.6. 图像编解码器详情
格式/编解码器 (Format/Codec) | 详情 | 支持的文件类型/容器格式 (Supported File Types/Container Formats) |
---|---|---|
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) | |
HEIF | 图像、图像集合、图像序列 | HEIF (.heif), HEIC (.heic) |
5.1.7. 视频编解码器
- 为了保证可接受的网络视频流和视频会议服务质量,设备实现**应该**使用符合要求的硬件 VP8 编解码器。
如果设备实现包含视频解码器或编码器
-
[C-1-1] 视频编解码器**必须**支持输出和输入字节缓冲区大小,以适应标准和配置规定的最大可行压缩和未压缩帧,但也不得过度分配。
-
[C-1-2] 视频编码器和解码器**必须**支持 YUV420 灵活颜色格式 (COLOR_FormatYUV420Flexible)。
如果设备实现通过 Display.HdrCapabilities
声明支持 HDR 配置文件,则它们
- [C-2-1] **必须**支持 HDR 静态元数据解析和处理。
如果设备实现通过 FEATURE_IntraRefresh
在 MediaCodecInfo.CodecCapabilities
类中声明支持帧内刷新,则它们
- [C-3-1] **必须**支持 10 - 60 帧范围内的刷新周期,并在配置的刷新周期的 20% 范围内准确运行。
5.1.8. 视频编解码器列表
格式/编解码器 (Format/Codec) | 详情 | 支持的文件类型/ 容器格式 |
---|---|---|
H.263 |
|
|
H.264 AVC | 有关详细信息,请参阅 第 5.2 节 和 5.3 节 |
|
H.265 HEVC | 有关详细信息,请参阅 第 5.3 节 | MPEG-4 (.mp4) |
MPEG-2 | 主要配置文件 | MPEG2-TS |
MPEG-4 SP | 3GPP (.3gp) | |
VP8 | 有关详细信息,请参阅 第 5.2 节 和 5.3 节 |
|
VP9 | 有关详细信息,请参阅 第 5.3 节 |
|
5.2. 视频编码
如果设备实现支持任何视频编码器并使其可供第三方应用使用,则它们
- **应该**在帧内帧 (I 帧) 间隔之间的两个滑动窗口上,比特率不超过约 15%。
- **应该**在 1 秒的滑动窗口上,比特率不超过约 100%。
如果设备实现包含对角线长度至少为 2.5 英寸的嵌入式屏幕显示器,或者包含视频输出端口,或者通过 android.hardware.camera.any
功能标志声明支持摄像头,则它们
- [C-1-1] **必须**包含对 VP8 或 H.264 视频编码器中至少一个的支持,并使其可供第三方应用程序使用。
- **应该**同时支持 VP8 和 H.264 视频编码器,并使其可供第三方应用程序使用。
如果设备实现支持任何 H.264、VP8、VP9 或 HEVC 视频编码器并使其可供第三方应用程序使用,则它们
- [C-2-1] **必须**支持动态可配置比特率。
- **应该**支持可变帧率,其中视频编码器**应该**根据输入缓冲区的时戳确定瞬时帧持续时间,并根据该帧持续时间分配其位桶。
如果设备实现支持 MPEG-4 SP 视频编码器并使其可供第三方应用程序使用,则它们
- **应该**为支持的编码器支持动态可配置比特率。
5.2.1. H.263
如果设备实现支持 H.263 编码器并使其可供第三方应用程序使用,则它们
- [C-1-1] **必须**支持 Baseline Profile Level 45。
- **应该**为支持的编码器支持动态可配置比特率。
5.2.2. H-264
如果设备实现支持 H.264 编解码器,则它们
- [C-1-1] **必须**支持 Baseline Profile Level 3。但是,对 ASO (任意切片顺序)、FMO (灵活宏块顺序) 和 RS (冗余切片) 的支持是**可选**的。此外,为了保持与其他 Android 设备的兼容性,**建议**编码器不要将 ASO、FMO 和 RS 用于 Baseline Profile。
- [C-1-2] **必须**支持下表中的 SD (标准清晰度) 视频编码配置文件。
- **应该**支持 Main Profile Level 4。
- **应该**支持下表中指示的 HD (高清) 视频编码配置文件。
如果设备实现通过媒体 API 报告支持 720p 或 1080p 分辨率视频的 H.264 编码,则它们
- [C-2-1] **必须**支持下表中的编码配置文件。
SD (低质量) | SD (高质量) | HD 720p | HD 1080p | |
---|---|---|---|---|
视频分辨率 | 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 |
5.2.3. VP8
如果设备实现支持 VP8 编解码器,则它们
- [C-1-1] **必须**支持 SD 视频编码配置文件。
- **应该**支持以下 HD (高清) 视频编码配置文件。
- **应该**支持写入 Matroska WebM 文件。
- **应该**使用符合 WebM 项目 RTC 硬件编码要求的硬件 VP8 编解码器,以确保可接受的网络视频流和视频会议服务质量。
如果设备实现通过媒体 API 报告支持 720p 或 1080p 分辨率视频的 VP8 编码,则它们
- [C-2-1] **必须**支持下表中的编码配置文件。
SD (低质量) | SD (高质量) | HD 720p | HD 1080p | |
---|---|---|---|---|
视频分辨率 | 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 |
5.2.4. VP9
如果设备实现支持 VP9 编解码器,则它们
- **应该**支持写入 Matroska WebM 文件。
5.3. 视频解码
如果设备实现支持 VP8、VP9、H.264 或 H.265 编解码器,则它们
- [C-1-1] **必须**在同一码流内,通过标准 Android API 实时支持所有 VP8、VP9、H.264 和 H.265 编解码器的动态视频分辨率和帧率切换,并且达到设备上每个编解码器支持的最大分辨率。
如果设备实现通过 HDR_TYPE_DOLBY_VISION
声明支持 Dolby Vision 解码器,则它们
- [C-2-1] **必须**提供支持 Dolby Vision 的提取器。
- [C-2-2] **必须**在设备屏幕或标准视频输出端口 (例如 HDMI) 上正确显示 Dolby Vision 内容。
- [C-2-3] **必须**将向后兼容的基层 (如果存在) 的轨道索引设置为与组合的 Dolby Vision 层的轨道索引相同。
5.3.1. MPEG-2
如果设备实现支持 MPEG-2 解码器,则它们
- [C-1-1] **必须**支持 Main Profile High Level。
5.3.2. H.263
如果设备实现支持 H.263 解码器,则它们
- [C-1-1] **必须**支持 Baseline Profile Level 30 和 Level 45。
5.3.3. MPEG-4
如果设备实现具有 MPEG-4 解码器,则它们
- [C-1-1] **必须**支持 Simple Profile Level 3。
5.3.4. H.264
如果设备实现支持 H.264 解码器,则它们
- [C-1-1] **必须**支持 Main Profile Level 3.1 和 Baseline Profile。对 ASO (任意切片顺序)、FMO (灵活宏块顺序) 和 RS (冗余切片) 的支持是**可选**的。
- [C-1-2] **必须**能够解码下表中列出的 SD (标准清晰度) 配置文件的视频,并使用 Baseline Profile 和 Main Profile Level 3.1 (包括 720p30) 进行编码。
- **应该**能够解码下表中指示的 HD (高清) 配置文件的视频。
如果 Display.getSupportedModes()
方法报告的高度等于或大于视频分辨率,则设备实现
- [C-2-1] **必须**支持下表中的 HD 720p 视频解码配置文件。
- [C-2-2] **必须**支持下表中的 HD 1080p 视频解码配置文件。
SD (低质量) | SD (高质量) | HD 720p | HD 1080p | |
---|---|---|---|---|
视频分辨率 | 320 x 240 像素 | 720 x 480 像素 | 1280 x 720 像素 | 1920 x 1080 像素 |
视频帧率 | 30 fps | 30 fps | 60 fps | 30 fps (60 fps电视) |
视频比特率 | 800 Kbps | 2 Mbps | 8 Mbps | 20 Mbps |
5.3.5. H.265 (HEVC)
如果设备实现支持 H.265 编解码器,则它们
- [C-1-1] **必须**支持 Main Profile Level 3 Main tier 和下表中指示的 SD 视频解码配置文件。
- **应该**支持下表中指示的 HD 解码配置文件。
- [C-1-2] 如果有硬件解码器,**必须**支持下表中指示的 HD 解码配置文件。
如果 Display.getSupportedModes()
方法报告的高度等于或大于视频分辨率,则
- [C-2-1] 设备实现**必须**支持 720、1080 和 UHD 配置文件的 H.265 或 VP9 解码中的至少一种。
SD (低质量) | SD (高质量) | HD 720p | HD 1080p | UHD | |
---|---|---|---|---|---|
视频分辨率 | 352 x 288 像素 | 720 x 480 像素 | 1280 x 720 像素 | 1920 x 1080 像素 | 3840 x 2160 像素 |
视频帧率 | 30 fps | 30 fps | 30 fps | 30/60 fps (60 fps具有 H.265 硬件解码的电视) | 60 fps |
视频比特率 | 600 Kbps | 1.6 Mbps | 4 Mbps | 5 Mbps | 20 Mbps |
5.3.6. VP8
如果设备实现支持 VP8 编解码器,则它们
- [C-1-1] **必须**支持下表中的 SD 解码配置文件。
- **应该**使用符合 要求的硬件 VP8 编解码器。
- **应该**支持下表中的 HD 解码配置文件。
如果 Display.getSupportedModes()
方法报告的高度等于或大于视频分辨率,则
- [C-2-1] 设备实现**必须**支持下表中的 720p 配置文件。
- [C-2-2] 设备实现**必须**支持下表中的 1080p 配置文件。
SD (低质量) | SD (高质量) | HD 720p | HD 1080p | |
---|---|---|---|---|
视频分辨率 | 320 x 180 像素 | 640 x 360 像素 | 1280 x 720 像素 | 1920 x 1080 像素 |
视频帧率 | 30 fps | 30 fps | 30 fps (60 fps电视) | 30 (60 fps电视) |
视频比特率 | 800 Kbps | 2 Mbps | 8 Mbps | 20 Mbps |
5.3.7. VP9
如果设备实现支持 VP9 编解码器,则它们
- [C-1-1] **必须**支持下表中指示的 SD 视频解码配置文件。
- **应该**支持下表中指示的 HD 解码配置文件。
如果设备实现支持 VP9 编解码器和硬件解码器
- [C-2-1] **必须**支持下表中指示的 HD 解码配置文件。
如果 Display.getSupportedModes()
方法报告的高度等于或大于视频分辨率,则
- [C-3-1] 设备实现**必须**支持 720、1080 和 UHD 配置文件的 VP9 或 H.265 解码中的至少一种。
SD (低质量) | SD (高质量) | HD 720p | HD 1080p | UHD | |
---|---|---|---|---|---|
视频分辨率 | 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具有 VP9 硬件解码的电视) | 60 fps |
视频比特率 | 600 Kbps | 1.6 Mbps | 4 Mbps | 5 Mbps | 20 Mbps |
5.4. 音频录制
虽然本节中概述的某些要求自 Android 4.3 起被列为**应该**,但未来版本的兼容性定义计划将这些更改为**必须**。**强烈建议**现有和新的 Android 设备满足这些被列为**应该**的要求,否则它们在升级到未来版本时将无法获得 Android 兼容性。
5.4.1. 原始音频捕获
如果设备实现声明 android.hardware.microphone
,则它们
-
[C-1-1] **必须**允许捕获具有以下特征的原始音频内容:
- **格式**:线性 PCM,16 位
- **采样率**:8000、11025、16000、44100 Hz
- **通道**:单声道
-
[C-1-2] **必须**在上述采样率下捕获,无需上采样。
- [C-1-3] 当使用降采样捕获上述采样率时,**必须**包含适当的抗锯齿滤波器。
-
**应该**允许 AM 无线电和 DVD 质量的原始音频内容捕获,这意味着以下特征:
- **格式**:线性 PCM,16 位
- **采样率**:22050、48000 Hz
- **通道**:立体声
如果设备实现允许 AM 无线电和 DVD 质量的原始音频内容捕获,则它们
- [C-2-1] **必须**在任何高于 16000:22050 或 44100:48000 的比率下进行捕获,而无需上采样。
- [C-2-2] 对于任何上采样或降采样,**必须**包含适当的抗锯齿滤波器。
5.4.2. 用于语音识别的捕获
如果设备实现声明 android.hardware.microphone
,则它们
- [C-1-1] **必须**以采样率 44100 和 48000 之一捕获
android.media.MediaRecorder.AudioSource.VOICE_RECOGNITION
音频源。 - [C-1-2] 默认情况下,从
AudioSource.VOICE_RECOGNITION
音频源录制音频流时,**必须**禁用任何降噪音频处理。 - [C-1-3] 默认情况下,从
AudioSource.VOICE_RECOGNITION
音频源录制音频流时,**必须**禁用任何自动增益控制。 - **应该**以近似平坦的幅度与频率特性记录语音识别音频流:具体而言,从 100 Hz 到 4000 Hz,±3 dB。
- **应该**设置语音识别音频流的输入灵敏度,使得麦克风处 1000 Hz 的 90 dB 声功率级 (SPL) 源产生 16 位样本的 2500 RMS。
- **应该**记录语音识别音频流,以便 PCM 幅度级别在至少 30 dB 范围内线性跟踪输入 SPL 变化,范围从 -18 dB 到 +12 dB re 麦克风处 90 dB SPL。
- **应该**记录语音识别音频流,在麦克风处 90 dB SPL 输入电平下,1 kHz 的总谐波失真 (THD) 小于 1%。
如果设备实现声明 android.hardware.microphone
和针对语音识别调整的噪声抑制 (降低) 技术,则它们
- [C-2-1] **必须**允许使用
android.media.audiofx.NoiseSuppressor
API 控制此音频效果。 - [C-2-2] **必须**通过
AudioEffect.Descriptor.uuid
字段唯一标识每种噪声抑制技术实现。
5.4.3. 用于重定向播放的捕获
android.media.MediaRecorder.AudioSource
类包含 REMOTE_SUBMIX
音频源。
如果设备实现同时声明 android.hardware.audio.output
和 android.hardware.microphone
,则它们
-
[C-1-1] **必须**正确实现
REMOTE_SUBMIX
音频源,以便当应用程序使用android.media.AudioRecord
API 从此音频源录制时,它捕获除以下各项之外的所有音频流的混合:-
AudioManager.STREAM_RING
-
AudioManager.STREAM_ALARM
-
AudioManager.STREAM_NOTIFICATION
-
5.5. 音频播放
Android 包括支持允许应用程序通过第 7.8.2 节中定义的音频输出外围设备播放音频。
5.5.1. 原始音频播放
如果设备实现声明 android.hardware.audio.output
,则它们
-
[C-1-1] **必须**允许播放具有以下特征的原始音频内容:
- **格式**:线性 PCM,16 位、8 位、浮点
- **通道**:单声道、立体声、具有最多 8 个通道的有效多通道配置
-
采样率 (Hz):
- 8000、11025、16000、22050、32000、44100、48000 在上述通道配置中
- 96000 在单声道和立体声中
-
**应该**允许播放具有以下特征的原始音频内容:
- 采样率: 24000, 48000
5.5.2. 音频效果
Android 为设备实现提供了用于音频效果的 API。
如果设备实现声明了 android.hardware.audio.output
功能,则它们
- [C-1-1] **必须**支持通过 AudioEffect 子类
Equalizer
、LoudnessEnhancer
控制的EFFECT_TYPE_EQUALIZER
和EFFECT_TYPE_LOUDNESS_ENHANCER
实现。 - [C-1-2] **必须**支持可视化工具 API 实现,可通过
Visualizer
类控制。 - [C-1-3] **必须**支持通过 AudioEffect 子类
DynamicsProcessing
控制的EFFECT_TYPE_DYNAMICS_PROCESSING
实现。 - **应该**支持通过
AudioEffect
子类BassBoost
、EnvironmentalReverb
、PresetReverb
和Virtualizer
控制的EFFECT_TYPE_BASS_BOOST
、EFFECT_TYPE_ENV_REVERB
、EFFECT_TYPE_PRESET_REVERB
和EFFECT_TYPE_VIRTUALIZER
实现。
5.5.3. 音频输出音量
汽车设备实现
- **应该**允许使用 AudioAttributes 定义的内容类型或用法以及
android.car.CarAudioManager
中公开定义的汽车音频用法,分别调整每个音频流的音频音量。
5.6. 音频延迟
音频延迟是音频信号通过系统时的时间延迟。许多类别的应用程序都依赖于短延迟来实现实时音效。
就本节而言,请使用以下定义:
- **输出延迟**:应用程序写入 PCM 编码数据帧的时间与在设备上传感器处将相应声音呈现给环境或信号通过端口离开设备并在外部观察到的时间之间的时间间隔。
- **冷启动输出延迟**:第一个帧的输出延迟,此时音频输出系统在请求之前一直处于空闲和断电状态。
- **连续输出延迟**:设备播放音频后,后续帧的输出延迟。
- **输入延迟**:环境通过设备上传感器向设备呈现声音或信号通过端口进入设备的时间与应用程序读取相应 PCM 编码数据帧的时间之间的时间间隔。
- **丢失的输入**:输入信号的初始部分,该部分不可用或无法使用。
- **冷启动输入延迟**:丢失的输入时间和第一个帧的输入延迟之和,此时音频输入系统在请求之前一直处于空闲和断电状态。
- **连续输入延迟**:设备捕获音频时,后续帧的输入延迟。
- **冷启动输出抖动**:冷启动输出延迟值的单独测量值之间的变异性。
- **冷启动输入抖动**:冷启动输入延迟值的单独测量值之间的变异性。
- **连续往返延迟**:连续输入延迟加上连续输出延迟加上一个缓冲区周期之和。缓冲区周期允许应用程序处理信号的时间以及应用程序减轻输入和输出流之间相位差的时间。
- **OpenSL ES PCM 缓冲区队列 API**:OpenSL ES API 中 Android NDK 内与 PCM 相关的一组 API。
- **AAudio 本机音频 API**:AAudio API 中 Android NDK 内的一组 API。
- **时间戳**:一对值,由流中的相对帧位置和估计的该帧进入或离开关联端点上音频处理管道的时间组成。另请参见 AudioTimestamp。
如果设备实现声明 android.hardware.audio.output
,**强烈建议**它们达到或超过以下要求:
- [C-SR] 冷启动输出延迟为 100 毫秒或更短
- [C-SR] 连续输出延迟为 45 毫秒或更短
- [C-SR] 尽量减少冷启动输出抖动
- [C-SR] AudioTrack.getTimestamp 和
AAudioStream_getTimestamp
返回的输出时间戳的精度为 +/- 1 毫秒。
如果设备实现在任何初始校准之后,在使用 OpenSL ES PCM 缓冲区队列和 AAudio 本机音频 API 时,对于至少一个支持的音频输出设备的连续输出延迟和冷启动输出延迟,它们是
- [C-SR] **强烈建议**通过声明
android.hardware.audio.low_latency
功能标志来报告低延迟音频。 - [C-SR] **强烈建议**通过 AAudio API 满足低延迟音频的要求。
- [C-SR] **强烈建议**确保对于从
AAudioStream_getPerformanceMode()
返回AAUDIO_PERFORMANCE_MODE_LOW_LATENCY
的流,AAudioStream_getFramesPerBurst()
返回的值小于或等于android.media.AudioManager.getProperty(String)
为属性键AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER
返回的值。
如果设备实现不满足通过 OpenSL ES PCM 缓冲区队列和 AAudio 本机音频 API 两者实现低延迟音频的要求,则它们
- [C-1-1] **不得**报告对低延迟音频的支持。
如果设备实现包含 android.hardware.microphone
,**强烈建议**它们满足以下输入音频要求:
- [C-SR] 冷启动输入延迟为 100 毫秒或更短。
- [C-SR] 连续输入延迟为 30 毫秒或更短。
- [C-SR] 连续往返延迟为 50 毫秒或更短。
- [C-SR] 尽量减少冷启动输入抖动。
- [C-SR] 将 AudioRecord.getTimestamp 或
AAudioStream_getTimestamp
返回的输入时间戳的误差限制在 +/- 1 毫秒以内。
5.7. 网络协议
设备实现**必须**支持 Android SDK 文档中指定的用于音频和视频播放的媒体网络协议。
如果设备实现包含音频或视频解码器,则它们
-
[C-1-1] **必须**支持 第 5.1 节 中通过 HTTP(S) 的所有必需编解码器和容器格式。
-
[C-1-2] **必须**支持下表“媒体分段格式”中显示的媒体分段格式,协议为 HTTP Live Streaming 草案协议,版本 7。
-
[C-1-3] **必须**支持下表“RTSP”中显示的以下 RTP 音频视频配置文件和相关编解码器。有关例外情况,请参见 第 5.1 节 中的表格脚注。
媒体分段格式
分段格式 | 参考 | 必需的编解码器支持 |
---|---|---|
MPEG-2 传输流 | ISO 13818 | 视频编解码器
MPEG-2 的详细信息,请参阅 第 5.1.3 节。 音频编解码器
|
具有 ADTS 帧和 ID3 标签的 AAC | ISO 13818-7 | 有关 AAC 及其变体的详细信息,请参阅 第 5.1.1 节 |
WebVTT | WebVTT |
RTSP (RTP, SDP)
配置文件名称 | 参考 | 必需的编解码器支持 |
---|---|---|
H264 AVC | RFC 6184 | 有关 H264 AVC 的详细信息,请参阅 第 5.1.3 节 |
MP4A-LATM | RFC 6416 | 有关 AAC 及其变体的详细信息,请参阅 第 5.1.1 节 |
H263-1998 |
RFC 3551 RFC 4629 RFC 2190 |
有关 H263 的详细信息,请参阅 第 5.1.3 节 |
H263-2000 | RFC 4629 | 有关 H263 的详细信息,请参阅 第 5.1.3 节 |
AMR | RFC 4867 | 有关 AMR-NB 的详细信息,请参阅 第 5.1.1 节 |
AMR-WB | RFC 4867 | 有关 AMR-WB 的详细信息,请参阅 第 5.1.1 节 |
MP4V-ES | RFC 6416 | 有关 MPEG-4 SP 的详细信息,请参阅 第 5.1.3 节 |
mpeg4-generic | RFC 3640 | 有关 AAC 及其变体的详细信息,请参阅 第 5.1.1 节 |
MP2T | RFC 2250 | 有关详细信息,请参阅 HTTP Live Streaming 下的 MPEG-2 传输流 |
5.8. 安全媒体
如果设备实现支持安全视频输出并能够支持安全表面,则它们
- [C-1-1] **必须**声明支持
Display.FLAG_SECURE
。
如果设备实现声明支持 Display.FLAG_SECURE
并支持无线显示协议,则它们
- [C-2-1] **必须**使用密码学强度高的机制 (例如 HDCP 2.x 或更高版本) 来保护通过无线协议 (例如 Miracast) 连接的显示器的链路安全。
如果设备实现声明支持 Display.FLAG_SECURE
并支持有线外部显示器,则它们
- [C-3-1] **必须**为通过用户可访问的有线端口连接的所有外部显示器支持 HDCP 1.2 或更高版本。
5.9. 乐器数字接口 (MIDI)
如果设备实现通过 android.content.pm.PackageManager
类报告支持 android.software.midi
功能,则它们
-
[C-1-1] **必须**支持 MIDI over 所有 支持 MIDI 的硬件传输,它们为其提供通用非 MIDI 连接,其中此类传输是:
-
[C-1-2] **必须**支持应用间 MIDI 软件传输 (虚拟 MIDI 设备)
5.10. 专业音频
如果设备实现通过 android.content.pm.PackageManager 类报告支持 android.hardware.audio.pro
功能,则它们
- [C-1-1] **必须**报告支持
android.hardware.audio.low_latency
功能。 - [C-1-2] 连续往返音频延迟 (如第 5.6 节 音频延迟中定义) **必须**为 20 毫秒或更短,**应该**在至少一个支持的路径上为 10 毫秒或更短。
- [C-1-3] **必须**包括支持 USB 主机模式和 USB 外围设备模式的 USB 端口。
- [C-1-4] **必须**报告支持
android.software.midi
功能。 - [C-1-5] **必须**使用 OpenSL ES PCM 缓冲区队列和 AAudio 本机音频 API 满足延迟和 USB 音频要求。
- [SR] **强烈建议**在音频处于活动状态且 CPU 负载变化时提供一致的 CPU 性能。应使用 SimpleSynth commit 1bd6391 测试这一点。SimpleSynth 应用需要使用以下参数运行,并在 10 分钟后实现零欠载:
- 工作周期:200,000
- 可变负载:开启 (这将每 2 秒在工作周期值的 100% 和 10% 之间切换,旨在测试 CPU 调速器行为)
- 稳定负载:关闭
- **应该**尽量减少音频时钟相对于标准时间的不准确度和漂移。
- **应该**尽量减少音频时钟相对于 CPU
CLOCK_MONOTONIC
(两者都处于活动状态时) 的漂移。 - **应该**尽量减少通过设备上传感器的音频延迟。
- **应该**尽量减少通过 USB 数字音频的音频延迟。
- **应该**记录所有路径上的音频延迟测量值。
- **应该**尽量减少音频缓冲区完成回调进入时间的抖动,因为这会影响回调可用的完整 CPU 带宽的百分比。
- **应该**在报告的延迟下,在正常使用情况下提供零音频欠载 (输出) 或过载 (输入)。
- **应该**提供零通道间延迟差。
- **应该**尽量减少所有传输上的 MIDI 平均延迟。
- **应该**尽量减少所有传输上的负载 (抖动) 下的 MIDI 延迟可变性。
- **应该**在所有传输上提供准确的 MIDI 时间戳。
- **应该**尽量减少设备上传感器上的音频信号噪声,包括冷启动后立即发生的期间。
- 设备实现**应**在对应的端点(例如设备内置麦克风和扬声器,或音频插孔输入和输出)均处于激活状态时,在输入端和输出端之间提供零音频时钟差异。
- 设备实现**应**在对应的端点的输入端和输出端都处于激活状态时,在同一线程上处理音频缓冲区完成回调;并且在输入回调返回后立即进入输出回调。或者,如果无法在同一线程上处理回调,则**应**在进入输入回调后不久进入输出回调,以允许应用程序在输入端和输出端之间具有一致的定时。
- 设备实现**应**尽可能减小对应端点的输入端和输出端的 HAL 音频缓冲之间的相位差。
- 设备实现**应**尽可能缩短触摸延迟。
- 设备实现**应**尽可能减小负载下的触摸延迟可变性(抖动)。
- 设备实现从触摸输入到音频输出的延迟**应**小于或等于 40 毫秒。
如果设备实现满足上述所有要求,则它们
- [SR] **强烈建议**通过
android.content.pm.PackageManager
类报告对android.hardware.audio.pro
功能的支持。
如果设备实现包含 4 芯 3.5 毫米音频插孔,则它们
- [C-2-1] **必须**使通过音频插孔路径的连续往返音频延迟为 20 毫秒或更短。
- [SR] **强烈建议**遵守 有线音频耳机规范 (v1.1) 的 移动设备(插孔)规范 部分。
- 通过音频插孔路径的连续往返音频延迟**应**为 10 毫秒或更短。
如果设备实现省略了 4 芯 3.5 毫米音频插孔,但包含支持 USB 主机模式的 USB 端口,则它们
- [C-3-1] **必须**实现 USB 音频类。
- [C-3-2] **必须**使通过使用 USB 音频类的 USB 主机模式端口的连续往返音频延迟为 20 毫秒或更短。
- 通过使用 USB 音频类的 USB 主机模式端口的连续往返音频延迟**应**为 10 毫秒或更短。
如果设备实现包含 HDMI 端口,则它们
- [C-4-1] **必须**支持至少在一种配置中以 20 位或 24 位深度和 192 kHz 输出立体声和八声道,且不损失位深度或进行重采样。
5.11. 未处理音频捕获
Android 包含通过 android.media.MediaRecorder.AudioSource.UNPROCESSED
音频源录制未处理音频的支持。在 OpenSL ES 中,可以使用记录预设 SL_ANDROID_RECORDING_PRESET_UNPROCESSED
访问它。
如果设备实现打算支持未处理音频源并使其可供第三方应用使用,则它们
-
[C-1-1] **必须**通过
android.media.AudioManager
属性 PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED 报告支持情况。 -
[C-1-2] **必须**在中间频率范围内表现出近似平坦的幅度-频率特性:具体而言,对于用于录制未处理音频源的每个麦克风,在 100 Hz 到 7000 Hz 范围内为 ±10dB。
-
[C-1-3] **必须**在低频范围内表现出幅度水平:具体而言,对于用于录制未处理音频源的每个麦克风,在 5 Hz 到 100 Hz 范围内,与中间频率范围相比为 ±20 dB。
-
[C-1-4] **必须**在高频范围内表现出幅度水平:具体而言,对于用于录制未处理音频源的每个麦克风,在 7000 Hz 到 22 KHz 范围内,与中间频率范围相比为 ±30 dB。
-
[C-1-5] **必须**设置音频输入灵敏度,使得以 94 dB 声压级 (SPL) 播放的 1000 Hz 正弦波音源对于 16 位采样产生 RMS 为 520 的响应(或对于浮点/双精度采样为 -36 dB 满量程),对于用于录制未处理音频源的每个麦克风。
-
[C-1-6] **必须**对于用于录制未处理音频源的每个麦克风,具有 60 dB 或更高的信噪比 (SNR)。(其中 SNR 测量为 94 dB SPL 与自噪声的等效 SPL 之间的差值,A 计权)。
-
[C-1-7] **必须**对于用于录制未处理音频源的每个麦克风,在 90 dB SPL 输入电平下 1 kHZ 的总谐波失真 (THD) 小于 1%。
-
**必须**在路径中不包含任何其他信号处理(例如自动增益控制、高通滤波器或回声消除),除了将电平调整到所需范围的电平乘法器。换句话说
- [C-1-8] 如果架构中出于任何原因存在任何信号处理,则**必须**禁用它,并有效地为信号路径引入零延迟或额外延迟。
- [C-1-9] 电平乘法器虽然允许在路径上,但**必须**不为信号路径引入延迟或时延。
所有 SPL 测量均在紧靠被测麦克风的位置进行。对于多麦克风配置,这些要求适用于每个麦克风。
如果设备实现声明 android.hardware.microphone
但不支持未处理音频源,则它们
- [C-2-1] **必须**为
AudioManager.getProperty(PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED)
API 方法返回null
,以正确指示缺少支持。 - [SR] 仍然**强烈建议**满足尽可能多的未处理录音源信号路径的要求。
6. 开发者工具和选项兼容性
6.1. 开发者工具
设备实现
- [C-0-1] **必须**支持 Android SDK 中提供的 Android 开发者工具。
-
- [C-0-2] **必须**支持 Android SDK 中记录的 adb 以及 AOSP 中提供的 shell 命令,这些命令可供应用开发者使用,包括
dumpsys
和cmd stats
。 - [C-0-3] **必须**不得更改通过 dumpsys 命令记录的设备系统事件(batterystats、diskstats、fingerprint、graphicsstats、netstats、notification、procstats)的格式或内容。
- [C-0-10] **必须**完整地记录以下事件,并使其可通过
cmd stats
shell 命令和StatsManager
系统 API 类访问和可用。- ActivityForegroundStateChanged
- AnomalyDetected
- AppBreadcrumbReported
- AppCrashOccurred
- AppStartOccurred
- BatteryLevelChanged
- BatterySaverModeStateChanged
- BleScanResultReceived
- BleScanStateChanged
- ChargingStateChanged
- DeviceIdleModeStateChanged
- ForegroundServiceStateChanged
- GpsScanStateChanged
- JobStateChanged
- PluggedStateChanged
- ScheduledJobStateChanged
- ScreenStateChanged
- SyncStateChanged
- SystemElapsedRealtime
- UidProcessStateChanged
- WakelockStateChanged
- WakeupAlarmOccurred
- WifiLockStateChanged
- WifiMulticastLockStateChanged
- WifiScanStateChanged
- [C-0-4] **必须**默认情况下设备端 adb 守护程序处于非活动状态,并且**必须**存在用户可访问的机制来启用 Android 调试桥。
- [C-0-5] **必须**支持安全 adb。Android 包含对安全 adb 的支持。安全 adb 允许在已知的已验证主机上启用 adb。
-
[C-0-6] **必须**提供一种允许从主机连接 adb 的机制。例如
- 没有支持外围设备模式的 USB 端口的设备实现**必须**通过局域网(例如以太网或 Wi-Fi)实现 adb。
- **必须**提供适用于 Windows 7、9 和 10 的驱动程序,允许开发者使用 adb 协议连接到设备。
- [C-0-2] **必须**支持 Android SDK 中记录的 adb 以及 AOSP 中提供的 shell 命令,这些命令可供应用开发者使用,包括
-
- [C-0-7] **必须**支持 Android SDK 中记录的所有 ddms 功能。由于 ddms 使用 adb,因此对 ddms 的支持**应**默认处于非活动状态,但只要用户已如上所述激活 Android 调试桥,就**必须**支持 ddms。
-
Monkey
- [C-0-8] **必须**包含 Monkey 框架并使其可供应用程序使用。
-
SysTrace
- [C-0-9] **必须**支持 Android SDK 中记录的 systrace 工具。Systrace 必须默认处于非活动状态,并且**必须**存在用户可访问的机制来启用 Systrace。
如果设备实现通过 android.hardware.vulkan.version
功能标志报告对 Vulkan 1.0 或更高版本的支持,则它们
- [C-1-1] **必须**为应用开发者提供启用/禁用 GPU 调试层的功能。
- [C-1-2] **必须**在启用 GPU 调试层后,枚举调试应用程序基本目录中找到的外部工具(即,非平台或应用程序包的一部分)提供的库中的层,以支持 vkEnumerateInstanceLayerProperties() 和 vkCreateInstance() API 方法。
6.2. 开发者选项
Android 包含对开发者配置应用程序开发相关设置的支持。
设备实现**必须**为开发者选项提供一致的体验,它们
- [C-0-1] **必须**遵守 android.settings.APPLICATION_DEVELOPMENT_SETTINGS intent 以显示应用程序开发相关设置。上游 Android 实现默认情况下隐藏“开发者选项”菜单,并允许用户在点击设置 > 关于设备 > 版本号 菜单项七 (7) 次后启动“开发者选项”。
- [C-0-2] **必须**默认情况下隐藏“开发者选项”。
- [C-0-3] **必须**提供一种清晰的机制,该机制不对一个第三方应用程序给予优待,而不是另一个第三方应用程序来启用“开发者选项”。**必须**提供一份公开可见的文档或网站,描述如何启用“开发者选项”。此文档或网站**必须**可以从 Android SDK 文档链接。
- **应**在启用“开发者选项”且用户安全受到关注时,向用户发出持续的视觉通知。
- **可以**暂时限制对“开发者选项”菜单的访问,通过视觉上隐藏或禁用菜单,以防止在用户安全受到关注的情况下分散注意力。
7. 硬件兼容性
如果设备包含具有第三方开发者对应 API 的特定硬件组件
- [C-0-1] 设备实现**必须**按照 Android SDK 文档中的描述实现该 API。
如果 SDK 中的 API 与声明为可选的硬件组件交互,并且设备实现不具备该组件
- [C-0-2] 该组件 API 的完整类定义(如 SDK 文档中所述)**必须**仍然存在。
- [C-0-3] API 的行为**必须**以某种合理的方式实现为 no-ops。
- [C-0-4] API 方法**必须**在 SDK 文档允许的情况下返回空值。
- [C-0-5] API 方法**必须**在 SDK 文档不允许空值的情况下返回类的 no-op 实现。
- [C-0-6] API 方法**必须**不得抛出 SDK 文档中未记录的异常。
- [C-0-7] 设备实现**必须**通过 android.content.pm.PackageManager 类上的
getSystemAvailableFeatures()
和hasSystemFeature(String)
方法,针对相同的构建指纹一致地报告准确的硬件配置信息。
这些要求适用的典型场景示例是电话 API:即使在非电话设备上,这些 API 也必须实现为合理的 no-ops。
7.1. 显示和图形
Android 包含自动调整应用程序资源和 UI 布局以适应该设备的功能,以确保第三方应用程序在 各种硬件配置上良好运行。设备**必须**正确实现这些 API 和行为,如本节详细所述。
本节中要求的单位定义如下
- 物理对角线尺寸。显示器发光部分两个相对角之间的英寸距离。
- 每英寸点数 (dpi)。1 英寸线性水平或垂直跨度所包含的像素数。在列出 dpi 值时,水平和垂直 dpi 都必须在范围内。
- 宽高比。屏幕较长尺寸的像素与较短尺寸的像素之比。例如,480x854 像素的显示器将为 854/480 = 1.779,或大致“16:9”。
- 密度无关像素 (dp)。归一化为 160 dpi 屏幕的虚拟像素单位,计算公式为:像素 = dps * (密度/160)。
7.1.1. 屏幕配置
7.1.1.1. 屏幕尺寸和形状
Android UI 框架支持各种不同的逻辑屏幕布局尺寸,并允许应用程序通过 Configuration.screenLayout
与 SCREENLAYOUT_SIZE_MASK
和 Configuration.smallestScreenWidthDp
查询当前配置的屏幕布局尺寸。
设备实现
-
[C-0-1] **必须**报告
Configuration.screenLayout
的正确布局尺寸,如 Android SDK 文档中所定义。具体而言,设备实现**必须**报告如下所示的正确的逻辑密度无关像素 (dp) 屏幕尺寸- 将
Configuration.uiMode
设置为除 UI_MODE_TYPE_WATCH 之外的任何值,并为Configuration.screenLayout
报告small
尺寸的设备,**必须**至少具有 426 dp x 320 dp。 - 为
Configuration.screenLayout
报告normal
尺寸的设备,**必须**至少具有 480 dp x 320 dp。 - 为
Configuration.screenLayout
报告large
尺寸的设备,**必须**至少具有 640 dp x 480 dp。 - 为
Configuration.screenLayout
报告xlarge
尺寸的设备,**必须**至少具有 960 dp x 720 dp。
- 将
-
[C-0-2] **必须**通过 AndroidManifest.xml 中的 <
supports-screens
> 属性,正确遵守应用程序声明的对屏幕尺寸的支持,如 Android SDK 文档中所述。 -
**可以**具有带圆角的显示屏。
如果设备实现支持 UI_MODE_TYPE_NORMAL
并且包含带圆角的显示屏,则它们
- [C-1-1] **必须**确保圆角的半径小于或等于 38 dp。
- **应**包含用户切换到具有直角拐角的显示模式的功能。
7.1.1.2. 屏幕宽高比
虽然对物理屏幕显示的屏幕宽高比值没有限制,但第三方应用程序在其中渲染的逻辑显示的屏幕宽高比(可以从通过 view.Display
API 和 Configuration API 报告的高度和宽度值中得出)**必须**满足以下要求
-
[C-0-1] 将
Configuration.uiMode
设置为UI_MODE_TYPE_NORMAL
的设备实现**必须**具有介于 1.3333 (4:3) 和 1.86(大致 16:9)之间的宽高比值,除非该应用可以通过满足以下条件之一而被视为已准备好拉伸得更长- 该应用已通过
android.max_aspect
元数据值声明它支持更大的屏幕宽高比。 - 该应用通过 android:resizeableActivity 属性声明它是可调整大小的。
- 该应用的目标 API 级别为 24 或更高,并且未声明会限制允许的宽高比的
android:MaxAspectRatio
。
- 该应用已通过
-
[C-0-2] 将
Configuration.uiMode
设置为UI_MODE_TYPE_WATCH
的设备实现**必须**将宽高比值设置为 1.0 (1:1)。
7.1.1.3. 屏幕密度
Android UI 框架定义了一组标准逻辑密度,以帮助应用程序开发者定位应用程序资源。
-
[C-0-1] 默认情况下,设备实现**必须**仅通过 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 框架密度。
如果存在更改设备显示尺寸的功能
- [C-1-1] 显示尺寸**必须**不得缩放大于本机密度的 1.5 倍,或产生小于 320dp(相当于资源限定符 sw320dp)的有效最小屏幕尺寸,以先到者为准。
- [C-1-2] 显示尺寸**必须**不得缩放小于本机密度的 0.85 倍。
- 为了确保良好的可用性和一致的字体大小,**建议**提供以下本机显示选项的缩放(同时遵守上述限制)
- 小:0.85x
- 默认:1x(本机显示比例)
- 大:1.15x
- 更大:1.3x
- 最大:1.45x
7.1.2. 显示指标
如果设备实现包含屏幕或视频输出,则它们
- [C-1-1] **必须**报告
android.util.DisplayMetrics
API 中定义的所有显示指标的正确值。
如果设备实现不包含嵌入式屏幕或视频输出,则它们
- [C-2-1] **必须**为模拟的默认
view.Display
报告android.util.DisplayMetrics
API 中定义的所有显示指标的合理值。
7.1.3. 屏幕方向
设备实现
- [C-0-1] **必须**报告它们支持的屏幕方向(
android.hardware.screen.portrait
和/或android.hardware.screen.landscape
),并且**必须**报告至少一种支持的方向。例如,具有固定方向横向屏幕的设备(例如电视或笔记本电脑)**应**仅报告android.hardware.screen.landscape
。 - [C-0-2] **必须**在通过
android.content.res.Configuration.orientation
、android.view.Display.getOrientation()
或其他 API 查询时,报告设备当前方向的正确值。
如果设备实现同时支持两种屏幕方向,则它们
- [C-1-1] **必须**支持应用程序对纵向或横向屏幕方向的动态方向控制。也就是说,设备必须尊重应用程序对特定屏幕方向的请求。
- [C-1-2] **必须**不得在更改方向时更改报告的屏幕尺寸或密度。
- **可以**选择纵向或横向方向作为默认方向。
7.1.4. 2D 和 3D 图形加速
7.1.4.1 OpenGL ES
设备实现
- [C-0-1] **必须**通过托管 API(例如通过
GLES10.getString()
方法)和本机 API 正确识别支持的 OpenGL ES 版本(1.1、2.0、3.0、3.1、3.2)。 - [C-0-2] **必须**包含对它们识别为支持的每个 OpenGL ES 版本的所有相应托管 API 和本机 API 的支持。
如果设备实现包含屏幕或视频输出,则它们
- [C-1-1] **必须**支持 OpenGL ES 1.1 和 2.0,如 Android SDK 文档中体现和详述的那样。
- [SR] **强烈建议**支持 OpenGL ES 3.1。
- **应**支持 OpenGL ES 3.2。
如果设备实现支持任何 OpenGL ES 版本,则它们
- [C-2-1] **必须**通过 OpenGL ES 托管 API 和本机 API 报告它们已实现的任何其他 OpenGL ES 扩展,反之,**必须**不得报告它们不支持的扩展字符串。
- [C-2-2] **必须**支持
EGL_KHR_image
、EGL_KHR_image_base
、EGL_ANDROID_image_native_buffer
、EGL_ANDROID_get_native_client_buffer
、EGL_KHR_wait_sync
、EGL_KHR_get_all_proc_addresses
、EGL_ANDROID_presentation_time
、EGL_KHR_swap_buffers_with_damage
和EGL_ANDROID_recordable
扩展。 - [SR] **强烈建议**支持 EGL_KHR_partial_update。
- **应**通过
getString()
方法准确报告它们支持的任何纹理压缩格式,这通常是供应商特定的。
如果设备实现声明支持 OpenGL ES 3.0、3.1 或 3.2,则它们
- [C-3-1] 除了 libGLESv2.so 库中的 OpenGL ES 2.0 函数符号外,**必须**导出这些版本的相应函数符号。
如果设备实现支持 OpenGL ES 3.2,则它们
- [C-4-1] **必须**完全支持 OpenGL ES Android Extension Pack。
如果设备实现完全支持 OpenGL ES Android Extension Pack,则它们
- [C-5-1] **必须**通过
android.hardware.opengles.aep
功能标志识别支持情况。
如果设备实现公开支持 EGL_KHR_mutable_render_buffer
扩展,则它们
- [C-6-1] **必须**同时支持
EGL_ANDROID_front_buffer_auto_refresh
扩展。
7.1.4.2 Vulkan
Android 包含对 Vulkan 的支持,Vulkan 是一种低开销、跨平台 API,用于高性能 3D 图形。
如果设备实现支持 OpenGL ES 3.1,则它们
- [SR] **强烈建议**包含对 Vulkan 1.1 的支持。
如果设备实现包含屏幕或视频输出,则它们
- **应**包含对 Vulkan 1.1 的支持。
如果设备实现包含对 Vulkan 1.0 的支持,则它们
- [C-1-1] **必须**使用
android.hardware.vulkan.level
和android.hardware.vulkan.version
功能标志报告正确的整数值。 - [C-1-2] **必须**为 Vulkan 本机 API
vkEnumeratePhysicalDevices()
枚举至少一个VkPhysicalDevice
。 - [C-1-3] **必须**为每个枚举的
VkPhysicalDevice
完全实现 Vulkan 1.0 API。 - [C-1-4] **必须**通过 Vulkan 本机 API
vkEnumerateInstanceLayerProperties()
和vkEnumerateDeviceLayerProperties()
枚举应用程序包的本机库目录中名为libVkLayer*.so
的本机库中包含的层。 - [C-1-5] **必须**不得枚举应用程序包外部的库提供的层,或提供其他方式来跟踪或拦截 Vulkan API,除非应用程序将
android:debuggable
属性设置为true
。 - [C-1-6] **必须**通过 Vulkan 本机 API 报告它们支持的所有扩展字符串,反之,**必须**不得报告它们未正确支持的扩展字符串。
- [C-1-7] **必须**支持 VK_KHR_surface、VK_KHR_android_surface、VK_KHR_swapchain 和 VK_KHR_incremental_present 扩展。
如果设备实现不包含对 Vulkan 1.0 的支持,则它们
- [C-2-1] **必须**不得声明任何 Vulkan 功能标志(例如
android.hardware.vulkan.level
、android.hardware.vulkan.version
)。 - [C-2-2] **必须**不得为 Vulkan 本机 API
vkEnumeratePhysicalDevices()
枚举任何VkPhysicalDevice
。
如果设备实现包含对 Vulkan 1.1 的支持,则它们
- [C-3-1] **必须**公开支持
SYNC_FD
外部信号量和句柄类型。 - [SR] **强烈建议**支持
VK_ANDROID_external_memory_android_hardware_buffer
扩展。
7.1.4.3 RenderScript
- [C-0-1] 设备实现**必须**支持 Android RenderScript,如 Android SDK 文档中所述。
7.1.4.4 2D 图形加速
Android 包含一种机制,应用程序可以通过使用清单标记 android:hardwareAccelerated 或直接 API 调用声明它们想要为应用程序、Activity、Window 或 View 级别启用 2D 图形硬件加速。
设备实现
- [C-0-1] **必须**默认启用硬件加速,并且如果开发者通过设置 android:hardwareAccelerated="false” 或直接通过 Android View API 禁用硬件加速来请求,则**必须**禁用硬件加速。
- [C-0-2] **必须**表现出与 硬件加速相关的 Android SDK 文档一致的行为。
Android 包含 TextureView 对象,使开发者可以直接将硬件加速的 OpenGL ES 纹理作为渲染目标集成到 UI 层次结构中。
设备实现
- [C-0-3] **必须**支持 TextureView API,并且**必须**表现出与上游 Android 实现一致的行为。
7.1.4.5 广色域显示屏
如果设备实现通过 Configuration.isScreenWideColorGamut()
声称支持广色域显示屏,则它们
- [C-1-1] **必须**具有颜色校准的显示屏。
- [C-1-2] **必须**具有在 CIE 1931 xyY 空间中色域完全覆盖 sRGB 色域的显示屏。
- [C-1-3] **必须**具有在 CIE 1931 xyY 空间中色域面积至少为 DCI-P3 的 90% 的显示屏。
- [C-1-4] **必须**支持 OpenGL ES 3.1 或 3.2 并正确报告。
- [C-1-5] **必须**宣传支持
EGL_KHR_no_config_context
、EGL_EXT_pixel_format_float
、EGL_KHR_gl_colorspace
、EGL_EXT_gl_colorspace_scrgb
、EGL_EXT_gl_colorspace_scrgb_linear
、EGL_EXT_gl_colorspace_display_p3
和EGL_KHR_gl_colorspace_display_p3
扩展。 - [SR] **强烈建议**支持
GL_EXT_sRGB
。
相反,如果设备实现不支持广色域显示屏,则它们
- [C-2-1] **应**在 CIE 1931 xyY 空间中覆盖 100% 或更多的 sRGB,尽管屏幕色域未定义。
7.1.5. 旧应用程序兼容模式
Android 指定了一种“兼容模式”,其中框架以“正常”屏幕尺寸等效(320dp 宽度)模式运行,以使未为旧版本 Android 开发的旧版应用程序受益,这些旧版本 Android 早于屏幕尺寸独立性。
7.1.6. 屏幕技术
Android 平台包含允许应用程序向显示屏渲染丰富图形的 API。除非本文档中特别允许,否则设备**必须**支持 Android SDK 定义的所有这些 API。
设备实现
- [C-0-1] **必须**支持能够渲染 16 位彩色图形的显示屏。
- **应**支持能够渲染 24 位彩色图形的显示屏。
- [C-0-2] **必须**支持能够渲染动画的显示屏。
- [C-0-3] **必须**使用像素宽高比 (PAR) 在 0.9 和 1.15 之间的显示技术。也就是说,像素宽高比**必须**接近正方形 (1.0),公差为 10~15%。
7.1.7. 副显示屏
Android 包含对副显示屏的支持,以启用媒体共享功能和用于访问外部显示屏的开发者 API。
如果设备实现支持外部显示屏(通过有线、无线或嵌入式附加显示屏连接),则它们
- [C-1-1] **必须**实现
DisplayManager
系统服务和 API,如 Android SDK 文档中所述。
7.2. 输入设备
设备实现
7.2.1. 键盘
如果设备实现包含对第三方输入法编辑器 (IME) 应用程序的支持,则它们
- [C-1-1] 必须声明
android.software.input_methods
功能标志。 - [C-1-2] 必须完整实现
输入法管理框架
- [C-1-3] 必须预装软件键盘。
设备实现:* [C-0-1] 绝不能包含与 android.content.res.Configuration.keyboard(QWERTY 或 12 键)中指定的格式不匹配的硬件键盘。* 应该包含额外的软键盘实现。* 可以包含硬件键盘。
7.2.2. 非触摸导航
Android 包括对 D-pad、轨迹球和滚轮作为非触摸导航机制的支持。
设备实现
- [C-0-1] 必须报告 android.content.res.Configuration.navigation 的正确值。
如果设备实现缺少非触摸导航,则它们
- [C-1-1] 必须为文本的选择和编辑提供合理的替代用户界面机制,且该机制与输入法管理引擎兼容。上游 Android 开源实现包括一种选择机制,适用于缺少非触摸导航输入的设备。
7.2.3. 导航键
通常通过与专用物理按钮或触摸屏的特定部分交互提供的 主页键、最近任务键 和 返回键 功能对于 Android 导航范例至关重要,因此,设备实现
- [C-0-1] 必须提供用户操作入口,以启动已安装的应用,这些应用具有使用
<intent-filter>
设置为ACTION=MAIN
和CATEGORY=LAUNCHER
或CATEGORY=LEANBACK_LAUNCHER
(对于电视设备实现)的 Activity。“主页”功能应该是此用户操作入口的机制。 - 应该为“最近任务”和“返回”功能提供按钮。
如果提供“主页”、“最近任务”或“返回”功能,则它们
- [C-1-1] 必须在任何功能可访问时,通过单次操作(例如,点按、双击或手势)即可访问。
- [C-1-2] 必须清楚地指示哪个单次操作将触发每个功能。在按钮上印上可见图标、在屏幕的导航栏部分显示软件图标或在开箱即用设置体验期间引导用户完成分步演示流程,都是此类指示的示例。
设备实现
- [SR] 强烈建议不要为 菜单功能 提供输入机制,因为它自 Android 4.0 起已被弃用,转而使用操作栏。
如果设备实现提供“菜单”功能,则它们
- [C-2-1] 只要操作溢出菜单弹出窗口不为空且操作栏可见,就必须显示操作溢出按钮。
- [C-2-2] 绝不能修改通过在操作栏中选择溢出按钮显示的操作溢出弹出窗口的位置,但在通过选择“菜单”功能显示操作溢出弹出窗口时,可以修改其在屏幕上的位置。
如果设备实现不提供“菜单”功能,为了向后兼容,它们:* [C-3-1] 当 targetSdkVersion
小于 10 时,必须通过物理按钮、软件键或手势使“菜单”功能可供应用使用。除非与其他导航功能一起隐藏,否则此“菜单”功能应可访问。
如果设备实现提供 Assist 功能,则它们:* [C-4-1] 当其他导航键可访问时,必须通过单次操作(例如,点按、双击或手势)使“Assist”功能可访问。* [SR] 强烈建议使用长按“主页”功能作为此指定交互。
如果设备实现使用屏幕的特定部分来显示导航键,则它们
- [C-5-1] 导航键必须使用屏幕的特定部分,该部分对应用不可用,并且绝不能遮挡或以其他方式干扰对应用可用的屏幕部分。
- [C-5-2] 必须向应用提供显示屏的一部分,该部分满足 7.1.1 节中定义的要求。
- [C-5-3] 必须遵守应用通过
View.setSystemUiVisibility()
API 方法设置的标志,以便屏幕的此特定部分(也称为导航栏)按 SDK 中的文档正确隐藏。
7.2.4. 触摸屏输入
Android 包括对各种指针输入系统的支持,例如触摸屏、触摸板和伪触摸输入设备。基于触摸屏的设备实现与显示屏相关联,以便用户具有直接操作屏幕上项目的印象。由于用户直接触摸屏幕,因此系统不需要任何额外的操作入口来指示正在操作的对象。
设备实现
- 应该具有某种类型的指针输入系统(鼠标式或触摸式)。
- 应该完全支持独立跟踪的指针。
如果设备实现包括触摸屏(单点触控或更好),则它们
- [C-1-1] 必须为
Configuration.touchscreen
API 字段报告TOUCHSCREEN_FINGER
。 - [C-1-2] 必须报告
android.hardware.touchscreen
和android.hardware.faketouch
功能标志。
如果设备实现包括可以跟踪多个触摸点的触摸屏,则它们
- [C-2-1] 必须报告与设备上特定触摸屏类型对应的相应功能标志
android.hardware.touchscreen.multitouch
、android.hardware.touchscreen.multitouch.distinct
、android.hardware.touchscreen.multitouch.jazzhand
。
如果设备实现不包括触摸屏(并且仅依赖指针设备)并且满足 7.2.5 节中的伪触摸要求,则它们
- [C-3-1] 绝不能报告任何以
android.hardware.touchscreen
开头的功能标志,并且必须仅报告android.hardware.faketouch
。
7.2.5. 伪触摸输入
伪触摸界面提供了一种用户输入系统,该系统近似于触摸屏功能的子集。例如,驱动屏幕光标的鼠标或遥控器近似于触摸,但需要用户先指向或聚焦,然后再单击。诸如鼠标、触控板、基于陀螺仪的空中鼠标、陀螺仪指针、操纵杆和多点触控板之类的多种输入设备可以支持伪触摸交互。Android 包括功能常量 android.hardware.faketouch,它对应于高保真非触摸(基于指针)输入设备(例如,鼠标或触控板),该设备可以充分模拟基于触摸的输入(包括基本手势支持),并指示设备支持触摸屏功能的模拟子集。
如果设备实现不包括触摸屏,但包括它们想要提供的另一个指针输入系统,则它们
- 应该声明对
android.hardware.faketouch
功能标志的支持。
如果设备实现声明支持 android.hardware.faketouch
,则它们
- [C-1-1] 必须报告指针位置的 绝对 X 和 Y 屏幕位置,并在屏幕上显示可视指针。
- [C-1-2] 必须报告触摸事件,其操作代码指定指针 在屏幕上按下或抬起时发生的状态变化。
- [C-1-3] 必须支持在屏幕上的对象上按下和抬起指针,这允许用户模拟点按屏幕上的对象。
- [C-1-4] 必须支持在屏幕上的对象上按下指针、抬起指针、按下指针,然后在同一位置在时间阈值内抬起指针,这允许用户 模拟双击 屏幕上的对象。
- [C-1-5] 必须支持在屏幕上的任意点按下指针、将指针移动到屏幕上的任何其他任意点,然后抬起指针,这允许用户模拟触摸拖动。
- [C-1-6] 必须支持按下指针,然后允许用户将对象快速移动到屏幕上的不同位置,然后在屏幕上抬起指针,这允许用户在屏幕上轻拂对象。
- [C-1-7] 必须为
Configuration.touchscreen
API 字段报告TOUCHSCREEN_NOTOUCH
。
如果设备实现声明支持 android.hardware.faketouch.multitouch.distinct
,则它们
- [C-2-1] 必须声明支持
android.hardware.faketouch
。 - [C-2-2] 必须支持对两个或更多独立指针输入的区分跟踪。
如果设备实现声明支持 android.hardware.faketouch.multitouch.jazzhand
,则它们
- [C-3-1] 必须声明支持
android.hardware.faketouch
。 - [C-3-2] 必须支持对 5 个(跟踪一只手的手指)或更多指针输入进行完全独立的区分跟踪。
7.2.6. 游戏控制器支持
7.2.6.1. 按钮映射
如果设备实现声明 android.hardware.gamepad
功能标志,则它们
- [C-1-1] 必须嵌入控制器或在包装盒中附带单独的控制器,这将提供输入下表中所列所有事件的方法。
- [C-1-2] 必须能够将 HID 事件映射到其关联的 Android
view.InputEvent
常量,如下表所示。上游 Android 实现包括满足此要求的游戏控制器的实现。
按钮 | HID 用法2 | Android 按钮 |
---|---|---|
A1 | 0x09 0x0001 | KEYCODE_BUTTON_A (96) |
B1 | 0x09 0x0002 | KEYCODE_BUTTON_B (97) |
X1 | 0x09 0x0004 | KEYCODE_BUTTON_X (99) |
Y1 | 0x09 0x0005 | KEYCODE_BUTTON_Y (100) |
D-pad 向上1 D-pad 向下1 |
0x01 0x00393 | AXIS_HAT_Y4 |
D-pad 向左1 D-pad 向右1 |
0x01 0x00393 | AXIS_HAT_X4 |
左肩按钮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 上述 HID 用法必须在游戏手柄 CA (0x01 0x0005) 中声明。
3 此用法必须具有逻辑最小值 0、逻辑最大值 7、物理最小值 0、物理最大值 315、单位为度,以及报告大小 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. 遥控器
有关特定于设备的要求,请参阅第 2.3.1 节。
7.3. 传感器
如果设备实现包含具有第三方开发人员的相应 API 的特定传感器类型,则设备实现必须按照 Android SDK 文档和关于 传感器的 Android 开源文档中所述实现该 API。
设备实现
- [C-0-1] 必须根据
android.content.pm.PackageManager
类准确报告传感器的存在或缺失。 - [C-0-2] 必须通过
SensorManager.getSensorList()
和类似方法返回受支持传感器的准确列表。 - [C-0-3] 必须对所有其他传感器 API 表现合理(例如,当应用程序尝试注册侦听器时返回
true
或false
,当相应的传感器不存在时不调用传感器侦听器;等等)。
如果设备实现包含具有第三方开发人员的相应 API 的特定传感器类型,则它们
- [C-1-1] 必须使用 Android SDK 文档中定义的每种传感器类型的相关国际单位制 (公制) 值 报告所有传感器测量值。
- [C-1-2] 当应用程序处理器处于活动状态时,对于以 5 毫秒 + 2 * sample_time 的最小所需延迟流式传输的传感器,必须以 100 毫秒 + 2 * sample_time 的最大延迟报告传感器数据。此延迟不包括任何滤波延迟。
- [C-1-3] 必须在传感器激活后的 400 毫秒 + 2 * sample_time 内报告第一个传感器样本。此样本的精度为 0 是可以接受的。
-
[SR] 应该以纳秒为单位 报告事件时间,如 Android SDK 文档中所定义,表示事件发生的时间并与 SystemClock.elapsedRealtimeNano() 时钟同步。强烈建议现有和新的 Android 设备满足这些要求,以便它们能够升级到未来平台版本,在这些版本中,这可能成为必需的组件。同步误差应该低于 100 毫秒。
-
[C-1-4] 对于 Android SDK 文档指示为连续传感器的任何 API,设备实现必须持续提供周期性数据样本,这些样本的抖动应该低于 3%,其中抖动定义为连续事件之间报告的时间戳值之差的标准偏差。
-
[C-1-5] 必须确保传感器事件流绝不能阻止设备 CPU 进入挂起状态或从挂起状态唤醒。
- 当激活多个传感器时,功耗应该不超过各个传感器报告的功耗之和。
上面的列表并不全面;Android SDK 的文档和关于 传感器的 Android 开源文档应被视为权威。
某些传感器类型是复合型的,这意味着它们可以从一个或多个其他传感器提供的数据中派生出来。(示例包括方向传感器和线性加速度传感器。)
设备实现
- 应该在包括 传感器类型中所述的先决条件物理传感器时,实现这些传感器类型。
如果设备实现包括复合传感器,则它们
- [C-2-1] 必须按照关于 复合传感器的 Android 开源文档中所述实现传感器。
7.3.1. 加速度计
- 设备实现应该包括 3 轴加速度计。
如果设备实现包括 3 轴加速度计,则它们
- [C-1-1] 必须能够报告高达至少 50 Hz 频率的事件。
- [C-1-2] 必须实现并报告
TYPE_ACCELEROMETER
传感器。 - [C-1-3] 必须遵守 Android API 中详述的 Android 传感器坐标系。
- [C-1-4] 必须能够测量任何轴上从自由落体到重力四倍 (4g) 或更大的加速度。
- [C-1-5] 必须具有至少 12 位的分辨率。
- [C-1-6] 必须具有不大于 0.05 m/s^ 的标准偏差,其中标准偏差应在以最快采样率在至少 3 秒的时间段内收集的样本上按轴计算。
- [SR] 强烈建议实现
TYPE_SIGNIFICANT_MOTION
复合传感器。 - [SR] 如果在线加速度计校准可用,则强烈建议实现
TYPE_ACCELEROMETER_UNCALIBRATED
传感器。 - 应该实现 Android SDK 文档中描述的
TYPE_SIGNIFICANT_MOTION
、TYPE_TILT_DETECTOR
、TYPE_STEP_DETECTOR
、TYPE_STEP_COUNTER
复合传感器。 - 应该报告高达至少 200 Hz 的事件。
- 应该具有至少 16 位的分辨率。
- 应该在使用中进行校准(如果特性在生命周期内发生变化并进行补偿),并在设备重启之间保留补偿参数。
- 应该进行温度补偿。
- 应该还实现
TYPE_ACCELEROMETER_UNCALIBRATED
传感器。
如果设备实现包括 3 轴加速度计,并且实现了 TYPE_SIGNIFICANT_MOTION
、TYPE_TILT_DETECTOR
、TYPE_STEP_DETECTOR
、TYPE_STEP_COUNTER
复合传感器中的任何一个
- [C-2-1] 它们的功耗总和必须始终小于 4 mW。
- 在动态或静态条件下,每个传感器的功耗应该低于 2 mW 和 0.5 mW。
如果设备实现包括 3 轴加速度计和陀螺仪传感器,则它们
- [C-3-1] 必须实现
TYPE_GRAVITY
和TYPE_LINEAR_ACCELERATION
复合传感器。 - 应该实现
TYPE_GAME_ROTATION_VECTOR
复合传感器。 - [SR] 强烈建议现有和新的 Android 设备实现
TYPE_GAME_ROTATION_VECTOR
传感器。
如果设备实现包括 3 轴加速度计、陀螺仪传感器和磁力计传感器,则它们
- [C-4-1] 必须实现
TYPE_ROTATION_VECTOR
复合传感器。
7.3.2. 磁力计
- 设备实现应该包括 3 轴磁力计(指南针)。
如果设备实现包括 3 轴磁力计,则它们
- [C-1-1] 必须实现
TYPE_MAGNETIC_FIELD
传感器。 - [C-1-2] 必须能够报告高达至少 10 Hz 频率的事件,并且应该报告高达至少 50 Hz 的事件。
- [C-1-3] 必须遵守 Android API 中详述的 Android 传感器坐标系。
- [C-1-4] 必须能够测量每个轴上 -900 µT 到 +900 µT 之间的范围,然后才会饱和。
- [C-1-5] 必须具有小于 700 µT 的硬铁偏移值,并且应该具有低于 200 µT 的值,方法是将磁力计放置在远离动态(电流感应)和静态(磁体感应)磁场的位置。
- [C-1-6] 必须具有等于或高于 0.6 µT 的分辨率。
- [C-1-7] 必须支持硬铁偏差的在线校准和补偿,并在设备重启之间保留补偿参数。
- [C-1-8] 必须应用软铁补偿—校准可以在使用中或设备生产期间完成。
- [C-1-9] 必须具有标准偏差,该标准偏差在以最快采样率在至少 3 秒的时间段内收集的样本上按轴计算,不大于 1.5 µT;应该具有不大于 0.5 µT 的标准偏差。
- 应该实现
TYPE_MAGNETIC_FIELD_UNCALIBRATED
传感器。 - [SR] 强烈建议现有和新的 Android 设备实现
TYPE_MAGNETIC_FIELD_UNCALIBRATED
传感器。
如果设备实现包括 3 轴磁力计、加速度计传感器和陀螺仪传感器,则它们
- [C-2-1] 必须实现
TYPE_ROTATION_VECTOR
复合传感器。
如果设备实现包括 3 轴磁力计、加速度计,则它们
- 可以实现
TYPE_GEOMAGNETIC_ROTATION_VECTOR
传感器。
如果设备实现包括 3 轴磁力计、加速度计和 TYPE_GEOMAGNETIC_ROTATION_VECTOR
传感器,则它们
- [C-3-1] 必须消耗小于 10 mW 的功率。
- 当传感器以 10 Hz 注册为批量模式时,应该消耗小于 3 mW 的功率。
7.3.3. GPS
设备实现
- 应该包括 GPS/GNSS 接收器。
如果设备实现包括 GPS/GNSS 接收器并通过 android.hardware.location.gps
功能标志向应用程序报告此功能,则它们
- [C-1-1] 当通过
LocationManager#requestLocationUpdate
请求时,必须支持至少 1 Hz 速率的位置输出。 - [C-1-2] 当连接到 0.5 Mbps 或更快的数据速度互联网连接时,必须能够在 10 秒内(首次定位时间快)确定开阔天空条件下的位置(强信号、可忽略的多路径、HDOP < 2)。此要求通常通过使用某种形式的辅助或预测 GPS/GNSS 技术来满足,以最大限度地减少 GPS/GNSS 锁定时间(辅助数据包括参考时间、参考位置和卫星星历/时钟)。
- [C-1-6] 在进行此类位置计算后,即使在随后的请求是在没有数据连接和/或断电后发出的情况下,设备实现必须在位置请求重新启动后 5 秒内确定其在开阔天空中的位置,最长可达初始位置计算后一小时。
-
在确定位置后的开阔天空条件下,当静止或以小于每秒平方米 1 米的加速度移动时
- [C-1-3] 必须能够至少在 95% 的时间内,将位置确定在 20 米以内,速度确定在每秒 0.5 米以内。
- [C-1-4] 必须通过
GnssStatus.Callback
同时跟踪和报告来自一个星座的至少 8 颗卫星。 - 应该能够同时跟踪来自多个星座(例如,GPS + Glonass、北斗、Galileo 中的至少一个)的至少 24 颗卫星。
- [C-1-5] 必须通过测试 API 'getGnssYearOfHardware' 报告 GNSS 技术代系。
- [SR] 在紧急电话呼叫期间继续提供正常的 GPS/GNSS 位置输出。
- [SR] 报告来自跟踪的所有星座(在 GnssStatus 消息中报告)的 GNSS 测量值,SBAS 除外。
- [SR] 报告 AGC 和 GNSS 测量的频率。
- [SR] 报告作为每个 GPS/GNSS 位置一部分的所有精度估计值(包括方位角、速度和垂直精度)。
- [SR] 强烈建议尽可能多地满足通过测试 API
LocationManager.getGnssYearOfHardware()
报告年份“2016”或“2017”的设备的额外强制性要求。
如果设备实现包括 GPS/GNSS 接收器并通过 android.hardware.location.gps
功能标志向应用程序报告此功能,并且 LocationManager.getGnssYearOfHardware()
测试 API 报告年份“2016”或更新版本,则它们
- [C-2-1] 必须报告 GNSS 测量值,即使尚未报告从 GPS/GNSS 计算的位置,也要尽快报告。
- [C-2-2] 必须报告 GNSS 伪距和伪距速率,这些伪距和伪距速率在确定位置后的开阔天空条件下,当静止或以小于每秒平方米 0.2 米的加速度移动时,足以至少在 95% 的时间内将位置计算在 20 米以内,速度计算在每秒 0.2 米以内。
如果设备实现包括 GPS/GNSS 接收器并通过 android.hardware.location.gps
功能标志向应用程序报告此功能,并且 LocationManager.getGnssYearOfHardware()
测试 API 报告年份“2017”或更新版本,则它们
- [C-3-1] 必须在紧急电话呼叫期间继续提供正常的 GPS/GNSS 位置输出。
- [C-3-2] 必须报告来自跟踪的所有星座(在 GnssStatus 消息中报告)的 GNSS 测量值,SBAS 除外。
- [C-3-3] 必须报告 AGC 和 GNSS 测量的频率。
- [C-3-4] 必须报告作为每个 GPS/GNSS 位置一部分的所有精度估计值(包括方位角、速度和垂直精度)。
如果设备实现包括 GPS/GNSS 接收器并通过 android.hardware.location.gps
功能标志向应用程序报告此功能,并且 LocationManager.getGnssYearOfHardware()
测试 API 报告年份“2018”或更新版本,则它们
- [C-4-1] 必须在基于移动台 (MS-Based) 网络发起的紧急会话呼叫期间,继续向应用程序提供正常的 GPS/GNSS 输出。
- [C-4-2] 必须向 GNSS 位置提供程序 API 报告位置和测量值。
7.3.4. 陀螺仪
设备实现
- 应该包括陀螺仪(角变化传感器)。
- 除非还包括 3 轴加速度计,否则不应该包括陀螺仪传感器。
如果设备实现包括陀螺仪,则它们
- [C-1-1] 必须能够报告高达至少 50 Hz 频率的事件。
- [C-1-2] 必须实现
TYPE_GYROSCOPE
传感器,并且应该还实现TYPE_GYROSCOPE_UNCALIBRATED
传感器。 - [C-1-3] 必须能够测量高达每秒 1,000 度的方向变化。
- [C-1-4] 必须具有 12 位或更高的分辨率,并且应该具有 16 位或更高的分辨率。
- [C-1-5] 必须进行温度补偿。
- [C-1-6] 必须在使用中进行校准和补偿,并在设备重启之间保留补偿参数。
- [C-1-7] 必须具有不大于 1e-7 rad^2 / s^2 每 Hz 的方差(每 Hz 方差,或 rad^2 / s)。方差允许随采样率变化,但必须受此值约束。换句话说,如果您测量 1 Hz 采样率下陀螺仪的方差,则其应该不大于 1e-7 rad^2/s^2。
- [SR] 强烈建议现有和新的 Android 设备实现
SENSOR_TYPE_GYROSCOPE_UNCALIBRATED
传感器。 - [SR] 强烈建议当设备在室温下静止时,校准误差小于 0.01 rad/s。
- 应该报告高达至少 200 Hz 的事件。
如果设备实现包括陀螺仪、加速度计传感器和磁力计传感器,则它们
- [C-2-1] 必须实现
TYPE_ROTATION_VECTOR
复合传感器。
如果设备实现包括陀螺仪和加速度计传感器,则它们
- [C-3-1] 必须实现
TYPE_GRAVITY
和TYPE_LINEAR_ACCELERATION
复合传感器。 - [SR] 强烈建议现有和新的 Android 设备实现
TYPE_GAME_ROTATION_VECTOR
传感器。 - 应该实现
TYPE_GAME_ROTATION_VECTOR
复合传感器。
7.3.5. 气压计
- 设备实现应该包括气压计(环境气压传感器)。
如果设备实现包括气压计,则它们
- [C-1-1] 必须实现并报告
TYPE_PRESSURE
传感器。 - [C-1-2] 必须能够以 5 Hz 或更高的频率传送事件。
- [C-1-3] 必须进行温度补偿。
- [SR] 强烈建议能够报告 300hPa 至 1100hPa 范围内的压力测量值。
- 应该具有 1hPa 的绝对精度。
- 在 20hPa 范围内,应该具有 0.12hPa 的相对精度(相当于在海平面 ~200m 变化范围内 ~1m 的精度)。
7.3.6. 温度计
设备实现:* 可以包括环境温度计(温度传感器)。* 可以但不应该包括 CPU 温度传感器。
如果设备实现包括环境温度计(温度传感器),则它们
- [C-1-1] 必须定义为
SENSOR_TYPE_AMBIENT_TEMPERATURE
,并且必须测量用户与设备交互的环境(房间/车辆座舱)温度,单位为摄氏度。 - [C-1-2] 必须定义为
SENSOR_TYPE_TEMPERATURE
。 - [C-1-3] 必须测量设备 CPU 的温度。
- [C-1-4] 绝不能测量任何其他温度。
请注意,SENSOR_TYPE_TEMPERATURE
传感器类型已在 Android 4.0 中弃用。
7.3.7. 光度计
- 设备实现可以包括光度计(环境光传感器)。
7.3.8. 接近传感器
- 设备实现可以包括接近传感器。
如果设备实现包括接近传感器,则它们
- [C-1-1] 必须测量与屏幕相同方向的物体的接近程度。也就是说,接近传感器必须定向为检测靠近屏幕的物体,因为此传感器类型的主要意图是检测用户正在使用的手机。如果设备实现包括任何其他方向的接近传感器,则绝不能通过此 API 访问它。
- [C-1-2] 必须具有 1 位或更高的精度。
7.3.9. 高保真传感器
如果设备实现包括本节中定义的一组更高质量的传感器,并将其提供给第三方应用程序,则它们
- [C-1-1] 必须通过
android.hardware.sensor.hifi_sensors
功能标志来识别此功能。
如果设备实现声明了 android.hardware.sensor.hifi_sensors
,则它们
-
[C-2-1] 必须具有一个
TYPE_ACCELEROMETER
传感器,该传感器- 必须具有至少 -8g 到 +8g 的测量范围,应该具有至少 -16g 到 +16g 的测量范围。
- 必须具有至少 2048 LSB/g 的测量分辨率。
- 必须具有 12.5 Hz 或更低的最小测量频率。
- 必须具有 400 Hz 或更高的最大测量频率;应该支持 SensorDirectChannel
RATE_VERY_FAST
。 - 必须具有不超过 400 μg/√Hz 的测量噪声。
- 必须实现此传感器的非唤醒形式,且缓冲能力至少为 3000 个传感器事件。
- 必须具有不高于 3 mW 的批处理功耗。
- [C-SR] 强烈建议具有至少为奈奎斯特频率 80% 的 3dB 测量带宽,以及此带宽内的白噪声频谱。
- 应该具有在室温下测试的小于 30 μg √Hz 的加速度随机游走。
- 应该具有 ≤ +/- 1 mg/°C 的偏置随温度变化。
- 应该具有 ≤ 0.5% 的最佳拟合线非线性,以及 ≤ 0.03%/C° 的灵敏度随温度变化。
- 应该具有 < 2.5 % 的轴间灵敏度,以及在设备工作温度范围内 < 0.2% 的轴间灵敏度变化。
-
[C-2-2] 必须具有一个
TYPE_ACCELEROMETER_UNCALIBRATED
,其质量要求与TYPE_ACCELEROMETER
相同。 -
[C-2-3] 必须具有一个
TYPE_GYROSCOPE
传感器,该传感器- 必须具有至少 -1000 到 +1000 dps 的测量范围。
- 必须具有至少 16 LSB/dps 的测量分辨率。
- 必须具有 12.5 Hz 或更低的最小测量频率。
- 必须具有 400 Hz 或更高的最大测量频率;应该支持 SensorDirectChannel
RATE_VERY_FAST
。 - 必须具有不超过 0.014°/s/√Hz 的测量噪声。
- [C-SR] 强烈建议具有至少为奈奎斯特频率 80% 的 3dB 测量带宽,以及此带宽内的白噪声频谱。
- 应该具有在室温下测试的小于 0.001 °/s √Hz 的速率随机游走。
- 应该具有 ≤ +/- 0.05 °/ s / °C 的偏置随温度变化。
- 应该具有 ≤ 0.02% / °C 的灵敏度随温度变化。
- 应该具有 ≤ 0.2% 的最佳拟合线非线性。
- 应该具有 ≤ 0.007 °/s/√Hz 的噪声密度。
- 应该在设备静止时,在 10 ~ 40 ℃ 温度范围内具有小于 0.002 rad/s 的校准误差。
- 应该具有小于 0.1°/s/g 的 g 敏感度。
- 应该具有 < 4.0 % 的轴间灵敏度,以及在设备工作温度范围内 < 0.3% 的轴间灵敏度变化。
-
[C-2-4] 必须具有一个
TYPE_GYROSCOPE_UNCALIBRATED
,其质量要求与TYPE_GYROSCOPE
相同。 -
[C-2-5] 必须具有一个
TYPE_GEOMAGNETIC_FIELD
传感器,该传感器- 必须具有至少 -900 到 +900 μT 的测量范围。
- 必须具有至少 5 LSB/uT 的测量分辨率。
- 必须具有 5 Hz 或更低的最小测量频率。
- 必须具有 50 Hz 或更高的最大测量频率。
- 必须具有不超过 0.5 uT 的测量噪声。
-
[C-2-6] 必须具有一个
TYPE_MAGNETIC_FIELD_UNCALIBRATED
,其质量要求与TYPE_GEOMAGNETIC_FIELD
相同,此外- 必须实现此传感器的非唤醒形式,且缓冲能力至少为 600 个传感器事件。
- [C-SR] 强烈建议在报告速率为 50 Hz 或更高时,具有从 1 Hz 到至少 10 Hz 的白噪声频谱。
-
[C-2-7] 必须具有一个
TYPE_PRESSURE
传感器,该传感器- 必须具有至少 300 到 1100 hPa 的测量范围。
- 必须具有至少 80 LSB/hPa 的测量分辨率。
- 必须具有 1 Hz 或更低的最小测量频率。
- 必须具有 10 Hz 或更高的最大测量频率。
- 必须具有不超过 2 Pa/√Hz 的测量噪声。
- 必须实现此传感器的非唤醒形式,且缓冲能力至少为 300 个传感器事件。
- 必须具有不高于 2 mW 的批处理功耗。
- [C-2-8] 必须具有一个
TYPE_GAME_ROTATION_VECTOR
传感器,该传感器- 必须实现此传感器的非唤醒形式,且缓冲能力至少为 300 个传感器事件。
- 必须具有不高于 4 mW 的批处理功耗。
- [C-2-9] 必须具有一个
TYPE_SIGNIFICANT_MOTION
传感器,该传感器- 必须具有设备静止时不高于 0.5 mW,设备移动时不高于 1.5 mW 的功耗。
- [C-2-10] 必须具有一个
TYPE_STEP_DETECTOR
传感器,该传感器- 必须实现此传感器的非唤醒形式,且缓冲能力至少为 100 个传感器事件。
- 必须具有设备静止时不高于 0.5 mW,设备移动时不高于 1.5 mW 的功耗。
- 必须具有不高于 4 mW 的批处理功耗。
- [C-2-11] 必须具有一个
TYPE_STEP_COUNTER
传感器,该传感器- 必须具有设备静止时不高于 0.5 mW,设备移动时不高于 1.5 mW 的功耗。
- [C-2-12] 必须具有一个
TILT_DETECTOR
传感器,该传感器- 必须具有设备静止时不高于 0.5 mW,设备移动时不高于 1.5 mW 的功耗。
- [C-2-13] 加速度计、陀螺仪和磁力计报告的同一物理事件的事件时间戳必须彼此相差在 2.5 毫秒以内。加速度计和陀螺仪报告的同一物理事件的事件时间戳应该彼此相差在 0.25 毫秒以内。
- [C-2-14] 必须使陀螺仪传感器事件时间戳与摄像头子系统在同一时基上,且误差在 1 毫秒以内。
- [C-2-15] 必须在数据在任何上述物理传感器上可用后 5 毫秒内将样本传递给应用程序。
- [C-2-16] 当启用以下传感器的任意组合时,设备静止时功耗不得高于 0.5 mW,设备移动时功耗不得高于 2.0 mW
-
SENSOR_TYPE_SIGNIFICANT_MOTION
-
SENSOR_TYPE_STEP_DETECTOR
-
SENSOR_TYPE_STEP_COUNTER
-
SENSOR_TILT_DETECTORS
-
- [C-2-17] 可以具有
TYPE_PROXIMITY
传感器,但如果存在,则必须具有至少 100 个传感器事件的最小缓冲能力。
请注意,本节中的所有功耗要求均不包括应用处理器的功耗。它包括整个传感器链(传感器、任何支持电路、任何专用传感器处理系统等)消耗的功率。
如果设备实现包括直接传感器支持,则它们
- [C-3-1] 必须通过
isDirectChannelTypeSupported
和getHighestDirectReportRateLevel
API 正确声明对直接通道类型和直接报告速率级别的支持。 - [C-3-2] 对于声明支持传感器直接通道的所有传感器,必须支持至少两种传感器直接通道类型中的一种。
- 应该支持通过传感器直接通道报告以下类型的主传感器(非唤醒变体)事件
-
TYPE_ACCELEROMETER
-
TYPE_ACCELEROMETER_UNCALIBRATED
-
TYPE_GYROSCOPE
-
TYPE_GYROSCOPE_UNCALIBRATED
-
TYPE_MAGNETIC_FIELD
-
TYPE_MAGNETIC_FIELD_UNCALIBRATED
-
7.3.10. 生物识别传感器
7.3.10.1. 指纹传感器
如果设备实现包括安全锁屏,则它们
- 应该包括指纹传感器。
如果设备实现包括指纹传感器并向第三方应用开放该传感器,则它们
- [C-1-1] 必须声明支持
android.hardware.fingerprint
功能。 - [C-1-2] 必须完全实现 相应的 API,如 Android SDK 文档中所述。
- [C-1-3] 必须具有不高于 0.002% 的错误接受率。
- [SR] 强烈建议具有不高于 7% 的欺骗和冒名顶替接受率。
- [C-1-4] 如果欺骗和冒名顶替接受率高于 7%,则必须披露此模式可能不如强 PIN 码、图案或密码安全,并清楚地列举启用它的风险。
- [C-1-5] 指纹验证尝试失败五次后,必须将尝试次数限制在至少 30 秒内。
- [C-1-6] 必须具有硬件支持的密钥库实现,并在可信执行环境 (TEE) 或具有通往 TEE 的安全通道的芯片上执行指纹匹配。
- [C-1-7] 必须对所有可识别的指纹数据进行加密和密码学身份验证,使其无法在 TEE 外部或具有通往 TEE 的安全通道的芯片上获取、读取或更改,如 Android 开源项目网站上的实现指南中所述。
- [C-1-8] 必须在用户确认现有设备凭据(PIN 码/图案/密码)或添加由 TEE 保护的新设备凭据后,才能防止添加指纹以建立信任链;Android 开源项目实现在框架中提供了执行此操作的机制。
- [C-1-9] 不得允许第三方应用程序区分各个指纹。
- [C-1-10] 必须遵守 DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT 标志。
- [C-1-11] 从 Android 6.0 之前的版本升级时,必须安全地迁移指纹数据以满足上述要求,或将其删除。
- [C-1-12] 当用户的帐户被删除时(包括通过恢复出厂设置),必须完全删除该用户的所有可识别指纹数据。
- [C-1-13] 不得允许对应用处理器进行未加密访问可识别指纹数据或从中衍生的任何数据(例如嵌入)。
- [SR] 强烈建议在设备上测量的错误拒绝率低于 10%。
- [SR] 强烈建议对于一个已注册的指纹,从触摸指纹传感器到屏幕解锁的延迟低于 1 秒。
- 应该使用 Android 开源项目中提供的 Android 指纹图标。
7.3.10.2. 其他生物识别传感器
如果设备实现包括一个或多个非指纹生物识别传感器并向第三方应用开放它们,则它们
- [C-1-1] 必须具有不高于 0.002% 的错误接受率。
- [C-SR] 强烈建议具有不高于 7% 的欺骗和冒名顶替接受率。
- [C-1-2] 如果欺骗和冒名顶替接受率高于 7%,则必须披露此模式可能不如强 PIN 码、图案或密码安全,并清楚地列举启用它的风险。
- [C-1-3] 生物识别验证尝试失败五次后,必须将尝试次数限制在至少 30 秒内 - 其中,失败尝试是指具有足够捕获质量 (ACQUIRED_GOOD) 但与已注册生物识别信息不匹配的尝试
- [C-1-4] 必须具有硬件支持的密钥库实现,并在 TEE 或具有通往 TEE 的安全通道的芯片上执行生物识别匹配。
- [C-1-5] 必须对所有可识别数据进行加密和密码学身份验证,使其无法在 TEE 外部或具有通往 TEE 的安全通道的芯片上获取、读取或更改,如 Android 开源项目网站上的实现指南中所述。
- [C-1-6] 必须在用户确认现有设备凭据(PIN 码/图案/密码)或添加由 TEE 保护的新设备凭据后,才能防止添加新的生物识别信息以建立信任链;Android 开源项目实现在框架中提供了执行此操作的机制。
- [C-1-7] 不得允许第三方应用程序区分生物识别注册。
- [C-1-8] 必须遵守该生物识别信息的各个标志(即:
DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT
、DevicePolicymanager.KEYGUARD_DISABLE_FACE
或DevicePolicymanager.KEYGUARD_DISABLE_IRIS
)。 - [C-1-9] 当用户的帐户被删除时(包括通过恢复出厂设置),必须完全删除该用户的所有可识别生物识别数据。
- [C-1-10] 不得允许在 TEE 上下文之外对应用处理器进行未加密访问可识别生物识别数据或从中衍生的任何数据(例如嵌入)。
- [C-SR] 强烈建议在设备上测量的错误拒绝率低于 10%。
- [C-SR] 强烈建议对于每个已注册的生物识别信息,从检测到生物识别信息到屏幕解锁的延迟低于 1 秒。
7.3.11. 仅限 Android Automotive 的传感器
汽车专用传感器在 android.car.CarSensorManager API
中定义。
7.3.11.1. 当前档位
有关设备特定要求,请参阅 第 2.5.1 节。
7.3.11.2. 日夜模式
有关设备特定要求,请参阅 第 2.5.1 节。
7.3.11.3. 驾驶状态
此要求已弃用。
7.3.11.4. 轮速
有关设备特定要求,请参阅 第 2.5.1 节。
7.3.11.5. 驻车制动器
有关设备特定要求,请参阅 第 2.5.1 节。
7.3.12. 姿势传感器
设备实现
- 可以支持具有 6 个自由度的姿势传感器。
如果设备实现支持具有 6 个自由度的姿势传感器,则它们
- [C-1-1] 必须实现并报告
TYPE_POSE_6DOF
传感器。 - [C-1-2] 必须比仅旋转矢量更准确。
7.4. 数据连接
7.4.1. 电话
Android API 和本文档中使用的“电话”专门指与通过 GSM 或 CDMA 网络拨打语音电话和发送 SMS 消息相关的硬件。虽然这些语音电话可能是也可能不是分组交换的,但就 Android 而言,它们被认为独立于可能使用同一网络实现的任何数据连接。换句话说,Android “电话”功能和 API 专门指语音电话和 SMS。例如,无法拨打电话或发送/接收 SMS 消息的设备不被视为电话设备,无论它们是否使用蜂窝网络进行数据连接。
- Android 可以用于不包括电话硬件的设备。也就是说,Android 与非电话设备兼容。
如果设备实现包括 GSM 或 CDMA 电话,则它们
- [C-1-1] 必须根据技术声明
android.hardware.telephony
功能标志和其他子功能标志。 - [C-1-2] 必须完全实现该技术的 API 支持。
如果设备实现不包括电话硬件,则它们
- [C-2-1] 必须将完整的 API 实现为无操作。
7.4.1.1. 号码阻止兼容性
如果设备实现报告 android.hardware.telephony feature
,则它们
- [C-1-1] 必须包括号码阻止支持
- [C-1-2] 必须完全实现
BlockedNumberContract
和相应的 API,如 SDK 文档中所述。 - [C-1-3] 必须阻止来自 'BlockedNumberProvider' 中电话号码的所有呼叫和消息,而无需与应用进行任何交互。唯一的例外是 SDK 文档中描述的临时取消号码阻止的情况。
- [C-1-4] 对于被阻止的呼叫,不得写入 平台通话记录提供程序。
- [C-1-5] 对于被阻止的消息,不得写入 Telephony 提供程序。
- [C-1-6] 必须实现阻止号码管理 UI,该 UI 通过
TelecomManager.createManageBlockedNumbersIntent()
方法返回的 intent 打开。 - [C-1-7] 不得允许辅助用户查看或编辑设备上的阻止号码,因为 Android 平台假定主用户对设备上的电话服务(单个实例)具有完全控制权。所有阻止相关的 UI 必须对辅助用户隐藏,并且阻止列表仍然必须受到尊重。
- 在设备更新到 Android 7.0 时,应该将阻止号码迁移到提供程序中。
7.4.1.2. Telecom API
如果设备实现报告 android.hardware.telephony
,则它们
- [C-1-1] 必须支持 SDK 中描述的
ConnectionService
API。 - [C-1-2] 当用户正在进行由不支持通过
CAPABILITY_SUPPORT_HOLD
指定的保持功能的第三方应用进行的通话时,必须显示新的来电,并提供用户接受或拒绝来电的提示。 -
[C-SR] 强烈建议通知用户,接听来电将挂断正在进行的通话。
AOSP 实现通过一个抬头通知来满足这些要求,该通知向用户指示接听来电将导致另一个通话被挂断。
-
[C-SR] 强烈建议预加载默认拨号器应用,当第三方应用在其
PhoneAccount
上将EXTRA_LOG_SELF_MANAGED_CALLS
额外键设置为true
时,该应用会在其通话记录中显示通话记录条目和第三方应用的名称。 - [C-SR] 强烈建议处理音频耳机的
KEYCODE_MEDIA_PLAY_PAUSE
和KEYCODE_HEADSETHOOK
事件,用于如下所示的android.telecom
API- 在正在进行的通话期间检测到按键事件的短按时,调用
Connection.onDisconnect()
。 - 在来电期间检测到按键事件的短按时,调用
Connection.onAnswer()
。 - 在来电期间检测到按键事件的长按时,调用
Connection.onReject()
。 - 切换
CallAudioState
的静音状态。
- 在正在进行的通话期间检测到按键事件的短按时,调用
7.4.2. IEEE 802.11 (Wi-Fi)
设备实现
- 应该包括对一种或多种 802.11 形式的支持。
如果设备实现包括对 802.11 的支持并向第三方应用程序公开该功能,则它们
- [C-1-1] 必须实现相应的 Android API。
- [C-1-2] 必须报告硬件功能标志
android.hardware.wifi
。 - [C-1-3] 必须实现 SDK 文档中描述的 多播 API。
- [C-1-4] 必须支持多播 DNS (mDNS),并且不得在任何操作时间(包括)过滤 mDNS 数据包 (224.0.0.251)
- 即使屏幕未处于活动状态。
- 对于 Android 电视设备实现,即使在待机电源状态下也是如此。
- [C-1-5] 不得将
WifiManager.enableNetwork()
API 方法调用视为足以切换当前活动的Network
的指示,该网络默认用于应用程序流量,并由ConnectivityManager
API 方法(例如getActiveNetwork
和registerDefaultNetworkCallback
)返回。换句话说,只有当成功验证 Wi-Fi 网络提供互联网访问时,它们才可以禁用任何其他网络提供商(例如移动数据)提供的互联网访问。 - [C-SR] 强烈建议在调用
ConnectivityManager.reportNetworkConnectivity()
API 方法时,重新评估Network
上的互联网访问,并且一旦评估确定当前Network
不再提供互联网访问,则切换到任何其他可用的网络(例如移动数据),以提供互联网访问。 - [C-SR] 强烈建议在 STA 断开连接时,在每次扫描开始时随机化探测请求帧的源 MAC 地址和序列号。
- 构成一次扫描的每组探测请求帧应使用一个一致的 MAC 地址(不应在扫描过程中随机化 MAC 地址)。
- 探测请求序列号应在扫描中的探测请求之间正常(顺序)迭代。
- 探测请求序列号应在一次扫描的最后一个探测请求和下一次扫描的第一个探测请求之间随机化。
- [C-SR] 强烈建议在 STA 断开连接时,仅允许探测请求帧中包含以下元素
- SSID 参数集 (0)
- DS 参数集 (3)
如果设备实现支持 Wi-Fi 并使用 Wi-Fi 进行位置扫描,则它们
- [C-2-1] 必须提供用户提示,以启用/禁用通过
WifiManager.isScanAlwaysAvailable
API 方法读取的值。
7.4.2.1. Wi-Fi Direct
设备实现
- 应该包括对 Wi-Fi Direct(Wi-Fi 对等网络)的支持。
如果设备实现包括对 Wi-Fi Direct 的支持,则它们
- [C-1-1] 必须实现 SDK 文档中描述的 相应的 Android API。
- [C-1-2] 必须报告硬件功能
android.hardware.wifi.direct
。 - [C-1-3] 必须支持常规 Wi-Fi 操作。
- [C-1-4] 必须同时支持 Wi-Fi 和 Wi-Fi Direct 操作。
7.4.2.2. Wi-Fi 隧道式直接链路设置
设备实现
- 应该包括对 Android SDK 文档中描述的 Wi-Fi 隧道式直接链路设置 (TDLS) 的支持。
如果设备实现包括对 TDLS 的支持,并且 WiFiManager API 启用了 TDLS,则它们
- [C-1-1] 必须通过
WifiManager.isTdlsSupported
声明对 TDLS 的支持。 - 应该仅在可能且有利时使用 TDLS。
- 应该具有一些启发式方法,并且当 TDLS 的性能可能比通过 Wi-Fi 接入点更差时,不应使用 TDLS。
7.4.2.3. Wi-Fi Aware
设备实现
- 应该包括对 Wi-Fi Aware 的支持。
如果设备实现包括对 Wi-Fi Aware 的支持并向第三方应用开放该功能,则它们
- [C-1-1] 必须实现 SDK 文档中描述的
WifiAwareManager
API。 - [C-1-2] 必须声明
android.hardware.wifi.aware
功能标志。 - [C-1-3] 必须同时支持 Wi-Fi 和 Wi-Fi Aware 操作。
- [C-1-4] 必须以不超过 30 分钟的间隔以及在每次启用 Wi-Fi Aware 时随机化 Wi-Fi Aware 管理接口地址。
如果设备实现包括对 Wi-Fi Aware 和 第 7.4.2.5 节中描述的 Wi-Fi 位置的支持,并向第三方应用开放这些功能,则它们
- [C-2-1] 必须实现位置感知发现 API:setRangingEnabled、setMinDistanceMm、setMaxDistanceMm 和 onServiceDiscoveredWithinRange。
7.4.2.4. Wi-Fi Passpoint
设备实现
- 应该包括对 Wi-Fi Passpoint 的支持。
如果设备实现包括对 Wi-Fi Passpoint 的支持,则它们
- [C-1-1] 必须实现 SDK 文档中描述的 Passpoint 相关
WifiManager
API。 - [C-1-2] 必须支持 IEEE 802.11u 标准,特别是与网络发现和选择相关的标准,例如通用广告服务 (GAS) 和接入网络查询协议 (ANQP)。
相反,如果设备实现不包括对 Wi-Fi Passpoint 的支持
- [C-2-1] Passpoint 相关
WifiManager
API 的实现必须抛出UnsupportedOperationException
。
7.4.2.5. Wi-Fi 位置(Wi-Fi 往返时间 - RTT)
设备实现
- 应该包括对 Wi-Fi 位置的支持。
如果设备实现包括对 Wi-Fi 位置的支持并向第三方应用开放该功能,则它们
- [C-1-1] 必须实现 SDK 文档中描述的
WifiRttManager
API。 - [C-1-2] 必须声明
android.hardware.wifi.rtt
功能标志。 - [C-1-3] 必须为每次 RTT 突发随机化源 MAC 地址,当执行 RTT 的 Wi-Fi 接口未与接入点关联时。
7.4.3. 蓝牙
如果设备实现支持蓝牙音频配置文件,则它们
- 应该支持高级音频编解码器和蓝牙音频编解码器(例如 LDAC)。
如果设备实现支持 HFP、A2DP 和 AVRCP,则它们
- 应该支持至少 5 个总连接设备。
如果设备实现声明 android.hardware.vr.high_performance
功能,则它们
- [C-1-1] 必须支持蓝牙 4.2 和蓝牙 LE 数据长度扩展。
Android 包括对 蓝牙和蓝牙低功耗的支持。
如果设备实现包括对蓝牙和蓝牙低功耗的支持,则它们
- [C-2-1] 必须声明相关的平台功能(分别为
android.hardware.bluetooth
和android.hardware.bluetooth_le
)并实现平台 API。 - 应该根据设备实现相关的蓝牙配置文件,例如 A2DP、AVRCP、OBEX、HFP 等。
如果设备实现包括对蓝牙低功耗的支持,则它们
- [C-3-1] 必须声明硬件功能
android.hardware.bluetooth_le
。 - [C-3-2] 必须启用 SDK 文档和 android.bluetooth 中描述的基于 GATT(通用属性配置文件)的蓝牙 API。
- [C-3-3] 必须报告
BluetoothAdapter.isOffloadedFilteringSupported()
的正确值,以指示是否实现了 ScanFilter API 类的过滤逻辑。 - [C-3-4] 必须报告
BluetoothAdapter.isMultipleAdvertisementSupported()
的正确值,以指示是否支持低功耗广播。 - 在实现 ScanFilter API 时,应该支持将过滤逻辑卸载到蓝牙芯片组。
- 应该支持将批量扫描卸载到蓝牙芯片组。
-
应该支持至少 4 个插槽的多重广播。
-
[SR] 强烈建议实施可解析的私有地址 (RPA) 超时,超时时间不超过 15 分钟,并在超时时轮换地址以保护用户隐私。
如果设备实现支持蓝牙 LE 并使用蓝牙 LE 进行位置扫描,则它们
- [C-4-1] 必须提供用户提示,以启用/禁用通过系统 API
BluetoothAdapter.isBleScanAlwaysAvailable()
读取的值。
7.4.4. 近场通信
设备实现
- 应该包括用于近场通信 (NFC) 的收发器和相关硬件。
- [C-0-1] 即使设备实现不包括对 NFC 的支持或声明
android.hardware.nfc
功能,也必须实现android.nfc.NdefMessage
和android.nfc.NdefRecord
API,因为这些类表示与协议无关的数据表示格式。
如果设备实现包括 NFC 硬件并计划向第三方应用开放它,则它们
- [C-1-1] 必须从
android.content.pm.PackageManager.hasSystemFeature()
方法报告android.hardware.nfc
功能。 - 必须能够通过以下 NFC 标准读取和写入 NDEF 消息,如下所示
- [C-1-2] 必须能够通过以下 NFC 标准充当 NFC 论坛读取器/写入器(由 NFC 论坛技术规范 NFCForum-TS-DigitalProtocol-1.0 定义)
- NfcA (ISO14443-3A)
- NfcB (ISO14443-3B)
- NfcF (JIS X 6319-4)
- IsoDep (ISO 14443-4)
- NFC 论坛标签类型 1、2、3、4、5(由 NFC 论坛定义)
-
[SR] 强烈建议能够通过以下 NFC 标准读取和写入 NDEF 消息以及原始数据。请注意,虽然 NFC 标准被强烈建议,但未来版本的兼容性定义计划将这些更改为必须。这些标准在本版本中是可选的,但在未来版本中将是必需的。强烈鼓励运行此 Android 版本的现有和新设备现在就满足这些要求,以便它们能够升级到未来的平台版本。
-
[C-1-3] 必须能够通过以下对等标准和协议传输和接收数据
- ISO 18092
- LLCP 1.2(由 NFC 论坛定义)
- SDP 1.0(由 NFC 论坛定义)
- NDEF 推送协议
- SNEP 1.0(由 NFC 论坛定义)
- [C-1-4] 必须包括对 Android Beam 的支持,并且应该默认启用 Android Beam。
- [C-1-5] 当 Android Beam 启用或另一个专有的 NFC P2p 模式开启时,必须能够使用 Android Beam 发送和接收。
- [C-1-6] 必须实现 SNEP 默认服务器。SNEP 默认服务器接收到的有效 NDEF 消息必须使用
android.nfc.ACTION_NDEF_DISCOVERED
intent 分发给应用程序。在设置中禁用 Android Beam 不得禁用传入 NDEF 消息的分发。 - [C-1-7] 必须遵守
android.settings.NFCSHARING_SETTINGS
intent 以显示 NFC 共享设置。 - [C-1-8] 必须实现 NPP 服务器。NPP 服务器接收到的消息必须以与 SNEP 默认服务器相同的方式处理。
- [C-1-9] 必须实现 SNEP 客户端,并在启用 Android Beam 时尝试将出站 P2P NDEF 发送到默认 SNEP 服务器。如果未找到默认 SNEP 服务器,则客户端必须尝试发送到 NPP 服务器。
- [C-1-10] 必须允许前台活动使用
android.nfc.NfcAdapter.setNdefPushMessage
、android.nfc.NfcAdapter.setNdefPushMessageCallback
和android.nfc.NfcAdapter.enableForegroundNdefPush
设置出站 P2P NDEF 消息。 - 在发送出站 P2P NDEF 消息之前,应该使用手势或屏幕确认,例如“触摸以传输”。
- [C-1-11] 当设备支持蓝牙对象推送配置文件时,必须支持 NFC 连接切换到蓝牙。
- [C-1-12] 在使用
android.nfc.NfcAdapter.setBeamPushUris
时,**必须**支持连接切换到蓝牙,通过实现 NFC 论坛的“连接切换版本 1.2”和“使用 NFC 的蓝牙安全简单配对版本 1.0”规范。 此类实现**必须**实现 handover LLCP 服务,其服务名称为 “urn:nfc:sn:handover”,用于通过 NFC 交换 handover 请求/选择记录,并且**必须**使用蓝牙对象推送配置文件进行实际的蓝牙数据传输。出于遗留原因(为了与 Android 4.1 设备保持兼容),该实现**应该**仍然接受 SNEP GET 请求,以便通过 NFC 交换 handover 请求/选择记录。但是,实现本身**不应该**发送 SNEP GET 请求来执行连接切换。 - [C-1-13] 在 NFC 发现模式下,**必须**轮询所有支持的技术。
- 当设备唤醒、屏幕激活且锁屏解锁时,**应该**处于 NFC 发现模式。
- **应该**能够读取 Thinfilm NFC 条形码 产品的条形码和 URL(如果已编码)。
请注意,上面引用的 JIS、ISO 和 NFC 论坛规范的公开链接不可用。
Android 包括对 NFC 主机卡模拟 (HCE) 模式的支持。
如果设备实现包括能够进行 HCE(用于 NfcA 和/或 NfcB)并支持应用 ID (AID) 路由的 NFC 控制器芯片组,则它们
- [C-2-1] **必须**报告
android.hardware.nfc.hce
功能常量。 - [C-2-2] **必须**支持 Android SDK 中定义的 NFC HCE API。
如果设备实现包括能够进行 NfcF 的 HCE 的 NFC 控制器芯片组,并为第三方应用程序实现该功能,则它们
- [C-3-1] **必须**报告
android.hardware.nfc.hcef
功能常量。 - [C-3-2] **必须**实现 Android SDK 中定义的 NfcF 卡模拟 API。
如果设备实现包括本节中描述的通用 NFC 支持,并在读/写器角色中支持 MIFARE 技术(MIFARE Classic、MIFARE Ultralight、MIFARE Classic 上的 NDEF),则它们
- [C-4-1] **必须**实现 Android SDK 文档中描述的相应 Android API。
- [C-4-2] **必须**从
android.content.pm.PackageManager.hasSystemFeature
() 方法报告功能com.nxp.mifare
。请注意,这不是标准的 Android 功能,因此不会显示为android.content.pm.PackageManager
类中的常量。
7.4.5. 最低网络能力
设备实现
- [C-0-1] **必须**包括对一种或多种数据网络形式的支持。具体而言,设备实现**必须**包括对至少一种能够达到 200 Kbit/秒或更高速度的数据标准的支持。满足此要求的技术示例包括 EDGE、HSPA、EV-DO、802.11g、以太网和蓝牙 PAN。
- 当物理网络标准(如以太网)是主要数据连接时,**应该**还包括对至少一种常见无线数据标准(如 802.11 (Wi-Fi))的支持。
- **可以**实现多种数据连接形式。
- [C-0-2] **必须**包括 IPv6 网络堆栈,并使用托管 API(如
java.net.Socket
和java.net.URLConnection
)以及本机 API(如AF_INET6
套接字)支持 IPv6 通信。 - [C-0-3] **必须**默认启用 IPv6。
- **必须**确保 IPv6 通信与 IPv4 一样可靠,例如
- [C-0-4] **必须**在 Doze 模式下保持 IPv6 连接。
- [C-0-5] 速率限制**不得**导致设备在任何使用 RA 生存期至少为 180 秒的 IPv6 兼容网络上丢失 IPv6 连接。
- [C-0-6] 当连接到 IPv6 网络时,**必须**为第三方应用程序提供直接的 IPv6 网络连接,而设备本地不进行任何形式的地址或端口转换。托管 API(如
Socket#getLocalAddress
或Socket#getLocalPort
) 和 NDK API(如getsockname()
或IPV6_PKTINFO
)**必须**返回实际用于在网络上发送和接收数据包的 IP 地址和端口。
所需的 IPv6 支持级别取决于网络类型,如下列要求所示。
如果设备实现支持 Wi-Fi,则它们
- [C-1-1] **必须**支持 Wi-Fi 上的双栈和仅 IPv6 操作。
如果设备实现支持以太网,则它们
- [C-2-1] **必须**支持以太网上的双栈操作。
如果设备实现支持蜂窝数据,则它们
- **应该**支持蜂窝网络上的 IPv6 操作(仅 IPv6 和可能的双栈)。
如果设备实现支持多种网络类型(例如,Wi-Fi 和蜂窝数据),则它们
- [C-3-1] 当设备同时连接到多种网络类型时,**必须**同时满足上述每种网络的要求。
7.4.6. 同步设置
设备实现
- [C-0-1] **必须**默认启用主自动同步设置,以便
getMasterSyncAutomatically()
方法返回“true”。
7.4.7. 省流量模式
如果设备实现包括按流量计费的连接,则
- [SR] **强烈建议**提供省流量模式。
如果设备实现提供省流量模式,则它们
- [C-1-1] **必须**支持
ConnectivityManager
类中的所有 API,如 SDK 文档中所述 - [C-1-2] **必须**在设置中提供用户界面,以处理
Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS
Intent,允许用户将应用程序添加到允许列表或从中删除应用程序。
如果设备实现不提供省流量模式,则它们
- [C-2-1] **必须**为
ConnectivityManager.getRestrictBackgroundStatus()
返回值RESTRICT_BACKGROUND_STATUS_DISABLED
- [C-2-2] **不得**广播
ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED
。 - [C-2-3] **必须**具有处理
Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS
Intent 的 Activity,但**可以**将其实现为无操作。
7.4.8. 安全元件
如果设备实现支持能够使用 Open Mobile API 的安全元件,并将其提供给第三方应用程序,则它们
- [C-1-1] 当调用
android.se.omapi.SEService.getReaders()
方法时,**必须**枚举可用的安全元件读取器。
7.5. 相机
如果设备实现包括至少一个摄像头,则它们
- [C-1-1] **必须**声明
android.hardware.camera.any
功能标志。 - [C-1-2] 当摄像头打开以进行基本预览和静态图像捕获时,应用程序**必须**能够同时分配 3 个 RGBA_8888 位图,其大小等于设备上最大分辨率摄像头传感器生成的图像大小。
7.5.1. 后置摄像头
后置摄像头是位于设备显示屏相对侧的摄像头;也就是说,它像传统相机一样对设备远侧的场景成像。
设备实现
- **应该**包括后置摄像头。
如果设备实现包括至少一个后置摄像头,则它们
- [C-1-1] **必须**报告功能标志
android.hardware.camera
和android.hardware.camera.any
。 - [C-1-2] **必须**具有至少 2 百万像素的分辨率。
- **应该**在摄像头驱动程序中实现硬件自动对焦或软件自动对焦(对应用程序软件透明)。
- **可以**具有固定对焦或 EDOF(扩展景深)硬件。
- **可以**包括闪光灯。
如果摄像头包括闪光灯
- [C-2-1] 除非应用程序通过启用
Camera.Parameters
对象的FLASH_MODE_AUTO
或FLASH_MODE_ON
属性显式启用了闪光灯,否则当android.hardware.Camera.PreviewCallback
实例已在摄像头预览表面上注册时,闪光灯**不得**点亮。请注意,此约束不适用于设备的内置系统相机应用程序,而仅适用于使用Camera.PreviewCallback
的第三方应用程序。
7.5.2. 前置摄像头
前置摄像头是位于设备显示屏同一侧的摄像头;也就是说,通常用于对用户成像的摄像头,例如用于视频会议和类似应用程序。
设备实现
- **可以**包括前置摄像头。
如果设备实现包括至少一个前置摄像头,则它们
- [C-1-1] **必须**报告功能标志
android.hardware.camera.any
和android.hardware.camera.front
。 - [C-1-2] **必须**具有至少 VGA (640x480 像素) 的分辨率。
- [C-1-3] **不得**使用前置摄像头作为 Camera API 的默认摄像头,并且**不得**配置 API 将前置摄像头视为默认后置摄像头,即使它是设备上唯一的摄像头。
- [C-1-4] 当当前应用程序已通过调用
android.hardware.Camera.setDisplayOrientation()
方法显式请求旋转摄像头显示时,摄像头预览**必须**相对于应用程序指定的方向水平镜像。相反,当当前应用程序未通过调用android.hardware.Camera.setDisplayOrientation()
方法显式请求旋转摄像头显示时,预览**必须**沿设备的默认水平轴镜像。 - [C-1-5] **不得**镜像返回到应用程序回调或提交到媒体存储的最终捕获的静态图像或视频流。
- [C-1-6] **必须**以与摄像头预览图像流相同的方式镜像 postview 显示的图像。
- **可以**包括后置摄像头中可用的功能(例如自动对焦、闪光灯等),如 第 7.5.1 节中所述。
如果设备实现能够由用户旋转(例如通过加速计自动旋转或通过用户输入手动旋转)
- [C-2-1] 摄像头预览**必须**相对于设备的当前方向水平镜像。
7.5.3. 外部摄像头
设备实现
- **可以**包括对外部摄像头的支持,该摄像头不一定始终连接。
如果设备实现包括对外部摄像头的支持,则它们
- [C-1-1] **必须**声明平台功能标志
android.hardware.camera.external
和android.hardware camera.any
。 - [C-1-2] 如果外部摄像头通过 USB 主机端口连接,则**必须**支持 USB 视频类 (UVC 1.0 或更高版本)。
- [C-1-3] **必须**在连接物理外部摄像头设备的情况下通过摄像头 CTS 测试。摄像头 CTS 测试的详细信息可在 source.android.com 上找到。
- **应该**支持视频压缩(如 MJPEG),以实现高质量未编码流(即原始或独立压缩的图片流)的传输。
- **可以**支持多个摄像头。
- **可以**支持基于摄像头的视频编码。
如果支持基于摄像头的视频编码
- [C-2-1] 设备实现**必须**能够访问同步的未编码/MJPEG 流(QVGA 或更高分辨率)。
7.5.4. 相机 API 行为
Android 包括两个用于访问摄像头的 API 包,较新的 android.hardware.camera2 API 向应用程序公开较低级别的摄像头控制,包括高效的零拷贝突发/流式传输流程以及曝光、增益、白平衡增益、颜色转换、去噪、锐化等每帧控制。
较旧的 API 包 android.hardware.Camera
在 Android 5.0 中标记为已弃用,但它仍应可供应用程序使用。Android 设备实现**必须**确保继续支持该 API,如本节和 Android SDK 中所述。
已弃用的 android.hardware.Camera 类和较新的 android.hardware.camera2 包之间通用的所有功能,在两个 API 中**必须**具有同等的性能和质量。例如,在同等设置下,自动对焦速度和准确度**必须**相同,并且捕获的图像质量**必须**相同。依赖于两个 API 不同语义的功能不需要具有匹配的速度或质量,但**应该**尽可能接近地匹配。
设备实现**必须**为所有可用的摄像头实现与摄像头相关的 API 的以下行为。设备实现
- [C-0-1] 当应用程序从未调用
android.hardware.Camera.Parameters.setPreviewFormat(int)
时,**必须**使用android.hardware.PixelFormat.YCbCr_420_SP
作为提供给应用程序回调的预览数据。 - [C-0-2] 当应用程序注册
android.hardware.Camera.PreviewCallback
实例并且系统调用onPreviewFrame()
方法且预览格式为 YCbCr_420_SP 时,在传递到onPreviewFrame()
中的 byte[] 中的数据**必须**进一步采用 NV21 编码格式。也就是说,NV21 **必须**是默认格式。 - [C-0-3] **必须**支持 YV12 格式(由
android.graphics.ImageFormat.YV12
常量表示),用于android.hardware.Camera
的前置和后置摄像头的相机预览。(硬件视频编码器和摄像头可以使用任何本机像素格式,但设备实现**必须**支持转换为 YV12。) - [C-0-4] **必须**支持
android.hardware.ImageFormat.YUV_420_888
和android.hardware.ImageFormat.JPEG
格式,作为通过android.media.ImageReader
API 为android.hardware.camera2
设备提供的输出,这些设备在android.request.availableCapabilities
中声明了REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
功能。 - [C-0-5] **必须**仍然实现 Android SDK 文档中包含的完整 Camera API,无论设备是否包括硬件自动对焦或其他功能。例如,缺少自动对焦功能的摄像头仍然**必须**调用任何已注册的
android.hardware.Camera.AutoFocusCallback
实例(即使这与非自动对焦摄像头无关)。请注意,这确实适用于前置摄像头;例如,即使大多数前置摄像头不支持自动对焦,API 回调也仍然**必须**按照描述进行“伪造”。 - [C-0-6] **必须**识别并遵守在
android.hardware.Camera.Parameters
类上定义为常量的每个参数名称。相反,设备实现**不得**遵守或识别传递给android.hardware.Camera.setParameters()
方法的字符串常量,除非这些常量在android.hardware.Camera.Parameters
上记录为常量。也就是说,如果硬件允许,设备实现**必须**支持所有标准 Camera 参数,并且**不得**支持自定义 Camera 参数类型。例如,支持使用高动态范围 (HDR) 成像技术进行图像捕获的设备实现**必须**支持摄像头参数Camera.SCENE_MODE_HDR
。 - [C-0-7] **必须**使用
android.info.supportedHardwareLevel
属性报告适当的支持级别,如 Android SDK 中所述,并报告相应的 框架功能标志。 - [C-0-8] **必须**还通过
android.request.availableCapabilities
属性声明其android.hardware.camera2
的各个摄像头功能,并声明相应的 功能标志;如果其任何连接的摄像头设备支持该功能,则**必须**定义该功能标志。 - [C-0-9] 每当摄像头拍摄新照片并将照片条目添加到媒体存储时,**必须**广播
Camera.ACTION_NEW_PICTURE
Intent。 - [C-0-10] 每当摄像头录制新视频并将视频条目添加到媒体存储时,**必须**广播
Camera.ACTION_NEW_VIDEO
Intent。 - [C-SR] **强烈建议**支持逻辑摄像头设备,该设备列出功能
CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
,用于具有多个朝向同一方向的摄像头的设备,由每个朝向该方向的物理摄像头组成,只要框架支持物理摄像头类型并且物理摄像头的CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL
为LIMITED
、FULL
或LEVEL_3
。
7.5.5. 摄像头方向
如果设备实现具有前置或后置摄像头,则此类摄像头
- [C-1-1] **必须**定向,使摄像头的长尺寸与屏幕的长尺寸对齐。也就是说,当设备以横向方向握持时,摄像头**必须**以横向方向捕获图像。这适用于设备的自然方向,即适用于横向为主的设备以及纵向为主的设备。
7.6. 内存和存储
7.6.1. 最低内存和存储
设备实现
- [C-0-1] **必须**包括 下载管理器,应用程序**可以**使用它来下载数据文件,并且它们**必须**能够下载至少 100MB 大小的单个文件到默认“缓存”位置。
7.6.2. 应用程序共享存储
设备实现
- [C-0-1] **必须**提供存储空间供应用程序共享,通常也称为“共享外部存储”、“应用程序共享存储”或其挂载的 Linux 路径“/sdcard”。
- [C-0-2] **必须**配置为默认挂载共享存储,换句话说,即“开箱即用”,无论存储是在内部存储组件还是可移动存储介质(例如安全数字卡插槽)上实现。
- [C-0-3] **必须**将应用程序共享存储直接挂载到 Linux 路径
sdcard
,或包括从sdcard
到实际挂载点的 Linux 符号链接。 - [C-0-4] **必须**在此共享存储上强制执行
android.permission.WRITE_EXTERNAL_STORAGE
权限,如 SDK 中所述。共享存储**必须**可由任何获得该权限的应用程序写入。
设备实现**可以**使用以下任一方式满足上述要求
- 用户可访问的可移动存储,例如安全数字 (SD) 卡插槽。
- Android 开源项目 (AOSP) 中实现的内部(不可移动)存储的一部分。
如果设备实现使用可移动存储来满足上述要求,则它们
- [C-1-1] 当插槽中未插入存储介质时,**必须**实现 Toast 或弹出式用户界面警告用户。
- [C-1-2] **必须**包括 FAT 格式的存储介质(例如 SD 卡),或在包装盒和购买时可用的其他材料上显示存储介质必须单独购买。
如果设备实现使用一部分不可移动存储来满足上述要求,则它们
- **应该**使用内部应用程序共享存储的 AOSP 实现。
- **可以**与应用程序私有数据共享存储空间。
如果设备实现包括多个共享存储路径(例如 SD 卡插槽和共享内部存储),则它们
- [C-2-1] **必须**仅允许具有
WRITE_EXTERNAL_STORAGE
权限的预装和特权 Android 应用程序写入辅助外部存储,除非写入其特定于软件包的目录或由触发ACTION_OPEN_DOCUMENT_TREE
Intent 返回的URI
中。
如果设备实现具有支持 USB 外围设备模式的 USB 端口,则它们
- [C-3-1] **必须**提供一种机制,以从主机计算机访问应用程序共享存储上的数据。
- **应该**通过 Android 的媒体扫描器服务和
android.provider.MediaStore
透明地公开来自两个存储路径的内容。 - **可以**使用 USB 大容量存储,但**应该**使用媒体传输协议来满足此要求。
如果设备实现具有支持 USB 外围设备模式的 USB 端口并支持媒体传输协议,则它们
- **应该**与参考 Android MTP 主机 Android File Transfer 兼容。
- **应该**报告 USB 设备类为 0x00。
- **应该**报告 USB 接口名称为 'MTP'。
7.6.3. 可采纳的存储
如果设备预计本质上是移动的,而不是电视,则设备实现
- [SR] **强烈建议**在长期稳定的位置实现可采纳的存储,因为意外断开连接可能会导致数据丢失/损坏。
如果可移动存储设备端口位于长期稳定的位置,例如在电池仓或其他保护盖内,则设备实现
- [SR] **强烈建议**实现 可采纳的存储。
7.7. USB
如果设备实现具有 USB 端口,则它们
- **应该**支持 USB 外围设备模式,并**应该**支持 USB 主机模式。
7.7.1. USB 外围设备模式
如果设备实现包括支持外围设备模式的 USB 端口
- [C-1-1] 该端口**必须**可连接到具有标准 Type-A 或 Type-C USB 端口的 USB 主机。
- [C-1-2] **必须**通过
android.os.Build.SERIAL
报告 USB 标准设备描述符中iSerialNumber
的正确值。 - [C-1-3] 如果设备支持 Type-C USB,**必须**根据 Type-C 电阻标准检测 1.5A 和 3.0A 充电器,并**必须**检测广告中的更改。
- [SR] 该端口**应该**使用 micro-B、micro-AB 或 Type-C USB 外形尺寸。**强烈建议**现有和新的 Android 设备**满足这些要求**,以便它们能够升级到未来的平台版本。
- [SR] 该端口**应该**位于设备底部(根据自然方向),或为所有应用程序(包括主屏幕)启用软件屏幕旋转,以便当设备以端口在底部方向定向时,显示屏可以正确绘制。**强烈建议**现有和新的 Android 设备**满足这些要求**,以便它们能够升级到未来的平台版本。
- [SR] **应该**实现支持在 HS 啁啾和流量期间绘制 1.5 A 电流,如 USB 电池充电规范修订版 1.2 中所指定。**强烈建议**现有和新的 Android 设备**满足这些要求**,以便它们能够升级到未来的平台版本。
- [SR] **强烈建议**不要支持修改超出默认级别的 Vbus 电压或更改接收器/源角色的专有充电方法,因为这可能会导致与支持标准 USB 电源传输方法的充电器或设备出现互操作性问题。虽然这被称为“**强烈建议**”,但在未来的 Android 版本中,我们可能**要求**所有 Type-C 设备都支持与标准 Type-C 充电器的完全互操作性。
- [SR] 当设备支持 Type-C USB 和 USB 主机模式时,**强烈建议**支持电源传输以进行数据和电源角色交换。
- **应该**支持电源传输以实现高压充电,并支持显示输出等备用模式。
- **应该**实现 Android 开放附件 (AOA) API 和规范,如 Android SDK 文档中所述。
如果设备实现包括 USB 端口并实现 AOA 规范,则它们
- [C-2-1] **必须**声明对硬件功能
android.hardware.usb.accessory
的支持。 - [C-2-2] USB 大容量存储类**必须**在 USB 大容量存储的接口描述
iInterface
字符串末尾包含字符串 "android"
7.7.2. USB 主机模式
如果设备实现包括支持主机模式的 USB 端口,则它们
- [C-1-1] **必须**实现 Android USB 主机 API,如 Android SDK 中所述,并且**必须**声明对硬件功能
android.hardware.usb.host
的支持。 - [C-1-2] **必须**实现对连接标准 USB 外围设备的支持,换句话说,它们**必须**
- 具有设备上的 Type C 端口或随附将设备上的专有端口适配为标准 USB Type-C 端口的线缆(USB Type-C 设备)。
- 具有设备上的 Type A 端口或随附将设备上的专有端口适配为标准 USB Type-A 端口的线缆。
- 具有设备上的 micro-AB 端口,该端口**应该**随附适配为标准 Type-A 端口的线缆。
- [C-1-3] **不得**随附将 USB Type A 或 micro-AB 端口转换为 Type-C 端口(插座)的适配器。
- [SR] **强烈建议**实现 Android SDK 文档中描述的 USB 音频类。
- **应该**支持在主机模式下为连接的 USB 外围设备充电;对于 USB Type-C 连接器,广告的源电流至少为 1.5A,如 USB Type-C 线缆和连接器规范修订版 1.2 的终止参数部分中所指定;或者对于 Micro-AB 连接器,使用 USB 电池充电规范修订版 1.2 中指定的充电下游端口 (CDP) 输出电流范围。
- **应该**实现并支持 USB Type-C 标准。
如果设备实现包括支持主机模式和 USB 音频类的 USB 端口,则它们
- [C-2-1] **必须**支持 USB HID 类。
- [C-2-2] **必须**支持检测和映射 USB HID 用途表 和 语音命令用途请求 中指定的以下 HID 数据字段到
KeyEvent
常量,如下所示- 用途页 (0xC) 用途 ID (0x0CD):
KEYCODE_MEDIA_PLAY_PAUSE
- 用途页 (0xC) 用途 ID (0x0E9):
KEYCODE_VOLUME_UP
- 用途页 (0xC) 用途 ID (0x0EA):
KEYCODE_VOLUME_DOWN
- 用途页 (0xC) 用途 ID (0x0CF):
KEYCODE_VOICE_ASSIST
- 用途页 (0xC) 用途 ID (0x0CD):
如果设备实现包括支持主机模式和存储访问框架 (SAF) 的 USB 端口,则它们
- [C-3-1] **必须**识别任何远程连接的 MTP(媒体传输协议)设备,并通过
ACTION_GET_CONTENT
、ACTION_OPEN_DOCUMENT
和ACTION_CREATE_DOCUMENT
Intent 使其内容可访问。
如果设备实现包括支持主机模式和 USB Type-C 的 USB 端口,则它们
- [C-4-1] **必须**实现 USB Type-C 规范(第 4.5.1.3.3 节)定义的双重角色端口功能。
- [SR] 强烈建议支持 DisplayPort,应该支持 USB SuperSpeed 数据速率,并且强烈建议支持电源输送,以进行数据和电源角色互换。
- [SR] 强烈建议不支持音频适配器配件模式,如 USB Type-C 连接线和连接器规范 1.2 修订版附录 A 中所述。
- 应该实现最适合设备外形尺寸的 Try.* 模型。例如,手持设备应该实现 Try.SNK 模型。
7.8. 音频
7.8.1. 麦克风
如果设备实现包含麦克风,则它们
- [C-1-1] 必须报告
android.hardware.microphone
功能常量。 - [C-1-2] 必须满足第 5.4 节中的音频录制要求。
- [C-1-3] 必须满足第 5.6 节中的音频延迟要求。
- [SR] 强烈建议支持近超声波录制,如第 7.8.3 节中所述。
如果设备实现省略麦克风,则它们
- [C-2-1] 必须不报告
android.hardware.microphone
功能常量。 - [C-2-2] 必须至少将音频录制 API 实现为第 7 节中所述的空操作。
7.8.2. 音频输出
如果设备实现包含扬声器或用于音频输出外围设备(如 4 芯 3.5 毫米音频插孔或使用 USB 音频类的 USB 主机模式端口)的音频/多媒体输出端口,则它们
- [C-1-1] 必须报告
android.hardware.audio.output
功能常量。 - [C-1-2] 必须满足第 5.5 节中的音频播放要求。
- [C-1-3] 必须满足第 5.6 节中的音频延迟要求。
- [SR] 强烈建议支持近超声波播放,如第 7.8.3 节中所述。
如果设备实现不包含扬声器或音频输出端口,则它们
- [C-2-1] 必须不报告
android.hardware.audio.output
功能。 - [C-2-2] 必须至少将音频输出相关 API 实现为空操作。
对于本节而言,“输出端口”是指物理接口,例如 3.5 毫米音频插孔、HDMI 或具有 USB 音频类的 USB 主机模式端口。通过基于无线电的协议(如蓝牙、WiFi 或蜂窝网络)支持音频输出不符合包含“输出端口”的条件。
7.8.2.1. 模拟音频端口
为了与整个 Android 生态系统中使用 3.5 毫米音频插头的耳机和其他音频配件兼容,如果设备实现包含一个或多个模拟音频端口,则它们
- [C-SR] 强烈建议至少包含一个作为 4 芯 3.5 毫米音频插孔的音频端口。
如果设备实现具有 4 芯 3.5 毫米音频插孔,则它们
- [C-1-1] 必须支持音频播放到立体声耳机和带有麦克风的立体声耳机。
- [C-1-2] 必须支持具有 CTIA 引脚排列顺序的 TRRS 音频插头。
- [C-1-3] 必须支持检测并映射到音频插头上麦克风和地线导体之间以下 3 个等效阻抗范围的键码
-
70 欧姆或更小:
KEYCODE_HEADSETHOOK
-
210-290 欧姆:
KEYCODE_VOLUME_UP
-
360-680 欧姆:
KEYCODE_VOLUME_DOWN
-
70 欧姆或更小:
- [C-1-4] 必须在插入插头时触发
ACTION_HEADSET_PLUG
,但仅在插头上的所有触点都接触到插孔上的相关部分之后。 - [C-1-5] 必须能够驱动 32 欧姆扬声器阻抗上至少 150mV ± 10% 的输出电压。
- [C-1-6] 必须具有 1.8V ~ 2.9V 之间的麦克风偏置电压。
- [C-1-7] 必须检测并映射到音频插头上麦克风和地线导体之间以下等效阻抗范围的键码
-
110-180 欧姆:
KEYCODE_VOICE_ASSIST
-
110-180 欧姆:
- [C-SR] 强烈建议支持具有 OMTP 引脚排列顺序的音频插头。
- [C-SR] 强烈建议支持从带有麦克风的立体声耳机进行音频录制。
如果设备实现具有 4 芯 3.5 毫米音频插孔并支持麦克风,并且广播 android.intent.action.HEADSET_PLUG
,并将附加值 microphone 设置为 1,则它们
- [C-2-1] 必须支持检测插入的音频配件上的麦克风。
7.8.3. 近超声波
近超声波音频是指 18.5 kHz 至 20 kHz 频段。
设备实现
- 必须通过 AudioManager.getProperty API 正确报告对近超声波音频功能的支持,如下所示
如果 PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND
为“true”,则 VOICE_RECOGNITION
和 UNPROCESSED
音频源必须满足以下要求
- [C-1-1] 麦克风在 18.5 kHz 至 20 kHz 频段的平均功率响应必须不得低于 2 kHz 响应 15 dB 以上。
- [C-1-2] 对于 -26 dBFS 的 19 kHz 音调,麦克风在 18.5 kHz 至 20 kHz 范围内的非加权信噪比必须不得低于 50 dB。
如果 PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND
为“true”
- [C-2-1] 扬声器在 18.5 kHz - 20 kHz 范围内的平均响应必须不得低于 2 kHz 响应 40 dB 以上。
7.9. 虚拟现实
Android 包含用于构建“虚拟现实”(VR) 应用程序(包括高质量移动 VR 体验)的 API 和工具。设备实现必须正确实现本节中详细介绍的这些 API 和行为。
7.9.1. 虚拟现实模式
Android 包含对 VR 模式的支持,VR 模式是一项功能,用于处理通知的立体渲染,并在 VR 应用程序具有用户焦点时禁用单眼系统 UI 组件。
7.9.2. 虚拟现实模式 - 高性能
如果设备实现支持 VR 模式,则它们
- [C-1-1] 必须至少有 2 个物理核心。
- [C-1-2] 必须声明
android.hardware.vr.high_performance
功能。 - [C-1-3] 必须支持持续性能模式。
- [C-1-4] 必须支持 OpenGL ES 3.2。
- [C-1-5] 必须支持
android.hardware.vulkan.level
0。 - 应该支持
android.hardware.vulkan.level
1 或更高版本。 - [C-1-6] 必须实现
EGL_KHR_mutable_render_buffer
、EGL_ANDROID_front_buffer_auto_refresh
、EGL_ANDROID_get_native_client_buffer
、EGL_KHR_fence_sync
、EGL_KHR_wait_sync
、EGL_IMG_context_priority
、EGL_EXT_protected_content
、EGL_EXT_image_gl_colorspace
,并在可用 EGL 扩展列表中公开这些扩展。 - [C-1-8] 必须实现
GL_EXT_multisampled_render_to_texture2
、GL_OVR_multiview
、GL_OVR_multiview2
、GL_OVR_multiview_multisampled_render_to_texture
、GL_EXT_protected_textures
,并在可用 GL 扩展列表中公开这些扩展。 - [C-SR] 强烈建议实现
GL_EXT_external_buffer
、GL_EXT_EGL_image_array
,并在可用 GL 扩展列表中公开这些扩展。 - [C-SR] 强烈建议支持 Vulkan 1.1。
- [C-SR] 强烈建议实现
VK_ANDROID_external_memory_android_hardware_buffer
、VK_GOOGLE_display_timing
、VK_KHR_shared_presentable_image
,并在可用 Vulkan 扩展列表中公开这些扩展。 - [C-SR] 强烈建议公开至少一个 Vulkan 队列族,其中
flags
包含VK_QUEUE_GRAPHICS_BIT
和VK_QUEUE_COMPUTE_BIT
,并且queueCount
至少为 2。 - [C-1-7] GPU 和显示器必须能够同步访问共享的前缓冲区,以便在使用两个渲染上下文以 60fps 进行 VR 内容的交替眼渲染时,显示时没有可见的撕裂伪影。
- [C-1-9] 必须实现对
AHardwareBuffer
标志AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER
、AHARDWAREBUFFER_USAGE_SENSOR_DIRECT_DATA
和AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT
的支持,如 NDK 中所述。 - [C-1-10] 必须实现对
AHardwareBuffer
的支持,其具有使用标志AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT
、AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE
、AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT
的任意组合,至少对于以下格式:AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM
、AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM
、AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM
、AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT
。 - [C-SR] 强烈建议支持分配具有多个层以及 C-1-10 中指定的标志和格式的
AHardwareBuffer
。 - [C-1-11] 必须支持 H.264 解码,至少 3840 x 2160,30fps,压缩到平均 40Mbps(相当于 4 个 1920 x1080,30 fps-10 Mbps 或 2 个 1920 x 1080,60 fps-20 Mbps 的实例)。
- [C-1-12] 必须支持 HEVC 和 VP9,必须能够解码至少 1920 x 1080,30 fps,压缩到平均 10 Mbps,并且应该能够解码 3840 x 2160,30 fps-20 Mbps(相当于 4 个 1920 x 1080,30 fps-5 Mbps 的实例)。
- [C-1-13] 必须支持
HardwarePropertiesManager.getDeviceTemperatures
API,并返回皮肤温度的准确值。 - [C-1-14] 必须具有嵌入式屏幕,并且其分辨率必须至少为 1920 x 1080。
- [C-SR] 强烈建议具有至少 2560 x 1440 的显示分辨率。
- [C-1-15] 显示器在 VR 模式下必须至少以 60 Hz 的频率更新。
- [C-1-17] 显示器必须支持低持久模式,持久性 ≤ 5 毫秒,持久性定义为像素发光的时间量。
- [C-1-18] 必须支持蓝牙 4.2 和蓝牙 LE 数据长度扩展 第 7.4.3 节。
- [C-1-19] 必须支持并正确报告以下所有默认传感器类型的直接通道类型
-
TYPE_ACCELEROMETER
-
TYPE_ACCELEROMETER_UNCALIBRATED
-
TYPE_GYROSCOPE
-
TYPE_GYROSCOPE_UNCALIBRATED
-
TYPE_MAGNETIC_FIELD
-
TYPE_MAGNETIC_FIELD_UNCALIBRATED
-
- [C-SR] 强烈建议支持上述所有直接通道类型的
TYPE_HARDWARE_BUFFER
直接通道类型。 - [C-1-21] 必须满足第 7.3.9 节中指定的
android.hardware.hifi_sensors
的陀螺仪、加速度计和磁力计相关要求。 - [C-SR] 强烈建议支持
android.hardware.sensor.hifi_sensors
功能。 - [C-1-22] 必须具有不超过 28 毫秒的端到端运动到光子延迟。
- [C-SR] 强烈建议具有不超过 20 毫秒的端到端运动到光子延迟。
- [C-1-23] 必须具有至少 85% 的首帧比率,即从黑到白过渡后的第一帧像素亮度与稳态白像素亮度之比。
- [C-SR] 强烈建议具有至少 90% 的首帧比率。
- 可以为前台应用程序提供独占核心,并且可以支持
Process.getExclusiveCores
API 以返回专用于顶部前台应用程序的 CPU 核心编号。
如果支持独占核心,则该核心
- [C-2-1] 必须不允许任何其他用户空间进程在其上运行(应用程序使用的设备驱动程序除外),但可以允许一些内核进程根据需要运行。
8. 性能和功耗
一些最低性能和功耗标准对于用户体验至关重要,并且会影响开发人员在开发应用程序时应有的基线假设。
8.1. 用户体验一致性
如果有某些最低要求来确保应用程序和游戏的一致帧率和响应时间,则可以为最终用户提供流畅的用户界面。设备实现可以根据设备类型,对第 2 节中描述的用户界面延迟和任务切换具有可测量的要求。
8.2. 文件 I/O 访问性能
为应用程序私有数据存储(/data
分区)上一致的文件访问性能提供通用基线,使应用程序开发人员可以设置适当的期望,这将有助于他们的软件设计。设备实现可以根据设备类型,对以下读取和写入操作具有第 2 节中描述的某些要求
- 顺序写入性能。通过使用 10MB 写入缓冲区写入 256MB 文件来测量。
- 随机写入性能。通过使用 4KB 写入缓冲区写入 256MB 文件来测量。
- 顺序读取性能。通过使用 10MB 写入缓冲区读取 256MB 文件来测量。
- 随机读取性能。通过使用 4KB 写入缓冲区读取 256MB 文件来测量。
8.3. 省电模式
如果设备实现包含 AOSP 中包含或扩展 AOSP 中包含的功能以改进设备电源管理的功能,则它们
- [C-1-1] 必须不偏离 AOSP 实现的触发、维护、唤醒算法以及应用待机和 Doze 省电模式的全局系统设置的使用。
- [C-1-2] 必须不偏离 AOSP 实现的全局设置的使用,以管理应用待机中每个存储桶中应用的作业、警报和网络限制。
- [C-1-3] 必须不偏离 AOSP 实现的应用待机使用的应用待机存储桶的数量。
- [C-1-4] 必须实现应用待机存储桶和 Doze,如电源管理中所述。
- [C-1-5] 当设备处于省电模式时,必须为
PowerManager.isPowerSaveMode()
返回true
。 - [C-SR] 强烈建议提供用户可操作性以启用和禁用省电功能。
- [C-SR] 强烈建议提供用户可操作性以显示所有免除应用待机和 Doze 省电模式的应用。
除了省电模式外,Android 设备实现可以实现由高级配置和电源接口 (ACPI) 定义的 4 种睡眠电源状态中的任何一种或全部。
如果设备实现实现由 ACPI 定义的 S4 电源状态,则它们
- [C-1-1] 必须仅在用户采取明确操作将设备置于非活动状态(例如,通过关闭作为设备物理部件的上盖或关闭车辆或电视)之后,以及在用户重新激活设备(例如,通过打开上盖或重新打开车辆或电视)之前,才进入此状态。
如果设备实现实现由 ACPI 定义的 S3 电源状态,则它们
-
[C-2-1] 必须满足上述 C-1-1,或者,仅当第三方应用程序不需要系统资源(例如屏幕、CPU)时,才必须进入 S3 状态。
相反,当第三方应用程序需要系统资源时,必须退出 S3 状态,如本 SDK 中所述。
例如,当第三方应用程序请求通过
FLAG_KEEP_SCREEN_ON
保持屏幕开启或通过PARTIAL_WAKE_LOCK
保持 CPU 运行时,除非如 C-1-1 中所述,用户已采取明确操作将设备置于非活动状态,否则设备不得进入 S3 状态。相反,在通过 JobScheduler 实现的第三方应用程序的任务被触发或 Firebase 云消息传递被传递到第三方应用程序时,除非用户已将设备置于非活动状态,否则设备必须退出 S3 状态。这些不是全面的示例,AOSP 实现了广泛的唤醒信号,这些信号会触发从此状态唤醒。
8.4. 功耗核算
更准确地核算和报告功耗为应用程序开发人员提供了优化应用程序功耗模式的动力和工具。
设备实现
- [SR] 强烈建议提供每个组件的功耗配置文件,该文件定义了每个硬件组件的电流消耗值以及组件随时间推移造成的大致电池损耗,如 Android 开源项目站点中所述。
- [SR] 强烈建议以毫安时 (mAh) 为单位报告所有功耗值。
- [SR] 强烈建议报告每个进程 UID 的 CPU 功耗。Android 开源项目通过
uid_cputime
内核模块实现满足了该要求。 - [SR] 强烈建议通过
adb shell dumpsys batterystats
shell 命令向应用程序开发人员提供此功耗信息。 - 如果无法将硬件组件功耗归因于应用程序,则应该将其归因于硬件组件本身。
8.5. 一致的性能
对于高性能长时间运行的应用程序,性能可能会大幅波动,这可能是因为在后台运行的其他应用程序或由于温度限制导致的 CPU 节流。Android 包含编程接口,以便在设备有能力时,顶部前台应用程序可以请求系统优化资源分配以解决此类波动。
设备实现
-
[C-0-1] 必须通过
PowerManager.isSustainedPerformanceModeSupported()
API 方法准确报告对持续性能模式的支持。 -
应该支持持续性能模式。
如果设备实现报告支持持续性能模式,则它们
- [C-1-1] 当应用程序请求时,必须为顶部前台应用程序提供至少 30 分钟的一致性能水平。
- [C-1-2] 必须遵守
Window.setSustainedPerformanceMode()
API 和其他相关 API。
如果设备实现包含两个或多个 CPU 核心,则它们
- 应该提供至少一个可以由顶部前台应用程序保留的独占核心。
如果设备实现支持为顶部前台应用程序保留一个独占核心,则它们
- [C-2-1] 必须通过
Process.getExclusiveCores()
API 方法报告可以由顶部前台应用程序保留的独占核心的 ID 编号。 - [C-2-2] 必须不允许任何用户空间进程(应用程序使用的设备驱动程序除外)在独占核心上运行,但可以允许一些内核进程根据需要运行。
如果设备实现不支持独占核心,则它们
- [C-3-1] 必须通过
Process.getExclusiveCores()
API 方法返回空列表。
9. 安全模型兼容性
设备实现
-
[C-0-1] 必须实现与 Android 平台安全模型一致的安全模型,如 Android 开发者文档中 API 的安全性和权限参考文档中所定义。
-
[C-0-2] 必须支持安装自签名应用程序,而无需从任何第三方/机构请求任何其他权限/证书。具体而言,兼容设备必须支持以下小节中描述的安全机制。
9.1. 权限
设备实现
-
[C-0-1] 必须支持 Android 开发者文档中定义的 Android 权限模型。具体而言,它们必须强制执行 SDK 文档中描述的每个权限;不得省略、更改或忽略任何权限。
-
可以添加其他权限,前提是新的权限 ID 字符串不在
android.\*
命名空间中。 -
[C-0-2] 具有
PROTECTION_FLAG_PRIVILEGED
protectionLevel
的权限必须仅授予系统映像的特权路径中预安装的应用,并且在每个应用的显式允许列表权限的子集中。AOSP 实现通过从etc/permissions/
路径中的文件读取和遵守每个应用的允许列表权限,并使用system/priv-app
路径作为特权路径来满足此要求。
保护级别为危险的权限是运行时权限。 targetSdkVersion
> 22 的应用程序在运行时请求它们。
设备实现
- [C-0-3] 必须显示专用界面,供用户决定是否授予请求的运行时权限,并提供界面供用户管理运行时权限。
- [C-0-4] 必须具有用户界面的一个且仅一个实现。
- [C-0-5] 必须不向预安装的应用授予任何运行时权限,除非
- 在应用程序使用之前可以获得用户的同意。
- 运行时权限与预安装应用程序设置为默认处理程序的 intent 模式相关联。
- [C-0-6] 必须仅向注册了适当安全恢复代理的系统应用授予
android.permission.RECOVER_KEYSTORE
权限。适当安全恢复代理定义为设备上软件代理,该代理与设备外远程存储同步,该远程存储配备安全硬件,其保护级别等同于或强于 Google Cloud Key Vault Service 中描述的级别,以防止对锁屏知识因素进行暴力攻击。
如果设备实现包含预安装的应用或希望允许第三方应用访问使用情况统计信息,则它们
- [SR] 强烈建议提供用户可访问的机制,以响应声明了
android.permission.PACKAGE_USAGE_STATS
权限的应用的android.settings.ACTION_USAGE_ACCESS_SETTINGS
intent,授予或撤销对使用情况统计信息的访问权限。
如果设备实现打算禁止任何应用(包括预安装的应用)访问使用情况统计信息,则它们
- [C-1-1] 必须仍然需要有一个活动来处理
android.settings.ACTION_USAGE_ACCESS_SETTINGS
intent 模式,但必须将其实现为空操作,即具有与用户被拒绝访问时相同的行为。
9.2. UID 和进程隔离
设备实现
- [C-0-1] 必须支持 Android 应用程序沙箱模型,其中每个应用程序都以唯一的 Unix 风格 UID 和单独的进程运行。
- [C-0-2] 必须支持以相同的 Linux 用户 ID 运行多个应用程序,前提是这些应用程序已正确签名和构建,如安全性和权限参考中所定义。
9.3. 文件系统权限
设备实现
- [C-0-1] 必须支持安全性和权限参考中定义的 Android 文件访问权限模型。
9.4. 备选执行环境
即使设备实现包含运行时环境,这些运行时环境使用 Dalvik 可执行格式或本机代码以外的其他软件或技术来执行应用程序,设备实现必须保持 Android 安全和权限模型的一致性。换句话说
-
[C-0-1] 备选运行时本身必须是 Android 应用程序,并遵守第 9 节其他位置所述的标准 Android 安全模型。
-
[C-0-2] 不得授予备选运行时访问权限,以访问运行时
AndroidManifest.xml
文件中未通过 <uses-permission
> 机制请求的权限保护的资源。 -
[C-0-3] 不得允许备选运行时允许应用程序使用受限于系统应用程序的 Android 权限保护的功能。
-
[C-0-4] 备选运行时必须遵守 Android 沙箱模型,并且使用备选运行时安装的应用程序不得重用设备上安装的任何其他应用程序的沙箱,除非通过共享用户 ID 和签名证书的标准 Android 机制。
-
[C-0-5] 备选运行时不得启动、授予或被授予对与其他 Android 应用程序相对应的沙箱的访问权限。
-
[C-0-6] 备选运行时不得以超级用户 (root) 或任何其他用户 ID 的任何特权启动、被授予或授予给其他应用程序。
-
[C-0-7] 当备选运行时的
.apk
文件包含在设备实现的系统映像中时,必须使用与用于签署设备实现中包含的其他应用程序的密钥不同的密钥进行签名。 -
[C-0-8] 安装应用程序时,备选运行时必须获得用户对应用程序使用的 Android 权限的同意。
-
[C-0-9] 当应用程序需要使用设备资源(例如摄像头、GPS 等),且存在相应的 Android 权限时,备选运行时必须告知用户应用程序将能够访问该资源。
-
[C-0-10] 当运行时环境不以这种方式记录应用程序功能时,运行时环境必须在安装任何使用该运行时的应用程序时列出运行时本身拥有的所有权限。
-
备选运行时应该通过
PackageManager
将应用程序安装到单独的 Android 沙箱(Linux 用户 ID 等)中。 -
备选运行时可以提供一个由所有使用备选运行时的应用程序共享的 Android 沙箱。
9.5. 多用户支持
Android 包含对多用户的支持,并提供对完全用户隔离的支持。
- 如果设备实现使用可移动媒体作为主要外部存储,则设备实现可以启用多用户,但不应该这样做。
如果设备实现包含多用户,则它们
- [C-1-1] 必须满足与多用户支持相关的以下要求。
- [C-1-2] 对于每个用户,必须实现与 Android 平台安全模型一致的安全模型,如 API 中的安全性和权限参考文档中所定义。
- [C-1-3] 必须为每个用户实例提供单独且隔离的共享应用程序存储(又名
/sdcard
)目录。 - [C-1-4] 必须确保给定用户拥有和代表其运行的应用程序无法列出、读取或写入任何其他用户拥有的文件,即使两个用户的数据都存储在同一卷或文件系统中。
- [C-1-5] 如果设备实现使用可移动媒体作为外部存储 API,则在使用仅存储在仅系统可访问的不可移动媒体上的密钥启用多用户时,必须加密 SD 卡的内容。由于这将使主机 PC 无法读取该媒体,因此设备实现将需要切换到 MTP 或类似系统,以便为主机 PC 提供对当前用户数据的访问权限。
如果设备实现包含多用户且不声明 android.hardware.telephony
功能标志,则它们
- [C-2-1] 必须支持受限配置文件,这是一种允许设备所有者管理设备上其他用户及其功能的功能。使用受限配置文件,设备所有者可以为其他用户快速设置单独的工作环境,并能够管理这些环境中可用应用程序的更精细的限制。
如果设备实现包含多用户并声明 android.hardware.telephony
功能标志,则它们
- [C-3-1] 必须不支持受限配置文件,但必须与 AOSP 实现的控件对齐,以启用/禁用其他用户访问语音通话和短信。
9.6. 高级短信警告
Android 包含对警告用户任何发出的高级短信消息的支持。高级短信是发送到运营商注册的服务的短信,可能会向用户收取费用。
如果设备实现声明支持 android.hardware.telephony
,则它们
- [C-1-1] 必须在向设备中
/data/misc/sms/codes.xml
文件中定义的正则表达式标识的号码发送短信之前警告用户。上游 Android 开源项目提供了满足此要求的实现。
9.7. 安全功能
设备实现必须确保内核和平台中的安全功能符合下述要求。
Android 沙箱包括使用安全增强型 Linux (SELinux) 强制访问控制 (MAC) 系统、seccomp 沙箱和 Linux 内核中的其他安全功能的功能。设备实现
- [C-0-1] 即使在 Android 框架下实现了 SELinux 或任何其他安全功能,也必须保持与现有应用程序的兼容性。
- [C-0-2] 当在 Android 框架下实现的安全功能检测到并成功阻止安全违规时,必须不具有可见的用户界面,但是当发生未阻止的安全违规导致成功利用时,可以具有可见的用户界面。
- [C-0-3] 必须不使用户或应用程序开发者能够配置 SELinux 或在 Android 框架下实现的任何其他安全功能。
- [C-0-4] 必须禁止应用通过 API(例如设备管理 API)配置会破坏兼容性的策略,从而影响其他应用。
- [C-0-5] 必须将媒体框架拆分为多个进程,以便可以更精细地为每个进程授予访问权限,具体请参考 Android 开源项目网站中描述的内容。
- [C-0-6] 必须实现内核应用沙箱机制,该机制允许使用可配置策略从多线程程序中过滤系统调用。上游 Android 开源项目通过启用带有线程组同步 (TSYNC) 的 seccomp-BPF 来满足此要求,如 source.android.com 的内核配置部分所述。
内核完整性和自我保护功能是 Android 安全性的重要组成部分。设备实现
- [C-0-7] 必须实现内核栈缓冲区溢出保护(例如
CONFIG_CC_STACKPROTECTOR_STRONG
)。 - [C-0-8] 必须实现严格的内核内存保护,其中可执行代码为只读,只读数据为不可执行且不可写,可写数据为不可执行(例如
CONFIG_DEBUG_RODATA
或CONFIG_STRICT_KERNEL_RWX
)。 - [C-0-9] 对于最初搭载 API 级别 28 或更高版本的设备,必须实现用户空间和内核空间之间复制的静态和动态对象大小边界检查(例如
CONFIG_HARDENED_USERCOPY
)。 - [C-0-10] 对于最初搭载 API 级别 28 或更高版本的设备,在内核模式下执行时,必须禁止执行用户空间内存(例如硬件 PXN,或通过
CONFIG_CPU_SW_DOMAIN_PAN
或CONFIG_ARM64_SW_TTBR0_PAN
模拟)。 - [C-0-11] 对于最初搭载 API 级别 28 或更高版本的设备,必须禁止在内核中正常 usercopy 访问 API 之外读取或写入用户空间内存(例如硬件 PAN,或通过
CONFIG_CPU_SW_DOMAIN_PAN
或CONFIG_ARM64_SW_TTBR0_PAN
模拟)。 - [C-0-12] 对于最初搭载 API 级别 28 或更高版本的所有设备,必须实现内核页表隔离(例如
CONFIG_PAGE_TABLE_ISOLATION
或 `CONFIG_UNMAP_KERNEL_AT_EL0)。 - [SR] 强烈建议在初始化后将仅在初始化期间写入的内核数据标记为只读(例如
__ro_after_init
)。 - [SR] 强烈建议随机化内核代码和内存的布局,并避免可能损害随机化的暴露(例如
CONFIG_RANDOMIZE_BASE
,并通过/chosen/kaslr-seed 设备树节点
或EFI_RNG_PROTOCOL
使用引导加载程序熵)。
如果设备实现使用 Linux 内核,则它们
- [C-1-1] 必须实现 SELinux。
- [C-1-2] 必须将 SELinux 设置为全局强制模式。
- [C-1-3] 必须在强制模式下配置所有域。不允许使用许可模式域,包括特定于设备/供应商的域。
- [C-1-4] 不得修改、省略或替换上游 Android 开源项目 (AOSP) 中 system/sepolicy 文件夹内提供的 neverallow 规则,并且对于 AOSP SELinux 域以及设备/供应商特定域,策略必须在所有 neverallow 规则存在的情况下进行编译。
- [C-1-5] 必须在每个应用的 SELinux 沙箱中运行以 API 级别 28 或更高级别为目标的第三方应用,并在每个应用的私有数据目录上设置每个应用的 SELinux 限制。
- 建议保留上游 Android 开源项目的 system/sepolicy 文件夹中提供的默认 SELinux 策略,并且仅针对其自己的设备特定配置进一步添加此策略。
如果设备实现已在较早版本的 Android 上启动,并且无法通过系统软件更新来满足 [C-1-1] 和 [C-1-5] 要求,则可以免除这些要求。
如果设备实现使用 Linux 以外的内核,则它们
- [C-2-1] 必须使用等效于 SELinux 的强制访问控制系统。
Android 包含多种深度防御功能,这些功能是设备安全性的重要组成部分。
设备实现
- [C-SR] 强烈建议不要在已启用控制流完整性 (CFI) 或整数溢出清理 (IntSan) 的组件上禁用它们。
- [C-SR] 强烈建议为任何其他安全敏感的用户空间组件启用 CFI 和 IntSan,如 CFI 和 IntSan 中所述。
9.8. 隐私
9.8.1. 使用历史记录
Android 存储用户选择的历史记录,并通过 UsageStatsManager 管理此类历史记录。
设备实现
- [C-0-1] 必须保持此类用户历史记录的合理保留期限。
- [SR] 强烈建议保持 14 天的保留期限,这与 AOSP 实现中的默认配置相同。
Android 使用 StatsLog
标识符存储系统事件,并通过 StatsManager
和 IncidentManager
系统 API 管理此类历史记录。
设备实现
- [C-0-2] 必须仅在系统 API 类
IncidentManager
创建的事件报告中包含标记为DEST_AUTOMATIC
的字段。 - [C-0-3] 不得使用系统事件标识符来记录除
StatsLog
SDK 文档中所述事件之外的任何其他事件。如果记录了其他系统事件,则它们可以使用 100,000 到 200,000 范围内的不同原子标识符。
9.8.2. 录制
设备实现
- [C-0-1] 不得预加载或开箱即用地分发在未经用户同意或没有明确持续通知的情况下将用户的私人信息(例如,击键、屏幕上显示的文本)发送到设备外部的软件组件。
如果设备实现在系统中包含捕获屏幕上显示的内容和/或录制设备上播放的音频流的功能,则它们
- [C-1-1] 每当启用此功能并主动捕获/录制时,都必须向用户发出持续通知。
如果设备实现包含开箱即用的组件,该组件能够录制环境音频以推断有关用户情境的有用信息,则它们
- [C-2-1] 除非获得用户的明确同意,否则不得将录制的原始音频或任何可以转换回原始音频或近似副本的格式持久存储在设备上或传输到设备外部。
9.8.3. 连接性
如果设备实现具有支持 USB 外围设备模式的 USB 端口,则它们
- [C-1-1] 在允许通过 USB 端口访问共享存储的内容之前,必须呈现一个用户界面,询问用户是否同意。
9.8.4. 网络流量
设备实现
- [C-0-1] 必须为系统信任的证书颁发机构 (CA) 存储预安装与上游 Android 开源项目提供的相同的根证书。
- [C-0-2] 交付时必须配备一个空的用户根 CA 存储。
- [C-0-3] 当添加用户根 CA 时,必须向用户显示警告,指示网络流量可能受到监控。
如果设备流量通过 VPN 路由,则设备实现
- [C-1-1] 必须向用户显示警告,指示以下任一项:
- 网络流量可能受到监控。
- 网络流量正在通过提供 VPN 的特定 VPN 应用进行路由。
如果设备实现具有一种默认启用的机制,该机制通过代理服务器或 VPN 网关路由网络数据流量(例如,预加载授予 android.permission.CONTROL_VPN
权限的 VPN 服务),则它们
- [C-2-1] 在启用该机制之前必须征求用户的同意,除非该 VPN 是由设备策略控制器通过
DevicePolicyManager.setAlwaysOnVpnPackage()
启用的,在这种情况下,用户无需提供单独的同意,但必须仅被告知。
如果设备实现实现了用户界面来切换第三方 VPN 应用的“始终开启 VPN”功能,则它们
- [C-3-1] 对于在
AndroidManifest.xml
文件中通过将SERVICE_META_DATA_SUPPORTS_ALWAYS_ON
属性设置为false
而不支持始终开启 VPN 服务的应用,必须禁用此用户界面。
9.9. 数据存储加密
如果高级加密标准 (AES) 加密性能(使用设备上可用的最高性能 AES 技术(例如 ARM 加密扩展)测量)高于 50 MiB/秒,则设备实现
- [C-1-1] 必须支持应用私有数据(
/data
分区)以及应用共享存储分区(/sdcard
分区,如果它是设备的永久性、不可移动部分)的数据存储加密,但通常共享的设备实现(例如电视)除外。 - [C-1-2] 必须在用户完成开箱即用设置体验时默认启用数据存储加密,但通常共享的设备实现(例如电视)除外。
如果 AES 加密性能等于或低于 50 MiB/秒,则设备实现可以使用 Adiantum-XChaCha12-AES 来代替以下任何一项中列出的 AES 形式:第 9.9.2 节 [C-1-5] 中的 AES-256-XTS;第 9.9.2 节 [C-1-6] 中 CBS-CTS 模式下的 AES-256;第 9.9.3 节 [C-1-1] 中的 AES;第 9.9.3 节 [C-1-3] 中的 AES。
如果设备实现已在较早版本的 Android 上启动,并且无法通过系统软件更新来满足要求,则可以免除上述要求。
设备实现
- 建议通过实现基于文件的加密 (FBE) 来满足上述数据存储加密要求。
9.9.1. 直接启动
设备实现
-
[C-0-1] 即使设备实现不支持存储加密,也必须实现 Direct Boot 模式 API。
-
[C-0-2]
ACTION_LOCKED_BOOT_COMPLETED
和ACTION_USER_UNLOCKED
Intent 仍必须广播,以向 Direct Boot 感知应用发出设备加密 (DE) 和凭据加密 (CE) 存储位置可供用户使用的信号。
9.9.2. 基于文件的加密
如果设备实现支持 FBE,则它们
- [C-1-1] 必须在启动时无需用户提供凭据,并允许 Direct Boot 感知应用在广播
ACTION_LOCKED_BOOT_COMPLETED
消息后访问设备加密 (DE) 存储。 - [C-1-2] 只有在用户通过提供其凭据(例如,密码、PIN 码、图案或指纹)解锁设备并且广播
ACTION_USER_UNLOCKED
消息后,才必须允许访问凭据加密 (CE) 存储。 - [C-1-3] 不得提供任何在没有用户提供的凭据或注册的托管密钥的情况下解锁 CE 保护存储的方法。
- [C-1-4] 必须支持Verified Boot,并确保 DE 密钥在密码学上绑定到设备的硬件信任根。
- [C-1-5] 必须支持使用 AES-256-XTS 加密文件内容。AES-256-XTS 指的是密钥长度为 256 位的增强加密标准,以 XTS 模式运行。XTS 密钥的完整长度为 512 位。
-
[C-1-6] 必须支持使用 CBC-CTS 模式下的 AES-256 加密文件名。
-
保护 CE 和 DE 存储区域的密钥
-
[C-1-7] 必须在密码学上绑定到硬件支持的密钥库。
- [C-1-8] CE 密钥必须绑定到用户的锁屏凭据。
- [C-1-9] 当用户未指定锁屏凭据时,CE 密钥必须绑定到默认密码。
-
[C-1-10] 必须是唯一的且互不相同的,换句话说,任何用户的 CE 或 DE 密钥都不得与任何其他用户的 CE 或 DE 密钥匹配。
-
[C-1-11] 必须默认使用强制支持的密码、密钥长度和模式。
-
[C-SR] 强烈建议使用密码学上绑定到设备硬件信任根的密钥来加密文件系统元数据,例如文件大小、所有权、模式和扩展属性 (xattrs)。
-
建议使预安装的基本应用(例如闹钟、电话、消息)成为 Direct Boot 感知应用。
- 可以支持用于文件内容和文件名的备用密码、密钥长度和模式。
上游 Android 开源项目提供了基于 Linux 内核 ext4 加密功能的此功能的首选实现。
9.9.3. 全盘加密
如果设备实现支持全盘加密 (FDE),则它们
- [C-1-1] 必须使用为存储设计的模式(例如,XTS 或 CBC-ESSIV)中的 AES,以及 128 位或更长的密码密钥长度。
- [C-1-2] 必须使用默认密码来包装加密密钥,并且在任何时候都不得在未加密的情况下将加密密钥写入存储。
- [C-1-3] 必须默认使用 AES 加密加密密钥,除非用户明确选择退出,但活动使用时除外,此时使用慢速拉伸算法(例如 PBKDF2 或 scrypt)拉伸锁屏凭据。
- [C-1-4] 当用户未指定锁屏凭据或已禁用密码以进行加密,并且设备提供硬件支持的密钥库时,上述默认密码拉伸算法必须在密码学上绑定到该密钥库。
- [C-1-5] 不得将加密密钥发送到设备外部(即使在使用用户密码和/或硬件绑定密钥包装的情况下)。
上游 Android 开源项目提供了基于 Linux 内核功能 dm-crypt 的此功能的首选实现。
9.10. 设备完整性
以下要求确保设备完整性状态的透明度。设备实现
-
[C-0-1] 必须通过 System API 方法
PersistentDataBlockManager.getFlashLockState()
正确报告其引导加载程序状态是否允许刷写系统映像。FLASH_LOCK_UNKNOWN
状态保留供从较早版本的 Android 升级的设备实现使用,在较早版本中,此新的系统 API 方法不存在。 -
[C-0-2] 必须支持 Verified Boot 以确保设备完整性。
如果设备实现已在较早版本的 Android 上启动,但不支持 Verified Boot,并且无法通过系统软件更新添加对此功能的支持,则可以免除此要求。
Verified Boot 是一项保证设备软件完整性的功能。如果设备实现支持此功能,则它们
- [C-1-1] 必须声明平台功能标志
android.software.verified_boot
。 - [C-1-2] 必须在每个启动序列上执行验证。
- [C-1-3] 必须从作为信任根的不可变硬件密钥开始验证,并一直验证到系统分区。
- [C-1-4] 必须实现每个验证阶段,以在执行下一阶段中的代码之前检查下一阶段中所有字节的完整性和真实性。
- [C-1-5] 必须使用与 NIST 当前关于哈希算法 (SHA-256) 和公钥大小 (RSA-2048) 的建议一样强大的验证算法。
- [C-1-6] 当系统验证失败时,必须禁止完成启动,除非用户同意尝试继续启动,在这种情况下,不得使用来自任何未验证存储块的数据。
- [C-1-7] 除非用户已明确解锁引导加载程序,否则不得允许修改设备上的已验证分区。
- [C-SR] 如果设备中有多个独立的芯片(例如,无线电、专用图像处理器),则强烈建议每个芯片的启动过程在启动时验证每个阶段。
- [C-1-8] 必须使用防篡改存储:用于存储引导加载程序是否已解锁。防篡改存储意味着引导加载程序可以检测到存储是否已从 Android 内部被篡改。
- [C-1-9] 在使用设备时,必须提示用户,并要求物理确认,然后才允许从引导加载程序锁定模式转换为引导加载程序解锁模式。
- [C-1-10] 必须为 Android 使用的分区(例如,启动分区、系统分区)实施回滚保护,并使用防篡改存储来存储用于确定最低允许操作系统版本的元数据。
- [C-SR] 强烈建议使用以
/system
为根的信任链来验证所有特权应用 APK 文件,而/system
受 Verified Boot 保护。 - [C-SR] 强烈建议在执行特权应用从其 APK 文件外部加载的任何可执行工件(例如动态加载的代码或编译后的代码)之前对其进行验证,或者强烈建议完全不要执行它们。
- 建议为任何具有持久固件的组件(例如调制解调器、摄像头)实施回滚保护,并且建议使用防篡改存储来存储用于确定最低允许版本的元数据。
如果设备实现已在较早版本的 Android 上启动,但不支持 C-1-8 到 C-1-10,并且无法通过系统软件更新添加对这些要求的支持,则可以免除这些要求。
上游 Android 开源项目在 external/avb/
存储库中提供了此功能的首选实现,该实现可以集成到用于加载 Android 的引导加载程序中。
设备实现
- [C-R] 建议支持Android 受保护确认 API。
如果设备实现支持 Android 受保护确认 API,则它们
- [C-3-1] 必须为
ConfirmationPrompt.isSupported()
API 报告true
。 - [C-3-2] 必须确保安全硬件完全控制显示,以便 Android 操作系统无法阻止它,而不会被安全硬件检测到。
- [C-3-3] 必须确保安全硬件完全控制触摸屏。
9.11. 密钥和凭据
Android Keystore 系统允许应用开发者在容器中存储加密密钥,并通过 KeyChain API 或 Keystore API 在加密操作中使用它们。设备实现
- [C-0-1] 必须允许导入或生成至少 8,192 个密钥。
- [C-0-2] 锁屏身份验证必须限制尝试次数,并且必须具有指数退避算法。超过 150 次失败尝试后,每次尝试的延迟必须至少为 24 小时。
- 建议不要限制可以生成的密钥数量
当设备实现支持安全锁屏时,它
- [C-1-1] 必须使用隔离的执行环境来支持密钥库实现。
- [C-1-2] 必须具有 RSA、AES、ECDSA 和 HMAC 加密算法以及 MD5、SHA1 和 SHA-2 系列哈希函数的实现,以便在安全隔离于内核和以上层级运行的代码的区域中正确支持 Android Keystore 系统支持的算法。安全隔离必须阻止内核或用户空间代码可能访问隔离环境内部状态的所有潜在机制,包括 DMA。上游 Android 开源项目 (AOSP) 通过使用 Trusty 实现来满足此要求,但另一个基于 ARM TrustZone 的解决方案或经过第三方审查的正确基于虚拟机监控程序的隔离实现也是替代选项。
- [C-1-3] 必须在隔离的执行环境中执行锁屏身份验证,并且仅在成功时才允许使用绑定身份验证的密钥。锁屏凭据的存储方式必须仅允许隔离的执行环境执行锁屏身份验证。上游 Android 开源项目提供了 Gatekeeper 硬件抽象层 (HAL) 和 Trusty,可用于满足此要求。
- [C-1-4] 必须支持密钥证明,其中证明签名密钥受安全硬件保护,并且签名在安全硬件中执行。证明签名密钥必须在足够多的设备之间共享,以防止密钥被用作设备标识符。满足此要求的一种方法是共享相同的证明密钥,除非生产了至少 100,000 个给定 SKU 的单元。如果生产了超过 100,000 个 SKU 的单元,则每个 100,000 个单元可以使用不同的密钥。
- [C-1-5] 必须允许用户选择从解锁状态过渡到锁定状态的睡眠超时时间,最短允许超时时间为 15 秒。
请注意,如果设备实现已在较早版本的 Android 上启动,则此类设备可免于具有隔离执行环境支持的密钥库和支持密钥证明的要求,除非它声明需要隔离执行环境支持的密钥库的 android.hardware.fingerprint
功能。
9.11.1. 安全锁屏
AOSP 实现遵循分层身份验证模型,其中基于知识工厂的主要身份验证可以由辅助强生物识别或较弱的辅助模式支持。
设备实现
- [C-SR] 强烈建议仅将以下方法之一设置为主要身份验证方法
- 数字 PIN 码
- 字母数字密码
- 3x3 点网格上的滑动图案
请注意,以上身份验证方法在本文件中被称为建议的主要身份验证方法。
如果设备实现添加或修改了建议的主要身份验证方法,并使用新的身份验证方法作为锁定屏幕的安全方式,则新的身份验证方法
- [C-2-1] 必须是要求用户身份验证才能使用密钥中描述的用户身份验证方法。
- [C-2-2] 当用户解锁安全锁屏时,必须解锁所有密钥,以供第三方开发者应用使用。例如,所有密钥都必须通过相关 API(例如
createConfirmDeviceCredentialIntent
和setUserAuthenticationRequired
)供第三方开发者应用使用。
如果设备实现添加或修改了基于已知秘密解锁锁屏的身份验证方法,并使用新的身份验证方法被视为锁定屏幕的安全方式
- [C-3-1] 最短允许输入长度的熵必须大于 10 位。
- [C-3-2] 所有可能输入的最大熵必须大于 18 位。
- [C-3-3] 新的身份验证方法不得替换 AOSP 中实现和提供的任何建议的主要身份验证方法(即 PIN 码、图案、密码)。
- [C-3-4] 当设备策略控制器 (DPC) 应用通过
DevicePolicyManager.setPasswordQuality()
方法设置了密码质量策略,且其质量常数比PASSWORD_QUALITY_SOMETHING
更严格时,必须禁用新的身份验证方法。
如果设备实现添加或修改了建议的主要身份验证方法以解锁锁屏,并使用基于生物识别的新身份验证方法被视为锁定屏幕的安全方式,则新方法
- [C-4-1] 必须满足第 7.3.10.2 节中描述的所有要求。
- [C-4-2] 必须具有回退机制,以使用基于已知秘密的建议的主要身份验证方法之一。
- [C-4-3] 当设备策略控制器 (DPC) 应用通过调用方法
DevicePolicyManager.setKeyguardDisabledFeatures()
并使用任何关联的生物识别标志(即KEYGUARD_DISABLE_BIOMETRICS
、KEYGUARD_DISABLE_FINGERPRINT
、KEYGUARD_DISABLE_FACE
或KEYGUARD_DISABLE_IRIS
)设置了锁屏功能策略时,必须禁用新的身份验证方法,并且仅允许建议的主要身份验证方法解锁屏幕。 - [C-4-4] 必须至少每 72 小时或更短时间挑战用户进行建议的主要身份验证(例如 PIN 码、图案、密码)一次。
- [C-4-5] 必须具有与第 7.3.10 节中所述指纹传感器的要求相等或更强的错误接受率,否则,当设备策略控制器 (DPC) 应用通过
DevicePolicyManager.setPasswordQuality()
方法设置了密码质量策略,且其质量常数比PASSWORD_QUALITY_BIOMETRIC_WEAK
更严格时,必须禁用新的身份验证方法,并且仅允许建议的主要身份验证方法解锁屏幕。 - [C-SR] 强烈建议具有与第 7.3.10 节中所述指纹传感器要求相等或更强的欺骗和冒名顶替接受率。
- [C-4-6] 必须具有安全的处理管道,以便操作系统或内核泄露无法允许直接注入数据以错误地验证为用户身份。
- [C-4-7] 如果应用为
KeyGenParameterSpec.Built.setUserAuthenticationRequired()
设置了true
,并且生物识别是被动的(例如面部或虹膜,没有明确的意图信号),则必须与显式确认操作(例如:按钮按下)配对,以允许访问密钥库密钥。 - [C-SR] 强烈建议保护被动生物识别的确认操作,以便操作系统或内核泄露无法欺骗它。例如,这意味着基于物理按钮的确认操作通过安全元件 (SE) 的仅输入通用输入/输出 (GPIO) 引脚路由,该引脚不能通过物理按钮按下以外的任何其他方式驱动。
如果生物识别身份验证方法不满足第 7.3.10 节中描述的欺骗和冒名顶替接受率
- [C-5-1] 如果设备策略控制器 (DPC) 应用通过
DevicePolicyManager.setPasswordQuality()
方法设置了密码质量策略,且其质量常数比PASSWORD_QUALITY_BIOMETRIC_WEAK
更严格时,必须禁用这些方法。 - [C-5-2] 在任何 4 小时的空闲超时时间后,必须挑战用户进行建议的主要身份验证(例如:PIN 码、图案、密码)。在成功确认设备凭据后,空闲超时时间将被重置。
- [C-5-3] 这些方法不得被视为安全锁屏,并且必须满足本节下面以 C-8 开头的要求。
如果设备实现添加或修改了身份验证方法以解锁锁屏,并且新的身份验证方法基于物理令牌或位置
- [C-6-1] 它们必须具有回退机制,以使用基于已知秘密的建议的主要身份验证方法之一,并满足被视为安全锁屏的要求。
- [C-6-2] 当设备策略控制器 (DPC) 应用通过
DevicePolicyManager.setKeyguardDisabledFeatures(KEYGUARD_DISABLE_TRUST_AGENTS)
方法或DevicePolicyManager.setPasswordQuality()
方法设置了策略,且其质量常数比PASSWORD_QUALITY_UNSPECIFIED
更严格时,必须禁用新方法,并且仅允许建议的主要身份验证方法之一解锁屏幕。 - [C-6-3] 必须至少每 72 小时或更短时间挑战用户进行建议的主要身份验证方法之一(例如 PIN 码、图案、密码)。
- [C-6-4] 新方法不得被视为安全锁屏,并且必须遵循下面 C-8 中列出的约束。
如果设备实现具有安全锁屏并包含一个或多个信任代理(实现 TrustAgentService
系统 API),则它们
- [C-7-1] 当设备锁定被延迟或可以由信任代理解锁时,必须在设置菜单和锁屏上清楚地指示。例如,AOSP 通过在设置菜单中显示“自动锁定设置”和“电源按钮立即锁定”的文本描述以及锁屏上的可区分图标来满足此要求。
- [C-7-2] 必须尊重并完全实现
DevicePolicyManager
类中的所有信任代理 API,例如KEYGUARD_DISABLE_TRUST_AGENTS
常量。 - [C-7-3] 不得在用作主要个人设备(例如手持设备)的设备上完全实现
TrustAgentService.addEscrowToken()
函数,但可以在通常共享的设备实现(例如 Android 电视或汽车设备)上完全实现该函数。 - [C-7-4] 必须加密
TrustAgentService.addEscrowToken()
添加的所有存储令牌。 - [C-7-5] 不得在与密钥使用位置相同的设备上存储加密密钥。例如,允许存储在手机上的密钥解锁电视上的用户帐户。
- [C-7-6] 在启用托管令牌以解密数据存储之前,必须告知用户有关安全影响的信息。
- [C-7-7] 必须具有回退机制,以使用建议的主要身份验证方法之一。
- [C-7-8] 必须至少每 72 小时或更短时间挑战用户进行建议的主要身份验证(例如 PIN 码、图案、密码)方法之一。
- [C-7-9] 在任何 4 小时的空闲超时时间后,必须挑战用户进行建议的主要身份验证(例如 PIN 码、图案、密码)方法之一。在成功确认设备凭据后,空闲超时时间将被重置。
- [C-7-10] 不得被视为安全锁屏,并且必须遵循下面 C-8 中列出的约束。
如果设备实现添加或修改了身份验证方法以解锁锁屏,但该锁屏不是如上所述的安全锁屏,并且使用新的身份验证方法来解锁锁屏
- [C-8-1] 当设备策略控制器 (DPC) 应用通过
DevicePolicyManager.setPasswordQuality()
方法设置了密码质量策略,且其质量常数比PASSWORD_QUALITY_UNSPECIFIED
更严格时,必须禁用新方法。 - [C-8-2] 它们不得重置由
DevicePolicyManager.setPasswordExpirationTimeout()
设置的密码过期计时器。 - [C-8-3] 当应用为
KeyGenParameterSpec.Builder.setUserAuthenticationRequired()
设置true
时,它们不得对密钥库的访问进行身份验证)。
9.11.2. StrongBox
Android Keystore 系统允许应用开发者在专用安全处理器以及上述隔离的执行环境中存储加密密钥。
设备实现
- [C-SR] 强烈建议支持 StrongBox。
如果设备实现支持 StrongBox,则它们
-
[C-1-1] 必须声明 FEATURE_STRONGBOX_KEYSTORE。
-
[C-1-2] 必须提供专用安全硬件,用于支持密钥库和安全用户身份验证。
-
[C-1-3] 必须具有独立的 CPU,该 CPU 不与应用处理器 (AP) 共享缓存、DRAM、协处理器或其他核心资源。
-
[C-1-4] 必须确保与 AP 共享的任何外围设备都不能以任何方式更改 StrongBox 处理,或从 StrongBox 获取任何信息。AP 可以禁用或阻止对 StrongBox 的访问。
-
[C-1-5] 必须具有内部时钟,该时钟具有合理的精度(+/-10%),并且不受 AP 的操纵。
-
[C-1-6] 必须具有真随机数生成器,该生成器产生均匀分布且不可预测的输出。
-
[C-1-7] 必须具有防篡改性,包括抵抗物理穿透和故障注入。
-
[C-1-8] 必须具有侧信道抗性,包括抵抗通过功率、时序、电磁辐射和热辐射侧信道泄漏信息。
-
[C-1-9] 必须具有安全存储,以确保内容的机密性、完整性、真实性、一致性和新鲜度。除非 StrongBox API 允许,否则不得读取或更改存储。
-
为了验证是否符合 [C-1-3] 到 [C-1-9],设备实现
- [C-1-10] 必须包含已通过安全 IC 保护配置文件 BSI-CC-PP-0084-2014 认证的硬件,或由国家认可的测试实验室根据 通用准则智能卡攻击潜力应用进行的高攻击潜力漏洞评估进行评估。
- [C-1-11] 必须包含固件,该固件由国家认可的测试实验室根据 通用准则智能卡攻击潜力应用进行的高攻击潜力漏洞评估进行评估。
- [C-SR] 强烈建议包含使用安全目标、评估保证级别 (EAL) 5(通过 AVA_VAN.5 增强)进行评估的硬件。EAL 5 认证很可能在未来版本中成为一项要求。
-
[C-SR] 强烈建议提供内部人员攻击抵抗 (IAR),这意味着具有固件签名密钥的内部人员无法生成导致 StrongBox 泄漏机密信息、绕过功能安全要求或以其他方式允许访问敏感用户数据的固件。实施 IAR 的推荐方法是仅当通过 IAuthSecret HAL 提供主用户密码时才允许固件更新。
9.12. 数据删除
所有设备实现
- [C-0-1] 必须为用户提供执行“恢复出厂设置”的机制。
- [C-0-2] 必须删除所有用户生成的数据。即,以下数据除外的所有数据
- 系统映像
- 系统映像所需的任何操作系统文件
- [C-0-3] 必须以满足相关行业标准(如 NIST SP800-88)的方式删除数据。
- [C-0-4] 当主用户的设备策略控制器应用调用
DevicePolicyManager.wipeData()
API 时,必须触发上述“恢复出厂设置”过程。 - 可以提供快速数据擦除选项,该选项仅执行逻辑数据擦除。
9.13. 安全启动模式
Android 提供了安全启动模式,该模式允许用户启动到仅允许预安装的系统应用运行且禁用所有第三方应用的模式。此模式称为“安全启动模式”,为用户提供了卸载潜在有害的第三方应用的功能。
设备实现是
- [SR] 强烈建议实现安全启动模式。
如果设备实现实现了安全启动模式,则它们
-
[C-1-1] 必须为用户提供进入安全启动模式的选项,该选项不能被设备上安装的第三方应用中断,除非第三方应用是设备策略控制器并且已将
UserManager.DISALLOW_SAFE_BOOT
标志设置为 true。 -
[C-1-2] 必须为用户提供在安全模式下卸载任何第三方应用的功能。
-
应该为用户提供从启动菜单进入安全启动模式的选项,其工作流程与正常启动的工作流程不同。
9.14. 汽车车辆系统隔离
Android Automotive 设备预计通过使用 车辆 HAL 在车辆网络(如 CAN 总线)上发送和接收消息来与关键车辆子系统交换数据。
数据交换可以通过在 Android 框架层下实施安全功能来保护,以防止与这些子系统的恶意或意外交互。
9.15. 订阅计划
“订阅计划”是指移动运营商通过 SubscriptionManager.setSubscriptionPlans()
提供的计费关系计划详情。
所有设备实现
- [C-0-1] 必须仅将订阅计划返回给最初提供它们的移动运营商应用。
- [C-0-2] 不得远程备份或上传订阅计划。
- [C-0-3] 必须仅允许来自当前提供有效订阅计划的移动运营商应用的覆盖,例如
SubscriptionManager.setSubscriptionOverrideCongested()
。
10. 软件兼容性测试
设备实现必须通过本节中描述的所有测试。但是,请注意,没有哪个软件包测试是完全全面的。因此,强烈建议设备实现者尽可能少地更改 Android 开放源代码项目提供的 Android 参考实现和首选实现。这将最大限度地降低引入错误(这些错误会造成不兼容性,从而需要返工和潜在的设备更新)的风险。
10.1. 兼容性测试套件
设备实现
-
[C-0-1] 必须通过 Android 开放源代码项目提供的 Android 兼容性测试套件 (CTS),使用设备上的最终发布软件。
-
[C-0-2] 必须确保在 CTS 中存在歧义以及对参考源代码的任何重新实现的情况下实现兼容性。
CTS 旨在在实际设备上运行。与任何软件一样,CTS 本身可能包含错误。CTS 的版本将独立于此兼容性定义,并且可能会为 Android 9 发布 CTS 的多个修订版本。
设备实现
-
[C-0-3] 必须通过设备软件完成时可用的最新 CTS 版本。
-
应该尽可能多地使用 Android 开放源代码树中的参考实现。
10.2. CTS 验证程序
CTS 验证程序包含在兼容性测试套件中,旨在由人工操作员运行,以测试无法通过自动化系统测试的功能,例如摄像头和传感器的正确功能。
设备实现
- [C-0-1] 必须正确执行 CTS 验证程序中的所有适用案例。
CTS 验证程序具有针对多种硬件的测试,包括一些可选硬件。
设备实现
- [C-0-2] 必须通过针对他们拥有的硬件的所有测试;例如,如果设备拥有加速度计,则必须正确执行 CTS 验证程序中的加速度计测试案例。
此兼容性定义文档中注明为可选功能的功能的测试案例可以跳过或省略。
- [C-0-2] 如上所述,每个设备和每个版本都必须正确运行 CTS 验证程序。但是,由于许多版本非常相似,因此不期望设备实现者在仅在微不足道的方式上有所不同的版本上显式运行 CTS 验证程序。具体而言,与已通过 CTS 验证程序的实现仅在包含的语言区域设置、品牌等集合方面有所不同的设备实现可以省略 CTS 验证程序测试。
11. 可更新的软件
-
[C-0-1] 设备实现必须包含一种机制来替换整个系统软件。该机制不需要执行“实时”升级,也就是说,可能需要重启设备。可以使用任何方法,只要它可以替换设备上预安装的整个软件即可。例如,以下任何方法都将满足此要求
- 通过重启进行离线更新的“无线下载 (OTA)”。
- 通过 USB 从主机 PC 进行“有线”更新。
- 通过重启和从可移动存储设备上的文件进行更新的“离线”更新。
-
[C-0-2] 使用的更新机制必须支持在不擦除用户数据的情况下进行更新。也就是说,更新机制必须保留应用私有数据和应用共享数据。请注意,上游 Android 软件包含满足此要求的更新机制。
如果设备实现包含对非按流量计费数据连接(如 802.11 或蓝牙 PAN(个人区域网)配置文件)的支持,那么它们
- [C-1-1] 必须支持通过重启进行离线更新的 OTA 下载。
对于使用 Android 6.0 及更高版本启动的设备实现,更新机制应该支持验证系统映像在 OTA 后是否与预期结果完全相同。自 Android 5.1 以来添加的上游 Android 开放源代码项目中的基于块的 OTA 实现满足此要求。
此外,设备实现应该支持 A/B 系统更新。AOSP 使用启动控制 HAL 实现此功能。
如果在设备实现发布后但在其合理的产品寿命期内发现错误,并且经与 Android 兼容性团队协商后确定该错误会影响第三方应用的兼容性,则
- [C-2-1] 设备实现者必须通过软件更新来纠正错误,该软件更新可以通过刚刚描述的机制应用。
Android 包含允许设备所有者应用(如果存在)控制系统更新安装的功能。如果设备的系统更新子系统报告 android.software.device_admin,则它们
- [C-3-1] 必须实现 SystemUpdatePolicy 类中描述的行为。
12. 文档变更日志
有关此版本中兼容性定义的更改摘要
有关各个部分的更改摘要
12.1. 变更日志查看提示
更改标记如下
-
CDD
对兼容性要求的实质性更改。 -
文档
修饰性或构建相关的更改。
为了获得最佳查看效果,请将 pretty=full
和 no-merges
URL 参数附加到您的变更日志 URL。
13. 联系我们
您可以加入 android-compatibility 论坛,并询问澄清问题或提出您认为文档未涵盖的任何问题。