1. 简介
本文档列举了设备要与 Android 13 兼容必须满足的要求。
“必须 (MUST)”、“不得 (MUST NOT)”、“必需 (REQUIRED)”、“应 (SHALL)”、“不应 (SHALL NOT)”、“应该 (SHOULD)”、“不应该 (SHOULD NOT)”、“建议 (RECOMMENDED)”、“可以 (MAY)”和“可选 (OPTIONAL)”等术语的用法均符合 IETF 标准,该标准在 RFC2119 中定义。
在本文档中,“设备实现方”或“实现方”是指开发运行 Android 13 的硬件/软件解决方案的个人或组织。“设备实现”或“实现”是指如此开发的硬件/软件解决方案。
要被视为与 Android 13 兼容,设备实现必须满足本兼容性定义中提出的要求,包括通过引用并入的任何文档。
如果本定义或第 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 汽车实现
- W:Android 手表实现
- Tab:Android 平板电脑实现
- 条件 ID
- 当要求是无条件的,此 ID 设置为 0。
- 当要求是有条件的,对于第一个条件,此 ID 分配为 1,并且在同一章节和同一设备类型中,数字递增 1。
- 要求 ID
- 此 ID 从 1 开始,并在同一章节和同一条件下递增 1。
1.1.3. 第 2 节中的要求 ID
第 2 节中的要求 ID 有两个部分。第一部分对应于如上所述的章节 ID。第二部分标识外形规格和特定于外形规格的要求。
章节 ID 后跟如上所述的要求 ID。
- 第 2 节中的 ID 由以下部分组成:章节 ID / 设备类型 ID - 条件 ID - 要求 ID(例如,7.4.3/A-0-1)。
2. 设备类型
Android 开源项目提供了一个软件堆栈,可用于各种设备类型和外形规格。为了支持设备上的安全性,包括任何替换操作系统或备用内核实现的软件堆栈,预计将在安全环境中执行,如第 9 节和本 CDD 中的其他部分所述。一些设备类型具有相对更成熟的应用分发生态系统。
本节介绍了这些设备类型,以及适用于每种设备类型的附加要求和建议。
不属于任何所述设备类型的所有 Android 设备实现仍然必须满足本兼容性定义其他章节中的所有要求。
2.1 设备配置
有关按设备类型划分的硬件配置的主要差异,请参见本节后面的设备特定要求。
2.2. 手持设备要求
Android 手持设备是指通常通过手持使用的 Android 设备实现,例如 MP3 播放器、手机或平板电脑。
如果 Android 设备实现满足以下所有条件,则将其归类为手持设备
- 具有提供移动性的电源,例如电池。
- 物理对角线屏幕尺寸在 3.3 英寸(对于 API 级别 29 或更早版本出厂的设备实现,则为 2.5 英寸)到 8 英寸之间。
本节其余部分中的附加要求特定于 Android 手持设备实现。
2.2.1. 硬件
手持设备实现
- [7.1.1.1/H-0-1] 必须至少有一个符合本文档中描述的所有 Android 兼容显示屏。
[7.1.1.3/H-SR-1] 强烈建议为用户提供更改显示尺寸(屏幕密度)的方式。
[7.1.1.1/H-0-2] 必须支持 GPU 合成图形缓冲区,其大小至少与任何内置显示屏的最高分辨率一样大。
如果手持设备实现支持软件屏幕旋转,则它们
- [7.1.1.1/H-1-1]* 必须使提供给第三方应用的逻辑屏幕在短边上至少为 2 英寸,在长边上至少为 2.7 英寸。在 Android API 级别 29 或更早版本出厂的设备可以免除此要求。
如果手持设备实现不支持软件屏幕旋转,则它们
- [7.1.1.1/H-2-1]* 必须使提供给第三方应用的逻辑屏幕在短边上至少为 2.7 英寸。在 Android API 级别 29 或更早版本出厂的设备可以免除此要求。
如果手持设备实现通过 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.4.6/H-0-1] 必须通过系统属性
graphics.gpu.profiler.support
报告设备是否支持 GPU 性能分析功能。
如果手持设备实现通过系统属性 graphics.gpu.profiler.support
声明支持,则它们
- [7.1.4.6/H-1-1] 必须输出符合 Perfetto 文档中定义的 GPU 计数器和 GPU 渲染阶段架构的 protobuf 跟踪。
- [7.1.4.6/H-1-2] 必须按照 gpu 计数器跟踪数据包 proto 报告设备 GPU 计数器的符合性值。
- [7.1.4.6/H-1-3] 必须按照 渲染阶段跟踪数据包 proto 报告设备 GPU 渲染阶段的符合性值。
- [7.1.4.6/H-1-4] 必须报告 GPU 频率跟踪点,格式如 power/gpu_frequency 中指定。
手持设备实现
- [7.1.5/H-0-1] 必须包含对旧版应用兼容模式的支持,该模式由上游 Android 开源代码实现。也就是说,设备实现不得更改激活兼容模式的触发器或阈值,并且不得更改兼容模式本身的行为。
- [7.2.1/H-0-1] 必须包含对第三方输入法编辑器 (IME) 应用的支持。
- [7.2.3/H-0-2] 必须将返回功能(
KEYCODE_BACK
)的正常和长按事件都发送到前台应用。这些事件不得被系统消耗,并且可以由 Android 设备外部触发(例如,连接到 Android 设备的外部硬件键盘)。 - [7.2.3/H-0-3] 必须在提供主屏幕的所有 Android 兼容显示屏上提供主屏幕功能。
- [7.2.3/H-0-4] 必须在所有 Android 兼容显示屏上提供返回功能,并在至少一个 Android 兼容显示屏上提供最近任务功能。
- [7.2.4/H-0-1] 必须支持触摸屏输入。
- [7.2.4/H-SR-1] 强烈建议在长按
KEYCODE_MEDIA_PLAY_PAUSE
或KEYCODE_HEADSETHOOK
时启动用户选择的辅助应用,换句话说,即实现 VoiceInteractionService 的应用或处理ACTION_ASSIST
的 Activity(如果前台 Activity 不处理这些长按事件)。 - [7.3.1/H-SR-1] 强烈建议包含 3 轴加速度计。
如果手持设备实现包含 3 轴加速度计,则它们
- [7.3.1/H-1-1] 必须能够以至少 100 Hz 的频率报告事件。
如果手持设备实现包含 GPS/GNSS 接收器并通过 android.hardware.location.gps
功能标记向应用报告此功能,则它们
- [7.3.3/H-2-1] 必须在找到 GNSS 测量值后立即报告,即使尚未报告从 GPS/GNSS 计算的位置也是如此。
- [7.3.3/H-2-2] 必须报告 GNSS 伪距和伪距率,在开阔天空条件下,确定位置后,当静止或以小于 0.2 米/秒平方的加速度移动时,这些值足以在 20 米范围内计算位置,并在 0.2 米/秒范围内计算速度,至少在 95% 的时间内是这样。
如果手持设备实现包含 3 轴陀螺仪,则它们
可以进行语音通话并在 getPhoneType
中指示 PHONE_TYPE_NONE
以外的任何值的手持设备实现
- [7.3.8/H] 应该包含接近传感器。
手持设备实现
如果设备通过声明 PackageManager.FEATURE_WIFI_AWARE
支持 Wi-Fi 邻居感知网络 (NAN) 协议,并通过声明 PackageManager.FEATURE_WIFI_RTT
支持 Wi-Fi 定位(Wi-Fi 往返时间 - RTT),则它们
[7.4.2.5/H-1-1] 必须在 160 MHz 带宽下,在第 68 个百分位数(使用累积分布函数计算)时,准确报告范围在 +/-1 米以内;在 80 MHz 带宽下,在第 68 个百分位数时,准确报告范围在 +/-2 米以内;在 40 MHz 带宽下,在第 68 个百分位数时,准确报告范围在 +/-4 米以内;在 20 MHz 带宽下,在第 68 个百分位数时,准确报告范围在 +/-8 米以内,距离为 10 厘米、1 米、3 米和 5 米,通过 WifiRttManager#startRanging Android API 观察到。
[7.4.2.5/H-SR-1] 强烈建议在 160 MHz 带宽下,在第 90 个百分位数(使用累积分布函数计算)时,准确报告范围在 +/-1 米以内;在 80 MHz 带宽下,在第 90 个百分位数时,准确报告范围在 +/-2 米以内;在 40 MHz 带宽下,在第 90 个百分位数时,准确报告范围在 +/-4 米以内;在 20 MHz 带宽下,在第 90 个百分位数时,准确报告范围在 +/-8 米以内,距离为 10 厘米,通过 WifiRttManager#startRanging Android API 观察到。
强烈建议遵循 Presence Calibration 中指定的测量设置步骤。
如果手持设备实现包含使用 CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
列出功能的逻辑摄像头设备,则它们
- [7.5.4/H-1-1] 默认情况下必须具有正常视场 (FOV),并且必须介于 50 度到 95 度之间。
手持设备实现
- [7.6.1/H-0-1] 必须具有至少 4 GB 的非易失性存储空间,可用于应用私有数据(也称为“/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
。
如果手持设备实现包含的内核和用户空间可用内存大于或等于 2GB 且小于 4GB,则它们
- [7.6.1/H-SR-1] 强烈建议仅支持 32 位用户空间(包括应用和系统代码)
如果手持设备实现包含的内核和用户空间可用内存少于 2GB,则它们
- [7.6.1/H-1-1] 必须仅支持单个 ABI(仅 64 位或仅 32 位)。
手持设备实现
如果手持设备实现包含支持外围设备模式的 USB 端口,则它们
- [7.7.1/H-1-1] 必须实现 Android 开放配件 (AOA) API。
如果手持设备实现包含支持主机模式的 USB 端口,则它们
手持设备实现
如果手持设备实现能够满足支持 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
启用。
如果手持设备实现包含一个或多个主机模式的 USB-C 端口并实现(USB 音频类),除了第 7.7.2 节中的要求外,它们
- [7.8.2.2/H-1-1] 必须提供以下 HID 代码的软件映射
功能 | 映射 | 上下文 | 行为 |
---|---|---|---|
A | HID 用途页:0x0C HID 用途:0x0CD 内核键: KEY_PLAYPAUSE Android 键: KEYCODE_MEDIA_PLAY_PAUSE |
媒体播放 | 输入:短按 输出:播放或暂停 |
输入:长按 输出:启动语音命令 发送:如果设备已锁定或屏幕已关闭,则发送 android.speech.action.VOICE_SEARCH_HANDS_FREE 。否则,发送 android.speech.RecognizerIntent.ACTION_WEB_SEARCH |
|||
来电 | 输入:短按 输出:接听电话 |
||
输入:长按 输出:拒接电话 |
|||
通话中 | 输入:短按 输出:结束通话 |
||
输入:长按 输出:麦克风静音或取消静音 |
|||
B | HID 用途页:0x0C HID 用途:0x0E9 内核键: KEY_VOLUMEUP Android 键: VOLUME_UP |
媒体播放,通话中 | 输入:短按或长按 输出:增大系统或耳机音量 |
C | HID 用途页:0x0C HID 用途:0x0EA 内核键: KEY_VOLUMEDOWN Android 键: VOLUME_DOWN |
媒体播放,通话中 | 输入:短按或长按 输出:减小系统或耳机音量 |
D | HID 用途页:0x0C HID 用途:0x0CF 内核键: KEY_VOICECOMMAND Android 键: KEYCODE_VOICE_ASSIST |
全部。可以在任何情况下触发。 | 输入:短按或长按 输出:启动语音命令 |
- [7.8.2.2/H-1-2] 插入耳机时,**必须**触发 ACTION_HEADSET_PLUG Intent,但仅限于在 USB 音频接口和端点已正确枚举以识别所连接终端的类型之后。
当检测到 USB 音频终端类型 0x0302 时,它们
- [7.8.2.2/H-2-1] **必须**广播 Intent ACTION_HEADSET_PLUG,并将 "microphone" extra 设置为 0。
当检测到 USB 音频终端类型 0x0402 时,它们
- [7.8.2.2/H-3-1] **必须**广播 Intent ACTION_HEADSET_PLUG,并将 "microphone" extra 设置为 1。
当连接 USB 外围设备时调用 API AudioManager.getDevices(),它们
[7.8.2.2/H-4-1] 如果 USB 音频终端类型字段为 0x0302,**必须**列出一个类型为 AudioDeviceInfo.TYPE_USB_HEADSET 且角色为 isSink() 的设备。
[7.8.2.2/H-4-2] 如果 USB 音频终端类型字段为 0x0402,**必须**列出一个类型为 AudioDeviceInfo.TYPE_USB_HEADSET 且角色为 isSink() 的设备。
[7.8.2.2/H-4-3] 如果 USB 音频终端类型字段为 0x0402,**必须**列出一个类型为 AudioDeviceInfo.TYPE_USB_HEADSET 且角色为 isSource() 的设备。
[7.8.2.2/H-4-4] 如果 USB 音频终端类型字段为 0x603,**必须**列出一个类型为 AudioDeviceInfo.TYPE_USB_DEVICE 且角色为 isSink() 的设备。
[7.8.2.2/H-4-5] 如果 USB 音频终端类型字段为 0x604,**必须**列出一个类型为 AudioDeviceInfo.TYPE_USB_DEVICE 且角色为 isSource() 的设备。
[7.8.2.2/H-4-6] 如果 USB 音频终端类型字段为 0x400,**必须**列出一个类型为 AudioDeviceInfo.TYPE_USB_DEVICE 且角色为 isSink() 的设备。
[7.8.2.2/H-4-7] 如果 USB 音频终端类型字段为 0x400,**必须**列出一个类型为 AudioDeviceInfo.TYPE_USB_DEVICE 且角色为 isSource() 的设备。
[7.8.2.2/H-SR-1] **强烈建议**在连接 USB-C 音频外围设备后,在 1000 毫秒内执行 USB 描述符的枚举,识别终端类型并广播 Intent ACTION_HEADSET_PLUG。
如果手持设备实现声明了 android.hardware.audio.output
和 android.hardware.microphone
,则它们
[5.6/H-1-1] **必须**在 5 次测量中,在以下数据路径:“扬声器到麦克风”、3.5 毫米环回适配器(如果支持)、USB 环回(如果支持)上,具有 500 毫秒或更小的平均连续往返延迟,且平均绝对偏差小于 50 毫秒。
[5.6/H-1-2] **必须**在至少 5 次测量中,在扬声器到麦克风数据路径上,具有 500 毫秒或更小的平均 Tap-to-tone 延迟。
如果手持设备实现包含至少一个触觉致动器,则它们
- [7.10/H]* **应该**不使用偏心旋转质量 (ERM) 触觉致动器(振动器)。
- [7.10/H]* **应该**将致动器的位置放置在设备通常被手持或触摸的位置附近。
- [7.10/H]* **应该**为 清晰触感 实现 android.view.HapticFeedbackConstants 中的所有公共常量,即(CLOCK_TICK、CONTEXT_CLICK、KEYBOARD_PRESS、KEYBOARD_RELEASE、KEYBOARD_TAP、LONG_PRESS、TEXT_HANDLE_MOVE、VIRTUAL_KEY、VIRTUAL_KEY_RELEASE、CONFIRM、REJECT、GESTURE_START 和 GESTURE_END)。
- [7.10/H]* **应该**为 清晰触感 实现 android.os.VibrationEffect 中的所有公共常量,即(EFFECT_TICK、EFFECT_CLICK、EFFECT_HEAVY_CLICK 和 EFFECT_DOUBLE_CLICK),以及 丰富触感 中 android.os.VibrationEffect.Composition 的所有可行的公共
PRIMITIVE_*
常量,即(CLICK、TICK、LOW_TICK、QUICK_FALL、QUICK_RISE、SLOW_RISE、SPIN、THUD)。其中一些原语,例如 LOW_TICK 和 SPIN,可能仅在振动器可以支持相对低频率的情况下可行。 [7.10/H]* **应该**遵循 映射公共常量的指南,将 android.view.HapticFeedbackConstants 中的公共常量映射到推荐的 android.os.VibrationEffect 常量,并具有相应的振幅关系。
[7.10/H]* **应该**对 createOneShot() 和 createWaveform() API 执行 质量评估。
[7.10/H]* **应该**验证公共 API android.os.Vibrator.hasAmplitudeControl() 的结果是否正确反映了其振动器的功能。
线性谐振致动器 (LRA) 是一个单质量弹簧系统,它具有一个主谐振频率,在该频率下,质量沿期望运动的方向平移。
如果手持设备实现包含至少一个线性谐振致动器,则它们
- [7.10/H]* **应该**在纵向方向的 X 轴(左右)上移动触觉致动器。
如果手持设备实现具有 X 轴线性谐振致动器 (LRA) 的触觉致动器,则它们
- [7.10/H]* **应该**使 X 轴 LRA 的谐振频率低于 200 Hz。
如果手持设备实现遵循触觉常量映射,则它们
- [7.10/H]* **应该**通过运行 android.os.Vibrator.areAllEffectsSupported() 和 android.os.Vibrator.arePrimitivesSupported() API 来验证实现状态。
2.2.2. 多媒体
手持设备实现**必须**支持以下音频编码和解码格式,并使其可供第三方应用程序使用
- [5.1/H-0-1] AMR-NB
- [5.1/H-0-2] AMR-WB
- [5.1/H-0-3] MPEG-4 AAC Profile (AAC LC)
- [5.1/H-0-4] MPEG-4 HE AAC Profile (AAC+)
- [5.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.2.3.1/H-0-2]* **必须**为 此处列出的所有公共 Intent 过滤器模式预加载一个或多个应用程序或服务组件,其中包含 Intent 处理程序。
- [3.2.3.1/H-SR-1] **强烈建议**预加载一个电子邮件应用程序,该应用程序可以处理 ACTION_SENDTO 或 ACTION_SEND 或 ACTION_SEND_MULTIPLE Intent 以发送电子邮件。
- [3.4.1/H-0-1] **必须**提供
android.webkit.Webview
API 的完整实现。 - [3.4.2/H-0-1] **必须**包含一个独立的浏览器应用程序,用于一般的用户网页浏览。
- [3.8.1/H-SR-1] **强烈建议**实现一个默认启动器,该启动器支持应用内固定快捷方式、小部件和 widgetFeatures。
- [3.8.1/H-SR-2] **强烈建议**实现一个默认启动器,该启动器提供通过 ShortcutManager API 快速访问第三方应用程序提供的其他快捷方式。
- [3.8.1/H-SR-3] **强烈建议**包含一个默认启动器应用程序,该应用程序显示应用程序图标的徽章。
- [3.8.2/H-SR-1] **强烈建议**支持第三方应用程序小部件。
- [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-1] **强烈建议**在通知栏中显示通过
RemoteInput.Builder setChoices()
提供的第一个选项,无需额外的用户交互。 - [3.8.3/H-SR-2] **强烈建议**当用户展开通知栏中的所有通知时,在通知栏中显示通过
RemoteInput.Builder setChoices()
提供的所有选项。 - [3.8.3.1/H-SR-1] **强烈建议**以内联方式显示
Notification.Action.Builder.setContextual
设置为true
的操作,与Notification.Remoteinput.Builder.setChoices
显示的回复对齐。 - [3.8.4/H-SR-1] **强烈建议**在设备上实现一个助手来处理 Assist action。
如果手持设备实现支持 MediaStyle 通知,则它们
- [3.8.3.1/H-SR-2] **强烈建议**提供一个用户操作界面(例如,输出切换器),可以从系统 UI 访问,允许用户在应用发布带有
MediaSession
token 的MediaStyle
通知时,在合适的可用媒体路由(例如,蓝牙设备和提供给MediaRouter2Manager
的路由)之间切换。
如果手持设备实现支持 Assist action,则它们
- [3.8.4/H-SR-2] **强烈建议**使用长按
HOME
键作为启动助手应用程序的指定交互,如 7.2.3 节中所述。**必须**启动用户选择的助手应用程序,换句话说,即实现VoiceInteractionService
的应用程序,或处理ACTION_ASSIST
Intent 的 Activity。
如果手持设备实现支持 对话通知
并将它们与警报通知和静默非对话通知分组到一个单独的部分,则它们
- [3.8.4/H-1-1]* **必须**将对话通知显示在非对话通知之前,但正在进行的前台服务通知和 importance:high 通知除外。
如果 Android 手持设备实现支持锁屏,则它们
- [3.8.10/H-1-1] **必须**显示锁屏通知,包括媒体通知模板。
如果手持设备实现支持安全锁屏,则它们
如果手持设备实现包含对 ControlsProviderService
和 Control
API 的支持,并允许第三方应用程序发布 设备控件,那么它们
- [3.8.16/H-1-1] **必须**声明功能标志
android.software.controls
并将其设置为true
。 - [3.8.16/H-1-2] **必须**提供一个用户操作界面,使用户能够从第三方应用程序通过
ControlsProviderService
和Control
API 注册的控件中添加、编辑、选择和操作用户最喜欢的设备控件。 - [3.8.16/H-1-3] **必须**在默认启动器的三次交互内提供对此用户操作界面的访问。
[3.8.16/H-1-4] **必须**在此用户操作界面中准确呈现每个通过
ControlsProviderService
API 提供控件的第三方应用程序的名称和图标,以及Control
API 提供的任何指定字段。[3.8.16/H-1-5] **必须**提供一个用户操作界面,使用户能够选择退出第三方应用程序通过
ControlsProviderService
和Control
Control.isAuthRequired
API 注册的应用程序指定的无需身份验证的设备控件。
相反,如果手持设备实现未实现此类控件,则它们
- [3.8.16/H-2-1] **必须**为
ControlsProviderService
和Control
API 报告null
。 - [3.8.16/H-2-2] **必须**声明功能标志
android.software.controls
并将其设置为false
。
如果手持设备实现未在 锁任务模式 下运行,当内容复制到剪贴板时,它们
- [3.8.17/H-1-1] **必须**向用户显示已将数据复制到剪贴板的确认信息(例如,缩略图或 “内容已复制。” 警报)。此外,此处还应包含剪贴板数据是否将在设备之间同步的指示。
手持设备实现
- [3.10/H-0-1] **必须**支持第三方辅助功能服务。
- [3.10/H-SR-1] **强烈建议**在设备上预加载辅助功能服务,其功能与 talkback 开源项目中提供的 Switch Access 和 TalkBack(对于预安装的文本转语音引擎支持的语言)辅助功能服务相当或超过其功能。
- [3.11/H-0-1] **必须**支持安装第三方 TTS 引擎。
- [3.11/H-SR-1] **强烈建议**包含一个 TTS 引擎,该引擎支持设备上可用的语言。
- [3.13/H-SR-1] **强烈建议**包含一个快速设置 UI 组件。
如果 Android 手持设备实现声明 FEATURE_BLUETOOTH
或 FEATURE_WIFI
支持,则它们
- [3.16/H-1-1] **必须**支持伴侣设备配对功能。
如果导航功能作为屏幕上的基于手势的操作提供
- [7.2.3/H] Home 功能的手势识别区域的**应该**高度不超过屏幕底部的 32 dp。
如果手持设备实现从屏幕的左右边缘的任何位置提供导航功能作为手势
- [7.2.3/H-0-1] 导航功能的手势区域在每侧**必须**小于 40 dp 宽度。手势区域**应该**默认为 24 dp 宽度。
如果手持设备实现支持安全锁屏并且具有大于或等于 2GB 的内核和用户空间可用内存,则它们
- [3.9/H-1-2] **必须**通过
android.software.managed_users
功能标志声明对托管配置文件的支持。
如果 Android 手持设备实现通过 android.hardware.camera.any
声明对摄像头的支持,则它们
- [7.5.4/H-1-1] **必须**遵循
android.media.action.STILL_IMAGE_CAMERA
和android.media.action.STILL_IMAGE_CAMERA_SECURE
Intent,并按照 SDK 中的描述以静止图像模式启动相机。 - [7.5.4/H-1-2] **必须**遵循
android.media.action.VIDEO_CAMERA
Intent,以按照 SDK 中的描述以视频模式启动相机。
如果手持设备实现的设置应用程序使用活动嵌入来实现 分屏功能,那么它们
- [3.2.3.1/ H-1-1] 当分屏功能开启时,**必须**具有一个 Activity 来处理 Settings#ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY Intent。该 Activity **必须**受
android.permission.LAUNCH_MULTI_PANE_SETTINGS_DEEP_LINK
保护,并且**必须**启动从 Settings#EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_INTENT_URI 解析的 Intent 的 Activity。
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/s 的顺序写入性能。
- [8.2/H-0-2] **必须**确保至少 0.5 MB/s 的随机写入性能。
- [8.2/H-0-3] **必须**确保至少 15 MB/s 的顺序读取性能。
- [8.2/H-0-4] **必须**确保至少 3.5 MB/s 的随机读取性能。
如果手持设备实现包含用于改进设备电源管理的功能,这些功能包含在 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 并显示一个设置菜单,其中显示此功耗使用情况。
手持设备实现
- [8.5/H-0-1] **必须**在“设置”菜单中提供用户操作界面,使用户能够停止正在运行前台服务的应用程序,并显示所有具有活动前台服务的应用程序以及自服务启动以来每个服务的持续时间,如 SDK 文档中所述。
- 某些应用程序**可以**被豁免停止或列在此类用户操作界面中,如 SDK 文档中所述。
2.2.5. 安全模型
手持设备实现
- [9.1/H-0-1] **必须**允许第三方应用程序通过
android.permission.PACKAGE_USAGE_STATS
权限访问使用情况统计信息,并提供用户可访问的机制,以响应android.settings.ACTION_USAGE_ACCESS_SETTINGS
Intent,授予或撤销对此类应用程序的访问权限。
手持设备实现
- [9.11/H-0-2] **必须**使用隔离的执行环境来备份密钥库实现。
- [9.11/H-0-3] **必须**具有 RSA、AES、ECDSA 和 HMAC 加密算法以及 MD5、SHA1 和 SHA-2 系列哈希函数的实现,以便在安全隔离于内核及以上运行代码的区域中正确支持 Android Keystore 系统支持的算法。安全隔离**必须**阻止内核或用户空间代码可能访问隔离环境内部状态的所有潜在机制,包括 DMA。上游 Android 开源项目 (AOSP) 通过使用 Trusty 实现来满足此要求,但另一个基于 ARM TrustZone 的解决方案或第三方审查的安全管理程序隔离实现是替代方案。
- [9.11/H-0-4] **必须**在隔离的执行环境中执行锁屏身份验证,并且仅在成功时才允许使用身份验证绑定的密钥。锁屏凭据**必须**以仅允许隔离的执行环境执行锁屏身份验证的方式存储。上游 Android 开源项目提供了 Gatekeeper 硬件抽象层 (HAL) 和 Trusty,可用于满足此要求。
- [9.11/H-0-5] **必须**支持密钥证明,其中证明签名密钥受安全硬件保护,并且签名在安全硬件中执行。证明签名密钥**必须**在足够多的设备之间共享,以防止密钥被用作设备标识符。满足此要求的一种方法是共享相同的证明密钥,除非给定的 SKU 生产了至少 100,000 台设备。如果某个 SKU 的产量超过 100,000 台,则每 100,000 台设备**可以**使用不同的密钥。
- [9/H-0-1] **必须**声明 ‘android.hardware.security.model.compatible’ 功能。
请注意,如果设备实现已在较早的 Android 版本上启动,则此类设备可以免除密钥库由隔离的执行环境支持和支持密钥证明的要求,除非它声明需要密钥库由隔离的执行环境支持的 android.hardware.fingerprint
功能。
当手持设备实现支持安全锁屏时,它们
- [9.11/H-1-1] **必须**允许用户选择最短的睡眠超时时间,即从解锁状态到锁定状态的转换时间,为 15 秒或更短。
- [9.11/H-1-2] **必须**提供用户操作界面来隐藏通知并禁用除 9.11.1 安全锁屏中描述的主要身份验证之外的所有形式的身份验证。AOSP 满足作为锁定模式的要求。
如果手持设备实现包含多个用户并且未声明 android.hardware.telephony
功能标志,则它们
- [9.5/H-2-1] **必须**支持受限配置文件,这项功能允许设备所有者管理设备上的其他用户及其功能。借助受限配置文件,设备所有者可以快速为其他用户设置单独的环境以进行工作,并能够更精细地管理这些环境中可用的应用程序中的限制。
如果手持设备实现包含多个用户并声明 android.hardware.telephony
功能标志,则它们
- [9.5/H-3-1] **必须**不支持受限配置文件,但**必须**与 AOSP 实现的控件保持一致,以启用/禁用其他用户访问语音通话和 SMS。
Android 通过 System API VoiceInteractionService 支持一种用于安全常时热词检测的机制,而无需麦克风访问指示
如果手持设备实现支持 System API HotwordDetectionService
或另一种无需麦克风访问指示的热词检测机制,则它们
- [9.8/H-1-1] **必须**确保热词检测服务只能将数据传输到 System 或 ContentCaptureService。
- [9.8/H-1-2] 必须确保热词检测服务只能通过
HotwordDetectionService
API 向系统服务器传输麦克风音频数据或从中派生的数据,或者通过ContentCaptureManager
API 向ContentCaptureService
传输数据。 - [9.8/H-1-3] 对于单个硬件触发的请求,传输到热词检测服务的麦克风音频时长不得超过 30 秒。
- [9.8/H-1-4] 对于发送到热词检测服务的单个请求,缓冲麦克风音频的时长不得超过 8 秒。
- [9.8/H-1-5] 对于发送到语音互动服务或类似实体的缓冲麦克风音频,时长不得超过 30 秒。
- [9.8/H-1-6] 在每次成功的热词结果中,不允许从热词检测服务传输超过 100 字节的非音频数据。
- [9.8/H-1-7] 在每次负面热词结果中,不允许从热词检测服务传输超过 5 比特的数据。
- [9.8/H-1-8] 只有在系统服务器发送热词验证请求时,才允许从热词检测服务传输数据。
- [9.8/H-1-9] 不允许用户安装的应用提供热词检测服务。
- [9.8/H-1-10] 不得在用户界面上显示有关热词检测服务麦克风使用情况的定量数据。
- [9.8/H-1-11] 必须记录每次从热词检测服务进行的传输中包含的字节数,以便安全研究人员进行检查。
- [9.8/H-1-12] 必须支持调试模式,记录每次从热词检测服务进行的传输的原始内容,以便安全研究人员进行检查。
- [9.8/H-1-14] 当成功的热词结果传输到语音互动服务或类似实体时,必须显示麦克风指示器,如 9.8.2 节所述。
- [9.8/H-SR-1] 强烈建议在将应用设置为热词检测服务提供商之前通知用户。
- [9.8/H-SR-2] 强烈建议不允许从热词检测服务传输非结构化数据。
- [9.8/H-SR-3] 强烈建议至少每小时或每 30 次硬件触发事件(以先到者为准)重启托管热词检测服务的进程一次。
如果设备实现包含使用 System API HotwordDetectionService
或类似机制进行热词检测且不显示麦克风使用指示的应用,则该应用
- [9.8/H-2-1] 必须为每个支持的热词短语向用户提供明确通知。
- [9.8/H-2-2] 不得通过热词检测服务保留原始音频数据或从中派生的数据。
- [9.8/H-2-3] 不得从热词检测服务传输音频数据、可用于(全部或部分)重建音频的数据或与热词本身无关的音频内容,除非传输到
ContentCaptureService
。
如果手持设备实现声明 android.hardware.microphone
,则它们
- [9.8.2/H-4-1] 当应用正在访问来自麦克风的音频数据时,必须显示麦克风指示器,但当麦克风仅由
HotwordDetectionService
、SOURCE_HOTWORD
、ContentCaptureService
或在 CDD 标识符为 [C-4-X] 的 第 9.1 节中列出的角色应用访问时,则不必显示麦克风指示器。 - [9.8.2/H-4-2] 必须显示从
PermissionManager.getIndicatorAppOpUsageData()
返回的最近和活跃麦克风使用应用列表,以及与它们关联的任何归因消息。
如果手持设备实现声明 android.hardware.camera.any
,则它们
- [9.8.2/H-5-1] 当应用正在访问实时摄像头数据时,必须显示摄像头指示器,但当摄像头仅由在 CDD 标识符为 [C-4-X] 的 第 9.1 节中列出的角色应用访问时,则不必显示摄像头指示器。
- [9.8.2/H-5-2] 必须显示从
PermissionManager.getIndicatorAppOpUsageData()
返回的最近和活跃摄像头使用应用列表,以及与它们关联的任何归因消息。
2.2.6. 开发者工具和选项兼容性
手持设备实现(* 不适用于平板电脑)
- [6.1/H-0-1]* 必须支持 shell 命令
cmd testharness
。
手持设备实现(* 不适用于平板电脑)
- Perfetto
- [6.1/H-0-2]* 必须向 shell 用户公开
/system/bin/perfetto
二进制文件,该二进制文件的 cmdline 符合 perfetto 文档。 - [6.1/H-0-3]* perfetto 二进制文件必须接受符合 perfetto 文档中定义的架构的 protobuf 配置作为输入。
- [6.1/H-0-4]* perfetto 二进制文件必须写入符合 perfetto 文档中定义的架构的 protobuf 跟踪作为输出。
- [6.1/H-0-5]* 必须通过 perfetto 二进制文件提供至少 perfetto 文档中描述的数据源。
- [6.1/H-0-6]* perfetto 跟踪守护进程必须默认启用(系统属性
persist.traced.enable
)。
- [6.1/H-0-2]* 必须向 shell 用户公开
2.2.7. 手持媒体性能等级
有关媒体性能等级的定义,请参阅 第 7.11 节。
2.2.7.1. 媒体
如果手持设备实现为 android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
返回 android.os.Build.VERSION_CODES.S
,则它们
- 必须满足 Android 12 CDD 第 2.2.7.1 节中列出的媒体要求。
如果手持设备实现为 android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
返回 android.os.Build.VERSION_CODES.T
,则它们
- [5.1/H-1-1] 必须通过
CodecCapabilities.getMaxSupportedInstances()
和VideoCapabilities.getSupportedPerformancePoints()
方法通告可以在任何编解码器组合中并发运行的最大硬件视频解码器会话数。 - [5.1/H-1-2] 必须支持 6 个硬件视频解码器会话实例(AVC、HEVC、VP9、AV1 或更高版本),这些实例可以在任何编解码器组合中以 1080p 分辨率 @ 30 fps 的速度并发运行。
- [5.1/H-1-3] 必须通过
CodecCapabilities.getMaxSupportedInstances()
和VideoCapabilities.getSupportedPerformancePoints()
方法通告可以在任何编解码器组合中并发运行的最大硬件视频编码器会话数。 - [5.1/H-1-4] 必须支持 6 个硬件视频编码器会话实例(AVC、HEVC、VP9、AV1 或更高版本),这些实例可以在任何编解码器组合中以 1080p 分辨率 @ 30fps 的速度并发运行。
- [5.1/H-1-5] 必须通过
CodecCapabilities.getMaxSupportedInstances()
和VideoCapabilities.getSupportedPerformancePoints()
方法通告可以在任何编解码器组合中并发运行的最大硬件视频编码器和解码器会话数。 - [5.1/H-1-6] 必须支持 6 个硬件视频解码器和硬件视频编码器会话实例(AVC、HEVC、VP9、AV1 或更高版本),这些实例可以在任何编解码器组合中以 1080p@30fps 分辨率并发运行。
- [5.1/H-1-7] 对于所有硬件视频编码器,在负载下,1080p 或更小视频编码会话的编解码器初始化延迟必须为 40 毫秒或更短。此处的负载定义为使用硬件视频编解码器并发进行的 1080p 到 720p 纯视频转码会话,以及 1080p 音视频录制初始化。对于杜比视界编解码器,编解码器初始化延迟必须为 50 毫秒或更短。
- [5.1/H-1-8] 对于所有音频编码器,在负载下,128 kbps 或更低比特率音频编码会话的编解码器初始化延迟必须为 30 毫秒或更短。此处的负载定义为使用硬件视频编解码器并发进行的 1080p 到 720p 纯视频转码会话,以及 1080p 音视频录制初始化。
- [5.1/H-1-9] 必须支持 2 个安全硬件视频解码器会话实例(AVC、HEVC、VP9、AV1 或更高版本),这些实例可以在任何编解码器组合中以 1080p 分辨率 @ 30 fps 的速度并发运行。
- [5.1/H-1-10] 必须支持 3 个非安全硬件视频解码器会话实例和 1 个安全硬件视频解码器会话实例(总共 4 个实例)(AVC、HEVC、VP9、AV1 或更高版本),这些实例可以在任何编解码器组合中以 1080p 分辨率 @ 30fps 的速度并发运行。
- [5.1/ H-1-11] 设备上的每个硬件 AVC、HEVC、VP9 或 AV1 解码器都必须支持安全解码器。
- [5.1/H-1-12] 对于所有硬件视频解码器,在负载下,1080p 或更小视频解码会话的编解码器初始化延迟必须为 40 毫秒或更短。此处的负载定义为使用硬件视频编解码器并发进行的 1080p 到 720p 纯视频转码会话,以及 1080p 音视频播放初始化。对于杜比视界编解码器,编解码器初始化延迟必须为 50 毫秒或更短。
- [5.1/H-1-13] 对于所有音频解码器,在负载下,128 kbps 或更低比特率音频解码会话的编解码器初始化延迟必须为 30 毫秒或更短。此处的负载定义为使用硬件视频编解码器并发进行的 1080p 到 720p 纯视频转码会话,以及 1080p 音视频播放初始化。
- [5.1/H-1-14] 必须支持 AV1 硬件解码器 Main 10,Level 4.1。
- [5.1/H-SR-1] 强烈建议 AV1 硬件解码器支持胶片颗粒。
- [5.1/H-1-15] 必须至少有 1 个支持 4K60 的硬件视频解码器。
- [5.1/H-1-16] 必须至少有 1 个支持 4K60 的硬件视频编码器。
- [5.3/H-1-1] 在负载下,对于 1080p 60 fps 视频会话,每 10 秒不得丢帧超过 1 帧(即,丢帧率低于 0.167%)。负载定义为使用硬件视频编解码器并发进行的 1080p 到 720p 纯视频转码会话,以及 128 kbps AAC 音频播放。
- [5.3/H-1-2] 在负载下,在 60 fps 视频会话中进行视频分辨率更改期间,每 10 秒不得丢帧超过 1 帧。负载定义为使用硬件视频编解码器并发进行的 1080p 到 720p 纯视频转码会话,以及 128 kbps AAC 音频播放。
- [5.6/H-1-1] 使用 OboeTester 点击到音调测试或 CTS Verifier 点击到音调测试,点击到音调的延迟必须为 80 毫秒或更短。
- [5.6/H-1-2] 在至少一条受支持的数据路径上,往返音频延迟必须为 80 毫秒或更短。
- [5.6/H-1-3] 如果存在 3.5 毫米音频插孔,并且如果通过整个数据路径支持 USB 音频以实现低延迟和流式传输配置,则必须支持 >=24 位音频的立体声输出。对于低延迟配置,应用应在低延迟回调模式下使用 AAudio。对于流式传输配置,应用应使用 Java AudioTrack。在低延迟和流式传输配置中,HAL 输出接收器应接受
AUDIO_FORMAT_PCM_24_BIT
、AUDIO_FORMAT_PCM_24_BIT_PACKED
、AUDIO_FORMAT_PCM_32_BIT
或AUDIO_FORMAT_PCM_FLOAT
作为其目标输出格式。 - [5.6/H-1-4] 必须支持 >=4 声道 USB 音频设备(DJ 控制器使用此功能来预览歌曲。)
- [5.6/H-1-5] 必须支持类兼容 MIDI 设备并声明 MIDI 功能标志。
- [5.7/H-1-2] 必须支持具有以下内容解密功能的
MediaDrm.SECURITY_LEVEL_HW_SECURE_ALL
。
最小样本大小 | 4 MiB |
最小子样本数 - H264 或 HEVC | 32 |
最小子样本数 - VP9 | 9 |
最小子样本数 - AV1 | 288 |
最小子样本缓冲区大小 | 1 MiB |
最小通用加密缓冲区大小 | 500 KiB |
最小并发会话数 | 30 |
每个会话的最小密钥数 | 20 |
最小密钥总数(所有会话) | 80 |
最小 DRM 密钥总数(所有会话) | 6 |
消息大小 | 16 KiB |
每秒解密帧数 | 60 fps |
2.2.7.2. 摄像头
如果手持设备实现为 android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
返回 android.os.Build.VERSION_CODES.S
,则它们
- 必须满足 Android 12 CDD 第 2.2.7.2 节中列出的摄像头要求。
如果手持设备实现为 android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
返回 android.os.Build.VERSION_CODES.T
,则它们
- [7.5/H-1-1] 必须配备分辨率至少为 12 兆像素的主后置摄像头,并支持 4k@30fps 视频拍摄。主后置摄像头是摄像头 ID 最低的后置摄像头。
- [7.5/H-1-2] 必须配备分辨率至少为 5 兆像素的主前置摄像头,并支持 1080p@30fps 视频拍摄。主前置摄像头是摄像头 ID 最低的前置摄像头。
- [7.5/H-1-3] 对于后置主摄像头,必须支持
android.info.supportedHardwareLevel
属性为FULL
或更高,对于前置主摄像头,必须支持LIMITED
或更高。 - [7.5/H-1-4] 对于两个主摄像头,都必须支持
CameraMetadata.SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME
。 - [7.5/H-1-5] 对于两个主摄像头,在 ITS 照明条件 (3000K) 下,CTS 摄像头性能测试测得的 1080p 分辨率下,camera2 JPEG 拍摄延迟必须 < 1000 毫秒。
- [7.5/H-1-6] 对于两个主摄像头,在 ITS 照明条件 (3000K) 下,CTS 摄像头性能测试测得的 camera2 启动延迟(打开摄像头到第一帧预览帧)必须 < 500 毫秒。
- [7.5/H-1-8] 对于后置主摄像头,必须支持
CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_RAW
和android.graphics.ImageFormat.RAW_SENSOR
。 - [7.5/H-1-9] 必须配备支持 720p 或 1080p @ 240fps 的后置主摄像头。
- [7.5/H-1-10] 如果有朝向同一方向的超广角 RGB 摄像头,则主摄像头的最小 ZOOM_RATIO 必须 < 1.0。
- [7.5/H-1-11] 必须实现主摄像头上的前后并发流式传输。
- [7.5/H-1-12] 对于后置主摄像头,必须支持
CONTROL_VIDEO_STABILIZATION_MODE_PREVIEW_STABILIZATION
。 - [7.5/H-1-13] 如果有多个 RGB 后置摄像头,则对于后置主摄像头,必须支持
LOGICAL_MULTI_CAMERA
功能。 - [7.5/H-1-14] 对于前置主摄像头和后置主摄像头,都必须支持
STREAM_USE_CASE
功能。
2.2.7.3. 硬件
如果手持设备实现为 android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
返回 android.os.Build.VERSION_CODES.S
,则它们
- 必须满足 Android 12 CDD 第 2.2.7.3 节中列出的硬件要求。
如果手持设备实现为 android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
返回 android.os.Build.VERSION_CODES.T
,则它们
- [7.1.1.1/H-2-1] 必须具有至少 1080p 的屏幕分辨率。
- [7.1.1.3/H-2-1] 必须具有至少 400 dpi 的屏幕密度。
- [7.6.1/H-2-1] 必须具有至少 8 GB 的物理内存。
2.2.7.4. 性能
如果手持设备实现为 android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
返回 android.os.Build.VERSION_CODES.S
,则它们
- 必须满足 Android 12 CDD 第 2.2.7.4 节中列出的性能要求。
如果手持设备实现为 android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
返回 android.os.Build.VERSION_CODES.T
,则它们
- [8.2/H-1-1] 必须确保至少 125 MB/s 的顺序写入性能。
- [8.2/H-1-2] 必须确保至少 10 MB/s 的随机写入性能。
- [8.2/H-1-3] 必须确保至少 250 MB/s 的顺序读取性能。
- [8.2/H-1-4] 必须确保至少 40 MB/s 的随机读取性能。
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] 建议提供遥控器,用户可以通过遥控器访问 非触摸导航和 核心导航键输入。
如果电视设备实现包含 3 轴陀螺仪,则它们
电视设备实现
如果电视设备实现包括支持主机模式的 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-1] 强烈建议支持以每秒 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-0-6] MPEG-2
电视设备实现必须支持 MPEG-2 解码,如第 5.3.1 节中详述,在标准视频帧速率和分辨率下,最高可达包括
- [5.3.1/T-1-1] 高级主配置文件的 HD 1080p,每秒 29.97 帧。
- [5.3.1/T-1-2] 高级主配置文件的 HD 1080i,每秒 59.94 帧。它们必须对隔行扫描 MPEG-2 视频进行去隔行处理,并使其可供第三方应用使用。
电视设备实现必须支持 H.264 解码,如第 5.3.4 节中详述,在标准视频帧速率和分辨率下,最高可达包括
- [5.3.4/T-1-1] 基线配置文件的 HD 1080p,每秒 60 帧
- [5.3.4/T-1-2] 主配置文件的 HD 1080p,每秒 60 帧
- [5.3.4/T-1-3] 高级配置 Level 4.2 的 HD 1080p,每秒 60 帧
具有 H.265 硬件解码器的电视设备实现必须支持 H.265 解码,如第 5.3.5 节中详述,在标准视频帧速率和分辨率下,最高可达包括
- [5.3.5/T-1-1] 主配置 Level 4.1 的 HD 1080p,每秒 60 帧
如果具有 H.265 硬件解码器的电视设备实现支持 H.265 解码和 UHD 解码配置文件,则它们
- [5.3.5/T-2-1] 必须支持 UHD 解码配置文件,在 Main10 Level 5 Main Tier 配置文件下,每秒 60 帧
电视设备实现必须支持 VP8 解码,如第 5.3.6 节中详述,在标准视频帧速率和分辨率下,最高可达包括
- [5.3.6/T-1-1] HD 1080p 解码配置文件,每秒 60 帧
具有 VP9 硬件解码器的电视设备实现必须支持 VP9 解码,如第 5.3.7 节中详述,在标准视频帧速率和分辨率下,最高可达包括
- [5.3.7/T-1-1] 配置文件 0(8 位颜色深度)的 HD 1080p,每秒 60 帧
如果具有 VP9 硬件解码器的电视设备实现支持 VP9 解码和 UHD 解码配置文件,则它们
- [5.3.7/T-2-1] 必须支持配置文件 0(8 位颜色深度)的 UHD 解码配置文件,每秒 60 帧。
- [5.3.7/T-SR1] 强烈建议支持配置文件 2(10 位颜色深度)的 UHD 解码配置文件,每秒 60 帧。
电视设备实现
- [5.5/T-0-1] 必须包括对系统主音量和受支持输出上的数字音频输出音量衰减的支持,但压缩音频直通输出(设备上未完成音频解码)除外。
如果电视设备实现没有内置显示屏,而是支持通过 HDMI 连接的外部显示屏,则它们
- [5.8/T-0-1] 必须设置 HDMI 输出模式以选择可以支持的最大分辨率,刷新率为 50Hz 或 60Hz。
- [5.8/T-SR-1] 强烈建议提供用户可配置的 HDMI 刷新率选择器。
- [5.8] 建议将 HDMI 输出模式刷新率设置为 50Hz 或 60Hz,具体取决于设备销售地区的视频刷新率。
如果电视设备实现没有内置显示屏,而是支持通过 HDMI 连接的外部显示屏,则它们
- [5.8/T-1-1] 必须支持 HDCP 2.2。
如果电视设备实现不支持 UHD 解码,而是支持通过 HDMI 连接的外部显示屏,则它们
- [5.8/T-2-1] 必须支持 HDCP 1.4
2.3.3. 软件
电视设备实现
- [3/T-0-1] 必须声明功能
android.software.leanback
和android.hardware.type.television
。 - [3.2.3.1/T-0-1] 必须预加载一个或多个应用或服务组件,其中包含 intent 处理程序,用于 此处 列出的以下应用 intent 定义的所有公共 intent 过滤器模式。
- [3.4.1/T-0-1] 必须提供
android.webkit.Webview
API 的完整实现。
如果 Android 电视设备实现支持锁屏,则它们
- [3.8.10/T-1-1] 必须显示锁屏通知,包括媒体通知模板。
电视设备实现
- [3.8.14/T-SR-1] 强烈建议支持画中画 (PIP) 模式多窗口。
- [3.10/T-0-1] 必须支持第三方辅助功能服务。
- [3.10/T-SR-1] 强烈建议在设备上预加载辅助功能服务,其功能与 talkback 开源项目中提供的 Switch Access 和 TalkBack(对于预安装的文本转语音引擎支持的语言)辅助功能服务相当或超过。
如果电视设备实现报告功能 android.hardware.audio.output
,则它们
电视设备实现
- [3.12/T-0-1] 必须支持电视输入框架。
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.3/T-1-1] 必须提供用户操作界面来启用和禁用省电模式功能。
如果电视设备实现没有电池,则它们
如果电视设备实现有电池,则它们
- [8.3/T-1-3] 必须提供用户操作界面来显示所有免于应用待机和 Doze 省电模式的应用。
电视设备实现
- [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.3.5. 安全模型
电视设备实现
- [9.11/T-0-1] 必须使用隔离的执行环境备份密钥库实现。
- [9.11/T-0-2] 必须实现 RSA、AES、ECDSA 和 HMAC 加密算法以及 MD5、SHA1 和 SHA-2 系列哈希函数,以便在安全隔离于内核及以上层代码运行的区域中,正确支持 Android Keystore 系统支持的算法。安全隔离必须阻止内核或用户空间代码可能访问隔离环境内部状态的所有潜在机制,包括 DMA。上游 Android 开放源代码项目 (AOSP) 通过使用 Trusty 实现来满足此要求,但其他基于 ARM TrustZone 的解决方案或经过第三方审查的适当的基于虚拟机监控程序隔离的安全实现也是替代方案。
- [9.11/T-0-3] 必须在隔离的执行环境中执行锁屏身份验证,并且仅在成功时,才允许使用身份验证绑定的密钥。锁屏凭据的存储方式必须仅允许隔离的执行环境执行锁屏身份验证。上游 Android 开放源代码项目提供了 Gatekeeper 硬件抽象层 (HAL) 和 Trusty,可用于满足此要求。
- [9.11/T-0-4] 必须支持密钥认证,其中认证签名密钥受到安全硬件的保护,并且签名在安全硬件中执行。认证签名密钥必须在足够大量的设备之间共享,以防止密钥被用作设备标识符。满足此要求的一种方法是共享相同的认证密钥,除非生产的给定 SKU 至少有 100,000 个单元。如果生产的 SKU 超过 100,000 个单元,则每 100,000 个单元可以使用不同的密钥。
- [9/T-0-1] 必须声明“android.hardware.security.model.compatible”功能。
请注意,如果设备实现已在较早的 Android 版本上启动,则此类设备可以免除密钥库由隔离的执行环境支持和支持密钥证明的要求,除非它声明需要密钥库由隔离的执行环境支持的 android.hardware.fingerprint
功能。
如果电视设备实现支持安全锁屏,则它们
- [9.11/T-1-1] 必须允许用户选择从解锁状态转换到锁定状态的睡眠超时时间,最小允许超时时间为 15 秒或更短。
如果电视设备实现包含多个用户,并且未声明 android.hardware.telephony
功能标志,则它们
- [9.5/T-2-1] 必须支持受限个人资料,此功能允许设备所有者管理设备上的其他用户及其功能。借助受限个人资料,设备所有者可以快速为其他用户设置单独的环境以供工作,并能够更精细地管理这些环境中可用的应用程序的限制。
如果电视设备实现包含多个用户,并且声明了 android.hardware.telephony
功能标志,则它们
- [9.5/T-3-1] 不得支持受限个人资料,但必须与 AOSP 对启用/禁用其他用户访问语音通话和短信的控件的实现保持一致。
如果电视设备实现声明 android.hardware.microphone
,则它们
- [9.8.2/T-4-1] 当应用程序正在访问来自麦克风的音频数据时,必须显示麦克风指示器,但当麦克风仅被 HotwordDetectionService、SOURCE_HOTWORD、ContentCaptureService 或在第 9.1 节权限中以及 CDD 标识符 C-3-X] 中调用的角色持有的应用程序访问时,则不必显示。
- [9.8.2/T-4-2] 对于具有可见用户界面或直接用户交互的系统应用程序,不得隐藏麦克风指示器。
如果电视设备实现声明 android.hardware.camera.any
,则它们
- [9.8.2/T-5-1] 当应用程序正在访问实时摄像头数据时,必须显示摄像头指示器,但当摄像头仅被在第 9.1 节权限中以及 CDD 标识符 [C-3-X] 中调用的角色持有的应用程序访问时,则不必显示。
- [9.8.2/T-5-2] 对于具有可见用户界面或直接用户交互的系统应用程序,不得隐藏摄像头指示器。
2.3.6. 开发者工具和选项兼容性
电视设备实现
- Perfetto
- [6.1/T-0-1] 必须向 shell 用户公开
/system/bin/perfetto
二进制文件,该文件的 cmdline 符合 perfetto 文档。 - [6.1/T-0-2] perfetto 二进制文件必须接受符合 perfetto 文档中定义的架构的 protobuf 配置作为输入。
- [6.1/T-0-3] perfetto 二进制文件必须将符合 perfetto 文档中定义的架构的 protobuf 跟踪作为输出写入。
- [6.1/T-0-4] 必须通过 perfetto 二进制文件,至少提供 perfetto 文档中描述的数据源。
- [6.1/T-0-1] 必须向 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-1] 强烈建议包含 3 轴加速度计。
如果手表设备实现包含 GPS/GNSS 接收器并通过 android.hardware.location.gps
功能标志向应用程序报告此功能,则它们
- [7.3.3/W-1-1] 即使尚未报告从 GPS/GNSS 计算的位置,也必须在找到 GNSS 测量值后立即报告。
- [7.3.3/W-1-2] 必须报告 GNSS 伪距和伪距率,在开阔天空条件下,确定位置后,在静止或以小于每秒平方 0.2 米的加速度移动时,这些值足以在 20 米内计算位置,在每秒 0.2 米内计算速度,至少 95% 的时间。
如果手表设备实现包含 3 轴陀螺仪,则它们
- [7.3.4/W-2-1] 必须能够测量高达每秒 1000 度的方向变化。
手表设备实现
[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。
- [3.2.3.1/W-0-1] 必须预加载一个或多个应用程序或服务组件,其中包含一个 intent 处理程序,用于 此处列出的以下应用程序 intent 定义的所有公共 intent 过滤器模式。
手表设备实现
声明 android.hardware.audio.output
功能标志的手表设备实现
- [3.10/W-1-1] 必须支持第三方辅助功能服务。
- [3.10/W-SR-1] 强烈建议在设备上预加载辅助功能服务,这些服务的功能应与 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.4.5. 安全模型
手表设备实现
- [9/W-0-1] 必须声明
android.hardware.security.model.compatible
功能。
如果手表设备实现包含多个用户,并且未声明 android.hardware.telephony
功能标志,则它们
- [9.5/W-1-1] 必须支持受限个人资料,此功能允许设备所有者管理设备上的其他用户及其功能。借助受限个人资料,设备所有者可以快速为其他用户设置单独的环境以供工作,并能够更精细地管理这些环境中可用的应用程序的限制。
如果手表设备实现包含多个用户,并且声明了 android.hardware.telephony
功能标志,则它们
- [9.5/W-2-1] 不得支持受限个人资料,但必须与 AOSP 对启用/禁用其他用户访问语音通话和短信的控件的实现保持一致。
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/A-0-1] 必须实现并报告
GEAR_SELECTION
、NIGHT_MODE
、PERF_VEHICLE_SPEED
和PARKING_BRAKE_ON
。[7.3/A-0-2]
NIGHT_MODE
标志的值必须与仪表板白天/夜晚模式一致,并且应该基于环境光传感器输入。底层环境光传感器可以与 光度计 相同。[7.3/A-0-3] 必须为提供的每个传感器提供传感器附加信息字段
TYPE_SENSOR_PLACEMENT
作为 SensorAdditionalInfo 的一部分。[7.3/A-SR1] 可以通过将 GPS/GNSS 与其他传感器融合来推算 位置。如果推算 位置,强烈建议实现和报告使用的相应 传感器 类型和/或 车辆属性 ID。
[7.3/A-0-4] 通过 LocationManager#requestLocationUpdates() 请求的 位置 不得是地图匹配的。
[7.3/A-SR-1] 强烈建议包含 3 轴加速度计和 3 轴陀螺仪。
[7.3/A-SR-2] 强烈建议实现并报告
TYPE_HEADING
传感器。
如果汽车设备实现支持 OpenGL ES 3.1,则它们
- [7.1.4.1/A-0-1] 必须声明 OpenGL ES 3.1 或更高版本。
- [7.1.4.1/A-0-2] 必须支持 Vulkan 1.1。
- [7.1.4.1/A-0-3] 必须包含 Vulkan 加载器并导出所有符号。
如果汽车设备实现包含加速度计,则它们
- [7.3.1/A-1-1] 必须能够以至少 100 Hz 的频率报告事件。
如果设备实现包含 3 轴加速度计,则它们
- [7.3.1/A-SR-1] 强烈建议实现有限轴加速度计的复合传感器。
如果汽车设备实现包含轴数少于 3 轴的加速度计,则它们
- [7.3.1/A-1-3] 必须实现并报告
TYPE_ACCELEROMETER_LIMITED_AXES
传感器。 - [7.3.1/A-1-4] 必须实现并报告
TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED
传感器。
如果汽车设备实现包含陀螺仪,则它们
- [7.3.4/A-2-1] 必须能够以至少 100 Hz 的频率报告事件。
- [7.3.4/A-2-3] 必须能够测量高达每秒 250 度的方向变化。
- [7.3.4/A-SR-1] 强烈建议将陀螺仪的测量范围配置为 +/-250dps,以便最大限度地提高可能的分辨率。
如果汽车设备实现包含 3 轴陀螺仪,则它们
- [7.3.4/A-SR-2] 强烈建议实现有限轴陀螺仪的复合传感器。
如果汽车设备实现包含轴数少于 3 轴的陀螺仪,则它们
- [7.3.4/A-4-1] 必须实现并报告
TYPE_GYROSCOPE_LIMITED_AXES
传感器。 - [7.3.4/A-4-2] 必须实现并报告
TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED
传感器。
如果汽车设备实现包含 GPS/GNSS 接收器,但不包含基于蜂窝网络的数据连接,则它们
- [7.3.3/A-3-1] 必须在首次打开 GPS/GNSS 接收器时或在 4 天以上后 60 秒内确定位置。
- [7.3.3/A-3-2] 对于所有其他位置请求(即,并非首次或 4 天以上后的请求),必须满足 7.3.3/C-1-2 和 7.3.3/C-1-6 中描述的首次定位时间标准。通常,在没有基于蜂窝网络的数据连接的车辆中,通过使用接收器上计算的 GNSS 轨道预测,或使用上次已知的车辆位置以及至少 60 秒的航位推算能力(位置精度满足 7.3.3/C-1-3),或两者的组合来满足要求 7.3.3/C-1-2。
如果汽车设备实现包含 TYPE_HEADING
传感器,则它们
- [7.3.4/A-4-3] 必须能够以至少 1 Hz 的频率报告事件。
- [7.3.4/A-SR-3] 强烈建议以至少 10 Hz 的频率报告事件。
- 应该参考正北方向。
- 应该即使在车辆静止时也可用。
- 应该具有至少 1 度的分辨率。
汽车设备实现
- [7.4.3/A-0-1] 必须支持蓝牙,应该支持蓝牙 LE。
- [7.4.3/A-0-2] Android 汽车实现必须支持以下蓝牙配置文件
- 通过免提配置文件 (HFP) 进行电话呼叫。
- 通过音频分发配置文件 (A2DP) 进行媒体播放。
- 通过远程控制配置文件 (AVRCP) 进行媒体播放控制。
- 使用电话簿访问配置文件 (PBAP) 进行联系人共享。
[7.4.3/A-SR-1] 强烈建议支持消息访问配置文件 (MAP)。
[7.4.5/A] 应该包含对基于蜂窝网络的数据连接的支持。
[7.4.5/A] 可以将系统 API
NetworkCapabilities#NET_CAPABILITY_OEM_PAID
常量用于应可供系统应用使用的网络。
外部视图摄像头是指对设备实现外部场景(如后视摄像头)成像的摄像头。
汽车设备实现
- 应该包含一个或多个外部视图摄像头。
如果汽车设备实现包含外部视图摄像头,则对于此类摄像头,它们
- [7.5/A-1-1] 除非符合摄像头核心要求,否则不得通过 Android Camera API 访问外部视图摄像头。
[7.5/A-SR-1] 强烈建议不要旋转或水平镜像摄像头预览。
[7.5/A-SR-2] 强烈建议分辨率至少为 130 万像素。
应该具有固定焦点或 EDOF(扩展景深)硬件。
可以在摄像头驱动程序中实现硬件自动对焦或软件自动对焦。
如果汽车设备实现包含一个或多个外部视图摄像头,并加载外部视图系统 (EVS) 服务,则对于此类摄像头,它们
- [7.5/A-2-1] 不得旋转或水平镜像摄像头预览。
汽车设备实现
- 可以包含一个或多个可供第三方应用程序使用的摄像头。
如果汽车设备实现包含至少一个摄像头并使其可供第三方应用程序使用,则它们
- [7.5/A-3-1] 必须报告功能标志
android.hardware.camera.any
。 - [7.5/A-3-2] 不得将摄像头声明为系统摄像头。
- 可以支持 7.5.3 节中描述的外部摄像头。
- 可以包含 7.5.1 节中描述的后置摄像头可用的功能(例如自动对焦等)。
汽车设备实现
[7.6.1/A-0-1] 必须至少有 4 GB 的非易失性存储空间可用于应用程序私有数据(又名“/data”分区)。
[7.6.1/A] 应该格式化数据分区,以在闪存存储上提供更高的性能和更长的寿命,例如使用
f2fs
文件系统。
如果汽车设备实现通过内部非可移动存储的一部分提供共享外部存储,则它们
- [7.6.1/A-SR-1] 强烈建议减少在外部存储上执行的操作的 I/O 开销,例如使用
SDCardFS
。
如果汽车设备实现是 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-1] 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。
如果汽车设备实现使用 android.car.CarPropertyManager
和 android.car.VehiclePropertyIds
提供专有 API,则它们
汽车设备实现
[3.2.3.1/A-0-1] 必须预加载一个或多个应用程序或服务组件,其中包含一个 intent 处理程序,用于 此处列出的以下应用程序 intent 定义的所有公共 intent 过滤器模式。
[3.4.1/A-0-1] 必须提供
android.webkit.Webview
API 的完整实现。[3.8.3/A-0-1] 当第三方应用程序请求时,必须显示使用
Notification.CarExtender
API 的通知。
如果汽车设备实现包含一键通按钮,则它们
- [3.8.4/A-1-1] 必须使用短按一键通按钮作为指定交互来启动用户选择的助手应用程序,换句话说,即实现
VoiceInteractionService
的应用程序。
汽车设备实现
- [3.8.3.1/A-0-1] 必须正确呈现
汽车操作系统上的通知
SDK 文档中描述的资源。 - [3.8.3.1/A-0-2] 必须在通过
Notification.Builder.addAction()
提供的通知操作的位置显示“播放”和“静音”。 - [3.8.3.1/A] 应该限制使用丰富的管理任务,例如每个通知渠道的控件。可以使用每个应用程序的 UI 可操作性来减少控件。
如果汽车设备实现支持用户 HAL 属性,则它们
汽车设备实现
- [3.14/A-0-1] 必须包含 UI 框架,以支持使用 3.14 节中描述的媒体 API 的第三方应用程序。
- [3.14/A-0-2] 必须允许用户在驾驶时安全地与媒体应用程序交互。
- [3.14/A-0-3] 必须支持具有
CAR_EXTRA_MEDIA_PACKAGE
extra 的CAR_INTENT_ACTION_MEDIA_TEMPLATE
隐式 Intent 操作。 - [3.14/A-0-4] 必须提供一种可操作性,以导航到媒体应用程序的 首选项活动,但必须仅在汽车 UX 限制未生效时启用它。
- [3.14/A-0-5] 必须显示媒体应用程序设置的 错误消息,并且必须支持可选的 extra
ERROR_RESOLUTION_ACTION_LABEL
和ERROR_RESOLUTION_ACTION_INTENT
。 - [3.14/A-0-6] 必须支持支持搜索的应用程序的应用内搜索可操作性。
- [3.14/A-0-7] 在显示 MediaBrowser 层次结构时,必须遵守
CONTENT_STYLE_BROWSABLE_HINT
和CONTENT_STYLE_PLAYABLE_HINT
定义。
如果汽车设备实现包含默认启动器应用程序,则它们
- [3.14/A-1-1] 必须包含媒体服务,并使用
CAR_INTENT_ACTION_MEDIA_TEMPLATE
intent 打开它们。
汽车设备实现
- [3.8/A] 可以限制应用程序进入
沉浸式文档
中描述的全屏模式的请求。 - [3.8/A] 可以始终保持状态栏和导航栏可见。
- [3.8/A] 可以限制应用程序更改系统 UI 元素后面的颜色的请求,以确保这些元素始终清晰可见。
2.5.4. 性能和功耗
汽车设备实现
- [8.2/A-0-1] 必须报告每个进程的 UID 读取和写入非易失性存储的字节数,以便开发者可以通过系统 API
android.car.storagemonitoring.CarStorageMonitoringManager
获取统计信息。Android 开放源代码项目通过uid_sys_stats
内核模块满足此要求。 - [8.3/A-1-3] 必须支持 车库模式。
- [8.3/A] 除非出现以下情况,否则每次驾驶后**应该**处于车库模式至少 15 分钟
- 电池耗尽。
- 未安排空闲作业。
- 驾驶员退出车库模式。
- [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.5/A-1-2] **必须** 在
BOOT_COMPLETED
之前切换到辅助用户。 - [9.5/A-1-3] 即使设备上的用户数已达到上限,**也必须**支持创建访客用户的功能。
如果汽车设备实现声明 android.hardware.camera.any
,则它们
- [9.8.2/A-2-1] 当应用正在访问实时摄像头数据时,**必须**显示摄像头指示器,但当摄像头仅被持有 第 9.1 节权限 中 [C-3-X] CDD 标识符中列出的角色的应用访问时,则不必显示。
- [9.8.2/A-2-2] **绝不能** 对具有可见用户界面或直接用户交互的系统应用隐藏摄像头指示器。
汽车设备实现
- [9.11/A-0-1] **必须** 使用隔离的执行环境备份密钥库实现。
- [9.11/A-0-2] **必须** 具有 RSA、AES、ECDSA 和 HMAC 加密算法以及 MD5、SHA1 和 SHA-2 系列哈希函数的实现,以正确支持 Android Keystore 系统在安全隔离于内核及以上层级运行的代码的区域中支持的算法。安全隔离**必须**阻止内核或用户空间代码可能访问隔离环境内部状态的所有潜在机制,包括 DMA。上游 Android 开放源代码项目 (AOSP) 通过使用 Trusty 实现来满足此要求,但另一个基于 ARM TrustZone 的解决方案或经过第三方审核的基于安全虚拟机监控程序的隔离实现也是替代选项。
- [9.11/A-0-3] **必须** 在隔离的执行环境中执行锁屏身份验证,并且仅在成功时才允许使用身份验证绑定的密钥。锁屏凭据的存储方式**必须**仅允许隔离的执行环境执行锁屏身份验证。上游 Android 开放源代码项目提供了 Gatekeeper 硬件抽象层 (HAL) 和 Trusty,可用于满足此要求。
- [9.11/A-0-4] **必须** 支持密钥证明,其中证明签名密钥受安全硬件保护,并且签名在安全硬件中执行。证明签名密钥的共享范围**必须**足够大的设备数量,以防止密钥被用作设备标识符。满足此要求的一种方法是共享相同的证明密钥,除非生产了至少 100,000 个给定 SKU 的单元。如果生产了超过 100,000 个 SKU 的单元,则每个 100,000 个单元**可以**使用不同的密钥。
- [9/A-0-1] **必须** 声明“android.hardware.security.model.compatible”功能。
请注意,如果设备实现已在较早的 Android 版本上启动,则此类设备可以免除密钥库由隔离的执行环境支持和支持密钥证明的要求,除非它声明需要密钥库由隔离的执行环境支持的 android.hardware.fingerprint
功能。
汽车设备实现
- [9.14/A-0-1] **必须** 门控来自 Android 框架车辆子系统的消息,例如,允许列出允许的消息类型和消息源。
- [9.14/A-0-2] **必须** 防范来自 Android 框架或第三方应用的拒绝服务攻击。这可以防止恶意软件用流量淹没车辆网络,这可能会导致车辆子系统发生故障。
2.5.6. 开发者工具和选项兼容性
汽车设备实现
- Perfetto
- [6.1/A-0-1] **必须** 向 shell 用户公开
/system/bin/perfetto
二进制文件,该二进制文件的 cmdline 符合 perfetto 文档。 - [6.1/A-0-2] perfetto 二进制文件**必须**接受符合 perfetto 文档中定义的架构的 protobuf 配置作为输入。
- [6.1/A-0-3] perfetto 二进制文件**必须**写入符合 perfetto 文档中定义的架构的 protobuf 跟踪作为输出。
- [6.1/A-0-4] **必须** 通过 perfetto 二进制文件提供至少 perfetto 文档中描述的数据源。
- [6.1/A-0-1] **必须** 向 shell 用户公开
2.6. 平板电脑要求
**Android 平板电脑设备**是指通常满足以下所有条件的 Android 设备实现
- 双手握持使用。
- 没有翻盖或可转换配置。
- 与设备一起使用的物理键盘实现通过标准连接(例如 USB、蓝牙)进行连接。
- 具有提供移动性的电源,例如电池。
- 屏幕显示尺寸大于 7 英寸且小于 18 英寸,以对角线测量。
平板电脑设备实现具有与手持设备实现类似的要求。例外情况在该部分中以 * 标出,并在本节中注明以供参考。
2.6.1. 硬件
陀螺仪
如果平板电脑设备实现包括 3 轴陀螺仪,则它们
- [7.3.4/Tab-1-1] **必须** 能够测量高达每秒 1000 度的方向变化。
最低内存和存储空间(第 7.6.1 节)
手持设备要求中列出的小/正常屏幕的屏幕密度不适用于平板电脑。
USB 外围设备模式(第 7.7.1 节)
如果平板电脑设备实现包括支持外围设备模式的 USB 端口,则它们
- [7.7.1/Tab] **可以** 实现 Android 开放附件 (AOA) API。
虚拟现实模式(第 7.9.1 节)
虚拟现实高性能(第 7.9.2 节)
虚拟现实要求不适用于平板电脑。
2.6.2. 安全模型
密钥和凭据(第 9.11 节)
请参阅 [9.11] 节。
如果平板电脑设备实现包括多个用户且未声明 android.hardware.telephony
功能标志,则它们
- [9.5/T-1-1] **必须** 支持受限配置文件,此功能允许设备所有者管理设备上的其他用户及其功能。借助受限配置文件,设备所有者可以快速为其他用户设置单独的工作环境,并能够更精细地管理这些环境中可用的应用中的限制。
如果平板电脑设备实现包括多个用户且声明了 android.hardware.telephony
功能标志,则它们
- [9.5/T-2-1] **绝不能** 支持受限配置文件,但**必须**与 AOSP 实现的控件对齐,以启用/停用其他用户访问语音通话和短信。
2.6.2. 软件
3. 软件
3.1. 托管 API 兼容性
托管 Dalvik 字节码执行环境是 Android 应用的主要载体。Android 应用程序编程接口 (API) 是公开给在托管运行时环境中运行的应用的一组 Android 平台接口。
设备实现
[C-0-1] **必须** 提供 Android SDK 公开的任何已记录 API 或上游 Android 源代码中使用“@SystemApi”标记修饰的任何 API 的完整实现,包括所有已记录的行为。
[C-0-2] **必须** 支持/保留使用 TestApi 注解 (@TestApi) 标记的所有类、方法和关联元素。
[C-0-3] **绝不能** 省略任何托管 API、更改 API 接口或签名、偏离已记录的行为,或包含空操作,除非本兼容性定义明确允许。
[C-0-4] 即使省略了 Android 包含 API 的某些硬件功能,**仍然必须**保留 API 的存在并以合理的方式运行。有关此场景的具体要求,请参阅第 7 节。
[C-0-5] **绝不能** 允许第三方应用使用非 SDK 接口,非 SDK 接口定义为 AOSP 启动类路径中 Java 语言包中的方法和字段,并且不构成公共 SDK 的一部分。这包括使用
@hide
注解但不使用@SystemAPI
修饰的 API,如 SDK 文档以及私有和包私有类成员中所述。[C-0-6] **必须** 随附每个非 SDK 接口,这些接口与 AOSP 中相应 API 级别分支的
prebuilts/runtime/appcompat/hiddenapi-flags.csv
路径中通过 provisional 和 denylist 标志提供的受限列表中的接口相同。[C-0-7] **必须** 支持 签名配置 动态更新机制,以通过在任何 APK 中嵌入签名配置,使用 AOSP 中存在的现有公钥,从受限列表中删除非 SDK 接口。
但是,它们
- 如果设备实现上缺少隐藏 API 或以不同的方式实现,**可以**将隐藏 API 移动到 denylist 或从所有受限列表中省略它。
- 如果隐藏 API 在 AOSP 中尚不存在,**可以**将隐藏 API 添加到任何受限列表。
3.1.1. Android 扩展
Android 支持通过更新该 API 级别的扩展版本来扩展特定 API 级别的托管 API 表面。android.os.ext.SdkExtensions.getExtensionVersion(int apiLevel)
API 返回提供的 apiLevel
的扩展版本(如果该 API 级别存在扩展)。
Android 设备实现
[C-0-1] **必须** 预加载共享库
ExtShared
和服务ExtServices
的 AOSP 实现,其版本必须大于或等于每个 API 级别允许的最低版本。例如,运行 API 级别 24 的 Android 7.0 设备实现**必须**至少包含版本 1。[C-0-2] **必须** 仅返回 AOSP 定义的有效扩展版本号。
[C-0-3] **必须** 以与其他托管 API 相同的方式支持
android.os.ext.SdkExtensions.getExtensionVersion(int apiLevel)
返回的扩展版本定义的所有 API,并遵循第 3.1 节中的要求。
3.1.2. Android 库
由于 Apache HTTP 客户端弃用,设备实现
- [C-0-1] **绝不能** 将
org.apache.http.legacy
库放在启动类路径中。 - [C-0-2] 仅当应用满足以下条件之一时,**必须**将
org.apache.http.legacy
库添加到应用类路径中- 目标 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. 构建参数
Android API 在 android.os.Build 类上包含许多常量,旨在描述当前设备。
- [C-0-1] 为了在设备实现中提供一致且有意义的值,下表包含对设备实现**必须**符合的这些值的格式的其他限制。
参数 | 详细信息 |
---|---|
VERSION.RELEASE | 当前正在执行的 Android 系统的版本,采用人类可读的格式。此字段**必须**具有 Android 13 的允许版本字符串中定义的字符串值之一。 |
VERSION.SDK | 当前正在执行的 Android 系统的版本,采用第三方应用程序代码可访问的格式。对于 Android 13,此字段**必须**具有整数值 13_INT。 |
VERSION.SDK_INT | 当前正在执行的 Android 系统的版本,采用第三方应用程序代码可访问的格式。对于 Android 13,此字段**必须**具有整数值 13_INT。 |
VERSION.INCREMENTAL | 设备实现者选择的值,用于指定当前正在执行的 Android 系统的特定版本,采用人类可读的格式。对于提供给最终用户的不同版本,**绝不能**重复使用此值。此字段的典型用途是指示用于生成版本的内部版本号或源代码控制更改标识符。此字段的值**必须**可编码为可打印的 7 位 ASCII 码,并且与正则表达式“^[^ :\/~]+$”匹配。 |
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 | 唯一标识此版本的字符串。它**应该**是合理的人类可读格式。它**必须**遵循以下模板 $(BRAND)/$(PRODUCT)/ 例如 acme/myproduct/ 指纹**绝不能**包含空格字符。此字段的值**必须**可编码为 7 位 ASCII 码。 |
HARDWARE | 硬件名称(来自内核命令行或 /proc)。它**应该**是合理的人类可读格式。此字段的值**必须**可编码为 7 位 ASCII 码,并且与正则表达式“^[a-zA-Z0-9_-]+$”匹配。 |
HOST | 唯一标识构建所依据的主机的字符串,采用人类可读的格式。对此字段的特定格式没有要求,但它**绝不能**为 null 或空字符串 ("")。 |
ID | 设备实现者选择的标识符,用于指代特定版本,采用人类可读的格式。此字段可以与 android.os.Build.VERSION.INCREMENTAL 相同,但**应该**是对于最终用户而言足够有意义的值,以便区分软件版本。此字段的值**必须**可编码为 7 位 ASCII 码,并且与正则表达式“^[a-zA-Z0-9._-]+$”匹配。 |
MANUFACTURER | 产品的原始设备制造商 (OEM) 的商品名称。对此字段的特定格式没有要求,但它**绝不能**为 null 或空字符串 ("")。此字段在产品的生命周期内**绝不能**更改。 |
SOC_MANUFACTURER | 产品中使用的主片上系统 (SOC) 的制造商的商品名称。具有相同 SOC 制造商的设备应使用相同的常量值。请向 SOC 制造商询问要使用的正确常量。此字段的值**必须**可编码为 7 位 ASCII 码,**必须**与正则表达式“^([0-9A-Za-z ]+)”匹配,**绝不能**以空格开头或结尾,并且**绝不能**等于“unknown”。此字段在产品的生命周期内**绝不能**更改。 |
SOC_MODEL | 产品中使用的主片上系统 (SOC) 的型号名称。具有相同 SOC 型号的设备应使用相同的常量值。请向 SOC 制造商询问要使用的正确常量。此字段的值**必须**可编码为 7 位 ASCII 码,并且与正则表达式“^([0-9A-Za-z ._/+-]+)$”匹配,**绝不能**以空格开头或结尾,并且**绝不能**等于“unknown”。此字段在产品的生命周期内**绝不能**更改。 |
MODEL | 设备实现者选择的值,其中包含最终用户已知的设备名称。这**应该**是设备销售给最终用户时使用的相同名称。对此字段的特定格式没有要求,但它**绝不能**为 null 或空字符串 ("")。此字段在产品的生命周期内**绝不能**更改。 |
PRODUCT | 设备实现者选择的值,其中包含特定产品 (SKU) 的开发名称或代码名称,该名称在同一品牌内**必须**是唯一的。**必须**采用人类可读的格式,但不一定供最终用户查看。此字段的值**必须**可编码为 7 位 ASCII 码,并且与正则表达式“^[a-zA-Z0-9_-]+$”匹配。此产品名称在产品的生命周期内**绝不能**更改。 |
ODM_SKU | 设备实现者选择的可选值,其中包含 SKU(库存单位),用于跟踪设备的特定配置,例如,设备销售时随附的任何外围设备。此字段的值**必须**可编码为 7 位 ASCII 码,并且与正则表达式 ^([0-9A-Za-z.,_-]+)$ 匹配。 |
SERIAL | 必须返回“UNKNOWN”。 |
TAGS | 设备实现者选择的标记的逗号分隔列表,用于进一步区分版本。标记**必须**可编码为 7 位 ASCII 码,并且与正则表达式“^[a-zA-Z0-9._-]+”匹配,并且**必须**具有与三种典型的 Android 平台签名配置之一对应的值:release-keys、dev-keys 和 test-keys。 |
TIME | 表示构建发生的时间戳的值。 |
TYPE | 设备实现者选择的值,用于指定版本的运行时配置。此字段**必须**具有与三种典型的 Android 运行时配置之一对应的值:user、userdebug 或 eng。 |
USER | 生成版本的用户(或自动化用户)的名称或用户 ID。对此字段的特定格式没有要求,但它**绝不能**为 null 或空字符串 ("")。 |
SECURITY_PATCH | 指示版本安全补丁级别的数值。它**必须**表明该版本在任何方面都不会受到 Android 公共安全公告中描述的任何问题的影响,直至指定的版本。它**必须**采用 [YYYY-MM-DD] 格式,与 Android 公共安全公告或 Android 安全公告中记录的已定义字符串匹配,例如“2015-11-01”。 |
BASE_OS | 表示构建的 FINGERPRINT 参数的值,该构建在其他方面与此构建相同,但 Android 公共安全公告中提供的补丁除外。它**必须**报告正确的值,如果不存在此类构建,则报告空字符串 ("")。 |
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 上游项目包含一个应用列表,这些应用实现了多个 Intent 模式以执行常用操作。
设备实现
- [C-SR-1] **强烈建议**为 此处列出的以下应用 Intent 定义的所有公共 Intent 过滤器模式预加载一个或多个具有 Intent 处理程序的应用或服务组件,并提供履行,即满足 SDK 中描述的这些常用应用 Intent 的开发者期望。
有关每种设备类型的强制性应用 Intent,请参阅第 2 节。
3.2.3.2. Intent 解析
[C-0-1] 由于 Android 是一个可扩展的平台,设备实现**必须**允许第三方应用覆盖 第 3.2.3.1 节中引用的每个 Intent 模式(设置除外)。上游 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 过滤器模式比浏览器的“http://”核心 Intent 模式更具体。
Android 还包括一种机制,供第三方应用为某些类型的 Web URI Intent 声明权威的默认 应用链接行为。当此类权威声明在应用的 Intent 过滤器模式中定义时,设备实现
- [C-0-4] **必须** 尝试通过执行 Digital Asset Links 规范中定义的验证步骤来验证任何 Intent 过滤器,这些步骤由上游 Android 开放源代码项目中的软件包管理器实现。
- [C-0-5] **必须** 尝试在安装应用期间验证 Intent 过滤器,并将所有成功验证的 URI Intent 过滤器设置为其 URI 的默认应用处理程序。
- **可以** 将特定的 URI Intent 过滤器设置为其 URI 的默认应用处理程序,如果它们已成功验证,但其他候选 URI 过滤器验证失败。如果设备实现这样做,则它**必须**在设置菜单中为用户提供适当的每个 URI 模式的替代项。
- **必须** 在“设置”中按如下方式为用户提供每个应用的“应用链接”控件
- [C-0-6] 用户**必须**能够整体覆盖应用的默认应用链接行为,使其为:始终打开、始终询问或永不打开,这必须同等适用于所有候选 URI Intent 过滤器。
- [C-0-7] 用户**必须**能够查看候选 URI Intent 过滤器的列表。
- 设备实现**可以**为用户提供在每个 Intent 过滤器的基础上覆盖已成功验证的特定候选 URI Intent 过滤器的能力。
- [C-0-8] 如果设备实现允许某些候选 URI Intent 过滤器成功验证,而另一些则可能失败,则设备实现**必须**为用户提供查看和覆盖特定候选 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] **必须** 广播 此处列出的公共广播 Intent,以响应 SDK 文档中描述的适当系统事件。请注意,此要求与第 3.5 节不冲突,因为 SDK 文档中也描述了后台应用的限制。此外,某些广播 Intent 取决于硬件支持,如果设备支持必要的硬件,则它们**必须**广播 Intent 并提供与 SDK 文档一致的行为。
3.2.3.5. 条件应用 Intent
Android 包括设置,为用户提供了一种简单的方法来选择其默认应用,例如主屏幕或短信。
在有意义的情况下,设备实现**必须**提供类似的设置菜单,并且与 SDK 文档中描述的 Intent 过滤器模式和 API 方法兼容,如下所示。
如果设备实现报告 android.software.home_screen
,则它们
- [C-1-1] **必须** 遵循
android.settings.HOME_SETTINGS
Intent 以显示主屏幕的默认应用设置菜单。
如果设备实现报告 android.hardware.telephony.calling,则它们
[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 实现通过在“通话”设置菜单中包含“通话帐户选项”菜单来满足此要求。[C-2-4] **必须** 允许持有
android.app.role.CALL_REDIRECTION
角色的应用的android.telecom.CallRedirectionService
。[C-2-5] **必须** 为用户提供辅助功能,以选择持有
android.app.role.CALL_REDIRECTION
角色的应用。[C-2-6] **必须** 遵循 android.intent.action.SENDTO 和 android.intent.action.VIEW Intent,并提供一个 Activity 来发送/显示短信。
[C-SR-1] **强烈建议**遵循 android.intent.action.ANSWER、android.intent.action.CALL、android.intent.action.CALL_BUTTON、android.intent.action.VIEW 和 android.intent.action.DIAL Intent,并预加载一个拨号器应用,该应用可以处理这些 Intent 并提供 SDK 中描述的履行。
如果设备实现报告 android.hardware.nfc.hce
,则它们
- [C-3-1] **必须** 遵循 android.settings.NFC_PAYMENT_SETTINGS Intent 以显示非接触式支付的默认应用设置菜单。
- [C-3-2] **必须** 遵循 android.nfc.cardemulation.action.ACTION_CHANGE_DEFAULT Intent 以显示一个 Activity,该 Activity 打开一个对话框,要求用户更改某个类别的默认卡模拟服务,如 SDK 中所述。
如果设备实现报告 android.hardware.nfc
,则它们
- [C-4-1] **必须** 遵循这些 intent android.nfc.action.NDEF_DISCOVERED、android.nfc.action.TAG_DISCOVERED 和 android.nfc.action.TECH_DISCOVERED,以显示一个 Activity,根据 SDK 中的描述,该 Activity 能够满足开发者对这些 intent 的预期。
如果设备实现报告 android.hardware.bluetooth
,则它们
- [C-5-1] **必须** 遵循 ‘android.bluetooth.adapter.action.REQUEST_ENABLE’ intent 并显示一个系统 Activity,以允许用户开启蓝牙。
- [C-5-2] **必须** 遵循 ‘android.bluetooth.adapter.action.REQUEST_DISCOVERABLE’ intent 并显示一个系统 Activity,以请求可检测模式。
如果设备实现支持“请勿打扰 (DND)”功能,则它们
- [C-6-1] **必须** 实现一个 Activity,用于响应 intent
ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS
;对于采用 UI_MODE_TYPE_NORMAL 的实现,此 Activity **必须** 是一个用户可以在其中授予或拒绝应用访问 DND 政策配置权限的 Activity。
如果设备实现允许用户在该设备上使用第三方输入法,则它们
- [C-7-1] **必须** 提供一个用户可访问的机制,以响应
android.settings.INPUT_METHOD_SETTINGS
intent,来添加和配置第三方输入法。
如果设备实现支持第三方无障碍服务,则它们
- [C-8-1] **必须** 遵循
android.settings.ACCESSIBILITY_SETTINGS
intent,以提供一个用户可访问的机制,来启用和停用第三方无障碍服务以及预加载的无障碍服务。
如果设备实现包含对 Wi-Fi Easy Connect 的支持,并将该功能向第三方应用公开,则它们
- [C-9-1] **必须** 按照 SDK 文档中的描述,实现 Settings#ACTION_PROCESS_WIFI_EASY_CONNECT_URI Intent API。
如果设备实现提供省流量模式,则它们
- [C-10-1] **必须** 在设置中提供一个用户界面,用于处理
Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS
intent,以允许用户将应用添加到允许列表或从允许列表中移除应用。
如果设备实现不提供省流量模式,则它们
- [C-11-1] **必须** 拥有一个 Activity 来处理
Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS
intent,但可以将其实现为无操作。
如果设备实现通过 android.hardware.camera.any
声明支持相机,则它们
- [C-12-3] **必须** 处理以下 intent,并且**必须**仅允许预装的 Android 应用处理以下 intent:
MediaStore.ACTION_IMAGE_CAPTURE
、MediaStore.ACTION_IMAGE_CAPTURE_SECURE
和MediaStore.ACTION_VIDEO_CAPTURE
,如 SDK 文档中所述。
如果设备实现报告 android.software.device_admin
,则它们
[C-13-1] **必须** 遵循 intent
android.app.action.ADD_DEVICE_ADMIN
,以调用一个 UI,引导用户将设备管理器添加到系统(或允许他们拒绝添加)。[C-13-2] **必须** 遵循 intent android.app.action.PROVISION_MANAGED_PROFILE、android.app.action.SET_NEW_PARENT_PROFILE_PASSWORD、android.app.action.SET_NEW_PASSWORD 和 android.app.action.START_ENCRYPTION,并拥有一个 Activity 来实现这些 intent,如 SDK 此处所述。
如果设备实现声明 android.software.autofill
功能标记,则它们
- [C-14-1] **必须** 完全实现
AutofillService
和AutofillManager
API,并遵循 android.settings.REQUEST_SET_AUTOFILL_SERVICE intent,以显示一个默认的应用设置菜单,供用户启用和停用自动填充功能,并更改默认的自动填充服务。
如果设备实现包含预装应用,或者希望允许第三方应用访问使用情况统计信息,则强烈建议它们
- [C-SR-2] **强烈建议** 提供用户可访问的机制,以响应 android.settings.ACTION_USAGE_ACCESS_SETTINGS intent,来授予或撤消对声明了
android.permission.PACKAGE_USAGE_STATS
权限的应用的用量统计信息的访问权限。
如果设备实现打算禁止任何应用(包括预装应用)访问用量统计信息,则它们
- [C-15-1] **必须** 仍然拥有一个 Activity 来处理 android.settings.ACTION_USAGE_ACCESS_SETTINGS intent 模式,但**必须** 将其实现为无操作,即具有与用户拒绝访问时相同的行为。
如果设备实现在“设置”中显示指向 AutofillService_passwordsActivity 指定的 Activity 的链接,或者通过类似机制显示指向用户密码的链接,则它们
[C-16-1] **必须** 为所有已安装的自动填充服务显示此类链接。
[C-17-1] [已移至 2.2.3]
如果设备实现支持 VoiceInteractionService
,并且同时安装了多个使用此 API 的应用,则它们
- [C-18-1] **必须** 遵循
android.settings.ACTION_VOICE_INPUT_SETTINGS
intent,以显示用于语音输入和辅助功能的默认应用设置菜单。
如果设备实现报告功能 android.hardware.audio.output
,则强烈建议它们
- [C-SR-3] **强烈建议** 遵循 android.intent.action.TTS_SERVICE、android.speech.tts.engine.INSTALL_TTS_DATA 和 android.speech.tts.engine.GET_SAMPLE_TEXT intent,并拥有一个 Activity 来实现这些 intent,如 SDK 此处所述。
Android 包含对互动式屏幕保护程序(以前称为“Dreams”)的支持。屏幕保护程序允许用户在连接到电源的设备处于闲置状态或停靠在桌面底座中时与应用互动。设备实现
- 应包含对屏幕保护程序的支持,并提供一个设置选项,供用户响应
android.settings.DREAM_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] **必须** 在未通过
ActivityOptions.setLaunchDisplayId()
API 指定目标显示屏的情况下启动新 Activity 时,将新 Activity 放置在与启动它的 Activity 相同的显示屏上。 - [C-1-4] 当移除带有
Display.FLAG_PRIVATE
标记的显示屏时,**必须** 销毁所有 Activity。 - [C-1-5] 当设备被安全锁屏锁定时,**必须** 安全地隐藏所有屏幕上的内容,除非应用选择使用
Activity#setShowWhenLocked()
API 在锁屏界面顶部显示。 - 如果 Activity 在辅助显示屏上启动,则应具有与该显示屏对应的
android.content.res.Configuration
,以便正确显示、正常运行并保持兼容性。
如果设备实现允许在辅助显示屏上启动普通 Android Activity,并且辅助显示屏带有 android.view.Display.FLAG_PRIVATE 标记
- [C-3-1] 只有该显示屏的所有者、系统以及已在该显示屏上的 Activity **必须** 能够在该显示屏上启动。任何人都可以启动到带有 android.view.Display.FLAG_PUBLIC 标记的显示屏。
3.3. 原生 API 兼容性
原生代码兼容性具有挑战性。因此,设备实现者
- [C-SR-1] **强烈建议** 使用上游 Android 开源项目中列出的库的实现。
3.3.1. 应用二进制接口
托管的 Dalvik 字节码可以调用应用 .apk
文件中提供的原生代码,该原生代码是一个针对相应设备硬件架构编译的 ELF .so
文件。由于原生代码高度依赖于底层处理器技术,因此 Android 在 Android NDK 中定义了多个应用二进制接口 (ABI)。
设备实现
- [C-0-1] **必须** 与一个或多个已定义的 Android NDK ABI 兼容。
- [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
(NDK 不再支持作为目标)armeabi-v7a
arm64-v8a
x86
x86-64
[C-0-7] **必须** 使以下所有库(提供原生 API)可供包含原生代码的应用使用
- libaaudio.so(AAudio 原生音频支持)
- libamidi.so(原生 MIDI 支持,如果声明了功能
android.software.midi
,如第 5.9 节中所述) - libandroid.so(原生 Android Activity 支持)
- libc(C 库)
- libcamera2ndk.so
- libdl(动态链接器)
- libEGL.so(原生 OpenGL Surface 管理)
- 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] **必须** 通过
libGLESv3.so
库导出 NDK 中定义的所有 OpenGL ES 3.1 和 Android Extension Pack 函数符号。请注意,虽然所有符号都**必须**存在,但第 7.1.4.1 节更详细地描述了何时需要完全实现每个相应函数的要求。[C-0-12] **必须** 通过
libvulkan.so
库导出核心 Vulkan 1.0 函数符号,以及VK_KHR_surface
、VK_KHR_android_surface
、VK_KHR_swapchain
、VK_KHR_maintenance1
和VK_KHR_get_physical_device_properties2
扩展。请注意,虽然所有符号都**必须**存在,但第 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 指令。
- CP15ISB、CP15DSB 和 CP15DMB 屏障操作。
[C-2-3] **必须** 包含对 高级 SIMD(又名 NEON)扩展的支持。
3.4. Web 兼容性
3.4.1. WebView 兼容性
如果设备实现提供 android.webkit.Webview
API 的完整实现,则它们
- [C-1-1] **必须** 报告
android.software.webview
。 - [C-1-2] **必须** 使用来自上游 Android 开源项目的 Chromium 项目在 Android 13 分支上的构建,来实现
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 规范。
[C-1-4] **必须** 在与实例化 WebView 的应用不同的进程中呈现所提供的内容或远程 URL 内容。具体而言,单独的渲染器进程**必须**保持较低的权限,以单独的用户 ID 运行,无法访问应用的数据目录,无法直接访问网络,并且只能通过 Binder 访问最低要求的系统服务。WebView 的 AOSP 实现满足此要求。
请注意,如果设备实现是 32 位或声明了功能标记 android.hardware.ram.low
,则它们可以免除 C-1-3。
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-11] 设备**必须** 从
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. 应用限制
如果设备实现实现了一种专有机制来限制应用(例如,更改或限制 SDK 中描述的 API 行为),并且该机制比 受限应用待机存储分区更严格,则它们
- [C-1-1] **必须** 允许用户查看受限应用列表。
- [C-1-2] **必须** 提供用户操作界面,以针对每个应用开启/关闭所有这些专有限制。
[C-1-3] **不得** 在没有系统运行状况不佳行为的证据的情况下自动应用这些专有限制,但可以根据对卡住的唤醒锁、长时间运行的服务和其他标准等系统运行状况不佳行为的检测来应用限制。这些标准可以由设备实现者确定,但**必须**与应用对系统运行状况的影响相关。其他与系统运行状况纯粹无关的标准,例如应用在市场中的受欢迎程度不足,**不得**用作标准。
[C-1-4] 当用户手动关闭应用限制时,**不得** 自动应用这些专有限制,并且可以建议用户应用这些专有限制。
[C-1-5] 如果自动将这些专有限制应用于应用,**必须** 通知用户。此类信息**必须**在应用这些专有限制之前的 24 小时内提供。
[C-1-6] **必须** 为来自应用的任何 API 调用,为 ActivityManager.isBackgroundRestricted() 方法返回 true。
[C-1-7] **不得** 限制用户明确使用的顶部前台应用。
[C-1-8] 每当用户开始明确使用应用并使其成为顶部前台应用时,**必须** 暂停对该应用的这些专有限制。
[C-1-10] **必须** 提供一份公开且清晰的文档或网站,描述如何应用专有限制。此文档或网站**必须**可从 Android SDK 文档链接,并且**必须**包含
- 专有限制的触发条件。
- 可以限制哪些应用以及如何限制。
- 应用如何免除此类限制。
- 应用如何请求免除专有限制(如果它们支持为此类用户可以安装的应用提供豁免)。
如果某个应用预装在设备上,并且用户从未明确使用超过 30 天,则可以免除 [C-1-3] 和 [C-1-5]。
如果设备实现扩展了 AOSP 中实现的应用限制,则它们
- [C-2-1] **必须** 遵循此文档中描述的实现。
3.5.2. 应用休眠
如果设备实现包含 AOSP 中包含的应用休眠功能,或者扩展了 AOSP 中包含的功能,则它们
- [C-1-1] **必须** 满足第 3.5.1 节中的所有要求,但 [C-1-6] 和 [C-1-3] 除外。
- [C-1-2] **必须** 仅当有证据表明用户在一段时间内未使用过该应用时,才对该用户的应用应用限制。**强烈建议** 此持续时间为一个或多个月。使用情况**必须**由通过 UsageStats#getLastTimeVisible() API 的显式用户互动或导致应用离开强制停止状态的任何操作(包括服务绑定、内容提供程序绑定、显式广播等)来定义,这将通过新的 API UsageStats#getLastTimeAnyComponentUsed() 进行跟踪。
- [C-1-3] **必须** 仅当有证据表明任何用户在一段时间内都未使用过该软件包时,才应用影响所有设备用户的限制。**强烈建议** 此持续时间为一个或多个月。
- [C-1-4] **不得** 使应用无法响应 Activity intent、服务绑定、内容提供程序请求或显式广播。
AOSP 中的应用休眠功能满足上述要求。
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] **不得** 位于另一组织拥有或引用的命名空间中。例如,设备实现者**不得**将 API 添加到
com.google.*
或类似的命名空间:只有 Google 可以这样做。同样,Google **不得**将 API 添加到其他公司的命名空间。 - [C-0-6] **必须** 打包在 Android 共享库中,以便只有明确使用它们的应用程序(通过 <uses-library> 机制)才会受到此类 API 内存使用量增加的影响。
设备实现者可以在 NDK API 之外的本机语言中添加自定义 API,但自定义 API
- [C-1-1] **不得** 位于 NDK 库中或 此处描述的另一组织拥有的库中。
如果设备实现者建议改进上述软件包命名空间之一(例如,通过向现有 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 格式的参考上游实现,以及该参考实现的软件包管理系统。
应该在各种执行模式和目标架构下运行模糊测试,以确保运行时的稳定性。请参阅 Android 开源项目网站中的 JFuzz 和 DexFuzz。
请注意,以下指定的内存值被认为是最小值,设备实现可以为每个应用程序分配更多内存。
屏幕布局 | 屏幕密度 | 最小应用程序内存 |
---|---|---|
Android 手表 | 120 dpi (ldpi) | 32MB |
140 dpi (140dpi) | ||
160 dpi (mdpi) | ||
180 dpi (180dpi) | ||
200 dpi (200dpi) | ||
213 dpi (tvdpi) | ||
220 dpi (220dpi) | 36MB | |
240 dpi (hdpi) | ||
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 |
140 dpi (140dpi) | ||
160 dpi (mdpi) | ||
180 dpi (180dpi) | 48MB | |
200 dpi (200dpi) | ||
213 dpi (tvdpi) | ||
220 dpi (220dpi) | ||
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 |
140 dpi (140dpi) | 48MB | |
160 dpi (mdpi) | ||
180 dpi (180dpi) | 80MB | |
200 dpi (200dpi) | ||
213 dpi (tvdpi) | ||
220 dpi (220dpi) | ||
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 |
140 dpi (140dpi) | 80MB | |
160 dpi (mdpi) | ||
180 dpi (180dpi) | 96MB | |
200 dpi (200dpi) | ||
213 dpi (tvdpi) | ||
220 dpi (220dpi) | ||
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。
如果设备实现支持单色图标,则这些图标
- [C-6-1] 必须仅在用户明确启用它们时使用(例如,通过“设置”或壁纸选择器菜单)。
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,这些 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-1] 强烈建议为用户提供一种机制来控制暴露给已获得通知侦听器权限的应用的通知。粒度必须达到用户可以为每个此类通知侦听器控制桥接到此侦听器的通知类型。类型必须包括“对话”、“警报”、“静默”和“重要持续”通知。
- [C-SR-2] 强烈建议为用户提供一种机制来指定要从通知任何特定通知侦听器的应用中排除的应用。
- [C-SR-3] 强烈建议在用户多次关闭某个第三方应用的通知后,自动显示用户机制以阻止该第三方应用的每个渠道和应用包级别的通知。
- 应该支持富通知。
- 应该将一些较高优先级的通知显示为浮动通知。
- 应该具有用户机制来延迟通知。
- 可以仅管理第三方应用程序通知用户重要事件的可见性和时间,以减轻驾驶员分心等安全问题。
Android 11 引入了对对话通知的支持,这些通知使用 MessagingStyle 并提供已发布的 People 快捷方式 ID。
设备实现
- [C-SR-4] 强烈建议将
对话通知
分组并显示在非对话通知之前,但持续前台服务通知和importance:high
通知除外。
如果设备实现支持对话通知
并且应用程序为 bubbles
提供了所需的数据,则它们
- [C-SR-5] 强烈建议将此对话显示为气泡。AOSP 实现通过默认的系统 UI、设置和启动器满足这些要求。
如果设备实现支持富通知,则它们
- [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,这些 API 允许应用(一旦用户明确启用)接收所有通知的副本,因为它们会被发布或更新。
设备实现
- [C-0-1] 必须正确且及时地将通知完整更新到所有此类已安装且用户启用的侦听器服务,包括附加到 Notification 对象的所有元数据。
- [C-0-2] 必须遵守
snoozeNotification()
API 调用,并在 API 调用中设置的延迟持续时间后,关闭通知并进行回调。
如果设备实现具有用户机制来延迟通知,则它们
- [C-1-1] 必须通过标准 API(例如
NotificationListenerService.getSnoozedNotifications()
)正确反映延迟的通知状态。 - [C-1-2] 必须向用户提供此用户机制,以便从每个已安装的第三方应用程序延迟通知,除非它们来自持久/前台服务。
3.8.3.3. DND(请勿打扰)/ 优先级模式
如果设备实现支持 DND 功能(也称为优先级模式),则它们
- [C-1-1] 当设备实现提供了用户授予或拒绝第三方应用程序访问 DND 策略配置的手段时,必须显示应用程序创建的 自动 DND 规则 以及用户创建和预定义的规则。
- [C-1-3] 必须遵守沿
NotificationManager.Policy
传递的suppressedVisualEffects
值,并且如果应用程序设置了 SUPPRESSED_EFFECT_SCREEN_OFF 或 SUPPRESSED_EFFECT_SCREEN_ON 标志中的任何一个,则应该在 DND 设置菜单中向用户指示视觉效果被抑制。
3.8.4. 辅助 API
Android 包含 辅助 API,允许应用程序选择与设备上的助理共享多少当前上下文信息。
如果设备实现支持辅助操作,则它们
- [C-2-1] 必须通过以下任一方式向最终用户清楚地表明何时共享上下文:
- 每次辅助应用程序访问上下文时,在屏幕边缘周围显示白光,其持续时间和亮度符合或超过 Android 开源项目实现的水平。
- 对于预安装的辅助应用程序,提供一个用户机制,该机制距离默认语音输入和助理应用程序设置菜单的导航距离小于两次,并且仅在用户通过热词或辅助导航键输入显式调用辅助应用程序时才共享上下文。
- [C-2-2] 如第 7.2.3 节中所述,用于启动辅助应用程序的指定交互必须启动用户选择的辅助应用程序,换句话说,即实现
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 主题属性或其资源。
[C-1-3] 必须将“sans-serif”字体系列设置为 Roboto 2.x 版本(对于 Roboto 支持的语言),或者为用户提供一种机制来将“sans-serif”字体系列使用的字体更改为 Roboto 2.x 版本(对于 Roboto 支持的语言)。
[C-1-4] 必须按照
Settings.THEME_CUSTOMIZATION_OVERLAY_PACKAGES
的 AOSP 文档(参见android.theme.customization.system_palette
和android.theme.customization.theme_style
)中的规定生成动态颜色色调调色板。[C-1-5] 必须使用
Settings.THEME_CUSTOMIZATION_OVERLAY_PACKAGES
文档(参见android.theme.customization.theme_styles
)中枚举的颜色主题样式生成动态颜色色调调色板,即TONAL_SPOT
、VIBRANT
、EXPRESSIVE
、SPRITZ
、RAINBOW
、FRUIT_SALAD
。当与
android.theme.customization.system_palette
一起发送时(如Settings.THEME_CUSTOMIZATION_OVERLAY_PACKAGES
中所述),用于生成动态颜色色调调色板的“源颜色”。[C-1-6] 必须具有大于或等于 5 的
CAM16
色度值。应该通过
com.android.systemui.monet.ColorScheme#getSeedColors
从壁纸派生,这提供了多个有效的源颜色可供选择。如果提供的颜色均不满足上述源颜色要求,则应该使用值
0xFF1B6EF3
。
Android 还包含“设备默认”主题系列,作为一组定义的样式,供应用程序开发者使用,如果他们想匹配设备实现者定义的设备主题外观。
- 设备实现可以修改暴露给应用程序的 设备默认主题属性。
Android 支持具有半透明系统栏的变体主题,这允许应用程序开发者用他们的应用内容填充状态栏和导航栏后面的区域。为了在这种配置中实现一致的开发者体验,重要的是跨不同的设备实现保持状态栏图标样式。
如果设备实现包含系统状态栏,则它们
- [C-2-1] 必须对系统状态图标(例如信号强度和电池电量)以及系统发出的通知使用白色,除非图标指示有问题状态或应用程序使用 WindowInsetsController#APPEARANCE_LIGHT_STATUS_BARS 标志请求浅色状态栏。
- [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”),但可以延迟到用户与屏幕交互时才显示。
- 应该实现一个快捷方式,以便轻松切换到上一个活动。
- 当最近使用功能键被点击两次时,应该触发最近使用的两个应用程序之间的快速切换操作。
- 如果支持分屏多窗口模式,则应该在长按最近使用功能键时触发分屏多窗口模式。
- 可以显示关联的最近使用项,作为一个一起移动的组。
- [C-SR-1] 强烈建议对概览屏幕使用上游 Android 用户界面(或类似的基于缩略图的界面)。
3.8.9. 输入管理
Android 包括对 输入管理和对第三方输入法编辑器的支持。
如果设备实现允许用户在该设备上使用第三方输入法,则它们
- [C-1-1] 必须声明平台功能 android.software.input_methods 并支持 Android SDK 文档中定义的 IME API。
3.8.10. 锁屏媒体控制
Remote Control Client API 已从 Android 5.0 中弃用,取而代之的是 媒体通知模板,该模板允许媒体应用程序与锁定屏幕上显示的播放控件集成。
3.8.11. 屏幕保护程序(以前称为 Dreams)
有关配置屏幕保护程序的设置 intent,请参阅第 3.2.3.5 节。
3.8.12. 位置
如果设备实现包含能够提供位置坐标的硬件传感器(例如 GPS),则它们
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 覆盖范围,包括拉丁文扩展 A、B、C 和 D 范围,以及 Unicode 7.0 的货币符号块中的所有字形。
- [C-1-3] 不得删除或修改系统映像中的 NotoColorEmoji.tff。(可以添加新的表情符号字体来覆盖 NotoColorEmoji.tff 中的表情符号)
- 应该支持Unicode 技术报告 #51中指定的肤色和多样化的家庭表情符号。
如果设备实现包含 IME,则它们
- 应该为用户提供这些表情符号字符的输入法。
Android 包括渲染缅甸语字体的支持。缅甸语有几种不符合 Unicode 标准的字体,通常称为“Zawgyi”,用于渲染缅甸语。
如果设备实现包含对缅甸语的支持,则它们
- [C-2-1] 必须默认使用符合 Unicode 标准的字体渲染文本;除非用户在语言选择器中选择,否则不得将不符合 Unicode 标准的字体设置为默认字体。
- [C-2-2] 如果设备支持不符合 Unicode 标准的字体,则必须支持 Unicode 字体和不符合 Unicode 标准的字体。不符合 Unicode 标准的字体不得删除或覆盖 Unicode 字体。
- [C-2-3] 必须仅当指定了带有 脚本代码 Qaag 的语言代码时(例如 my-Qaag),才使用不符合 Unicode 标准的字体渲染文本。不得使用任何其他 ISO 语言或地区代码(无论是已分配、未分配还是保留)来指代缅甸语的不符合 Unicode 标准的字体。应用程序开发者和网页作者可以像指定任何其他语言一样指定 my-Qaag 作为指定的语言代码。
3.8.14. 多窗口
如果设备实现具有同时显示多个活动的能力,则它们
- [C-1-1] 必须根据 Android SDK 多窗口模式支持文档中描述的应用程序行为和 API 实现此类多窗口模式,并满足以下要求
- [C-1-2] 必须遵守应用程序在
AndroidManifest.xml
文件中设置的android:resizeableActivity
,如 此 SDK 中所述。 - [C-1-3] 如果屏幕高度小于 440 dp 且屏幕宽度小于 440 dp,则不得提供分屏或自由窗口模式。
- [C-1-4] 在除画中画以外的多窗口模式下,活动的大小不得调整为小于 220dp。
- 屏幕尺寸为
xlarge
的设备实现应该支持自由窗口模式。
如果设备实现支持多窗口模式和分屏模式,则它们
- [C-2-2] 如果启动器应用是焦点窗口,则必须裁剪分屏多窗口的停靠活动,但应该显示其部分内容。
- [C-2-3] 必须遵守第三方启动器应用程序声明的
AndroidManifestLayout_minWidth
和AndroidManifestLayout_minHeight
值,并且在显示停靠活动的某些内容的过程中,不得覆盖这些值。
如果设备实现支持多窗口模式和画中画多窗口模式,则它们
- [C-3-1] 当应用程序满足以下条件时,必须在画中画多窗口模式下启动活动:* 目标 API 级别为 26 或更高,并声明了
android:supportsPictureInPicture
* 目标 API 级别为 25 或更低,并同时声明了android:resizeableActivity
和android:supportsPictureInPicture
。 - [C-3-2] 必须按照当前画中画 (PIP) 活动的规定,通过
setActions()
API 在其 SystemUI 中公开操作。 - [C-3-3] 必须支持宽高比大于或等于 1:2.39 且小于或等于 2.39:1 的纵横比,如画中画 (PIP) 活动通过
setAspectRatio()
API 所指定。 - [C-3-4] 必须使用
KeyEvent.KEYCODE_WINDOW
来控制 PIP 窗口;如果未实现 PIP 模式,则该键必须可供前台活动使用。 - [C-3-5] 必须提供用户可操作的选项来阻止应用以 PIP 模式显示;AOSP 实现通过在通知栏中设置控件来满足此要求。
[C-3-6] 当应用未声明
AndroidManifestLayout_minWidth
和AndroidManifestLayout_minHeight
的任何值时,必须为 PIP 窗口分配以下最小宽度和高度- Configuration.uiMode 设置为除
UI_MODE_TYPE_TELEVISION
之外的其他值的设备,必须分配最小宽度和高度为 108 dp。 - Configuration.uiMode 设置为
UI_MODE_TYPE_TELEVISION
的设备,必须分配最小宽度为 240 dp,最小高度为 135 dp。
- Configuration.uiMode 设置为除
3.8.15. 显示屏缺口
Android 支持 SDK 文档中描述的显示屏缺口。DisplayCutout
API 定义了显示屏边缘上的一个区域,由于显示屏缺口或边缘的曲面显示,该区域可能无法供应用使用。
如果设备实现包含显示屏缺口,则它们
- [C-1-5] 如果设备的宽高比为 1.0(1:1),则不得有缺口。
- [C-1-2] 每条边不得有多个缺口。
- [C-1-3] 必须遵守应用通过
WindowManager.LayoutParams
API 设置的显示屏缺口标志,如 SDK 中所述。 - [C-1-4] 必须报告
DisplayCutout
API 中定义的所有缺口指标的正确值。
3.8.16. 设备控件
Android 包含 ControlsProviderService
和 Control
API,允许第三方应用发布设备控件,以便用户快速查看状态和执行操作。
有关特定于设备的要求,请参阅 2_2_3 节。
3.8.17. 剪贴板
设备实现
- [C-0-1] 未经用户明确操作(例如,按下叠加层上的按钮)或内容正在发送的指示,不得将剪贴板数据发送到任何组件、活动、服务或跨任何网络连接,但 9.8.6 内容捕获和应用搜索 中提及的服务除外。
如果设备实现在内容复制到剪贴板时为任何 ClipData
项生成用户可见的预览,其中 ClipData.getDescription().getExtras()
包含 android.content.extra.IS_SENSITIVE
,则它们
- [C-1-1] 必须编辑用户可见的预览
AOSP 参考实现满足这些剪贴板要求。
3.9. 设备管理
Android 包含一些功能,允许具有安全意识的应用在系统级别执行设备管理功能,例如通过 Android 设备管理 API 强制执行密码政策或执行远程擦除。
如果设备实现实现了 Android SDK 文档中定义的全部 设备管理 政策,则它们
- [C-1-1] 必须声明
android.software.device_admin
。 - [C-1-2] 必须支持 第 3.9.1 节 和 第 3.9.1.1 节 中描述的设备所有者配置。
3.9.1 设备配置
3.9.1.1 设备所有者配置
如果设备实现声明 android.software.device_admin
,则它们
- [C-1-1] 必须支持将设备策略客户端 (DPC) 注册为 设备所有者应用,如下所述
- 当设备实现既没有配置 用户 也没有用户数据时,它
- [C-1-5] 如果设备通过功能标志
android.hardware.nfc
声明支持近场通信 (NFC),并且收到包含 MIME 类型为MIME_TYPE_PROVISIONING_NFC
的记录的 NFC 消息,则必须将 DPC 应用注册为设备所有者应用,或允许 DPC 应用选择是成为设备所有者还是个人资料所有者。 - [C-1-8] 必须在设备所有者配置触发后发送 ACTION_GET_PROVISIONING_MODE Intent,以便 DPC 应用可以根据
android.app.extra.PROVISIONING_ALLOWED_PROVISIONING_MODES
的值选择是成为设备所有者还是个人资料所有者,除非可以从上下文中确定只有一个有效的选项。 - [C-1-9] 无论使用哪种配置方法,如果在配置期间建立了设备所有者,则必须向设备所有者应用发送 ACTION_ADMIN_POLICY_COMPLIANCE Intent。在设备所有者应用完成之前,用户不得在设置向导中继续操作。
- [C-1-5] 如果设备通过功能标志
- 当设备实现具有 用户 或用户数据时,它
- [C-1-7] 不得再将任何 DPC 应用注册为设备所有者应用。
- 当设备实现既没有配置 用户 也没有用户数据时,它
- [C-1-2] 必须在将应用设置为设备所有者之前,显示适当的披露声明(例如 AOSP 中引用的声明)并获得最终用户的明确同意,除非设备在屏幕上的最终用户交互之前已通过编程方式配置为 零售演示模式。
如果设备实现声明 android.software.device_admin
,但同时也包含专有的设备管理解决方案,并提供一种机制来将专有解决方案中配置的应用提升为标准 Android DevicePolicyManager API 认可的标准“设备所有者”的“设备所有者等效项”,则它们
- [C-2-1] 必须制定流程来验证要提升的特定应用是否属于合法的企业设备管理解决方案,并且已在专有解决方案中配置为具有与“设备所有者”等效的权限。
- [C-2-2] 必须在将 DPC 应用注册为“设备所有者”之前,显示与
android.app.action.PROVISION_MANAGED_DEVICE
发起的流程相同的 AOSP 设备所有者同意披露声明。 - [C-2-3] 不得硬编码同意,也不得阻止使用其他设备所有者应用。
3.9.1.2 受管理个人资料配置
如果设备实现声明 android.software.managed_users
,则它们
[C-1-1] 必须实现 API,允许设备策略控制器 (DPC) 应用成为新的受管理个人资料的所有者。
[C-1-2] 受管理个人资料配置过程(由 DPC 使用 android.app.action.PROVISION_MANAGED_PROFILE 或平台发起的流程)、同意屏幕和用户体验必须与 AOSP 实现保持一致。
[C-1-3] 必须在“设置”中提供以下用户可操作的选项,以向用户指示特定系统功能何时被设备策略控制器 (DPC) 禁用
- 一致的图标或其他用户可操作的选项(例如上游 AOSP 信息图标),以表示特定设置何时受到设备管理员的限制。
- 简短的说明消息,由设备管理员通过
setShortSupportMessage
提供。 - DPC 应用的图标。
[C-1-4] 如果在由 android.app.action.PROVISION_MANAGED_PROFILE Intent 发起的配置中建立了个人资料所有者,并且 DPC 实现了处理程序,则必须在工作个人资料中启动 ACTION_PROVISIONING_SUCCESSFUL Intent 的处理程序。
[C-1-5] 当由 android.app.action.PROVISION_MANAGED_PROFILE Intent 发起配置时,必须向工作个人资料 DPC 发送 ACTION_PROFILE_PROVISIONING_COMPLETE 广播。
[C-1-6] 必须在个人资料所有者配置触发后发送 ACTION_GET_PROVISIONING_MODE Intent,以便 DPC 应用可以选择是成为设备所有者还是个人资料所有者,但由 Intent android.app.action.PROVISION_MANAGED_PROFILE 触发的配置除外。
[C-1-7] 无论使用哪种配置方法,如果在配置期间建立了个人资料所有者,则必须向工作个人资料发送 ACTION_ADMIN_POLICY_COMPLIANCE Intent,但由 Intent android.app.action.PROVISION_MANAGED_PROFILE 触发的配置除外。在个人资料所有者应用完成之前,用户不得在设置向导中继续操作。
[C-1-8] 无论使用哪种配置方法,当建立个人资料所有者时,都必须向个人资料 DPC 发送 ACTION_MANAGED_PROFILE_PROVISIONED 广播。
3.9.2 受管理个人资料支持
如果设备实现声明 android.software.managed_users
,则它们
- [C-1-1] 必须通过
android.app.admin.DevicePolicyManager
API 支持受管理个人资料。 - [C-1-2] 必须允许创建且仅允许创建 一个受管理个人资料。
- [C-1-3] 必须使用图标徽章(类似于 AOSP 上游工作徽章)来表示受管理的应用和小部件以及其他带徽章的 UI 元素,如“最近使用”和“通知”。
- [C-1-4] 必须显示通知图标(类似于 AOSP 上游工作徽章),以指示用户何时位于受管理个人资料应用中。
- [C-1-5] 如果设备唤醒 (ACTION_USER_PRESENT) 并且前台应用位于受管理个人资料中,则必须显示 Toast 消息,指示用户位于受管理个人资料中。
- [C-1-6] 如果存在受管理个人资料,则必须在 Intent“选择器”中显示视觉提示,以允许用户将 Intent 从受管理个人资料转发到主用户,反之亦然(如果设备策略控制器启用)。
- [C-1-7] 如果存在受管理个人资料,则必须为主用户和受管理个人资料公开以下用户可操作的选项
- 分别核算主用户和受管理个人资料的电池、位置信息、移动数据和存储空间用量。
- 独立管理主用户或受管理个人资料中安装的 VPN 应用。
- 独立管理主用户或受管理个人资料中安装的应用。
- 独立管理主用户或受管理个人资料中的帐号。
- [C-1-8] 必须确保预装的拨号器、联系人和消息应用可以从受管理个人资料(如果存在)以及主个人资料中搜索和查找来电者信息(如果设备策略控制器允许)。
- [C-1-9] 必须确保它满足适用于启用多用户的设备的所有安全要求(请参阅 第 9.5 节),即使受管理个人资料不计为除主用户之外的另一个用户。
如果设备实现声明 android.software.managed_users
和 android.software.secure_lock_screen
,则它们
- [C-2-1] 必须支持指定单独的锁屏的能力,以满足以下要求,仅授予对受管理个人资料中运行的应用的访问权限。
- 设备实现必须遵守
DevicePolicyManager.ACTION_SET_NEW_PASSWORD
Intent,并显示一个界面来为受管理个人资料配置单独的锁屏凭据。 - 受管理个人资料的锁屏凭据必须使用与父个人资料相同的凭据存储和管理机制,如 Android 开源项目网站 上所述。
- DPC 密码政策 必须仅适用于受管理个人资料的锁屏凭据,除非在 getParentProfileInstance 返回的
DevicePolicyManager
实例上调用。
- 设备实现必须遵守
- 当受管理个人资料中的联系人显示在预装的通话记录、通话中 UI、正在进行和未接来电通知、联系人和消息应用中时,它们应使用与指示受管理个人资料应用相同的徽章进行标记。
3.9.3 受管理用户支持
如果设备实现声明 android.software.managed_users
,则它们
- [C-1-1] 当
isLogoutEnabled
返回true
时,必须提供用户可操作的选项,以便从当前用户注销并切换回多用户会话中的主用户。用户可操作的选项必须可以从锁屏界面访问,而无需解锁设备。
如果设备实现声明 android.software.device_admin
并提供设备上的用户可操作选项来添加其他辅助用户,则它们
- [C-SR-1] 强烈建议在允许在新辅助用户中添加帐号之前,显示与 android.app.action.PROVISION_MANAGED_DEVICE 发起的流程中显示的相同的 AOSP 设备所有者同意披露声明,以便用户了解设备是受管理的。
3.9.4 设备策略管理角色要求
如果设备实现报告 android.software.device_admin
或 android.software.managed_users
,则它们
- [C-1-1] 必须支持 第 9.1 节 中定义的设备策略管理角色。持有设备策略管理角色的应用可以通过将
config_devicePolicyManagement
设置为软件包名称来定义。软件包名称后必须跟:
和签名证书,除非该应用已预加载。
如果未如上所述为 config_devicePolicyManagement
定义软件包名称
- [C-2-1] 设备实现必须支持在没有设备策略管理角色持有者应用的情况下进行配置(AOSP 提供了参考实现)。
如果如上所述为 config_devicePolicyManagement
定义了软件包名称
- [C-3-1] 该应用必须安装在 用户 的所有个人资料上。
- [C-3-2] 设备实现可以定义一个应用,该应用通过设置
config_devicePolicyManagementUpdater
在配置之前更新设备策略管理角色持有者。
如果如上所述为 config_devicePolicyManagementUpdater
定义了软件包名称
- [C-4-1] 该应用必须预装在设备上。
- [C-4-2] 该应用必须实现一个 Intent 过滤器,该过滤器解析
android.app.action.UPDATE_DEVICE_POLICY_MANAGEMENT_ROLE_HOLDER
。
3.10. 无障碍功能
Android 提供了一个无障碍功能层,可帮助残障用户更轻松地浏览其设备。此外,Android 还提供平台 API,使无障碍功能服务实现能够接收用户和系统事件的回调,并生成替代反馈机制,例如文本转语音、触感反馈和轨迹球/方向键导航。
如果设备实现支持第三方无障碍服务,则它们
- [C-1-1] 必须提供 Android 无障碍功能框架的实现,如 无障碍功能 API SDK 文档中所述。
- [C-1-2] 必须生成无障碍功能事件,并将适当的
AccessibilityEvent
传递给所有已注册的AccessibilityService
实现,如 SDK 中所述。 - [C-1-4] 必须提供用户可操作的选项来控制声明 AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON 的无障碍功能服务。请注意,对于具有系统导航栏的设备实现,它们应允许用户选择在系统导航栏中设置一个按钮来控制这些服务。
如果设备实现包含预装的无障碍功能服务,则它们
- [C-2-1] 当数据存储使用基于文件的加密 (FBE) 进行加密时,必须将这些预装的无障碍功能服务实现为 Direct Boot Aware 应用。
- 应在开箱即用设置流程中提供一种机制,供用户启用相关的无障碍功能服务,以及调整字体大小、显示尺寸和放大手势的选项。
3.11. 文本转语音
Android 包含一些 API,允许应用使用文本转语音 (TTS) 服务,并允许服务提供商提供 TTS 服务的实现。
如果设备实现报告功能 android.hardware.audio.output,则它们
- [C-1-1] 必须支持 Android TTS 框架 API。
如果设备实现支持安装第三方 TTS 引擎,则它们
- [C-2-1] 必须提供用户可操作的选项,以允许用户选择要在系统级别使用的 TTS 引擎。
3.12. TV 输入框架
Android 电视输入框架 (TIF) 简化了向 Android 电视设备交付直播内容的过程。TIF 提供了一个标准 API,用于创建控制 Android 电视设备的输入模块。
如果设备实现支持 TIF,则它们
- [C-1-1] 必须声明平台功能
android.software.live_tv
。 - [C-1-2] 必须支持所有 TIF API,以便可以使用这些 API 和 第三方基于 TIF 的输入 服务的应用可以安装并在设备上使用。
3.13. 快捷设置
Android 提供了一个“快捷设置”UI 组件,可快速访问常用或紧急需要的操作。
如果设备实现包含“快捷设置”UI 组件并支持第三方快捷设置,则它们
- [C-1-1] 必须允许用户从第三方应用添加或移除通过
quicksettings
API 提供的图块。 - [C-1-2] 不得自动将第三方应用的图块直接添加到“快捷设置”。
- [C-1-3] 必须与系统提供的快捷设置图块一起显示来自第三方应用的所有用户添加的图块。
3.14. 媒体 UI
如果设备实现包含非语音激活的应用(以下简称“应用”),这些应用通过 MediaBrowser
或 MediaSession
与第三方应用交互,则这些应用
[C-1-2] 必须清楚地显示通过
getIconBitmap()
或getIconUri()
获取的图标,以及通过MediaDescription
中描述的getTitle()
获取的标题。可以缩短标题以符合安全法规(例如,驾驶员注意力分散)。[C-1-3] 每当显示此第三方应用提供的内容时,都必须显示第三方应用图标。
[C-1-4] 必须允许用户与整个
MediaBrowser
层次结构进行交互。可以限制对部分层次结构的访问,以符合安全法规(例如,驾驶员注意力分散),但不允许根据内容或内容提供商给予优惠待遇。[C-1-5] 对于
MediaSession.Callback#onMediaButtonEvent
,必须将双击KEYCODE_HEADSETHOOK
或KEYCODE_MEDIA_PLAY_PAUSE
视为KEYCODE_MEDIA_NEXT
。
3.15. 即时应用
如果设备实现支持即时应用,则它们必须满足以下要求
- [C-1-1] 即时应用只能被授予
android:protectionLevel
设置为"instant"
的权限。 - [C-1-2] 即时应用不得通过 隐式 Intent 与已安装的应用交互,除非满足以下条件之一
- 组件的 Intent 模式过滤器已公开并具有 CATEGORY_BROWSABLE
- 操作是 ACTION_SEND、ACTION_SENDTO、ACTION_SEND_MULTIPLE 之一
- 目标通过 android:visibleToInstantApps 显式公开
- [C-1-3] 除非组件通过 android:visibleToInstantApps 公开,否则即时应用不得与已安装的应用显式交互。
- [C-1-4] 除非即时应用显式连接到已安装的应用,否则已安装的应用不得查看有关设备上即时应用的详细信息。
设备实现必须提供以下用户可操作的选项,以便与即时应用进行交互。AOSP 通过默认的 System UI、“设置”和启动器满足这些要求。设备实现
- [C-1-5] 必须提供用户可操作的选项,以查看和删除本地缓存的每个单独应用软件包的即时应用。
- [C-1-6] 必须提供持久性用户通知,该通知可以在即时应用在前台运行时折叠。此用户通知必须包含即时应用不需要安装,并提供一个用户可操作的选项,将用户定向到“设置”中的应用信息屏幕。对于通过 Web Intent 启动的即时应用(通过使用操作设置为
Intent.ACTION_VIEW
且方案为“http”或“https”的 Intent 定义),如果设备上提供了浏览器,则其他用户可操作选项应允许用户不启动即时应用,而是使用配置的 Web 浏览器启动关联的链接。 - [C-1-7] 如果设备上提供了“最近使用”功能,则必须允许从“最近使用”功能访问正在运行的即时应用。
[C-1-8] 必须预加载一个或多个应用或服务组件,其中包含 SDK 此处 列出的 Intent 的 Intent 处理程序,并使 Intent 对即时应用可见。
3.16. 伴侣设备配对
Android 包括对伴侣设备配对的支持,以便更有效地管理与伴侣设备的关联,并提供 CompanionDeviceManager
API 供应用访问此功能。
如果设备实现支持伴侣设备配对功能,则它们
- [C-1-1] 必须声明功能标志
FEATURE_COMPANION_DEVICE_SETUP
。 - [C-1-2] 必须确保完全实现
android.companion
软件包中的 API。 - [C-1-3] 必须提供用户可操作的选项,供用户选择/确认伴侣设备已存在且可操作。
3.17. 重量级应用
如果设备实现声明功能 FEATURE_CANT_SAVE_STATE
,则它们
- [C-1-1] 在系统中一次必须仅运行一个指定
cantSaveState
的已安装应用。如果用户在未显式退出的情况下离开此类应用(例如,在离开活动活动时按 Home 键,而不是在系统中没有剩余活动活动时按返回键),则设备实现必须像对待其他预期保持运行的事项(例如前台服务)一样,优先考虑 RAM 中的该应用。当此类应用在后台运行时,系统仍然可以对其应用电源管理功能,例如限制 CPU 和网络访问。 - [C-1-2] 一旦用户启动使用
cantSaveState
属性声明的第二个应用,则必须提供 UI 可操作选项来选择不参与正常状态保存/恢复机制的应用。 - [C-1-3] 不得对指定
cantSaveState
的应用应用其他策略更改,例如更改 CPU 性能或更改调度优先级。
如果设备实现未声明功能 FEATURE_CANT_SAVE_STATE
,则它们
- [C-1-1] 必须忽略应用设置的
cantSaveState
属性,并且不得根据该属性更改应用行为。
3.18. 联系人
Android 包含 联系人提供程序
API,允许应用管理设备上存储的联系人信息。直接输入到设备中的联系人数据通常会与 Web 服务同步,但数据也可能仅驻留在设备本地。仅存储在设备上的联系人称为 本地联系人。
RawContacts 在 帐号 中“关联”或“存储”,当原始联系人的 ACCOUNT_NAME
和 ACCOUNT_TYPE
列与帐号的相应 Account.name 和 Account.type 字段匹配时。
默认本地帐号:原始联系人的帐号,仅存储在设备上,并且未与 AccountManager 中的帐号关联,这些帐号使用 ACCOUNT_NAME
和 ACCOUNT_TYPE
列的空值创建。
自定义本地帐号:原始联系人的帐号,仅存储在设备上,并且未与 AccountManager 中的帐号关联,这些帐号使用 ACCOUNT_NAME
和 ACCOUNT_TYPE
列的至少一个非空值创建。
设备实现
- [C-SR-1] 强烈建议不要创建 自定义本地帐号。
如果设备实现使用 自定义本地帐号
- [C-1-1] 自定义本地帐号的
ACCOUNT_NAME
必须由ContactsContract.RawContacts.getLocalAccountName
返回 - [C-1-2] 自定义本地帐号的
ACCOUNT_TYPE
必须由ContactsContract.RawContacts.getLocalAccountType
返回 - [C-1-3] 由第三方应用使用默认本地帐号(即通过为
ACCOUNT_NAME
和ACCOUNT_TYPE
设置空值)插入的原始联系人必须插入到 自定义本地帐号。 - [C-1-4] 插入到 自定义本地帐号 中的原始联系人在添加或移除帐号时不应被移除。
- [C-1-5] 对 自定义本地帐号 执行的删除操作必须导致原始联系人立即被清除(就像
CALLER_IS_SYNCADAPTER
参数设置为 true 一样),即使CALLER\_IS\_SYNCADAPTER
参数设置为 false 或未指定。
4. 应用封装兼容性
设备实现
[C-0-1] 必须能够安装和运行由包含在 官方 Android SDK 中的 “aapt” 工具生成的 Android “.apk” 文件。
- 由于以上要求可能具有挑战性,强烈建议设备实现使用 AOSP 参考实现的软件包管理系统。
[C-0-2] 必须支持使用 APK Signature Scheme v3.1、APK Signature Scheme v3、APK Signature Scheme v2 和 JAR 签名验证“.apk”文件。
[C-0-3] 绝不能以会阻止这些文件在其他兼容设备上正确安装和运行的方式扩展 .apk、Android Manifest、Dalvik 字节码或 RenderScript 字节码格式。
[C-0-4] 绝不允许除软件包的当前“记录安装程序”之外的应用在没有任何用户确认的情况下静默卸载应用,如
DELETE_PACKAGE
权限的 SDK 中所述。唯一的例外是处理 PACKAGE_NEEDS_VERIFICATION intent 的系统软件包验证程序应用和处理 ACTION_MANAGE_STORAGE intent 的存储管理器应用。[C-0-5] 必须具有一个 activity 来处理
android.settings.MANAGE_UNKNOWN_APP_SOURCES
intent。[C-0-6] 除非 请求安装 的应用满足以下所有要求,否则绝不能从未知来源安装应用程序包
- 它必须声明
REQUEST_INSTALL_PACKAGES
权限或将android:targetSdkVersion
设置为 24 或更低。 - 它必须已获得用户授予的从未知来源安装应用的权限。
- 它必须声明
应该提供用户界面,以允许用户按应用程序授予/撤销从未知来源安装应用的权限,但可以选择将其实现为无操作,并为
startActivityForResult()
返回RESULT_CANCELED
,如果设备实现不希望允许用户进行此选择。但是,即使在这种情况下,他们也应该向用户说明为什么没有提供这种选择。[C-0-7] 必须在启动已被同一系统 API
PackageManager.setHarmfulAppWarning
标记为可能有害的应用程序中的 activity 之前,向用户显示带有通过系统 APIPackageManager.setHarmfulAppWarning
提供的警告字符串的警告对话框。应该提供用户界面,以允许用户在警告对话框中选择卸载或启动应用程序。
[C-0-8] 必须实现对增量文件系统的支持,如此处所述。
[C-0-9] 必须支持使用 APK Signature Scheme v4 和 APK Signature Scheme v4.1 验证 .apk 文件。
5. 多媒体兼容性
设备实现
- [C-0-1] 对于
MediaCodecList
声明的每个编解码器,必须支持 第 5.1 节 中定义的媒体格式、编码器、解码器、文件类型和容器格式。 - [C-0-2] 必须声明和报告通过
MediaCodecList
向第三方应用程序提供的编码器和解码器的支持。 - [C-0-3] 必须能够正确解码并向第三方应用提供其可以编码的所有格式。这包括其编码器生成的所有比特流及其
CamcorderProfile
中报告的配置文件。
设备实现
- 应该力求最小化编解码器延迟,换句话说,它们
- 不应消耗和存储输入缓冲区,而应仅在处理后才返回输入缓冲区。
- 不应将解码后的缓冲区保留超过标准(例如 SPS)指定的时间。
- 不应将编码后的缓冲区保留超过 GOP 结构所需的时间。
以下各节中列出的所有编解码器都在 Android 开放源代码项目的首选 Android 实现中作为软件实现提供。
请注意,Google 和开放手机联盟均未声明这些编解码器不受第三方专利的约束。有意在硬件或软件产品中使用此源代码的人员应注意,此代码的实现,包括在开源软件或共享软件中的实现,可能需要获得相关专利持有人的专利许可。
5.1. 媒体编解码器
5.1.1. 音频编码
更多详细信息,请参见 5.1.3. 音频编解码器详细信息。
如果设备实现声明 android.hardware.microphone
,则它们必须支持编码以下音频格式并使其可供第三方应用使用
- [C-1-1] PCM/WAVE
- [C-1-2] FLAC
- [C-1-3] Opus
所有音频编码器必须支持
- [C-3-1] 通过
android.media.MediaCodec
API 的 PCM 16 位本机字节序音频帧。
5.1.2. 音频解码
更多详细信息,请参见 5.1.3. 音频编解码器详细信息。
如果设备实现声明支持 android.hardware.audio.output
功能,则它们必须支持解码以下音频格式
- [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 (增强型 AAC+)
- [C-1-4] AAC ELD (增强型低延迟 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,包括高达 24 位、192 kHz 采样率和 8 声道的高分辨率音频格式。请注意,此要求仅适用于解码,并且设备允许在播放阶段进行降采样和下混。
- [C-1-10] Opus
如果设备实现支持通过 android.media.MediaCodec
API 中的默认 AAC 音频解码器将多声道流(即超过两个声道)的 AAC 输入缓冲区解码为 PCM,则必须支持以下内容
- [C-2-1] 解码必须在没有下混的情况下执行(例如,5.0 AAC 流必须解码为五个声道的 PCM,5.1 AAC 流必须解码为六个声道的 PCM)。
- [C-2-2] 动态范围元数据必须按照 ISO/IEC 14496-3 中的“动态范围控制 (DRC)”定义,并且
android.media.MediaFormat
DRC 密钥用于配置音频解码器的动态范围相关行为。AAC DRC 密钥在 API 21 中引入,包括:KEY_AAC_DRC_ATTENUATION_FACTOR
、KEY_AAC_DRC_BOOST_FACTOR
、KEY_AAC_DRC_HEAVY_COMPRESSION
、KEY_AAC_DRC_TARGET_REFERENCE_LEVEL
和KEY_AAC_ENCODED_TARGET_LEVEL
。 - [C-SR-1] 强烈建议所有 AAC 音频解码器都满足上述要求 C-2-1 和 C-2-2。
当解码 USAC 音频时,MPEG-D (ISO/IEC 23003-4)
- [C-3-1] 响度和 DRC 元数据必须根据 MPEG-D DRC 动态范围控制配置文件级别 1 进行解释和应用。
- [C-3-2] 解码器必须根据使用以下
android.media.MediaFormat
密钥设置的配置运行:KEY_AAC_DRC_TARGET_REFERENCE_LEVEL
和KEY_AAC_DRC_EFFECT_TYPE
。
MPEG-4 AAC、HE AAC 和 HE AACv2 配置文件解码器
- 可以支持使用 ISO/IEC 23003-4 动态范围控制配置文件的响度和动态范围控制。
如果支持 ISO/IEC 23003-4 并且在解码的比特流中同时存在 ISO/IEC 23003-4 和 ISO/IEC 14496-3 元数据,则
- ISO/IEC 23003-4 元数据应优先。
所有音频解码器必须支持输出
- [C-6-1] 通过
android.media.MediaCodec
API 的 PCM 16 位本机字节序音频帧。
如果设备实现支持通过 android.media.MediaCodec
API 中的默认 AAC 音频解码器将多声道流(即超过两个声道)的 AAC 输入缓冲区解码为 PCM,则必须支持以下内容
- [C-7-1] 必须能够通过应用程序使用密钥
KEY_MAX_OUTPUT_CHANNEL_COUNT
进行解码配置,以控制内容是下混为立体声(当使用值 2 时)还是使用原生声道数输出(当使用等于或大于该声道数的值时)。例如,当输入 5.1 内容时,值 6 或更大将配置解码器输出 6 个声道。 - [C-7-2] 解码时,解码器必须使用
KEY_CHANNEL_MASK
密钥在输出格式上公布正在使用的声道掩码,并使用android.media.AudioFormat
常量(示例:CHANNEL_OUT_5POINT1
)。
如果设备实现支持除默认 AAC 音频解码器之外的其他音频解码器,并且能够在输入压缩多声道内容时输出多声道音频(即超过 2 个声道),则
- [C-SR-2] 强烈建议解码器能够通过应用程序使用密钥
KEY_MAX_OUTPUT_CHANNEL_COUNT
进行解码配置,以控制内容是下混为立体声(当使用值 2 时)还是使用原生声道数输出(当使用等于或大于该声道数的值时)。例如,当输入 5.1 内容时,值 6 或更大将配置解码器输出 6 个声道。 - [C-SR-3] 强烈建议解码器在解码时使用
KEY_CHANNEL_MASK
密钥在输出格式上公布正在使用的声道掩码,并使用 android.media.AudioFormat 常量(示例:CHANNEL_OUT_5POINT1
)。
5.1.3. 音频编解码器详细信息
格式/编解码器 | 详细信息 | 要支持的文件类型/容器格式 |
---|---|---|
MPEG-4 AAC Profile (AAC LC) |
支持单声道/立体声/5.0/5.1 内容,标准采样率从 8 到 48 kHz。 |
|
MPEG-4 HE AAC Profile (AAC+) | 支持单声道/立体声/5.0/5.1 内容,标准采样率从 16 到 48 kHz。 |
|
MPEG-4 HE AACv2 Profile (增强型 AAC+) |
支持单声道/立体声/5.0/5.1 内容,标准采样率从 16 到 48 kHz。 |
|
AAC ELD (增强型低延迟 AAC) | 支持单声道/立体声内容,标准采样率从 16 到 48 kHz。 |
|
USAC | 支持单声道/立体声内容,标准采样率从 7.35 到 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,如 AMR-WB, Adaptive Multi-Rate - Wideband Speech Codec 中定义 | 3GPP (.3gp) |
FLAC | 对于编码器和解码器:必须至少支持单声道和立体声模式。必须支持高达 192 kHz 的采样率;必须支持 16 位和 24 位分辨率。FLAC 24 位音频数据处理必须可用于浮点音频配置。 |
|
MP3 | 单声道/立体声 8-320Kbps 恒定 (CBR) 或可变比特率 (VBR) |
|
MIDI | MIDI 类型 0 和 1。DLS 版本 1 和 2。XMF 和 Mobile XMF。支持铃声格式 RTTTL/RTX、OTA 和 iMelody |
|
Vorbis | 解码:支持单声道、立体声、5.0 和 5.1 内容,采样率为 8000、12000、16000、24000 和 48000 Hz。 编码:支持单声道和立体声内容,采样率为 8000、12000、16000、24000 和 48000 Hz。 |
|
PCM/WAVE | PCM 编解码器必须支持 16 位线性 PCM 和 16 位浮点。WAVE 提取器必须支持 16 位、24 位、32 位线性 PCM 和 32 位浮点(速率高达硬件限制)。必须支持从 8 kHz 到 192 kHz 的采样率。 | WAVE (.wav) |
Opus | 解码:支持单声道、立体声、5.0 和 5.1 内容,采样率为 8000、12000、16000、24000 和 48000 Hz。 编码:支持单声道和立体声内容,采样率为 8000、12000、16000、24000 和 48000 Hz。 |
|
5.1.4. 图像编码
更多详细信息,请参见 5.1.6. 图像编解码器详细信息。
设备实现必须支持编码以下图像编码
- [C-0-1] JPEG
- [C-0-2] PNG
- [C-0-3] WebP
如果设备实现通过媒体类型 MIMETYPE_IMAGE_ANDROID_HEIC
的 android.media.MediaCodec
支持 HEIC 编码,则它们
- [C-1-1] 必须提供硬件加速的 HEVC 编码器编解码器,该编解码器支持
BITRATE_MODE_CQ
比特率控制模式、HEVCProfileMainStill
配置文件和 512 x 512 px 帧大小。
5.1.5. 图像解码
更多详细信息,请参见 5.1.6. 图像编解码器详细信息。
设备实现必须支持解码以下图像编码
- [C-0-1] JPEG
- [C-0-2] GIF
- [C-0-3] PNG
- [C-0-4] BMP
- [C-0-5] WebP
- [C-0-6] Raw
如果设备实现支持 HEVC 视频解码,则它们:* [C-1-1] 必须支持 HEIF (HEIC) 图像解码。
支持高位深格式(每个通道 9+ 位)的图像解码器
- [C-2-1] 如果应用程序请求,例如通过
android.graphics.Bitmap
的ARGB_8888
配置,则必须支持输出 8 位等效格式。
5.1.6. 图像编解码器详细信息
格式/编解码器 | 详细信息 | 支持的文件类型/容器格式 |
---|---|---|
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) |
通过 MediaCodec API 公开的图像编码器和解码器
[C-1-1] 必须通过
CodecCapabilities
支持 YUV420 8:8:8 灵活颜色格式 (COLOR_FormatYUV420Flexible
)。[C-SR-1] 强烈建议支持输入 Surface 模式的 RGB888 颜色格式。
[C-1-3] 必须支持至少一种平面或半平面 YUV420 8:8:8 颜色格式:
COLOR_FormatYUV420PackedPlanar
(等效于COLOR_FormatYUV420Planar
)或COLOR_FormatYUV420PackedSemiPlanar
(等效于COLOR_FormatYUV420SemiPlanar
)。强烈建议它们同时支持这两种格式。
5.1.7. 视频编解码器
- 为了获得可接受的网络视频流和视频会议服务质量,设备实现应使用满足 要求的硬件 VP8 编解码器。
如果设备实现包含视频解码器或编码器
[C-1-1] 视频编解码器必须支持输出和输入字节缓冲区大小,这些大小应容纳标准和配置规定的最大可行压缩帧和未压缩帧,但也不应过度分配。
[C-1-2] 视频编码器和解码器必须通过
CodecCapabilities
支持 YUV420 8:8:8 灵活颜色格式 (COLOR_FormatYUV420Flexible
)。[C-1-3] 视频编码器和解码器必须支持至少一种平面或半平面 YUV420 8:8:8 颜色格式:
COLOR_FormatYUV420PackedPlanar
(等效于COLOR_FormatYUV420Planar
)或COLOR_FormatYUV420PackedSemiPlanar
(等效于COLOR_FormatYUV420SemiPlanar
)。强烈建议它们同时支持这两种格式。[C-SR-1] 强烈建议视频编码器和解码器支持至少一种硬件优化的平面或半平面 YUV420 8:8:8 颜色格式(YV12、NV12、NV21 或等效的供应商优化格式。)
[C-1-5] 支持高位深格式(每个通道 9+ 位)的视频解码器必须支持输出 8 位等效格式(如果应用程序请求)。这必须通过
android.media.MediaCodecInfo
支持 YUV420 8:8:8 颜色格式来反映。
如果设备实现通过 Display.HdrCapabilities
公告 HDR 配置文件支持,则它们
- [C-2-1] 必须支持 HDR 静态元数据解析和处理。
如果设备实现通过 MediaCodecInfo.CodecCapabilities
类中的 FEATURE_IntraRefresh
公告帧内刷新支持,则它们
- [C-3-1] 必须支持 10 - 60 帧范围内的刷新周期,并在配置的刷新周期的 20% 范围内准确运行。
除非应用程序使用 KEY_COLOR_FORMAT
格式密钥另行指定,否则视频解码器实现
- [C-4-1] 如果配置为使用 Surface 输出,则必须默认使用针对硬件显示优化的颜色格式。
- [C-4-2] 如果配置为不使用 Surface 输出,则必须默认使用针对 CPU 读取优化的 YUV420 8:8:8 颜色格式。
5.1.8. 视频编解码器列表
格式/编解码器 | 详细信息 | 要支持的文件类型/容器格式 |
---|---|---|
H.263 |
|
|
H.264 AVC | 有关详细信息,请参见 第 5.2 节和 5.3 |
|
H.265 HEVC | 有关详细信息,请参见 第 5.3 节 |
|
MPEG-2 | Main Profile |
|
MPEG-4 SP |
|
|
VP8 | 有关详细信息,请参见 第 5.2 节和 5.3 |
|
VP9 | 有关详细信息,请参见 第 5.3 节 |
|
5.1.9. 媒体编解码器安全性
设备实现必须确保符合以下描述的媒体编解码器安全功能。
Android 包括对 OMX(一种跨平台多媒体加速 API)以及 Codec 2.0(一种低开销多媒体加速 API)的支持。
如果设备实现支持多媒体,则它们
- [C-1-1] 必须通过 OMX 或 Codec 2.0 API(或两者)提供对媒体编解码器的支持,如 Android 开放源代码项目中所述,并且不得禁用或规避安全保护。这并非特指每个编解码器都必须使用 OMX 或 Codec 2.0 API,而仅指必须提供对至少一个 API 的支持,并且对可用 API 的支持必须包括存在的安全保护。
- [C-SR-1] 强烈建议包括对 Codec 2.0 API 的支持。
如果设备实现不支持 Codec 2.0 API,则它们
- [C-2-1] 对于设备支持的每种媒体格式和类型(编码器或解码器),必须包括来自 Android 开放源代码项目的相应 OMX 软件编解码器(如果可用)。
- [C-2-2] 名称以“OMX.google.”开头的编解码器必须基于其 Android 开放源代码项目源代码。
- [C-SR-2] 强烈建议 OMX 软件编解码器在无法访问除内存映射器之外的硬件驱动程序的编解码器进程中运行。
如果设备实现支持 Codec 2.0 API,则它们
- [C-3-1] 对于设备支持的每种媒体格式和类型(编码器或解码器),必须包括来自 Android 开放源代码项目的相应 Codec 2.0 软件编解码器(如果可用)。
- [C-3-2] 必须将 Codec 2.0 软件编解码器置于 Android 开放源代码项目中提供的软件编解码器进程中,以便更精细地授予对软件编解码器的访问权限。
- [C-3-3] 名称以“c2.android.”开头的编解码器必须基于其 Android 开放源代码项目源代码。
5.1.10. 媒体编解码器特性
如果设备实现支持媒体编解码器,则它们
- [C-1-1] 必须通过
MediaCodecInfo
API 返回媒体编解码器特性的正确值。
特别是
- [C-1-2] 名称以“OMX.”开头的编解码器必须使用 OMX API,并且名称必须符合 OMX IL 命名准则。
- [C-1-3] 名称以“c2.”开头的编解码器必须使用 Codec 2.0 API,并且名称必须符合 Android 的 Codec 2.0 命名准则。
- [C-1-4] 名称以“OMX.google.”或“c2.android.”开头的编解码器绝不能被描述为供应商或硬件加速。
- [C-1-5] 在可以访问除内存分配器和映射器之外的硬件驱动程序的编解码器进程(供应商或系统)中运行的编解码器绝不能被描述为仅软件。
- [C-1-6] Android 开放源代码项目中不存在或不基于该项目中的源代码的编解码器必须被描述为供应商。
- [C-1-7] 利用硬件加速的编解码器必须被描述为硬件加速。
- [C-1-8] 编解码器名称绝不能具有误导性。例如,名为“decoders”的编解码器必须支持解码,而名为“encoders”的编解码器必须支持编码。名称中包含媒体格式的编解码器必须支持这些格式。
如果设备实现支持视频编解码器
- [C-2-1] 所有视频编解码器必须发布以下尺寸的可实现帧率数据(如果编解码器支持)
SD(低质量) | SD(高质量) | HD 720p | HD 1080p | UHD | |
---|---|---|---|---|---|
视频分辨率 |
|
|
|
1920 x 1080 px (MPEG4 以外) | 3840 x 2160 px (HEVC, VP9) |
- [C-2-2] 被描述为硬件加速的视频编解码器必须发布性能点信息。它们必须各自列出所有受支持的标准性能点(在
PerformancePoint
API 中列出),除非它们已被另一个受支持的标准性能点覆盖。 - 此外,如果它们支持除列出的标准性能点之外的其他持续视频性能,则应该发布扩展性能点。
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 视频编码器并使其可供第三方应用使用,则它们
- 应该支持受支持编码器的动态可配置比特率。
如果设备实现提供硬件加速的视频或图像编码器,并且支持通过 android.camera
API 公开的一个或多个连接或可插拔硬件摄像头
- [C-4-1] 所有硬件加速的视频和图像编码器必须支持从硬件摄像头编码帧。
- 应该支持通过所有视频或图像编码器从硬件摄像头编码帧。
如果设备实现提供 HDR 编码,则它们
- [C-SR-1] 强烈建议为无缝转码 API 提供插件,以将 HDR 格式转换为 SDR 格式。
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 px | 720 x 480 px | 1280 x 720 px | 1920 x 1080 px |
视频帧率 | 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(高清)视频编码配置文件。
- [C-1-2] 必须支持写入 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 px | 1920 x 1080 px |
视频帧率 | 30 fps | 30 fps | 30 fps | 30 fps |
视频比特率 | 800 Kbps | 2 Mbps | 4 Mbps | 10 Mbps |
5.2.4. VP9
如果设备实现支持 VP9 编解码器,则
- [C-1-2] 必须支持 Profile 0 Level 3。
- [C-1-1] 必须支持写入 Matroska WebM 文件。
- [C-1-3] 必须生成 CodecPrivate 数据。
- 应该支持下表所示的高清解码配置文件。
- [C-SR-1] 强烈建议在有硬件编码器的情况下支持下表所示的高清解码配置文件。
标清 | HD 720p | HD 1080p | UHD | |
---|---|---|---|---|
视频分辨率 | 720 x 480 px | 1280 x 720 px | 1920 x 1080 px | 3840 x 2160 像素 |
视频帧率 | 30 fps | 30 fps | 30 fps | 30 fps |
视频比特率 | 1.6 Mbps | 4 Mbps | 5 Mbps | 20 Mbps |
如果设备实现声明通过 Media API 支持 Profile 2 或 Profile 3
- 可以选择支持 12 位格式。
5.2.5. H.265
如果设备实现支持 H.265 编解码器,则
- [C-1-1] 必须支持 Main Profile Level 3。
- 应该支持下表所示的高清编码配置文件。
- [C-SR-1] 强烈建议在有硬件编码器的情况下支持下表所示的高清编码配置文件。
标清 | HD 720p | HD 1080p | UHD | |
---|---|---|---|---|
视频分辨率 | 720 x 480 px | 1280 x 720 px | 1920 x 1080 px | 3840 x 2160 像素 |
视频帧率 | 30 fps | 30 fps | 30 fps | 30 fps |
视频比特率 | 1.6 Mbps | 4 Mbps | 5 Mbps | 20 Mbps |
5.3. 视频解码
如果设备实现支持 VP8、VP9、H.264 或 H.265 编解码器,则
- [C-1-1] 必须支持通过标准 Android API 在同一码流内实时动态切换视频分辨率和帧率,且切换后的分辨率不得超过设备上各编解码器支持的最大分辨率。
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] 必须支持下表中的高清 720p 视频解码配置文件。
- [C-2-2] 必须支持下表中的高清 1080p 视频解码配置文件。
SD(低质量) | SD(高质量) | HD 720p | HD 1080p | |
---|---|---|---|---|
视频分辨率 | 320 x 240 px | 720 x 480 px | 1280 x 720 px | 1920 x 1080 px |
视频帧率 | 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 和下表所示的标清视频解码配置文件。
- 应该支持下表所示的高清解码配置文件。
- [C-1-2] 如果有硬件解码器,则必须支持下表所示的高清解码配置文件。
如果 Display.getSupportedModes()
方法报告的高度等于或大于视频分辨率,则
- [C-2-1] 设备实现必须支持 H.265 或 VP9 解码 720p、1080p 和 UHD 配置文件中的至少一种。
SD(低质量) | SD(高质量) | HD 720p | HD 1080p | UHD | |
---|---|---|---|---|---|
视频分辨率 | 352 x 288 像素 | 720 x 480 px | 1280 x 720 px | 1920 x 1080 px | 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 |
如果设备实现声明通过 Media API 支持 HDR 配置文件
- [C-3-1] 设备实现必须接受来自应用程序的必需 HDR 元数据,以及支持从码流和/或容器中提取和输出必需 HDR 元数据。
- [C-3-2] 设备实现必须在设备屏幕上或标准视频输出端口(例如 HDMI)上正确显示 HDR 内容。
5.3.6. VP8
如果设备实现支持 VP8 编解码器,则它们
- [C-1-1] 必须支持下表中的标清解码配置文件。
- 应该使用符合 要求的硬件 VP8 编解码器。
- 应该支持下表中的高清解码配置文件。
如果 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 px | 1920 x 1080 px |
视频帧率 | 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] 必须支持下表所示的标清视频解码配置文件。
- 应该支持下表所示的高清解码配置文件。
如果设备实现支持 VP9 编解码器和硬件解码器
- [C-2-1] 必须支持下表所示的高清解码配置文件。
如果 Display.getSupportedModes()
方法报告的高度等于或大于视频分辨率,则
- [C-3-1] 设备实现必须支持 VP9 或 H.265 解码 720p、1080p 和 UHD 配置文件中的至少一种。
SD(低质量) | SD(高质量) | HD 720p | HD 1080p | UHD | |
---|---|---|---|---|---|
视频分辨率 | 320 x 180 像素 | 640 x 360 像素 | 1280 x 720 px | 1920 x 1080 px | 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 |
如果设备实现声明通过 'CodecProfileLevel' Media API 支持 VP9Profile2
或 VP9Profile3
- 可以选择支持 12 位格式。
如果设备实现声明通过 Media API 支持 HDR 配置文件(VP9Profile2HDR
、VP9Profile2HDR10Plus
、VP9Profile3HDR
、VP9Profile3HDR10Plus
)
- [C-4-1] 设备实现必须接受来自应用程序的必需 HDR 元数据(所有 HDR 配置文件的
KEY_HDR_STATIC_INFO
,以及 HDR10Plus 配置文件的 'KEY_HDR10_PLUS_INFO')。它们还必须支持从码流和/或容器中提取和输出必需 HDR 元数据。 - [C-4-2] 设备实现必须在设备屏幕上或标准视频输出端口(例如 HDMI)上正确显示 HDR 内容。
5.3.8. Dolby Vision
如果设备实现通过 HDR_TYPE_DOLBY_VISION
声明支持 Dolby Vision 解码器,则
- [C-1-1] 必须提供支持 Dolby Vision 的提取器。
- [C-1-2] 必须在设备屏幕上或标准视频输出端口(例如 HDMI)上正确显示 Dolby Vision 内容。
- [C-1-3] 必须将向后兼容的基准层(如果存在)的 轨道 ID 设置为与组合 Dolby Vision 层的轨道 ID 相同。
5.3.9. AV1
如果设备实现支持 AV1 编解码器,则
- [C-1-1] 必须支持 Profile 0,包括 10 位内容。
5.4. 音频录制
虽然本节中概述的某些要求自 Android 4.3 起被列为“应该”,但未来版本的兼容性定义计划将这些要求更改为“必须”。强烈建议现有和新的 Android 设备满足这些列为“应该”的要求,否则在升级到未来版本时将无法获得 Android 兼容性。
5.4.1. 原始音频捕获和麦克风信息
如果设备实现声明 android.hardware.microphone
,则
[C-1-1] 必须允许捕获任何成功打开的
AudioRecord
或AAudio
INPUT 流的原始音频内容。至少必须支持以下特性- 格式:线性 PCM,16 位
- 采样率:8000、11025、16000、44100、48000 Hz
- 声道:单声道
- 音频源:
DEFAULT
、MIC
、CAMCORDER
、VOICE_RECOGNITION
、VOICE_COMMUNICATION
、UNPROCESSED
或VOICE_PERFORMANCE
。这也适用于AAudio
中的等效输入预设,例如AAUDIO_INPUT_PRESET_CAMCORDER
。
应该允许捕获具有以下特性的原始音频内容
- 格式:线性 PCM,16 位和 24 位
- 采样率:8000、11025、16000、22050、24000、32000、44100、48000 Hz
- 声道:与设备上麦克风数量相同的声道数
[C-1-2] 必须以高于上述采样率的速率捕获,而无需升采样。
[C-1-3] 当使用降采样捕获上述采样率时,必须包含适当的抗混叠滤波器。
应该允许捕获 AM 无线电和 DVD 质量的原始音频内容,这意味着以下特性
- 格式:线性 PCM,16 位
- 采样率:22050、48000 Hz
- 声道:立体声
[C-1-4] 必须遵循
MicrophoneInfo
API,并为第三方应用程序可通过AudioManager.getMicrophones()
API 访问的设备上的可用麦克风正确填写信息,适用于使用MediaRecorder.AudioSources DEFAULT
、MIC
、CAMCORDER
、VOICE_RECOGNITION
、VOICE_COMMUNICATION
、UNPROCESSED
或VOICE_PERFORMANCE
的活动 AudioRecord。
如果设备实现允许捕获 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 的范围内为 ±3dB。
[C-SR-1] 强烈建议在低频范围内展现幅度水平:具体而言,对于用于录制语音识别音频源的每个麦克风,与中频范围相比,30 Hz 到 100 Hz 的范围内为 ±20 dB。
[C-SR-2] 强烈建议在高频范围内展现幅度水平:具体而言,对于用于录制语音识别音频源的每个麦克风,与中频范围相比,4000 Hz 到 22 KHz 的范围内为 ±30 dB。
应该设置音频输入灵敏度,使得以 90 dB 声压级 (SPL)(在麦克风旁边测量)播放的 1000 Hz 正弦波音源对于 16 位采样产生 RMS 2500 的理想响应,范围在 1770 到 3530 之间(或者对于浮点/双精度采样,为 -22.35 db ±3dB 满量程),适用于用于录制语音识别音频源的每个麦克风。
应该录制语音识别音频流,以便 PCM 幅度水平在线性跟踪输入 SPL 变化,范围至少为 30 dB,从 -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.4.4. 声学回声消除器
如果设备实现声明 android.hardware.microphone
,则
- 应该实现针对语音通信调整的 声学回声消除器 (AEC) 技术,并在使用
AudioSource.VOICE_COMMUNICATION
进行捕获时应用于捕获路径。
如果设备实现在选择 AudioSource.VOICE_COMMUNICATION
时提供插入捕获音频路径中的声学回声消除器,则
- [C-SR-1] 强烈建议通过 AcousticEchoCanceler API 方法 AcousticEchoCanceler.isAvailable() 声明此功能
- [C-SR-2] 强烈建议允许通过 AcousticEchoCanceler API 控制此音频效果。
- [C-SR-3] 强烈建议通过 AudioEffect.Descriptor.uuid 字段唯一标识每种 AEC 技术实现。
5.4.5. 并发捕获
如果设备实现声明 android.hardware.microphone
,则它们必须按照 本文档 中的描述实现并发捕获。具体而言
- [C-1-1] 必须允许辅助功能服务使用
AudioSource.VOICE_RECOGNITION
进行捕获,以及至少一个应用程序使用任何AudioSource
进行捕获,从而并发访问麦克风。 - [C-1-2] 必须允许持有 Assistant 角色的预安装应用程序,以及至少一个应用程序使用任何
AudioSource
(AudioSource.VOICE_COMMUNICATION
或AudioSource.CAMCORDER
除外)进行捕获,从而并发访问麦克风。 - [C-1-3] 当应用程序使用
AudioSource.VOICE_COMMUNICATION
或AudioSource.CAMCORDER
进行捕获时,必须静音任何其他应用程序(辅助功能服务除外)的音频捕获。但是,当应用程序通过AudioSource.VOICE_COMMUNICATION
进行捕获时,如果另一个应用程序是具有CAPTURE_AUDIO_OUTPUT
权限的特权(预安装)应用程序,则该应用程序可以捕获语音通话。 - [C-1-4] 如果两个或多个应用程序正在并发捕获,并且两个应用程序都没有位于顶部的 UI,则最近开始捕获的应用程序将接收音频。
5.4.6. 麦克风增益级别 [已移至 5.4.2]
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、24000、32000、44100、48000
- 单声道和立体声下的 96000
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] 必须支持通过
Visualizer
类可控制的可视化工具 API 实现。 - [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
实现。 - [C-SR-1] 强烈建议在浮点和多声道中支持效果。
5.5.3. 音频输出音量
汽车设备实现
- 应该允许使用
AudioAttributes
定义的内容类型或用法,以及android.car.CarAudioManager
中公开定义的汽车音频用法,分别调整每个音频流的音频音量。
5.5.4. 音频卸载
如果设备实现支持 音频卸载播放,则
- [C-SR-1] 强烈建议当 AudioTrack 无缝 API 和 MediaPlayer 的媒体容器指定时,修剪两个具有相同格式的片段之间播放的无缝音频内容。
5.6. 音频延迟
音频延迟是音频信号通过系统时的时间延迟。许多类别的应用程序依赖于短延迟,以实现实时声音效果。
就本节而言,请使用以下定义
- 输出延迟。应用程序写入 PCM 编码数据帧的时间与在设备上传感器处将相应声音呈现给环境的时间之间,或信号通过端口离开设备并在外部可观察到的时间之间的时间间隔。
- 冷启动输出延迟。在请求之前音频输出系统处于空闲状态并已断电时,启动输出流和基于时间戳的第一个帧的呈现时间之间的时间。
- 持续输出延迟。设备播放音频后,后续帧的输出延迟。
- 输入延迟。环境通过设备上传感器将声音呈现给设备的时间或信号通过端口进入设备的时间与应用程序读取相应 PCM 编码数据帧的时间之间的时间间隔。
- 丢失输入。不可用或无法使用的输入信号的初始部分。
- 冷启动输入延迟。在请求之前音频输入系统处于空闲状态并已断电时,启动流和接收到第一个有效帧之间的时间。
- 持续输入延迟。设备捕获音频时,后续帧的输入延迟。
- 持续往返延迟。持续输入延迟加上持续输出延迟加上一个缓冲区周期的总和。缓冲区周期允许应用程序处理信号的时间以及应用程序减轻输入和输出流之间相位差的时间。
- OpenSL ES PCM 缓冲区队列 API。OpenSL ES API 在 Android NDK 中的 PCM 相关集。
- AAudio 本机音频 API。AAudio API 在 Android NDK 中的集。
- 时间戳。由流中的相对帧位置和估计的帧进入或离开关联端点上音频处理管道的时间组成的对。另请参见 AudioTimestamp。
- 故障。音频信号中的临时中断或不正确的采样值,通常由输出的 缓冲区下溢、输入的缓冲区溢出或任何其他数字或模拟噪声源引起。
- 平均绝对偏差。一组值的平均值与均值偏差的绝对值的平均值。
- 点击到声音的延迟。点击屏幕的时间与在扬声器上听到由该点击产生的声音的时间之间的时间。
如果设备实现声明 android.hardware.audio.output
,则它们必须满足或超过以下要求
- [C-1-1] AudioTrack.getTimestamp 和
AAudioStream_getTimestamp
返回的输出时间戳的准确度为 +/- 2 毫秒。 [C-1-2] 冷启动 输出 延迟为 500 毫秒或更短。
[C-1-3] 使用
AAudioStreamBuilder_openStream()
打开输出流的时间必须少于 1000 毫秒。
如果设备实现声明 android.hardware.audio.output
,则强烈建议它们满足或超过以下要求
- [C-SR-1] 通过扬声器数据路径的冷启动输出延迟为 100 毫秒或更短。
[C-SR-2] 点击到声音的延迟为 80 毫秒或更短。
[C-SR-4] AudioTrack.getTimestamp 和
AAudioStream_getTimestamp
返回的输出时间戳的准确度为 +/- 1 毫秒。
如果设备实现在任何初始校准后,在使用 AAudio 本机音频 API 时,对于至少一个支持的音频输出设备上的持续输出延迟和冷启动输出延迟,满足上述要求,则
- [C-SR-5] 强烈建议通过声明
android.hardware.audio.low_latency
功能标志来报告低延迟音频。 - [C-SR-6] 强烈建议通过 AAudio API 满足低延迟音频的要求。
- [C-SR-7] 强烈建议确保对于从
AAudioStream_getPerformanceMode()
返回AAUDIO_PERFORMANCE_MODE_LOW_LATENCY
的流,AAudioStream_getFramesPerBurst()
返回的值小于或等于android.media.AudioManager.getProperty(String)
为属性键AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER
返回的值。
如果设备实现不满足通过 AAudio 本机音频 API 实现低延迟音频的要求,则
- [C-2-1] 不得报告支持低延迟音频。
如果设备实现包括 android.hardware.microphone
,则它们必须满足这些输入音频要求
[C-3-1] 将 AudioRecord.getTimestamp 或
AAudioStream_getTimestamp
返回的输入时间戳的误差限制为 +/- 2 毫秒。“误差”在此处表示与正确值的偏差。[C-3-2] 冷启动 输入 延迟为 500 毫秒或更短。
[C-3-3] 使用
AAudioStreamBuilder_openStream()
打开输入流的时间必须少于 1000 毫秒。
如果设备实现包括 android.hardware.microphone
,则强烈建议它们满足这些输入音频要求
[C-SR-8] 通过麦克风数据路径的冷启动输入延迟为 100 毫秒或更短。
[C-SR-11] 将 AudioRecord.getTimestamp 或
AAudioStream_getTimestamp
返回的输入时间戳的误差限制为 +/- 1 毫秒。
如果设备实现声明 android.hardware.audio.output
和 android.hardware.microphone
,则
- [C-SR-12] 强烈建议在至少一个支持的路径上,5 次测量的平均持续往返延迟为 50 毫秒或更短,平均绝对偏差小于 10 毫秒。
5.7. 网络协议
设备实现必须支持 Android SDK 文档中指定的音频和视频播放的 媒体网络协议。
对于设备实现需要支持的每种编解码器和容器格式,设备实现
[C-1-1] 必须支持通过 HTTP 和 HTTPS 的编解码器或容器。
[C-1-2] 必须支持如下媒体段格式表所示的对应媒体段格式,通过 HTTP Live Streaming 草案协议,版本 7。
[C-1-3] 必须支持如下 RTSP 表所示的对应 RTSP 有效负载格式。有关例外情况,请参见 第 5.1 节中的表脚注。
媒体段格式
段格式 | 参考资料 | 必需的编解码器支持 |
---|---|---|
MPEG-2 传输流 | ISO 13818 | 视频编解码器
MPEG-2 的详细信息,请参见 第 5.1.8 节。 音频编解码器
|
具有 ADTS 帧和 ID3 标记的 AAC | ISO 13818-7 | 有关 AAC 及其变体的详细信息,请参见 第 5.1.1 节 |
WebVTT | WebVTT |
RTSP (RTP, SDP)
配置文件名称 | 参考资料 | 必需的编解码器支持 |
---|---|---|
H264 AVC | RFC 6184 | 有关 H264 AVC 的详细信息,请参见 第 5.1.8 节 |
MP4A-LATM | RFC 6416 | 有关 AAC 及其变体的详细信息,请参见 第 5.1.3 节 |
H263-1998 |
RFC 3551 RFC 4629 RFC 2190 |
有关 H263 的详细信息,请参见 第 5.1.8 节 |
H263-2000 | RFC 4629 | 有关 H263 的详细信息,请参见 第 5.1.8 节 |
AMR | RFC 4867 | 有关 AMR-NB 的详细信息,请参见 第 5.1.3 节 |
AMR-WB | RFC 4867 | 有关 AMR-WB 的详细信息,请参见 第 5.1.3 节 |
MP4V-ES | RFC 6416 | 有关 MPEG-4 SP 的详细信息,请参见 第 5.1.8 节 |
mpeg4-generic | RFC 3640 | 有关 AAC 及其变体的详细信息,请参见 第 5.1.3 节 |
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 的硬件传输的 MIDI,它们为其提供通用非 MIDI 连接,此类传输为
[C-1-2] 必须支持应用间 MIDI 软件传输(虚拟 MIDI 设备)
[C-1-3] 必须包含 libamidi.so(本机 MIDI 支持)
应该支持 USB 外围设备模式下的 MIDI,第 7.7 节
5.10. 专业音频
如果设备实现通过 android.content.pm.PackageManager 类报告支持 android.hardware.audio.pro
功能,则
- [C-1-1] 必须报告支持
android.hardware.audio.low_latency
功能。 - [C-1-2] 必须具有持续往返音频延迟,如 5.6 音频延迟 节中定义的,在至少一个支持的路径上为 25 毫秒或更短。
- [C-1-3] 必须包含支持 USB 主机模式和 USB 外围设备模式的 USB 端口。
- [C-1-4] 必须报告支持
android.software.midi
功能。 - [C-1-5] 必须使用 AAudio 本机音频 API 和
AAUDIO_PERFORMANCE_MODE_LOW_LATENCY
满足延迟和 USB 音频要求。 - [C-1-6] 必须具有 200 毫秒或更短的冷启动输出延迟。
- [C-1-7] 必须具有 200 毫秒或更短的冷启动输入延迟。
- [C-1-8] 必须具有平均点击到声音的延迟,在从扬声器到麦克风数据路径的 5 次测量中为 80 毫秒或更短。
- [C-SR-1] 强烈建议在从扬声器到麦克风路径的 5 次测量中,满足 5.6 音频延迟 节中定义的延迟,为 20 毫秒或更短,平均绝对偏差小于 5 毫秒。
- [C-SR-2] 强烈建议使用 MMAP 路径上的 AAudio 本机音频 API 满足专业音频的持续往返音频延迟、冷启动输入延迟和冷启动输出延迟以及 USB 音频要求。
[C-SR-3] 强烈建议在音频活动且 CPU 负载变化时提供一致的 CPU 性能水平。应使用 Android 应用 SynthMark 测试此项。SynthMark 使用在模拟音频框架上运行的软件合成器来测量系统性能。有关基准测试的说明,请参见 SynthMark 文档。SynthMark 应用需要使用“Automated Test”(自动测试)选项运行,并实现以下结果
- voicemark.90 >= 32 个声音
- latencymark.fixed.little <= 15 毫秒
- latencymark.dynamic.little <= 50 毫秒
应该最大限度地减少音频时钟相对于标准时间的不准确性和漂移。
应该最大限度地减少音频时钟相对于 CPU
CLOCK_MONOTONIC
的漂移(两者都处于活动状态时)。应该最大限度地减少设备上传感器上的音频延迟。
应该最大限度地减少 USB 数字音频上的音频延迟。
应该记录所有路径上的音频延迟测量值。
应该最大限度地减少音频缓冲区完成回调进入时间的抖动,因为这会影响回调可用的完整 CPU 带宽百分比。
在报告的延迟下,正常使用时应该提供零音频故障。
应该提供零声道间延迟差异。
应该最大限度地减少所有传输上的 MIDI 平均延迟。
应该最大限度地减少负载下所有传输上的 MIDI 延迟可变性(抖动)。
应该提供所有传输上的准确 MIDI 时间戳。
应该最大限度地减少设备上传感器上的音频信号噪声,包括冷启动后立即的时期。
当输入端和输出端都处于活动状态时,应该在相应端点的输入侧和输出侧之间提供零音频时钟差异。相应端点的示例包括设备上的麦克风和扬声器,或音频插孔输入和输出。
当输入端和输出端都处于活动状态时,应该在同一线程上处理相应端点的输入侧和输出侧的音频缓冲区完成回调,并在从输入回调返回后立即进入输出回调。或者,如果无法在同一线程上处理回调,则在进入输入回调后不久进入输出回调,以允许应用程序具有输入侧和输出侧的一致计时。
应该最大限度地减少相应端点的输入侧和输出侧的 HAL 音频缓冲之间的相位差。
应该最大限度地减少触摸延迟。
应该最大限度地减少负载下的触摸延迟可变性(抖动)。
如果设备实现满足上述所有要求,则
- [C-SR-4] 强烈建议通过
android.content.pm.PackageManager
类报告支持android.hardware.audio.pro
功能。
如果设备实现包括 4 导体 3.5 毫米音频插孔,则
- [C-2-1] 必须 具有平均持续往返音频延迟,如 5.6 音频延迟 节所定义,在使用 音频环回适配器 的音频插孔路径上,在 5 次测量中平均绝对偏差小于 5 毫秒的情况下,延迟为 20 毫秒或更少。
- [C-SR-5] **强烈建议** 符合 有线音频耳机规范 (v1.1) 的 移动设备(插孔)规范 的章节。
如果设备实现省略了 4 芯 3.5 毫米音频插孔,并包含支持 USB 主机模式的 USB 端口,则它们
- [C-3-1] 必须 实现 USB 音频类。
- [C-3-2] 必须 具有平均持续往返音频延迟,在使用 USB 音频类的情况下,在 USB 主机模式端口上,在 5 次测量中平均绝对偏差小于 5 毫秒的情况下,延迟为 25 毫秒或更少。(这可以使用 USB-3.5 毫米适配器和音频环回适配器进行测量,或者使用 USB 音频接口,用跳线将输入连接到输出)。
- [C-SR-6] **强烈建议** 在与也支持这些要求的 USB 音频外围设备一起使用时,支持高达每个方向 8 声道的同时 I/O、96 kHz 采样率以及 24 位或 32 位深度。
- [C-SR-7] **强烈建议** 使用通过 MMAP 路径的 AAudio 原生音频 API 来满足这组要求。
如果设备实现包含 HDMI 端口,则它们
- 应该 在至少一种配置中,支持立体声和八声道输出,位深为 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 范围内为 ±10 dB。
[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] 如果架构中出于任何原因存在任何信号处理,则必须 禁用它,并有效地为信号路径引入零延迟或额外延迟。
- [C-1-10] 电平乘法器虽然允许在路径上,但不得 为信号路径引入延迟或时延。
所有 SPL 测量均在被测麦克风旁边直接进行。对于多麦克风配置,这些要求适用于每个麦克风。
如果设备实现声明 android.hardware.microphone
但不支持未处理音频源,则它们
- [C-2-1] 必须 为
AudioManager.getProperty(PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED)
API 方法返回null
,以正确指示缺乏支持。 - [C-SR-1] 仍然**强烈建议** 尽可能满足未处理录音源信号路径的要求。
5.12. HDR 视频
Android 13 支持即将发布的文档中描述的 HDR 技术。
像素格式
如果视频解码器声明支持 COLOR_FormatYUVP010,则
[C-1-1] 必须 支持用于 CPU 读取(ImageReader、MediaImage、ByteBuffer)的 P010 格式。在 Android 13 中,P010 被放宽以允许 Y 和 UV 平面的任意步幅。
[C-1-2] P010 输出缓冲区必须 能够被 GPU 采样(当使用 GPU_SAMPLING 用法分配时)。这使应用能够进行 GPU 合成和自定义色调映射。
如果视频解码器声明支持 COLOR_Format32bitABGR2101010,则它
- [C-2-1] 必须 支持用于输出表面和 CPU 可读(ByteBuffer 输出)的 RGBA_1010102 格式。
如果视频编码器声明支持 COLOR_FormatYUVP010,则它
- [C-3-1] 必须 支持用于输入表面和 CPU 可写(ImageWriter、MediaImage、ByteBuffer)输入的 P010 格式。
如果视频编码器声明支持 COLOR_Format32bitABGR2101010,则它
- [C-4-1] 必须 支持用于输入表面和 CPU 可写(ImageWriter、ByteBuffer)输入的 RGBA_1010102 格式。注意:编码器不需要在各种传输曲线之间进行转换。
HDR 捕获要求
对于支持 HDR 配置文件的所有视频编码器,设备实现
[C-5-1] 不得 假设 HDR 元数据是精确的。例如,编码帧可能具有超出峰值亮度级别的像素,或者直方图可能无法代表帧。
应该 聚合 HDR 动态元数据,以为编码流生成适当的 HDR 静态元数据,并且它们应在每个编码会话结束时输出它。
如果设备实现支持使用 CamcorderProfile API 进行 HDR 捕获,则它们
[C-6-1] 必须 也通过 Camera2 API 支持 HDR 捕获。
[C-6-2] 必须 为每个支持的 HDR 技术至少支持一个硬件加速视频编码器。
[C-6-3] 必须 (至少)支持 HLG 捕获。
[C-6-4] 必须 将 HDR 元数据(如果适用于 HDR 技术)写入捕获的视频文件。对于 AV1、HEVC 和 DolbyVision,这意味着将元数据包含到编码比特流中。
[C-6-5] 必须 支持 P010 和 COLOR_FormatYUVP010。
[C-6-6] 必须 在捕获配置文件的默认硬件加速解码器中支持 HDR 到 SDR 的色调映射。换句话说,如果设备可以捕获 HDR10+ HEVC,则默认 HEVC 解码器必须 能够以 SDR 格式解码捕获的流。
HDR 编辑要求
如果设备实现包括支持 HDR 编辑的视频编码器,则它们
- 应该 在 HDR 元数据不存在时使用最小延迟来生成它,并且应该 优雅地处理某些帧存在元数据而其他帧不存在元数据的情况。此元数据应该 是精确的(例如,表示帧的实际峰值亮度和直方图)。
如果设备实现包括支持 FEATURE_HdrEditing 的编解码器,则这些编解码器
[C-7-1] 必须 至少支持一个 HDR 配置文件。
[C-7-2] 必须 为该编解码器广告宣传的所有 HDR 配置文件支持 FEATURE_HdrEditing。换句话说,对于使用 HDR 元数据的所有支持的 HDR 配置文件,它们必须 支持在 HDR 元数据不存在时生成它。
[C-7-3] 必须 支持以下完全保留 HDR 解码信号的视频编码器输入格式
- RGBA_1010102(已在目标传输曲线中),用于输入表面和 ByteBuffer,并且必须 广告宣传对 COLOR_Format32bitABGR2101010 的支持。
如果设备实现包括支持 FEATURE_HdrEditing 的编解码器,则设备
- [C-7-4] 必须 广告宣传对 EXT_YUV_target OpenGL 扩展的支持。
6. 开发者工具和选项兼容性
6.1. 开发者工具
设备实现
- [C-0-1] 必须 支持 Android SDK 中提供的 Android 开发者工具。
-
- [C-0-2] 必须 支持 Android SDK 和 AOSP 中提供的 shell 命令中记录的 adb,应用开发者可以使用这些命令,包括
dumpsys
cmd stats
- [C-0-11] 必须 支持 shell 命令
cmd testharness
。从早期 Android 版本升级设备实现而没有持久数据块的设备实现可以 免于 C-0-11。 - [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 端口的设备实现支持外围设备模式,则它们
- [C-3-1] 必须 通过局域网(例如以太网或 Wi-Fi)实现 adb。
- [C-3-2] 必须 提供适用于 Windows 7、8 和 10 的驱动程序,允许开发者使用 adb 协议连接到设备。
如果设备实现支持通过 Wi-Fi 或以太网连接到主机的 adb 连接,则它们
- [C-4-1] 必须 使
AdbManager#isAdbWifiSupported()
方法返回true
。
如果设备实现支持通过 Wi-Fi 或以太网连接到主机的 adb 连接,并且至少包含一个摄像头,则它们
- [C-5-1] 必须 使
AdbManager#isAdbWifiQrSupported()
方法返回true
。
- [C-0-2] 必须 支持 Android SDK 和 AOSP 中提供的 shell 命令中记录的 adb,应用开发者可以使用这些命令,包括
-
- [C-0-7] 必须 支持 Android SDK 中记录的所有 ddms 功能。由于 ddms 使用 adb,因此对 ddms 的支持应该 默认情况下处于非活动状态,但在用户激活 Android 调试桥后必须 得到支持,如上所述。
-
- [C-0-9] 必须 支持 Android SDK 中记录的 systrace 工具。Systrace 必须默认处于非活动状态,并且必须 有一个用户可访问的机制来启用 Systrace。
-
- [C-SR-1] **强烈建议** 向 shell 用户公开一个
/system/bin/perfetto
二进制文件,该二进制文件的 cmdline 符合 perfetto 文档。 - [C-SR-2] **强烈建议** perfetto 二进制文件接受符合 perfetto 文档 中定义的架构的 protobuf 配置作为输入。
- [C-SR-3] **强烈建议** perfetto 二进制文件将符合 perfetto 文档 中定义的架构的 protobuf 跟踪作为输出写入。
- [C-SR-4] **强烈建议** 通过 perfetto 二进制文件提供至少 perfetto 文档 中描述的数据源。
- [C-SR-1] **强烈建议** 向 shell 用户公开一个
-
- [C-0-12] 当应用被 低内存杀手 终止时,必须 将
LMK_KILL_OCCURRED_FIELD_NUMBER
Atom 写入 statsd 日志。
- [C-0-12] 当应用被 低内存杀手 终止时,必须 将
测试工具模式 如果设备实现支持 shell 命令
cmd testharness
并运行cmd testharness enable
,则它们- [C-2-1] 必须 为
ActivityManager.isRunningInUserTestHarness()
返回true
- [C-2-2] 必须 按照 测试工具模式文档 中所述实现测试工具模式。
- [C-2-1] 必须 为
GPU 工作信息
设备实现
- [C-0-13] 必须 实现 shell 命令
dumpsys gpu --gpuwork
以显示power/gpu_work_period
内核跟踪点返回的聚合 GPU 工作数据,如果不支持该跟踪点,则不显示任何数据。AOSP 实现为frameworks/native/services/gpuservice/gpuwork/
。
- [C-0-13] 必须 实现 shell 命令
如果设备实现通过 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 的行为必须 以某种合理的方式实现为无操作。
- [C-0-4] API 方法必须 在 SDK 文档允许的情况下返回 null 值。
- [C-0-5] API 方法必须 在 SDK 文档不允许使用 null 值的情况下返回类的无操作实现。
- [C-0-6] API 方法不得 抛出 SDK 文档中未记录的异常。
- [C-0-7] 设备实现必须 通过
getSystemAvailableFeatures()
和hasSystemFeature(String)
方法在 android.content.pm.PackageManager 类上一致地报告准确的硬件配置信息,用于相同的构建指纹。
这些要求适用的典型示例是电话 API:即使在非电话设备上,这些 API 也必须实现为合理的无操作。
7.1. 显示和图形
Android 包括自动调整应用程序资源和 UI 布局以适应设备的工具,以确保第三方应用程序在 各种硬件配置 上良好运行。在所有第三方 Android 兼容应用程序都可以运行的 Android 兼容显示屏上,设备实现必须 正确实现这些 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 文档中所述。可以 具有带圆角的 Android 兼容显示屏。
如果设备实现支持 UI_MODE_TYPE_NORMAL
并包含带圆角的 Android 兼容显示屏,则它们
[C-1-1] 必须 确保至少满足以下要求之一
- 圆角的半径小于或等于 38 dp。
- 当在逻辑显示屏的每个角锚定一个 15 dp x 15 dp 的框时,每个框的至少一个像素在屏幕上可见。
应该 包括用户切换到具有矩形角的显示模式的功能。
如果设备实现包括可折叠的 Android 兼容显示屏,或者包括多个显示面板之间的折叠铰链,并将此类显示屏提供给渲染第三方应用,则它们
- [C-2-1] 必须 实现最新可用的稳定版本的 extensions API 或稳定版本的 sidecar API,以供 Window Manager Jetpack 库使用。
如果设备实现包括可折叠的 Android 兼容显示屏,或者包括多个显示面板之间的折叠铰链,并且铰链或折叠跨越全屏应用程序窗口,则它们
- [C-3-1] 必须 通过 extensions 或 sidecar API 向应用程序报告铰链或折叠的位置、边界和状态。
有关正确实现 sidecar 或 extension API 的详细信息,请参阅 Window Manager Jetpack 的公共文档。
7.1.1.2. 屏幕纵横比
虽然 Android 兼容显示屏的物理显示屏的纵横比没有限制,但第三方应用渲染的逻辑显示屏的纵横比(可以从通过 view.Display
API 和 Configuration API 报告的高度和宽度值导出)必须 满足以下要求
[C-0-1]
Configuration.uiMode
设置为UI_MODE_TYPE_NORMAL
的设备实现必须 具有小于或等于 1.86(大约 16:9)的纵横比值,除非应用满足以下条件之一- 应用已通过
android.max_aspect
元数据值声明它支持更大的屏幕纵横比。 - 应用通过 android:resizeableActivity 属性声明它是可调整大小的。
- 应用的目标 API 级别为 24 或更高,并且未声明会限制允许的纵横比的
android:maxAspectRatio
。
- 应用已通过
[C-0-3]
Configuration.uiMode
设置为UI_MODE_TYPE_WATCH
的设备实现必须 将纵横比值设置为 1.0 (1:1)。
7.1.1.3. 屏幕密度
Android UI 框架定义了一组标准逻辑密度,以帮助应用程序开发者定位应用程序资源。
[C-0-1] 默认情况下,设备实现必须 仅通过
DisplayMetrics
上的DENSITY_DEVICE_STABLE
API 报告DisplayMetrics
上列出的 Android 框架密度之一,并且此值在任何时候都不得 更改;但是,设备可以 根据用户在初始启动后设置的显示配置更改(例如,显示尺寸)报告不同的任意密度。设备实现应该 定义在数值上最接近屏幕物理密度的标准 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. 显示指标
如果设备实现包括 Android 兼容显示屏或到 Android 兼容显示屏屏幕的视频输出,则它们
- [C-1-1] 必须 报告
android.util.DisplayMetrics
API 中定义的所有 Android 兼容显示指标的正确值。
如果设备实现不包括嵌入式屏幕或视频输出,则它们
- [C-2-1] 必须 报告
android.util.DisplayMetrics
API 中定义的 Android 兼容显示的正确值,用于模拟默认view.Display
。
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 文档 中所体现和详述的那样。
- [C-SR-1] **强烈建议** 支持 OpenGL ES 3.1。
- 应该 支持 OpenGL ES 3.2。
OpenGL ES dEQP 测试分为多个测试列表,每个列表都有关联的日期/版本号。这些列表位于 Android 源代码树的 external/deqp/android/cts/main/glesXX-main-YYYY-MM-DD.txt
中。支持自报告级别的 OpenGL ES 的设备表示它可以传递此级别和更早版本的所有测试列表中的 dEQP 测试。
如果设备实现支持任何 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
和EGL_ANDROID_GLES_layers
扩展。 - [C-2-3] 必须 通过
android.software.opengles.deqp.level
功能标志报告支持的 OpenGL ES dEQP 测试的最大版本。 - [C-2-4] 必须 至少支持版本 132383489(来自 2020 年 3 月 1 日),如
android.software.opengles.deqp.level
功能标志中所报告的那样。 - [C-2-5] 必须 通过版本 132383489 和
android.software.opengles.deqp.level
功能标志中指定的版本之间的测试列表中的所有 OpenGL ES dEQP 测试,对于每个支持的 OpenGL ES 版本。 - [C-SR-2] **强烈建议** 支持
EGL_KHR_partial_update
和OES_EGL_image_external
扩展。 - 应该 通过
getString()
方法准确报告它们支持的任何纹理压缩格式,这通常是供应商特定的。 - 应该 支持
EGL_IMG_context_priority
和EGL_EXT_protected_content
扩展。
如果设备实现声明支持 OpenGL ES 3.0、3.1 或 3.2,则它们
- [C-3-1] 必须 除了 libGLESv2.so 库中的 OpenGL ES 2.0 函数符号外,还导出这些版本的相应函数符号。
- [C-SR-3] **强烈建议** 支持
OES_EGL_image_external_essl3
扩展。
如果设备实现支持 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,则它们
- [C-SR-1] **强烈建议** 包括对 Vulkan 1.3 的支持。
- [C-4-1] 不得 支持 Vulkan 变体版本(即 Vulkan 核心版本的变体部分必须 为零)。
如果设备实现包含屏幕或视频输出,则它们
- [C-SR-2] **强烈建议** 包括对 Vulkan 1.3 的支持。
Vulkan dEQP 测试分为多个测试列表,每个列表都有关联的日期/版本。这些列表位于 Android 源代码树的 external/deqp/android/cts/main/vk-main-YYYY-MM-DD.txt
中。支持自报告级别的 Vulkan 的设备表示它可以传递此级别和更早版本的所有测试列表中的 dEQP 测试。
如果设备实现包含对 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] 除非应用程序的
android:debuggable
属性设置为true
,否则不得枚举应用程序包外部库提供的图层,或提供其他跟踪或拦截 Vulkan API 的方式。 - [C-1-6] 必须通过 Vulkan 原生 API 报告它们支持的所有扩展字符串,反之,不得报告它们未正确支持的扩展字符串。
- [C-1-7] 必须支持 VK_KHR_surface、VK_KHR_android_surface、VK_KHR_swapchain 和 VK_KHR_incremental_present 扩展。
- [C-1-8] 必须通过
android.software.vulkan.deqp.level
功能标志报告支持的 Vulkan dEQP 测试的最大版本。 - [C-1-9] 必须至少支持
android.software.vulkan.deqp.level
功能标志中报告的版本132317953
(来自 2019 年 3 月 1 日)。 - [C-1-10] 必须通过版本
132317953
和android.software.vulkan.deqp.level
功能标志中指定的版本之间的测试列表中所有 Vulkan dEQP 测试。 - [C-1-11] 不得枚举对 VK_KHR_video_queue、VK_KHR_video_decode_queue 或 VK_KHR_video_encode_queue 扩展的支持。
- [C-SR-3] 强烈建议支持
VK_KHR_driver_properties
和VK_GOOGLE_display_timing
扩展。 - 应支持
VkPhysicalDeviceProtectedMemoryFeatures
和VK_EXT_global_priority
。 - [C-1-12] 不得枚举对 VK_KHR_performance_query 扩展的支持。
- [C-SR-4] 强烈建议满足 Android Baseline 2021 配置文件中指定的要求。
如果设备实现不包含对 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 的支持并声明任何 Vulkan 功能标志,则它们
- [C-3-1] 必须公开对
SYNC_FD
外部信号量和句柄类型以及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、窗口或视图级别启用 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_EXT_gl_colorspace_display_p3_linear
和EGL_EXT_gl_colorspace_display_p3_passthrough
扩展。 - [C-SR-1] 强烈建议支持
GL_EXT_sRGB
。
相反,如果设备实现不支持广色域显示屏,则它们
- [C-2-1] 应在 CIE 1931 xyY 空间中覆盖 100% 或更多的 sRGB,尽管屏幕色域未定义。
7.1.5. 旧版应用程序兼容模式
Android 指定了一种“兼容模式”,在该模式下,框架以“正常”屏幕尺寸等效模式(320dp 宽度)运行,以使未针对早于屏幕尺寸独立的旧版本 Android 开发的旧版应用程序受益。
7.1.6. 屏幕技术
Android 平台包含允许应用程序将丰富的图形渲染到 Android 兼容显示屏的 API。除非本文档中明确允许,否则设备必须支持 Android SDK 定义的所有这些 API。
设备实现的所有 Android 兼容显示屏
- [C-0-1] 必须能够渲染 16 位彩色图形。
- 应支持能够渲染 24 位彩色图形的显示屏。
- [C-0-2] 必须能够渲染动画。
- [C-0-3] 必须具有介于 0.9 和 1.15 之间的像素宽高比 (PAR)。也就是说,像素宽高比必须接近正方形 (1.0),公差为 10~15%。
7.1.7. 副显示屏
Android 包括对副 Android 兼容显示屏的支持,以启用媒体共享功能和用于访问外部显示屏的开发者 API。
如果设备实现支持通过有线、无线或嵌入式附加显示屏连接的外部显示屏,则它们
- [C-1-1] 必须实现 Android SDK 文档中描述的
DisplayManager
系统服务和 API。
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] 必须提供用户功能来启动已安装的应用程序,这些应用程序具有使用
ACTION=MAIN
和CATEGORY=LAUNCHER
或电视设备实现的CATEGORY=LEANBACK_LAUNCHER
设置的<intent-filter>
的 Activity。主屏幕功能应是此用户功能的机制。 - 应为最近任务和返回功能提供按钮。
如果提供主屏幕、最近任务或返回功能,则它们
- [C-1-1] 在任何功能可访问时,必须通过单次操作(例如点击、双击或手势)访问它们。
- [C-1-2] 必须清楚地指示哪个单次操作将触发每个功能。在按钮上印上可见图标、在屏幕导航栏部分显示软件图标,或在开箱即用设置体验期间引导用户完成分步演示流程,都是此类指示的示例。
设备实现
[C-SR-1] 强烈建议不要为 菜单功能 提供输入机制,因为它自 Android 4.0 以来已被操作栏取代。
[C-SR-2] 强烈建议将所有导航功能都设为可取消。“可取消”定义为:如果滑动未释放超过某个阈值,用户可以阻止导航功能执行(例如,返回主屏幕、返回等)的能力。
如果设备实现提供菜单功能,则它们
- [C-2-1] 每当操作溢出菜单弹出窗口不为空且操作栏可见时,都必须显示操作溢出按钮。
- [C-2-2] 不得修改通过选择操作栏中的溢出按钮显示的操作溢出弹出窗口的位置,但在通过选择菜单功能显示操作溢出弹出窗口时,可以修改屏幕上的位置来渲染操作溢出弹出窗口。
如果设备实现不提供菜单功能,为了向后兼容,它们:* [C-3-1] 当 targetSdkVersion
小于 10 时,必须通过物理按钮、软件键或手势使应用程序可以使用菜单功能。除非与其他导航功能一起隐藏,否则此菜单功能应可访问。
如果设备实现提供 Assist 功能,则它们
- [C-4-1] 在其他导航键可访问时,必须通过单次操作(例如点击、双击或手势)访问 Assist 功能。
- [C-SR-3] 强烈建议使用长按主屏幕功能作为此指定交互。
如果设备实现使用屏幕的不同部分来显示导航键,则它们
- [C-5-1] 导航键必须使用屏幕的不同部分,应用程序不可用,并且不得遮挡或以其他方式干扰应用程序可用的屏幕部分。
- [C-5-2] 必须向应用程序提供满足 第 7.1.1 节 中定义的要求的显示屏部分。
- [C-5-3] 必须遵守应用程序通过
View.setSystemUiVisibility()
API 方法设置的标志,以便屏幕的此不同部分(又名导航栏)可以按照 SDK 中的文档正确隐藏。
如果导航功能作为屏幕上的基于手势的操作提供
- [C-6-1]
WindowInsets#getMandatorySystemGestureInsets()
必须仅用于报告主屏幕手势识别区域。 - [C-6-2] 在前台应用程序通过
View#setSystemGestureExclusionRects()
提供的排除矩形内,但在WindowInsets#getMandatorySystemGestureInsets()
之外开始的手势,只要排除矩形在View#setSystemGestureExclusionRects()
的文档中指定的最大排除限制内,就不得被导航功能拦截。 - [C-6-3] 如果前台应用程序先前已发送
MotionEvent.ACTION_DOWN
事件,则一旦触摸开始被系统手势拦截,必须向前台应用程序发送MotionEvent.ACTION_CANCEL
事件。 - [C-6-4] 必须提供用户功能来切换到基于屏幕按钮的导航(例如,在“设置”中)。
- 应将主屏幕功能作为从屏幕当前方向的底部边缘向上滑动的手势提供。
- 应将最近任务功能作为从与主屏幕手势相同的区域向上滑动并按住不放的手势提供。
- 在
WindowInsets#getMandatorySystemGestureInsets()
内开始的手势不应受前台应用程序通过View#setSystemGestureExclusionRects()
提供的排除矩形的影响。
如果从屏幕当前方向的左右边缘的任何位置提供导航功能
- [C-7-1] 导航功能必须是返回,并作为从屏幕当前方向的左右边缘滑动的手势提供。
- [C-7-2] 如果在左右边缘提供了自定义可滑动系统面板,则它们必须位于屏幕顶部 1/3 区域内,并具有清晰、持久的可视指示,表明向内拖动将调用上述面板,而不是返回。系统面板可以由用户配置为使其落在屏幕边缘顶部 1/3 区域以下,但系统面板不得使用超过边缘 1/3 的区域。
- [C-7-3] 当前台应用程序设置了 View.SYSTEM_UI_FLAG_IMMERSIVE、View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY、WindowInsetsController.BEHAVIOR_DEFAULT 或 WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE 标志时,从边缘滑动必须表现得与 AOSP 中的实现相同,这在 SDK 中有文档记录。
- [C-7-4] 当前台应用程序设置了 View.SYSTEM_UI_FLAG_IMMERSIVE、View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY、WindowInsetsController.BEHAVIOR_DEFAULT 或 WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE 标志时,自定义可滑动系统面板必须隐藏,直到用户调出或取消调暗系统栏(又名导航栏和状态栏),这与 AOSP 中的实现相同。
如果提供了返回导航功能,并且用户取消了返回手势,则
- [C-8-1] 必须调用
OnBackInvokedCallback.onBackCancelled()
。 - [C-8-2] 不得调用
OnBackInvokedCallback.onBackInvoked()
。 - [C-8-3] 不得分派 KEYCODE_BACK 事件。
如果提供了返回导航功能,但前台应用程序未注册 OnBackInvokedCallback
,则
- 系统应为前台应用程序提供动画,以表明用户正在返回,如 AOSP 中提供的那样。
如果设备实现提供对系统 API setNavBarMode
的支持,以允许任何具有 android.permission.STATUS_BAR
权限的系统应用程序设置导航栏模式,则它们
- [C-9-1] 必须提供对 AOSP 代码中提供的儿童友好图标或基于按钮的导航的支持。
7.2.4. 触摸屏输入
Android 包括对各种指针输入系统的支持,例如触摸屏、触摸板和模拟触摸输入设备。基于触摸屏的设备实现 与显示屏相关联,使用户感觉可以直接操作屏幕上的项目。由于用户直接触摸屏幕,因此系统不需要任何额外的功能来指示正在操作的对象。
设备实现
- 应具有某种类型的指针输入系统(鼠标式或触摸式)。
- 应支持完全独立跟踪的指针。
如果设备实现在主 Android 兼容显示屏上包含触摸屏(单点触控或更好),则它们
- [C-1-1] 必须为
Configuration.touchscreen
API 字段报告TOUCHSCREEN_FINGER
。 - [C-1-2] 必须报告
android.hardware.touchscreen
和android.hardware.faketouch
功能标志。
如果设备实现包含可以在主 Android 兼容显示屏上跟踪多个触摸点的触摸屏,则它们
- [C-2-1] 必须报告与设备上特定触摸屏类型对应的适当功能标志
android.hardware.touchscreen.multitouch
、android.hardware.touchscreen.multitouch.distinct
、android.hardware.touchscreen.multitouch.jazzhand
。
如果设备实现依赖外部输入设备(例如鼠标或轨迹球)(即不直接触摸屏幕)在主 Android 兼容显示屏上进行输入,并且满足 第 7.2.5 节 中的模拟触摸要求,则它们
- [C-3-1] 不得报告任何以
android.hardware.touchscreen
开头的功能标志。 - [C-3-2] 必须仅报告
android.hardware.faketouch
。 - [C-3-3] 必须为
Configuration.touchscreen
API 字段报告TOUCHSCREEN_NOTOUCH
。
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] 必须支持指针按下,然后允许用户快速将对象移动到屏幕上的不同位置,然后在屏幕上抬起指针,这允许用户在屏幕上快速滑动对象。
如果设备实现声明支持 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. 按钮映射
设备实现
- [C-1-1] 必须能够将 HID 事件映射到下表列出的相应
InputEvent
常量。上游 Android 实现满足此要求。
如果设备实现嵌入了控制器或在包装盒中附带了单独的控制器,该控制器将提供输入下表列出的所有事件的方式,则它们
- [C-2-1] 必须声明功能标志
android.hardware.gamepad
按钮 | 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 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] 当应用程序处理器处于活动状态时,对于最大请求延迟为 0 毫秒的传感器流,必须以最大延迟 100 毫秒 + 2 * sample_time 报告传感器数据。此延迟不包括任何滤波延迟。
- [C-1-3] 必须在传感器激活后的 400 毫秒 + 2 * sample_time 内报告第一个传感器样本。此样本的精度为 0 是可以接受的。
- [C-1-4] 对于 Android SDK 文档指示为 连续传感器 的任何 API,设备实现必须持续提供周期性数据样本,这些样本的抖动应低于 3%,其中抖动定义为连续事件之间报告的时间戳值差异的标准偏差。
- [C-1-5] 必须确保传感器事件流不得阻止设备 CPU 进入挂起状态或从挂起状态唤醒。
- [C-1-6] 必须按照 Android SDK 文档中的定义,以纳秒为单位 报告事件时间,表示事件发生的时间并与 SystemClock.elapsedRealtimeNano() 时钟同步。
- [C-SR-1] 强烈建议时间戳同步误差低于 100 毫秒,并且应使时间戳同步误差低于 1 毫秒。
- 当激活多个传感器时,功耗不应超过各个传感器报告的功耗之和。
上面的列表并不全面;关于 传感器 的 Android SDK 文档和 Android 开源文档的记录行为被认为是权威的。
如果设备实现包含特定传感器类型,并且该类型具有针对第三方开发者的相应 API,则它们
- [C-1-6] 必须为所有传感器设置非零分辨率,并通过
Sensor.getResolution()
API 方法报告该值。
某些传感器类型是复合的,这意味着它们可以从一个或多个其他传感器提供的数据中派生出来。(示例包括方向传感器和线性加速度传感器。)
设备实现
- 如果包含 传感器类型 中描述的先决条件物理传感器,则应实现这些传感器类型。
如果设备实现包含复合传感器,则它们
- [C-2-1] 必须按照关于 复合传感器 的 Android 开源文档中所述实现该传感器。
如果设备实现包含特定传感器类型,并且该类型具有针对第三方开发者的相应 API,且传感器仅报告一个值,则设备实现
- [C-3-1] 必须将分辨率设置为 1,并通过
Sensor.getResolution()
API 方法报告该值。
如果设备实现包含支持 SensorAdditionalInfo#TYPE_VEC3_CALIBRATION 的特定传感器类型,并且该传感器向第三方开发者公开,则它们
- [C-4-1] 不得在提供的数据中包含任何固定的、出厂确定的校准参数。
如果设备实现包含 3 轴加速度计、3 轴陀螺仪传感器或磁力计传感器的组合,则它们
- [C-SR-2] 强烈建议确保加速度计、陀螺仪和磁力计具有固定的相对位置,这样,如果设备是可变形的(例如可折叠),则传感器轴在所有可能的设备变形状态下都保持对齐并与传感器坐标系一致。
7.3.1. 加速度计
设备实现
- [C-SR-1] 强烈建议包含 3 轴加速度计。
如果设备实现包含加速度计,则它们
- [C-1-1] 必须能够报告高达至少 50 Hz 频率的事件。
- [C-1-3] 必须符合 Android API 中详述的 Android 传感器坐标系。
- [C-1-4] 必须能够在任何轴上测量从自由落体到四倍重力 (4g) 或更大的加速度。
- [C-1-5] 必须具有至少 12 位的分辨率。
- [C-1-6] 标准偏差必须不大于 0.05 m/s^2,其中标准偏差应基于以最快采样率在至少 3 秒的时间内收集的每个轴的样本进行计算。
- 应该报告高达至少 200 Hz 的事件。
- 应该具有至少 16 位的分辨率。
- 如果特性在生命周期内发生变化,则应该在使用时进行校准和补偿,并在设备重启之间保留补偿参数。
- 应该是温度补偿的。
如果设备实现包含 3 轴加速度计,则它们
- [C-2-1] 必须实现并报告
TYPE_ACCELEROMETER
传感器。 - [C-SR-4] 强烈建议实现
TYPE_SIGNIFICANT_MOTION
复合传感器。 - [C-SR-5] 强烈建议实现并报告
TYPE_ACCELEROMETER_UNCALIBRATED
传感器。强烈建议 Android 设备满足此要求,以便能够升级到未来可能需要此功能的平台版本。 - 应该实现 Android SDK 文档中描述的
TYPE_SIGNIFICANT_MOTION
、TYPE_TILT_DETECTOR
、TYPE_STEP_DETECTOR
、TYPE_STEP_COUNTER
复合传感器。
如果设备实现包括少于 3 个轴的加速度计,则它们
- [C-3-1] 必须实现并报告
TYPE_ACCELEROMETER_LIMITED_AXES
传感器。 - [C-SR-6] 强烈建议实现并报告
TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED
传感器。
如果设备实现包括一个 3 轴加速度计,并且实现了 TYPE_SIGNIFICANT_MOTION
、TYPE_TILT_DETECTOR
、TYPE_STEP_DETECTOR
、TYPE_STEP_COUNTER
复合传感器中的任何一个
- [C-4-1] 它们的总功耗必须始终小于 4 mW。
- 在动态或静态条件下,每个传感器的功耗都应该低于 2 mW 和 0.5 mW。
如果设备实现包括一个 3 轴加速度计和一个 3 轴陀螺仪传感器,则它们
- [C-5-1] 必须实现
TYPE_GRAVITY
和TYPE_LINEAR_ACCELERATION
复合传感器。 - [C-SR-7] 强烈建议实现
TYPE_GAME_ROTATION_VECTOR
复合传感器。
如果设备实现包括一个 3 轴加速度计、一个 3 轴陀螺仪传感器和一个磁力计传感器,则它们
- [C-6-1] 必须实现一个
TYPE_ROTATION_VECTOR
复合传感器。
7.3.2. 磁力计
设备实现
- [C-SR-1] 强烈建议包括一个 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] 标准偏差必须不大于 1.5 µT;标准偏差应基于以最快采样率在至少 3 秒的时间内收集的每个轴的样本进行计算;标准偏差应该不大于 0.5 µT。
- [C-1-10] 必须实现
TYPE_MAGNETIC_FIELD_UNCALIBRATED
传感器。
如果设备实现包括一个 3 轴磁力计、一个加速度计传感器和一个 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
设备实现
- [C-SR-1] 强烈建议包括 GPS/GNSS 接收器。
如果设备实现包括 GPS/GNSS 接收器,并通过 android.hardware.location.gps
功能标志向应用程序报告此功能,则它们
- [C-1-1] 当通过
LocationManager#requestLocationUpdate
请求时,必须支持至少 1 Hz 的位置输出速率。 - [C-1-2] 当连接到 0.5 Mbps 或更快的互联网数据连接时,必须能够在开阔天空条件下(强信号、可忽略的多径、HDOP < 2)在 10 秒内确定位置(快速首次定位时间)。此要求通常通过使用某种形式的辅助或预测 GPS/GNSS 技术来实现,以最大限度地缩短 GPS/GNSS 锁定时间(辅助数据包括参考时间、参考位置和卫星星历/时钟)。
- [C-1-6] 在进行此类位置计算后,即使后续请求是在没有数据连接的情况下和/或在断电重启后发出,设备实现在开阔天空条件下,在位置请求重新启动后最多一小时内,必须在 5 秒内确定其位置。
在开阔天空条件下,在确定位置后,当静止或以小于 1 米/秒平方的加速度移动时
- [C-1-3] 必须能够在 20 米内确定位置,并在 0.5 米/秒内确定速度,至少在 95% 的时间内。
- [C-1-4] 必须通过
GnssStatus.Callback
同时跟踪和报告来自一个星座的至少 8 颗卫星。 - 应该能够同时跟踪来自多个星座(例如 GPS + Glonass、北斗、伽利略中的至少一个)的至少 24 颗卫星。
[C-SR-2] 强烈建议在紧急电话呼叫期间继续通过 GNSS 位置提供程序 API 传递正常的 GPS/GNSS 位置输出。
[C-SR-3] 强烈建议报告来自所有跟踪星座(如 GnssStatus 消息中所报告)的 GNSS 测量值,SBAS 除外。
[C-SR-4] 强烈建议报告 AGC 和 GNSS 测量的频率。
[C-SR-5] 强烈建议报告每个 GPS/GNSS 位置的所有精度估计值(包括方位角、速度和垂直精度)。
[C-SR-6] 强烈建议尽快报告 GNSS 测量值,即使尚未报告从 GPS/GNSS 计算的位置。
[C-SR-7] 强烈建议报告 GNSS 伪距和伪距率,这些伪距和伪距率在开阔天空条件下,在确定位置后,当静止或以小于 0.2 米/秒平方的加速度移动时,足以在 20 米内计算位置,并在 0.2 米/秒内计算速度,至少在 95% 的时间内。
7.3.4. 陀螺仪
设备实现
- [C-SR-1] 强烈建议包括一个陀螺仪传感器。
如果设备实现包括一个陀螺仪,则它们
- [C-1-1] 必须能够报告高达至少 50 Hz 频率的事件。
- [C-1-4] 必须具有 12 位或更高的分辨率。
- [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。
- [C-SR-2] 当设备在室温下静止时,校准误差强烈建议小于 0.01 rad/s。
- [C-SR-3] 强烈建议具有 16 位或更高的分辨率。
- 应该报告高达至少 200 Hz 的事件。
如果设备实现包括一个 3 轴陀螺仪,则它们
- [C-2-1] 必须实现
TYPE_GYROSCOPE
传感器。 - [C-SR-4] 强烈建议实现
TYPE_GYROSCOPE_UNCALIBRATED
传感器。
如果设备实现包括一个少于 3 个轴的陀螺仪,则它们
- [C-3-1] 必须实现并报告
TYPE_GYROSCOPE_LIMITED_AXES
传感器。 - [C-SR-5] 强烈建议实现并报告
TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED
传感器。
如果设备实现包括一个 3 轴陀螺仪、一个加速度计传感器和一个磁力计传感器,则它们
- [C-4-1] 必须实现一个
TYPE_ROTATION_VECTOR
复合传感器。
如果设备实现包括一个 3 轴加速度计和一个 3 轴陀螺仪传感器,则它们
- [C-5-1] 必须实现
TYPE_GRAVITY
和TYPE_LINEAR_ACCELERATION
复合传感器。 - [C-SR-6] 强烈建议实现
TYPE_GAME_ROTATION_VECTOR
复合传感器。
7.3.5. 气压计
设备实现
- [C-SR-1] 强烈建议包括一个气压计(环境气压传感器)。
如果设备实现包括一个气压计,则它们
- [C-1-1] 必须实现并报告
TYPE_PRESSURE
传感器。 - [C-1-2] 必须能够以 5 Hz 或更高的频率传递事件。
- [C-1-3] 必须是温度补偿的。
- [C-SR-2] 强烈建议能够报告 300hPa 至 1100hPa 范围内的压力测量值。
- 应该具有 1hPa 的绝对精度。
- 应该在 20hPa 范围内具有 0.12hPa 的相对精度(相当于海平面上约 200m 变化时约 1m 的精度)。
7.3.6. 温度计
如果设备实现包括环境温度计(温度传感器),则它们
- [C-1-1] 必须为环境温度传感器定义
SENSOR_TYPE_AMBIENT_TEMPERATURE
,并且传感器必须测量用户与设备交互位置的环境(房间/车厢)温度,单位为摄氏度。
如果设备实现包括测量环境温度以外温度的温度计传感器,例如 CPU 温度,则它们
- [C-2-1] 不得为温度传感器定义
SENSOR_TYPE_AMBIENT_TEMPERATURE
。
如果设备实现包括用于监测皮肤温度的传感器,那么它们
- [C-SR-1] 强烈建议支持 PowerManager.getThermalHeadroom API。
7.3.7. 光度计
- 设备实现可以包括光度计(环境光传感器)。
7.3.8. 接近传感器
- 设备实现可以包括接近传感器。
如果设备实现包括接近传感器,并且它们仅报告二进制“近”或“远”读数,则它们
- [C-1-1] 必须测量屏幕方向上物体的接近程度。也就是说,接近传感器必须定向为检测靠近屏幕的物体,因为此传感器类型的主要目的是检测用户正在使用的手机。如果设备实现包括任何其他方向的接近传感器,则不得通过此 API 访问它。
- [C-1-2] 必须具有 1 位或更高的精度。
- [C-1-3] 必须使用 0 厘米作为“近”读数,5 厘米作为“远”读数。
- [C-1-4] 必须报告 5 的最大范围和分辨率。
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-1] 强烈建议具有至少 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-2] 强烈建议具有至少 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。
- g 灵敏度应该小于 0.1°/s/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-3] 强烈建议当报告速率为 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
传感器。[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. 生物识别传感器
有关衡量生物识别解锁安全性的更多背景信息,请参阅衡量生物识别安全性的文档。
如果设备实现包括安全锁屏,则它们
- 应该包括生物识别传感器
生物识别传感器可以根据其欺骗和冒名顶替接受率以及生物识别管道的安全性,分为3 类(以前称为强)、2 类(以前称为弱)或1 类(以前称为便捷)。此分类决定了生物识别传感器与平台和第三方应用程序交互的能力。如果传感器希望被分类为 1 类、2 类或 3 类,则需要满足以下详述的附加要求。2 类和 3 类生物识别技术都获得了以下详述的附加功能。
如果设备实现通过 android.hardware.biometrics.BiometricManager、android.hardware.biometrics.BiometricPrompt 和 android.provider.Settings.ACTION_BIOMETRIC_ENROLL 向第三方应用程序提供生物识别传感器,则它们
- [C-4-1] 必须满足本文档中定义的 3 类 或 2 类 生物识别的要求。
- [C-4-2] 必须识别并遵守在 Authenticators 类中定义为常量以及它们的任何组合的每个参数名称。相反,不得识别或遵守传递给 canAuthenticate(int) 和 setAllowedAuthenticators(int) 方法的整数常量,除非这些常量在 Authenticators 中记录为公共常量以及它们的任何组合。
- [C-4-3] 在具有 3 类 或 2 类 生物识别的设备上,必须实现 ACTION_BIOMETRIC_ENROLL 操作。此操作必须仅显示 3 类 或 2 类 生物识别的注册入口点。
如果设备实现支持被动生物识别,则它们
- [C-5-1] 默认情况下必须需要额外的确认步骤(例如,按下按钮)。
- [C-SR-1] 强烈建议设置一个选项,允许用户覆盖应用程序首选项并始终需要随附的确认步骤。
- [C-SR-2] 强烈建议确认操作是安全的,以至于操作系统或内核的妥协无法欺骗它。例如,这意味着基于物理按钮的确认操作通过安全元件 (SE) 的仅输入通用输入/输出 (GPIO) 引脚进行路由,该引脚无法通过物理按钮按压以外的任何其他方式驱动。
- [C-5-2] 必须另外实现与 setConfirmationRequired(boolean) 对应的隐式身份验证流程(无需确认步骤),应用程序可以设置使用此流程进行登录。
如果设备实现具有多个生物识别传感器,则它们
- [C-SR-3] 强烈建议每次身份验证仅需要确认一个生物识别(例如,如果设备上同时具有指纹和面部传感器,则在确认其中任何一个后,应发送 onAuthenticationSucceeded)。
为了使设备实现允许第三方应用程序访问密钥库密钥,它们
- [C-6-1] 必须满足以下本节中定义的 3 类 的要求。
- [C-6-2] 当身份验证需要 BIOMETRIC_STRONG 时,或者当使用 CryptoObject 调用身份验证时,必须仅显示 3 类 生物识别。
如果设备实现希望将生物识别传感器视为 1 类(以前称为 便捷),则它们
- [C-1-1] 误接受率必须小于 0.002%。
- [C-1-2] 如果欺骗和冒名顶替接受率高于 Android 生物识别测试协议 测量的 7%,则必须披露此模式可能不如强 PIN 码、图案或密码安全,并清楚地列举启用它的风险。
- [C-1-9] 在不超过 20 次错误尝试且不少于 90 秒的生物识别验证退避时间后,必须向用户质询推荐的主要身份验证(例如,PIN 码、图案、密码)- 其中错误尝试是指具有足够的捕获质量 (BIOMETRIC_ACQUIRED_GOOD) 但与已注册生物识别不匹配的尝试。
- [C-SR-4] 如果欺骗和冒名顶替接受率高于 Android 生物识别测试协议测量的 7%,则强烈建议降低 [C-1-9] 中指定的生物识别验证的错误尝试总次数。
- [C-1-3] 必须限制生物识别验证的尝试速率 - 其中错误尝试是指具有足够的捕获质量 (
BIOMETRIC_ACQUIRED_GOOD
) 但与已注册生物识别不匹配的尝试。 - [C-SR-5] 强烈建议在生物识别验证的五次错误尝试后,至少在 30 秒内限制尝试速率,以达到 [C-1-9] 中规定的最大错误尝试次数 - 其中错误尝试是指具有足够的捕获质量 (BIOMETRIC_ACQUIRED_GOOD) 但与已注册生物识别不匹配的尝试。
- [C-SR-6] 强烈建议将所有速率限制逻辑放在 TEE 中。
- [C-1-10] 一旦主要身份验证退避首次触发(如第 9.11 节的 [C-0-2] 中所述),必须禁用生物识别。
- [C-1-11] 欺骗和冒名顶替接受率必须不高于 30%,其中 (1) A 级演示攻击工具 (PAI) 物种的欺骗和冒名顶替接受率不高于 30%,以及 (2) B 级 PAI 物种的欺骗和冒名顶替接受率不高于 40%,如 Android 生物识别测试协议所衡量。
- [C-1-4] 必须防止在未首先通过让用户确认现有或添加新的设备凭据(TEE 保护的 PIN 码/图案/密码)来建立信任链的情况下添加新的生物识别;Android 开源项目实现提供了框架中执行此操作的机制。
- [C-1-5] 当用户的帐户被删除时(包括通过恢复出厂设置),必须完全删除用户的所有可识别生物识别数据。
- [C-1-6] 必须遵守该生物识别的单独标志(即
DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT
,DevicePolicymanager.KEYGUARD_DISABLE_FACE
, 或DevicePolicymanager.KEYGUARD_DISABLE_IRIS
)。 - [C-1-7] 必须每 24 小时或更短时间向用户质询推荐的主要身份验证(例如,PIN 码、图案、密码)。注意:在 Android 9 或更早版本上发布的升级设备必须每 72 小时或更短时间向用户质询推荐的主要身份验证(例如,PIN 码、图案、密码)。
- [C-1-8] 在发生以下情况之一后,必须向用户质询推荐的主要身份验证(例如:PIN 码、图案、密码)或 3 类(强)生物识别
- 4 小时的空闲超时时间,或
- 3 次生物识别身份验证尝试失败。
- 在设备凭据成功确认后,空闲超时时间和身份验证失败计数将重置。注意:在 Android 9 或更早版本上发布的升级设备可能可以豁免 C-1-8 要求。
- [C-SR-7] 强烈建议在新设备上使用 Android 开源项目提供的框架中的逻辑来强制执行 [C-1-7] 和 [C-1-8] 中指定的约束。
- [C-SR-8] 强烈建议设备上测得的错误拒绝率低于 10%。
- [C-SR-9] 强烈建议对于每个已注册的生物识别,从检测到生物识别到屏幕解锁的延迟低于 1 秒。
如果设备实现希望将生物识别传感器视为Class 2(以前称为Weak),则它们
[C-2-1] 必须满足上述 Class 1 的所有要求。
[C-2-2] 必须具有不高于 20% 的欺骗和冒名顶替接受率,其中 (1) A 级演示攻击工具 (PAI) 物种的欺骗和冒名顶替接受率不高于 20%,以及 (2) B 级 PAI 物种的欺骗和冒名顶替接受率不高于 30%,这由 Android 生物识别测试协议 衡量。
[C-2-3] 必须在 Android 用户或内核空间之外的隔离执行环境(例如可信执行环境 (TEE))中,或在具有通往隔离执行环境的安全通道的芯片上执行生物识别匹配。
[C-2-4] 必须对所有可识别的数据进行加密和密码学身份验证,使其无法在隔离执行环境之外或在具有通往隔离执行环境的安全通道的芯片上被获取、读取或更改,具体文档请参阅 Android 开源项目网站上的 实现指南。
[C-2-5] 对于基于摄像头的生物识别,在进行基于生物识别的身份验证或注册时
- 必须以防止摄像头帧在隔离执行环境之外或在具有通往隔离执行环境的安全通道的芯片上被读取或更改的模式操作摄像头。
- 对于 RGB 单摄像头解决方案,摄像头帧可以在隔离执行环境之外读取,以支持诸如注册预览之类的操作,但仍然绝不能被更改。
[C-2-6] 绝不能允许第三方应用程序区分各个生物识别注册。
[C-2-7] 绝不能允许在 TEE 上下文之外向应用程序处理器未加密访问可识别的生物识别数据或从中派生的任何数据(例如嵌入)。在 Android 9 或更早版本上发布的升级设备不豁免 C-2-7 要求。
[C-2-8] 必须具有安全的处理管道,以使操作系统或内核泄露不能允许直接注入数据来伪造用户身份验证。注意:如果设备实现在 Android 9 或更早版本上已发布,并且无法通过系统软件更新满足 C-2-8 要求,则它们可以豁免此要求。
[C-SR-10] 强烈建议为所有生物识别方式包含活体检测,并为面部生物识别包含注意力检测。
[C-2-9] 必须使生物识别传感器可供第三方应用程序使用。
如果设备实现希望将生物识别传感器视为 Class 3(以前称为 Strong),则它们
- [C-3-1] 必须满足上述 Class 2 的所有要求,但 [C-1-7] 和 [C-1-8] 除外。
- [C-3-2] 必须具有硬件支持的密钥库实现。
- [C-3-3] 必须具有不高于 7% 的欺骗和冒名顶替接受率,其中 (1) A 级演示攻击工具 (PAI) 物种的欺骗和冒名顶替接受率不高于 7%,以及 (2) B 级 PAI 物种的欺骗和冒名顶替接受率不高于 20%,这由 Android 生物识别测试协议 衡量。
- [C-3-4] 必须每 72 小时或更短的时间内,要求用户进行建议的主要身份验证(例如 PIN 码、图案、密码)。
- [C-3-5] 如果设备上支持的任何 Class 3 生物识别被重新注册,则必须为所有这些生物识别重新生成 Authenticator ID。
- [C-3-6] 必须允许第三方应用程序使用生物识别支持的密钥库密钥。
如果设备实现包含屏下指纹传感器 (UDFPS),则它们
- [C-SR-11] 强烈建议防止 UDFPS 的可触摸区域干扰三按钮导航(某些用户可能出于辅助功能目的而需要)。
7.3.11. 姿势传感器
设备实现
- 可以支持具有 6 个自由度的姿势传感器。
如果设备实现支持具有 6 个自由度的姿势传感器,则它们
- [C-1-1] 必须实现并报告
TYPE_POSE_6DOF
传感器。 - [C-1-2] 必须比单独的旋转矢量更准确。
7.3.12. 铰链角度传感器
如果设备实现支持铰链角度传感器,则它们
- [C-1-1] 必须实现并报告
TYPE_HINGLE_ANGLE
。 - [C-1-2] 必须支持至少两个介于 0 到 360 度之间的读数(包括 0 度和 360 度)。
- [C-1-3] 必须为
getDefaultSensor(SENSOR_TYPE_HINGE_ANGLE)
返回 唤醒 传感器。
7.3.13. IEEE 802.1.15.4 [已移至 7.4.9]
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。
- 在紧急呼叫期间,应允许所有可用的蜂窝服务类型(2G、3G、4G、5G 等)(无论
SetAllowedNetworkTypeBitmap()
设置的网络类型如何)。
如果设备实现不包含电话硬件,则它们
- [C-2-1] 必须将完整的 API 实现为 no-ops。
如果设备实现支持 eUICC 或 eSIM/嵌入式 SIM,并包含使第三方开发人员可以使用 eSIM 功能的专有机制,则它们
- [C-3-1] 必须声明
android.hardware.telephony.euicc
功能标志。
如果设备实现未将系统属性 ro.telephony.iwlan\_operation\_mode
设置为“legacy”,则它们
- [C-4-1] 当 NetworkRegistrationInfo#getTransportType() 报告为同一 NetworkRegistrationInfo 实例的 ‘TRANSPORT_TYPE_WWAN’ 时,绝不能通过 NetworkRegistrationInfo#getAccessNetworkTechnology() 报告 ‘NETWORK_TYPE_IWLAN’。
如果设备实现支持用于多媒体电话服务 (MMTEL) 和富通信服务 (RCS) 功能的单个 IP 多媒体子系统 (IMS) 注册,并且预期符合蜂窝运营商关于对所有 IMS 信令流量使用单个 IMS 注册的要求,则它们
- [C-5-1] 必须声明
android.hardware.telephony.ims
功能标志,并为 MMTEL 和 RCS 用户功能交换 API 提供 ImsService API 的完整实现。 - [C-5-2] 必须声明
android.hardware.telephony.ims.singlereg
功能标志,并提供 SipTransport API、GbaService API、使用 IRadio 1.6 HAL 的专用承载指示以及通过自动配置服务器 (ACS) 或使用 IMS 配置 API 的其他专有配置机制进行配置的完整实现。
如果设备实现报告了 android.hardware.telephony
功能,那么
- [C-6-1]
SmsManager#sendTextMessage
和SmsManager#sendMultipartTextMessage
必须导致对CarrierMessagingService
的相应调用,以提供文本消息功能。SmsManager#sendMultimediaMessage
和SmsManager#downloadMultimediaMessage
必须导致对CarrierMessagingService
的相应调用,以提供多媒体消息功能。 - [C-6-2] 由
android.provider.Telephony.Sms#getDefaultSmsPackage
指定的应用程序在发送和接收 SMS 和 MMS 消息时必须使用 SmsManager API。packages/apps/Messaging 中的 AOSP 参考实现满足此要求。 - [C-6-3] 响应
Intent#ACTION_DIAL
的应用程序必须支持输入格式为*#*#CODE#*#*
的任意拨号器代码,并触发相应的TelephonyManager#ACTION_SECRET_CODE
广播。 - [C-6-4] 响应
Intent#ACTION_DIAL
的应用程序如果支持可视化语音邮件转录,则必须使用VoicemailContract.Voicemails#TRANSCRIPTION
向用户显示可视化语音邮件转录。 - [C-6-5] 必须将具有等效 group UUID 的所有 SubscriptionInfo 表示为单个订阅,在所有显示和控制 SIM 卡信息的用户可见的工具中。此类工具的示例包括与
Settings#ACTION_MANAGE_ALL_SIM_PROFILES_SETTINGS
或EuiccManager#ACTION_MANAGE_EMBEDDED_SUBSCRIPTIONS
匹配的设置界面。 - [C-6-6] 绝不能在任何允许配置或控制 SIM 卡设置的用户可见的工具中显示或允许控制具有非空 group UUID 和 opportunistic bit 的任何 SubscriptionInfo。
如果设备实现报告了 android.hardware.telephony
功能并提供系统状态栏,则
- [C-7-1] 必须为给定的 group UUID 选择一个代表性的活动订阅,以便在任何提供 SIM 卡状态信息的工具中向用户显示。此类工具的示例包括状态栏蜂窝信号图标或快速设置磁贴。
- [C-SR-1] 强烈建议将代表性订阅选择为 活动数据订阅,除非设备正在进行语音通话,在这种情况下,强烈建议代表性订阅是活动语音订阅。
如果设备实现报告了 android.hardware.telephony
功能,那么
- [C-6-7] 必须能够根据 ETSI TS 102 221 标准,为每个 UICC 打开并同时使用最大数量的逻辑通道(总共 20 个)。
- [C-6-8] 绝不能自动或在没有明确用户确认的情况下,将以下任何行为应用于活动运营商应用(由
TelephonyManager#getCarrierServicePackageName
指定)- 撤销或限制网络访问
- 撤销权限
- 超出 AOSP 中包含的现有电源管理功能,限制后台或前台应用程序执行
- 禁用或卸载应用程序
如果设备实现报告了 android.hardware.telephony
功能,并且共享 group UUID 的所有活动的、非机会性订阅 被禁用、从设备物理移除或标记为机会性,则设备
- [C-8-1] 必须自动禁用同一组中的所有剩余活动 机会性 订阅。
如果设备实现包括 GSM 电话功能但不包括 CDMA 电话功能,则它们
- [C-9-1] 绝不能声明
PackageManager#FEATURE_TELEPHONY_CDMA
。 - [C-9-2] 在尝试在首选或允许的网络类型位掩码中设置任何 3GPP2 网络类型时,必须抛出
IllegalArgumentException
。 - [C-9-3] 必须从
TelephonyManager#getMeid
返回空字符串。
如果设备实现支持具有多个端口和配置文件的 eUICC,则它们
- [C-10-1] 必须声明
android.hardware.telephony.euicc.mep
功能标志。
7.4.1.1. 号码阻止兼容性
如果设备实现报告了 android.hardware.telephony.calling
功能,则它们
- [C-1-1] 必须包含号码阻止支持
- [C-1-2] 必须完全实现
BlockedNumberContract
以及 SDK 文档中描述的相应 API。 [C-1-3] 必须阻止来自 'BlockedNumberProvider' 中电话号码的所有呼叫和消息,而无需与应用程序进行任何交互。唯一的例外是 SDK 文档中描述的临时解除号码阻止的情况。
[C-1-4] 必须为被阻止的呼叫写入 平台通话记录提供程序,并且必须在预安装的拨号器应用程序的默认通话记录视图中过滤掉具有
BLOCKED_TYPE
的呼叫。[C-1-5] 对于被阻止的消息,绝不能写入 Telephony provider。
[C-1-6] 必须实现阻止号码管理 UI,该 UI 通过
TelecomManager.createManageBlockedNumbersIntent()
方法返回的 intent 打开。[C-1-7] 绝不能允许辅助用户查看或编辑设备上的阻止号码,因为 Android 平台假定主用户对设备上的电话服务(单个实例)拥有完全控制权。所有与阻止相关的 UI 必须对辅助用户隐藏,并且阻止列表必须仍然受到尊重。
当设备更新到 Android 7.0 时,应将阻止的号码迁移到提供程序中。
应提供用户工具,以在预安装的拨号器应用程序中显示阻止的呼叫。
7.4.1.2. 电信 API
如果设备实现报告了 android.hardware.telephony.calling
,则它们
- [C-1-1] 必须支持 SDK 中描述的
ConnectionService
API。 - [C-1-2] 当用户正在进行由不支持通过
CAPABILITY_SUPPORT_HOLD
指定的保持功能的第三方应用程序进行的通话时,必须显示新的来电并提供用户工具来接受或拒绝来电。 - [C-1-3] 必须具有一个实现 InCallService 的应用程序。
[C-SR-1] 强烈建议通知用户,接听来电将会断开正在进行的通话。
AOSP 实现通过抬头通知满足这些要求,该通知向用户指示接听来电将导致另一个通话断开。
[C-SR-2] 强烈建议预加载默认拨号器应用程序,当第三方应用程序在其
PhoneAccount
上将EXTRA_LOG_SELF_MANAGED_CALLS
附加键设置为true
时,该应用程序会在其通话记录中显示通话记录条目和第三方应用程序的名称。[C-SR-3] 强烈建议按如下方式处理音频耳机的
KEYCODE_MEDIA_PLAY_PAUSE
和KEYCODE_HEADSETHOOK
事件以用于android.telecom
API- 在正在进行的通话期间检测到按键事件短按时,调用
Connection.onDisconnect()
。 - 在来电期间检测到按键事件短按时,调用
Connection.onAnswer()
。 - 在来电期间检测到按键事件长按时,调用
Connection.onReject()
。 - 切换
CallAudioState
的静音状态。
- 在正在进行的通话期间检测到按键事件短按时,调用
7.4.1.3. 蜂窝 NAT-T Keepalive 卸载
设备实现
- 应包含对蜂窝 keepalive 卸载的支持。
如果设备实现包含对蜂窝 keepalive 卸载的支持并向第三方应用程序公开该功能,则它们
- [C-1-1] 必须支持 SocketKeepAlive API。
- [C-1-2] 必须支持蜂窝网络上至少一个并发 keepalive 插槽。
- [C-1-3] 必须支持与蜂窝无线电 HAL 支持的并发蜂窝 keepalive 插槽一样多的数量。
- [C-SR-1] 强烈建议每个无线电实例支持至少三个蜂窝 keepalive 插槽。
如果设备实现不包含对蜂窝 keepalive 卸载的支持,则它们
- [C-2-1] 必须返回 ERROR_UNSUPPORTED。
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
的指示,该Network
默认用于应用程序流量,并由ConnectivityManager
API 方法(例如getActiveNetwork
和registerDefaultNetworkCallback
)返回。换句话说,只有在成功验证 Wi-Fi 网络提供互联网访问后,它们才可以禁用任何其他网络提供商(例如移动数据)提供的互联网访问。 - [C-1-6] 强烈建议在调用
ConnectivityManager.reportNetworkConnectivity()
API 方法时,重新评估Network
上的互联网访问,并且一旦评估确定当前Network
不再提供互联网访问,则切换到任何其他可用的网络(例如移动数据),以提供互联网访问。 - [C-1-7] 必须在 STA 断开连接时,在每次扫描开始时随机化探测请求帧的源 MAC 地址和序列号。
- [C-1-8] 必须使用一个一致的 MAC 地址(不应在扫描过程中随机化 MAC 地址)。
- [C-1-9] 必须在扫描中的探测请求之间正常(顺序)迭代探测请求序列号。
- [C-1-10] 必须在扫描的最后一个探测请求和下一次扫描的第一个探测请求之间随机化探测请求序列号。
- [C-SR-1] 强烈建议在关联和关联时,随机化用于所有 STA 与接入点 (AP) 通信的源 MAC 地址。
- 设备必须为与之通信的每个 SSID(Passpoint 的 FQDN)使用不同的随机 MAC 地址。
- 设备必须为用户提供一个选项,以控制每个 SSID(Passpoint 的 FQDN)的随机化,包括非随机和随机选项,并且必须将新 Wi-Fi 配置的默认模式设置为随机化。
- [C-SR-2] 强烈建议为他们创建的任何 AP 使用随机 BSSID。
- MAC 地址必须随机化,并为 AP 使用的每个 SSID 持久保存。
- 设备可以为用户提供禁用此功能的选项。如果提供了这样的选项,则必须默认启用随机化。
如果设备实现包含对 IEEE 802.11 标准中定义的 Wi-Fi 省电模式的支持,则它们
- 每当应用程序通过
WifiManager.createWifiLock()
和WifiManager.WifiLock.acquire()
API 获取WIFI_MODE_FULL_HIGH_PERF
锁或WIFI_MODE_FULL_LOW_LATENCY
锁并且该锁处于活动状态时,都应关闭 Wi-Fi 省电模式。 - [C-3-2] 当设备处于 Wi-Fi 低延迟锁 (
WIFI_MODE_FULL_LOW_LATENCY
) 模式时,设备与接入点之间的平均往返延迟必须小于 Wi-Fi 高性能锁 (WIFI_MODE_FULL_HIGH_PERF
) 模式期间的延迟。 - [C-SR-3] 强烈建议每当获取并生效低延迟锁 (
WIFI_MODE_FULL_LOW_LATENCY
) 时,最大限度地减少 Wi-Fi 往返延迟。
如果设备实现支持 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 操作。
- [C-SR-1] 强烈建议为所有新形成的 Wi-Fi Direct 连接随机化源 MAC 地址。
7.4.2.2. Wi-Fi 隧道式直接链路设置
设备实现
- 应包含对 Android SDK 文档中描述的 Wi-Fi 隧道式直接链路设置 (TDLS) 的支持。
如果设备实现包含对 TDLS 的支持,并且通过 WiFiManager API 启用了 TDLS,则它们
- [C-1-1] 必须通过
WifiManager.isTdlsSupported
声明对 TDLS 的支持。 - 仅当 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 管理接口地址,除非 Aware 测距操作正在进行或 Aware 数据路径处于活动状态(只要数据路径处于活动状态,就不需要随机化)。
如果设备实现包含对 第 7.4.2.5 节 中描述的 Wi-Fi Aware 和 Wi-Fi 位置的支持,并将这些功能公开给第三方应用程序,则它们
- [C-2-1] 必须实现位置感知发现 API:setRangingEnabled、setMinDistanceMm、setMaxDistanceMm 和 onServiceDiscoveredWithinRange。
7.4.2.4. Wi-Fi Passpoint
如果设备实现包含对 802.11 (Wi-Fi) 的支持,则它们
- 应包含对 Wi-Fi Passpoint 的支持。
如果设备实现包含对 Wi-Fi Passpoint 的支持,则它们
- [C-1-2] 必须实现 SDK 文档 中描述的 Passpoint 相关
WifiManager
API。 - [C-1-3] 必须支持 IEEE 802.11u 标准,特别是与网络发现和选择相关的标准,例如通用广告服务 (GAS) 和接入网络查询协议 (ANQP)。
- [C-1-4] 必须声明
android.hardware.wifi.passpoint
功能标志。 - [C-1-5] 必须遵循 AOSP 实现来发现、匹配和关联到 Passpoint 网络。
- [C-1-6] 必须至少支持 Wi-Fi Alliance Passpoint R2 中定义的设备配置协议的以下子集:EAP-TTLS 身份验证和 SOAP-XML。
- [C-1-7] 必须按照 Hotspot 2.0 R3 规范处理 AAA 服务器证书。
- [C-1-8] 必须支持通过 Wi-Fi 选择器对配置进行用户控制。
- [C-1-9] 必须保持 Passpoint 配置在重启后仍然持久存在。
- [C-SR-1] 强烈建议支持条款和条件接受功能。
- [C-SR-2] 强烈建议支持场所信息功能。
如果提供了全局 Passpoint 禁用用户控制开关,则实现
- [C-3-1] 必须默认启用 Passpoint。
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 接口未关联到接入点时执行。
- [C-1-4] 在 80 MHz 带宽下,第 68 个百分位数(使用累积分布函数计算)的精度必须在 2 米以内。
- [C-SR-1] 强烈建议在 80 MHz 带宽下,第 68 个百分位数(使用累积分布函数计算)的精度准确到 1.5 米以内。
7.4.2.6. Wi-Fi Keepalive 卸载
设备实现
- 应包含对 Wi-Fi keepalive 卸载的支持。
如果设备实现包含对 Wi-Fi keepalive 卸载的支持并向第三方应用程序公开该功能,则它们
- [C-1-1] 必须支持 SocketKeepalive API。
- [C-1-2] 必须支持 Wi-Fi 上至少三个并发 keepalive 插槽。
如果设备实现不包含对 Wi-Fi keepalive 卸载的支持,则它们
- [C-2-1] 必须返回
ERROR_UNSUPPORTED
。
7.4.2.7. Wi-Fi Easy Connect(设备配置协议)
设备实现
- 应包含对 Wi-Fi Easy Connect (DPP) 的支持。
如果设备实现包含对 Wi-Fi Easy Connect 的支持,并将该功能向第三方应用公开,则它们
- [C-1-1] 必须使 WifiManager#isEasyConnectSupported() 方法返回
true
。
7.4.2.8. 企业 Wi-Fi 服务器证书验证
如果未验证 Wi-Fi 服务器证书或未设置 Wi-Fi 服务器域名,则设备实现
- [C-SR-1] 强烈建议不要向用户提供在“设置”应用中手动添加 企业 Wi-Fi 网络 的选项。
7.4.2.9. 首次使用信任 (TOFU)
如果设备实现支持首次使用信任 (TOFU) 并允许用户定义 WPA/WPA2/WPA3-企业版配置,则它们
- [C-4-1] 必须向用户提供选择使用 TOFU 的选项。
7.4.3. 蓝牙
如果设备实现支持蓝牙音频配置文件,则它们
- 应该支持高级音频编解码器和带 A2DP 的蓝牙音频编解码器(例如 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 等。
如果设备实现包含对蓝牙低功耗 (BLE) 的支持,则它们
- [C-3-1] 必须声明硬件功能
android.hardware.bluetooth_le
。 - [C-3-2] 必须启用基于 GATT(通用属性配置文件)的蓝牙 API,如 SDK 文档和 android.bluetooth 中所述。
- [C-3-3] 必须报告
BluetoothAdapter.isOffloadedFilteringSupported()
的正确值,以指示是否实现了 ScanFilter API 类的过滤逻辑。 - [C-3-4] 必须报告
BluetoothAdapter.isMultipleAdvertisementSupported()
的正确值,以指示是否支持低功耗广播。 - [C-3-5] 必须实现可解析私有地址 (RPA) 超时,超时时间不超过 15 分钟,并在设备主动使用 BLE 进行扫描或广播时,在超时时轮换地址以保护用户隐私。为防止定时攻击,超时时间间隔也必须在 5 到 15 分钟之间随机化。
- 在实现 ScanFilter API 时,应该支持将过滤逻辑卸载到蓝牙芯片组。
- 应该支持将批量扫描卸载到蓝牙芯片组。
- 应该支持至少 4 个插槽的多重广播。
如果设备实现支持蓝牙 LE 并使用蓝牙 LE 进行位置扫描,则它们
- [C-4-1] 必须提供用户界面,以启用/禁用通过系统 API
BluetoothAdapter.isBleScanAlwaysAvailable()
读取的值。
如果设备实现包含对蓝牙 LE 和助听器配置文件的支持,如 使用蓝牙 LE 的助听器音频支持 中所述,则它们
- [C-5-1] 对于 BluetoothAdapter.getProfileProxy(context, listener, BluetoothProfile.HEARING_AID),必须返回
true
。
如果设备实现包含对蓝牙或蓝牙低功耗的支持,则它们
- [C-6-1] 必须限制对任何蓝牙元数据(例如扫描结果)的访问,这些元数据可能被用于推断设备的位置,除非请求的应用成功通过了基于其当前前台/后台状态的
android.permission.ACCESS_FINE_LOCATION
权限检查。
如果设备实现包含对蓝牙或蓝牙低功耗的支持,并且应用清单不包含来自开发者的声明,声明他们没有从蓝牙获取位置信息,那么,它们
- [C-6-2] 必须将蓝牙访问权限限制在
android.permission.ACCESS_FINE_LOCATION
之后。
如果设备实现为 BluetoothAdapter.isLeAudioSupported()
API 返回 true
,则它们
- [C-7-1] 必须支持单播客户端。
- [C-7-2] 必须支持 2M PHY。
- [C-7-3] 必须支持 LE 扩展广播。
- [C-7-4] 必须在 CIG 中支持至少 2 个 CIS 连接。
- [C-7-5] 必须同时启用 BAP 单播客户端、CSIP 集协调器、MCP 服务器、VCP 控制器、CCP 服务器。
- [C-SR-1] 强烈建议启用 HAP 单播客户端。
如果设备实现为 BluetoothAdapter.isLeAudioBroadcastSourceSupported()
API 返回 true
,则它们
- [C-8-1] 必须在 BIG 中支持至少 2 个 BIS 链接。
- [C-8-2] 必须同时启用 BAP 广播源、BAP 广播助手。
- [C-8-3] 必须支持 LE 周期性广播。
如果设备实现为 BluetoothAdapter.isLeAudioBroadcastAssistantSupported()
API 返回 true
,则它们
- [C-9-1] 必须支持 PAST(周期性广播同步传输)。
- [C-9-2] 必须支持 LE 周期性广播。
如果设备实现声明 FEATURE_BLUETOOTH_LE
,则它们
- [C-10-1] 必须使 RSSI 测量值在视线环境中,距以
ADVERTISE_TX_POWER_HIGH
发射的参考设备 1 米距离处,95% 的测量值在 +/-9dB 范围内。 - [C-10-2] 必须包含 Rx/Tx 校正,以减少每通道偏差,以便在每个天线(如果使用多个天线)的 3 个通道上的测量值,95% 的测量值彼此之间在 +/-3dB 范围内。
- [C-SR-2] 强烈建议测量和补偿 Rx 偏移,以确保当设备方向为“平行平面”且屏幕朝向相同方向时,在距以
ADVERTISE_TX_POWER_HIGH
发射的参考设备 1 米距离处,中值 BLE RSSI 为 -60dBm +/-10 dB。 - [C-SR-3] 强烈建议测量和补偿 Tx 偏移,以确保当从位于 1 米距离处并以
ADVERTISE_TX_POWER_HIGH
发射的参考设备扫描时,中值 BLE RSSI 为 -60dBm +/-10 dB,其中设备方向为“平行平面”且屏幕朝向相同方向。
强烈建议遵循 Presence Calibration 中指定的测量设置步骤。
如果设备实现支持蓝牙 5.0 版本,则它们
- [C-SR-4] 强烈建议提供对以下内容的支持:
- LE 2M PHY
- LE 编解码器 PHY
- LE 广播扩展
- 周期性广播
- 至少 10 个广播集
- 至少 8 个 LE 并发连接。每个连接可以在任一连接拓扑角色中。
- LE 链路层隐私
- “解析列表”大小至少为 8 个条目
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 论坛定义)
[C-SR-1] 强烈建议能够通过以下 NFC 标准读取和写入 NDEF 消息以及原始数据。请注意,虽然 NFC 标准被强烈建议,但未来版本的兼容性定义计划将这些更改为必须。这些标准在本版本中是可选的,但在未来版本中将是必需的。强烈建议运行此 Android 版本的现有和新设备现在就满足这些要求,以便它们能够升级到未来的平台版本。
[C-1-13] 在 NFC 发现模式下,必须轮询所有受支持的技术。
当设备唤醒、屏幕处于活动状态且锁屏已解锁时,应该处于 NFC 发现模式。
应该能够读取 Thinfilm NFC 条形码 产品的条形码和 URL(如果已编码)。
请注意,上面引用的 JIS、ISO 和 NFC 论坛规范的公开链接不可用。
Android 包含对 NFC 主机卡模拟 (HCE) 模式的支持。
如果设备实现包含能够进行 HCE(用于 NfcA 和/或 NfcB)的 NFC 控制器芯片组并支持应用程序 ID (AID) 路由,则它们
- [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. 网络协议和 API
7.4.5.1. 最低网络能力
设备实现
- [C-0-1] 必须包含对一种或多种形式的数据网络的支持。具体而言,设备实现必须包含对至少一种能够达到 200 Kbit/秒或更高速度的数据标准的支持。满足此要求的技术示例包括 EDGE、HSPA、EV-DO、802.11g、以太网和蓝牙 PAN。
- 当物理网络标准(例如以太网)是主要数据连接时,应该还包括对至少一种常见无线数据标准(例如 802.11 (Wi-Fi))的支持。
- 可以实现多种形式的数据连接。
7.4.5.2. IPv6
设备实现
- [C-0-2] 必须包含 IPv6 网络堆栈,并使用托管 API(例如
java.net.Socket
和java.net.URLConnection
)以及本机 API(例如AF_INET6
套接字)支持 IPv6 通信。 - [C-0-3] 必须默认启用 IPv6。
- 必须确保 IPv6 通信与 IPv4 一样可靠,例如
- [C-0-4] 必须在低电耗模式下保持 IPv6 连接。
- [C-0-5] 速率限制不得导致设备在使用 RA 生存期至少为 180 秒的任何符合 IPv6 标准的网络上失去 IPv6 连接。
- 必须确保 IPv6 通信与 IPv4 一样可靠,例如
- [C-0-6] 当连接到 IPv6 网络时,必须为第三方应用程序提供到网络的直接 IPv6 连接,而无需在设备本地进行任何形式的地址或端口转换。托管 API(例如
Socket#getLocalAddress
或Socket#getLocalPort
)和 NDK API(例如getsockname()
或IPV6_PKTINFO
)都必须返回实际用于在网络上发送和接收数据包的 IP 地址和端口,并且互联网(Web)服务器可见此 IP 地址和端口作为源 IP 和端口。
所需的 IPv6 支持级别取决于网络类型,如下列要求所示。
如果设备实现支持 Wi-Fi,则它们
- [C-1-1] 必须支持 Wi-Fi 上的双堆栈和仅 IPv6 操作。
如果设备实现支持以太网,则它们
- [C-2-1] 必须支持以太网上的双堆栈和仅 IPv6 操作。
如果设备实现支持蜂窝数据,则它们
- [C-3-1] 必须支持蜂窝网络上的 IPv6 操作(仅 IPv6 和可能的双堆栈)。
如果设备实现支持多种网络类型(例如,Wi-Fi 和蜂窝数据),则它们
- [C-4-1] 当设备同时连接到多种网络类型时,必须同时满足每种网络的上述要求。
7.4.5.3. 强制门户
强制门户是指需要登录才能获得互联网访问权限的网络。
如果设备实现提供 android.webkit.Webview API
的完整实现,则它们
- [C-1-1] 必须提供强制门户应用程序来处理 intent
ACTION_CAPTIVE_PORTAL_SIGN_IN
,并通过在调用系统 APIConnectivityManager#startCaptivePortalApp(Network, Bundle)
时发送该 intent,来显示强制门户登录页面。 - [C-1-2] 当设备连接到任何网络类型(包括蜂窝/移动网络、WiFi、以太网或蓝牙)时,必须执行强制门户检测并支持通过强制门户应用程序登录。
- [C-1-3] 当设备配置为使用私有 DNS 严格模式时,必须支持使用明文 DNS 登录到强制门户。
- [C-1-4] 对于所有未显式与强制门户通信的网络流量,必须按照 SDK 文档
android.net.LinkProperties.getPrivateDnsServerName
和android.net.LinkProperties.isPrivateDnsActive
的规定使用加密 DNS。 - [C-1-5] 必须确保在用户登录到强制门户时,应用程序使用的默认网络(由
ConnectivityManager.getActiveNetwork
、ConnectivityManager.registerDefaultNetworkCallback
返回,并由 Java 网络 API(例如 java.net.Socket)和本机 API(例如 connect())默认使用)是任何其他可用的提供互联网访问的网络(如果可用)。
7.4.6. 同步设置
设备实现
- [C-0-1] 必须默认启用主自动同步设置,以便方法
getMasterSyncAutomatically()
返回 “true”。
7.4.7. 流量节省程序
如果设备实现包含按流量计费的连接,则它们
- [C-SR-1] 强烈建议提供流量节省程序模式。
如果设备实现提供省流量模式,则它们
- [C-1-1] 必须支持 SDK 文档 中描述的
ConnectivityManager
类中的所有 API。
如果设备实现不提供省流量模式,则它们
- [C-2-1] 对于
ConnectivityManager.getRestrictBackgroundStatus()
,必须返回值RESTRICT_BACKGROUND_STATUS_DISABLED
。 - [C-2-2] 不得广播
ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED
。
7.4.8. 安全元件
如果设备实现支持 开放移动 API 兼容的安全元件,并向第三方应用开放,则它们
[C-1-1] 必须通过
android.se.omapi.SEService.getReaders()
API 枚举可用的安全元件读取器。[C-1-2] 必须通过
android.hardware.se.omapi.uicc
为具有基于 UICC 的安全元件的设备、android.hardware.se.omapi.ese
为具有基于 eSE 的安全元件的设备以及android.hardware.se.omapi.sd
为具有基于 SD 的安全元件的设备声明正确的功能标志。
7.4.9. UWB
如果设备实现包含对 802.1.15.4 的支持并将该功能公开给第三方应用程序,则它们
- [C-1-1] 必须在 android.uwb 中实现相应的 Android API。
- [C-1-2] 必须报告硬件功能标志 android.hardware.uwb。
- [C-1-3] 必须支持 Android 实现中定义的所有相关 UWB 配置文件。
- [C-1-4] 必须提供用户界面以允许用户切换 UWB 无线电的开/关状态。
- [C-1-5] 必须强制执行使用 UWB 无线电的应用持有 UWB_RANGING 权限(在 NEARBY_DEVICES 权限组下)。
[C-SR-1] 强烈建议通过标准组织(包括 FIRA、CCC 和 CSA)定义的相关一致性和认证测试。
- [C-1-6] 必须确保在视线环境中,非反射腔室中 1 米距离处,95% 的距离测量值在 +/-15 厘米范围内。
- [C-1-7] 必须确保距参考设备 1 米处距离测量的中值在 [0.75 米, 1.25 米] 范围内,其中地面真实距离是从面朝上并倾斜 45 度的 DUT 的顶边测量的。
- [C-SR-2] 强烈建议遵循 存在校准 中指定的测量设置步骤。
7.5. 摄像头
如果设备实现包含至少一个摄像头,则它们
- [C-1-1] 必须声明
android.hardware.camera.any
功能标志。 - [C-1-2] 当摄像头打开以进行基本预览和静态图像捕获时,必须允许应用程序同时分配 3 个 RGBA_8888 位图,其大小等于设备上最大分辨率摄像头传感器生成的图像大小。
- [C-1-3] 必须确保预装的默认摄像头应用程序处理 intent
MediaStore.ACTION_IMAGE_CAPTURE
、MediaStore.ACTION_IMAGE_CAPTURE_SECURE
或MediaStore.ACTION_VIDEO_CAPTURE
,负责在接收应用程序没有ACCESS_FINE_LOCATION
时,在将图像元数据发送到接收应用程序之前删除用户位置信息。
如果设备实现支持 HDR 10 位输出能力,则它们
- [C-2-1] 对于每个支持 10 位输出的摄像头设备,必须至少支持 HLG HDR 配置文件。
- [C-2-2] 必须为主要后置摄像头或主要前置摄像头支持 10 位输出。
- [C-SR-1] 强烈建议为两个主摄像头都支持 10 位输出。
- [C-2-3] 对于支持 10 位 HDR 的逻辑摄像头设备,必须为逻辑摄像头本身及其所有向后兼容的物理子摄像头支持相同的 HDR 配置文件。
对于支持 10 位 HDR 并实现 android.hardware.camera2.CaptureRequest#CONTROL_ZOOM_RATIO
API 的逻辑摄像头设备,它们
- [C-3-1] 必须支持通过逻辑摄像头上的
CONTROL_ZOOM_RATIO
控件在所有向后兼容的物理摄像头之间切换。
7.5.1. 后置摄像头
后置摄像头是位于设备显示屏背面一侧的摄像头;也就是说,它像传统摄像头一样对设备远侧的场景进行成像。
设备实现
- 应该包括后置摄像头。
如果设备实现包含至少一个后置摄像头,则它们
- [C-1-1] 必须报告功能标志
android.hardware.camera
和android.hardware.camera.any
。 - [C-1-2] 必须具有至少 200 万像素的分辨率。
- 应该在摄像头驱动程序中实现硬件自动对焦或软件自动对焦(对应用软件透明)。
- 可以具有固定焦距或 EDOF(扩展景深)硬件。
- 可以包括闪光灯。
如果摄像头包括闪光灯
- [C-2-1] 在
android.hardware.Camera.PreviewCallback
实例已在摄像头预览表面上注册时,闪光灯不得点亮,除非应用程序已通过启用Camera.Parameters
对象的FLASH_MODE_AUTO
或FLASH_MODE_ON
属性显式启用闪光灯。请注意,此约束不适用于设备的内置系统摄像头应用程序,而仅适用于使用Camera.PreviewCallback
的第三方应用程序。
7.5.2. 前置摄像头
前置摄像头是位于设备显示屏同一侧的摄像头;也就是说,通常用于对用户成像的摄像头,例如用于视频会议和类似应用。
设备实现
- 可以包括前置摄像头。
如果设备实现包含至少一个前置摄像头,则它们
- [C-1-1] 必须报告功能标志
android.hardware.camera.any
和android.hardware.camera.front
。 - [C-1-2] 必须具有至少 VGA (640x480 像素) 的分辨率。
- [C-1-3] 不得使用前置摄像头作为摄像头 API 的默认摄像头,并且不得配置 API 将前置摄像头视为默认后置摄像头,即使它是设备上唯一的摄像头。
- [C-1-4] 当当前应用程序已通过调用
android.hardware.Camera.setDisplayOrientation()
方法显式请求旋转摄像头显示时,摄像头预览必须相对于应用程序指定的方向水平镜像。相反,当当前应用程序未通过调用android.hardware.Camera.setDisplayOrientation()
方法显式请求旋转摄像头显示时,预览必须沿设备的默认水平轴镜像。 - [C-1-5] 不得镜像返回给应用程序回调或提交到媒体存储的最终捕获的静态图像或视频流。
- [C-1-6] 必须以与摄像头预览图像流相同的方式镜像后视图显示的图像。
- 可以包括 第 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 设备实现必须确保继续支持本节和 Android SDK 中描述的 API。
在已弃用的 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] 对于
android.hardware.Camera
的前置和后置摄像头的摄像头预览,必须支持 YV12 格式(由android.graphics.ImageFormat.YV12
常量表示)。(硬件视频编码器和摄像头可以使用任何本机像素格式,但设备实现必须支持转换为 YV12。) - [C-0-4] 对于声明
REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
功能在android.request.availableCapabilities
中的android.hardware.camera2
设备,必须支持android.hardware.ImageFormat.YUV_420_888
和android.hardware.ImageFormat.JPEG
格式作为通过android.media.ImageReader
API 的输出。 - [C-0-5] 无论设备是否包含硬件自动对焦或其他功能,都必须仍然实现 Android SDK 文档中包含的完整 Camera API。例如,缺少自动对焦功能的摄像头仍然必须调用任何已注册的
android.hardware.Camera.AutoFocusCallback
实例(即使这与非自动对焦摄像头无关)。请注意,这确实适用于前置摄像头;例如,即使大多数前置摄像头不支持自动对焦,API 回调也仍然必须按照描述进行“伪造”。 - [C-0-6] 必须识别并遵守在
android.hardware.Camera.Parameters
类和android.hardware.camera2.CaptureRequest
类中定义为常量的每个参数名称。相反,设备实现不得遵守或识别传递给android.hardware.Camera.setParameters()
方法的字符串常量,但android.hardware.Camera.Parameters
上记录为常量的字符串常量除外。也就是说,如果硬件允许,设备实现必须支持所有标准摄像头参数,并且不得支持自定义摄像头参数类型。例如,支持使用高动态范围 (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-0-11] 必须确保通过已弃用的
android.hardware.Camera
API 访问的所有相机,也可以通过android.hardware.camera2
API 访问。 - [C-0-12] 必须确保面部外观不被更改,包括但不限于更改面部几何形状、面部肤色或面部皮肤平滑处理,对于任何
android.hardware.camera2
或android.hardware.Camera
API 都是如此。 - [C-SR-1] 对于在同一方向配备多个 RGB 相机的设备,强烈建议支持逻辑相机设备,该设备列出功能
CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
,由朝向该方向的所有 RGB 相机组成,作为物理子设备。
如果设备实现提供专有的相机 API 给第三方应用,则
- [C-1-1] 必须使用
android.hardware.camera2
API 实现此类相机 API。 - 可以为
android.hardware.camera2
API 提供供应商标记和/或扩展程序。
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] 必须默认对所有以 API 级别 29 或以上为目标的应用启用 分区存储,以下情况除外
- 当应用在其清单文件中请求
android:requestLegacyExternalStorage="true"
时。
- 当应用在其清单文件中请求
- [C-0-5] 当通过
MediaStore
访问媒体文件时,必须编辑存储在媒体文件中的位置元数据(例如 GPS Exif 标记),除非调用应用持有ACCESS_MEDIA_LOCATION
权限。
设备实现可以使用以下任一方法满足上述要求
- 用户可访问的可移动存储空间,例如安全数字 (SD) 卡插槽。
- 作为在 Android 开源项目 (AOSP) 中实现的内部(不可移动)存储空间的一部分。
如果设备实现使用可移动存储空间来满足上述要求,则
- [C-1-1] 必须实现一个 toast 或弹出式用户界面,在插槽中未插入存储介质时警告用户。
- [C-1-2] 必须包含 FAT 格式的存储介质(例如 SD 卡),或在包装盒和购买时可用的其他材料上显示存储介质必须单独购买。
如果设备实现使用不可移动存储空间的一部分来满足上述要求,则
- 应使用内部应用共享存储空间的 AOSP 实现。
- 可以与应用私有数据共享存储空间。
如果设备实现具有支持 USB 外围设备模式的 USB 端口,则
- [C-3-1] 必须提供一种机制,以便从主机计算机访问应用共享存储空间上的数据。
- 应通过 Android 的媒体扫描器服务和
android.provider.MediaStore
透明地公开来自两个存储路径的内容。 - 可以使用 USB 大容量存储,但应使用媒体传输协议来满足此要求。
如果设备实现具有支持 USB 外围设备模式和媒体传输协议的 USB 端口,则
- 应与参考 Android MTP 主机 Android File Transfer 兼容。
- 应报告 0x00 的 USB 设备类。
- 应报告“MTP”的 USB 接口名称。
7.6.3. 可采纳的存储空间
如果设备预计具有移动性质(与电视不同),则设备实现
- [C-SR-1] 强烈建议在长期稳定的位置实现可采纳的存储空间,因为意外断开连接可能会导致数据丢失/损坏。
如果可移动存储设备端口位于长期稳定的位置,例如在电池仓或其他保护罩内,则设备实现
- [C-SR-2] 强烈建议实现 可采纳的存储空间。
7.7. USB
如果设备实现具有 USB 端口,则
- 应支持 USB 外围设备模式,并应支持 USB 主机模式。
- 应支持禁用通过 USB 的数据信号传输。
7.7.1. USB 外围设备模式
如果设备实现包含支持外围设备模式的 USB 端口
- [C-1-1] 该端口必须可连接到具有标准 A 型或 C 型 USB 端口的 USB 主机。
- [C-1-2] 必须通过
android.os.Build.SERIAL
报告 USB 标准设备描述符中iSerialNumber
的正确值。 - [C-1-3] 如果支持 C 型 USB,则必须根据 C 型电阻器标准检测 1.5A 和 3.0A 充电器,并且必须检测广告中的变化。
- [C-SR-1] 该端口应使用 micro-B、micro-AB 或 C 型 USB 外形尺寸。强烈建议现有和新的 Android 设备满足这些要求,以便它们能够升级到未来的平台版本。
- [C-SR-2] 该端口应位于设备底部(根据自然方向)或为所有应用(包括主屏幕)启用软件屏幕旋转,以便在设备以端口位于底部的方向定向时,显示屏可以正确绘制。强烈建议现有和新的 Android 设备满足这些要求,以便它们能够升级到未来的平台版本。
- [C-SR-3] 应实现支持,以便在 HS 啁啾声和流量期间汲取 1.5 A 电流,如 USB 电池充电规范修订版 1.2 中所述。强烈建议现有和新的 Android 设备满足这些要求,以便它们能够升级到未来的平台版本。
- [C-SR-4] 强烈建议不要支持超出默认水平修改 Vbus 电压的专有充电方法,或改变接收器/源角色,因为这可能会导致与支持标准 USB 电源输送方法的充电器或设备的互操作性问题。虽然这被称为“强烈建议”,但在未来的 Android 版本中,我们可能会要求所有 C 型设备都支持与标准 C 型充电器的完全互操作性。
- [C-SR-5] 强烈建议在支持 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 外围设备,换句话说,它们必须满足以下条件之一
- 具有设备上的 C 型端口,或随附将设备上的专有端口适配为标准 C 型 USB 端口的线缆(USB C 型设备)。
- 具有设备上的 A 型端口,或随附将设备上的专有端口适配为标准 A 型 USB 端口的线缆。
- 具有设备上的 micro-AB 端口,应随附将端口适配为标准 A 型端口的线缆。
- [C-1-3] 不得随附将 A 型或 micro-AB USB 端口转换为 C 型端口(插座)的适配器。
- [C-SR-1] 强烈建议实现 USB 音频类,如 Android SDK 文档中所述。
- 应支持在主机模式下为连接的 USB 外围设备充电;为 USB C 型连接器宣传至少 1.5A 的源电流,如 USB C 型线缆和连接器规范修订版 1.2 的终止参数部分中所述,或使用充电下行端口 (CDP) 输出电流范围,如 USB 电池充电规范修订版 1.2 中针对 Micro-AB 连接器所述。
- 应实现并支持 USB C 型标准。
如果设备实现包含支持主机模式和 USB 音频类的 USB 端口,则
- [C-2-1] 必须支持 USB HID 类。
- [C-2-2] 必须支持检测和映射以下 HID 数据字段,这些字段在 USB 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 C 型的 USB 端口,则
- [C-4-1] 必须实现 USB C 型规范(第 4.5.1.3.3 节)定义的双重角色端口功能。对于双重角色端口,在包含 3.5 毫米音频插孔的设备上,USB 接收器检测(主机模式)可以默认关闭,但用户必须能够启用它。
- [C-SR-2] 强烈建议支持 DisplayPort,应支持 USB 超速数据速率,并且强烈建议支持电源输送以进行数据和电源角色交换。
- [C-SR-3] 强烈建议不要支持 USB 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 节中的音频延迟要求。
- [C-SR-1] 强烈建议支持近超声录制,如 第 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 节中的音频延迟要求。
- [C-SR-1] 强烈建议支持近超声播放,如 第 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-1] 强烈建议至少包含一个音频端口作为 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-2] 强烈建议支持具有 OMTP 引脚排列顺序的音频插头。
- [C-SR-3] 强烈建议支持从带有麦克风的立体声耳机录制音频。
如果设备实现具有 4 导体 3.5 毫米音频插孔并支持麦克风,并广播 android.intent.action.HEADSET_PLUG
,且额外值麦克风设置为 1,则
- [C-2-1] 必须支持检测插入的音频配件上的麦克风。
7.8.2.2. 数字音频端口
有关设备特定要求,请参阅 2.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.8.4. 信号完整性
设备实现
- 应为手持设备上的输入和输出流提供无故障音频信号路径,根据每个路径一分钟测试期间测得的零故障定义。使用 OboeTester “Automated Glitch Test” 进行测试。
该测试需要一个 音频环回适配器,直接在 3.5 毫米插孔中使用,和/或与 USB-C 转 3.5 毫米适配器结合使用。应测试所有音频输出端口。
OboeTester 当前支持 AAudio 路径,因此应使用 AAudio 测试以下组合是否存在故障
Perf 模式 | 共享 | 输出采样率 | 输入声道 | 输出声道 |
---|---|---|---|---|
LOW_LATENCY | EXCLUSIVE | UNSPECIFIED | 1 | 2 |
LOW_LATENCY | EXCLUSIVE | UNSPECIFIED | 2 | 1 |
LOW_LATENCY | SHARED | UNSPECIFIED | 1 | 2 |
LOW_LATENCY | SHARED | UNSPECIFIED | 2 | 1 |
NONE | SHARED | 48000 | 1 | 2 |
NONE | SHARED | 48000 | 2 | 1 |
NONE | SHARED | 44100 | 1 | 2 |
NONE | SHARED | 44100 | 2 | 1 |
NONE | SHARED | 16000 | 1 | 2 |
NONE | SHARED | 16000 | 2 | 1 |
可靠的流应满足以下 2000 Hz 正弦波的信噪比 (SNR) 和总谐波失真 (THD) 标准。
传感器 | THD | SNR |
---|---|---|
主内置扬声器,使用外部参考麦克风测量 | < 3.0% | >= 50 dB |
主内置麦克风,使用外部参考扬声器测量 | < 3.0% | >= 50 dB |
内置模拟 3.5 毫米插孔,使用环回适配器测试 | < 1% | >= 60 dB |
手机随附的 USB 适配器,使用环回适配器测试 | < 1.0% | >= 60 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_EXT_protected_textures
,并在可用的 GL 扩展程序列表中公开这些扩展程序。 - [C-SR-1] 强烈建议实现
GL_EXT_external_buffer
、GL_EXT_EGL_image_array
、GL_OVR_multiview_multisampled_render_to_texture
,并在可用的 GL 扩展程序列表中公开这些扩展程序。 - [C-SR-2] 强烈建议支持 Vulkan 1.1。
- [C-SR-3] 强烈建议实现
VK_ANDROID_external_memory_android_hardware_buffer
、VK_GOOGLE_display_timing
、VK_KHR_shared_presentable_image
,并在可用的 Vulkan 扩展程序列表中公开这些扩展程序。 - [C-SR-4] 强烈建议公开至少一个 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
具有用法标志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-5] 强烈建议支持分配具有多个图层以及 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-6] 强烈建议显示分辨率至少为 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-7] 强烈建议支持上述所有直接通道类型的
TYPE_HARDWARE_BUFFER
直接通道类型。 - [C-1-21] 必须满足
android.hardware.hifi_sensors
的陀螺仪、加速度计和磁力计相关要求,如 第 7.3.9 节中所述。 - [C-SR-8] 强烈建议支持
android.hardware.sensor.hifi_sensors
功能。 - [C-1-22] 端到端运动到光子延迟必须不高于 28 毫秒。
- [C-SR-9] 强烈建议端到端运动到光子延迟不高于 20 毫秒。
- [C-1-23] 首帧比必须至少为 85%,首帧比是像素在从黑到白的过渡后的第一帧上的亮度与稳态白色像素亮度之间的比率。
- [C-SR-10] 强烈建议首帧比至少为 90%。
- 可以为前台应用提供独占核心,并且可以支持
Process.getExclusiveCores
API 以返回专用于顶部前台应用的 cpu 核心编号。
如果支持独占核心,则核心
- [C-2-1] 必须不允许任何其他用户空间进程在其上运行(应用使用的设备驱动程序除外),但可以允许运行一些必要的内核进程。
7.10. 触感
有关设备特定要求,请参阅 2.2.1 节。
7.11. 媒体性能等级
设备实现的媒体性能等级可以从 android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
API 获取。媒体性能等级的要求针对从 R 版本(版本 30)开始的每个 Android 版本定义。特殊值 0 表示设备不属于媒体性能等级。
如果设备实现为 android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
返回非零值,则
[C-1-1] 必须至少返回
android.os.Build.VERSION_CODES.R
的值。[C-1-2] 必须是手持设备实现。
[C-1-3] 必须满足 第 2.2.7 节中描述的“媒体性能等级”的所有要求。
换句话说,Android T 中的媒体性能等级仅针对版本 T、S 或 R 的手持设备定义。
有关设备特定要求,请参阅 第 2.2.7 节。
8. 性能和功耗
一些最低性能和功耗标准对于用户体验至关重要,并且会影响开发者在开发应用时的基本假设。
8.1. 用户体验一致性
如果存在某些最低要求以确保应用和游戏的一致帧速率和响应时间,则可以为最终用户提供流畅的用户界面。设备实现可以根据设备类型,对用户界面延迟和任务切换具有可衡量的要求,如 第 2 节中所述。
8.2. 文件 I/O 访问性能
为应用私有数据存储空间(/data
分区)上的一致文件访问性能提供通用基准,使应用开发者能够设定适当的期望,这将有助于他们的软件设计。设备实现可以根据设备类型,对以下读取和写入操作具有 第 2 节中描述的某些要求
- 顺序写入性能。通过使用 10MB 写入缓冲区写入 256MB 文件来测量。
- 随机写入性能。通过使用 4KB 写入缓冲区写入 256MB 文件来测量。
- 顺序读取性能。通过使用 10MB 写入缓冲区读取 256MB 文件来测量。
- 随机读取性能。通过使用 4KB 写入缓冲区读取 256MB 文件来测量。
8.3. 节电模式
如果设备实现包含旨在改进设备电源管理的功能,这些功能包含在 AOSP 中(例如,应用待机分组、Doze)或扩展功能以应用比 RESTRICTED 应用待机分组 更强的限制,则
- [C-1-1] 对于应用待机和 Doze 节电模式的触发、维护、唤醒算法以及全局系统设置或 DeviceConfig 的使用,不得偏离 AOSP 实现。
- [C-1-2] 对于使用全局设置或 DeviceConfig 来管理应用待机中每个分组的应用的作业、闹钟和网络节流,不得偏离 AOSP 实现。
- [C-1-3] 对于用于应用待机的 应用待机分组 的数量,不得偏离 AOSP 实现。
- [C-1-4] 必须实现 应用待机分组 和 Doze,如 电源管理 中所述。
- [C-1-5] 在设备处于省电模式时,**必须**为
PowerManager.isPowerSaveMode()
返回true
。 - [C-1-6] **必须**提供用户界面,以显示所有被排除在应用待机和 Doze 省电模式或任何电池优化之外的应用,并且**必须**实现 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS intent,以请求用户允许应用忽略电池优化。
- [C-SR-1] **强烈建议**提供用户界面,以启用和禁用省电功能。
- [C-SR-2] **强烈建议**提供用户界面,以显示所有被排除在应用待机和 Doze 省电模式之外的应用。
如果设备实现扩展了 AOSP 中包含的电源管理功能,并且该扩展应用了比 Rare App Standby Bucket 更严格的限制,请参考 3.5.1 节。
除了省电模式外,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 Cloud Messaging 传递给第三方应用时,除非用户已将设备置于非活动状态,否则设备**必须**退出 S3 状态。这些并非全面的示例,AOSP 实现了广泛的唤醒信号,这些信号会触发从此状态唤醒。
8.4. 功耗核算
更准确的功耗核算和报告为应用开发者提供了优化应用功耗模式的激励和工具。
设备实现
- [C-SR-1] **强烈建议**提供每个组件的功耗配置文件,该文件定义每个硬件组件的 当前功耗值 以及组件随时间推移造成的大致电池耗电量,如 Android 开源项目站点中所述。
- [C-SR-2] **强烈建议**以毫安时 (mAh) 为单位报告所有功耗值。
- [C-SR-3] **强烈建议**报告每个进程 UID 的 CPU 功耗。Android 开源项目通过
uid_cputime
内核模块实现满足此要求。 - [C-SR-4] **强烈建议**通过
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] **必须**支持安装自签名应用程序,而无需从任何第三方/机构获得任何额外的权限/证书。
如果设备实现声明了 android.hardware.security.model.compatible
功能,则它们
- [C-1-1] **必须**支持以下小节中列出的要求。
9.1. 权限
设备实现
[C-0-1] **必须**支持 Android 开发者文档中定义的 Android 权限模型 和 Android 角色模型。具体而言,它们**必须**强制执行 SDK 文档中描述的每个权限和角色;不得省略、更改或忽略任何权限和角色。
**可以**添加额外的权限,前提是新的权限 ID 字符串不在
android.*
命名空间中。[C-0-2]
protectionLevel
为PROTECTION_FLAG_PRIVILEGED
的权限**必须**仅授予预安装在系统映像的特权路径(以及 APEX 文件)中的应用,并且必须在每个应用的显式允许列表权限的子集中。AOSP 实现通过从etc/permissions/
路径中的文件中读取和遵守每个应用的允许列表权限,并将system/priv-app
路径用作特权路径来满足此要求。
保护级别为危险的权限是运行时权限。targetSdkVersion
> 22 的应用程序在运行时请求它们。
设备实现
- [C-0-3] **必须**显示一个专用界面,供用户决定是否授予请求的运行时权限,并提供一个界面供用户管理运行时权限。
- [C-0-4] **必须**对两个用户界面都只有一个实现。如果设备实现支持配套设备,则配套设备**可以**提供额外的界面。
[C-0-5] **不得**向应用授予任何运行时权限,除非
[C-0-6] **必须**仅向注册了正确安全恢复代理的系统应用授予
android.permission.RECOVER_KEYSTORE
权限。正确安全恢复代理被定义为与设备外远程存储同步的设备上软件代理,该代理配备了安全硬件,其保护级别等同于或高于 Google Cloud Key Vault Service 中描述的级别,以防止对锁屏知识因素进行暴力破解攻击。
设备实现
[C-0-7] 当应用通过标准 Android API 或专有机制请求位置或身体活动数据时,**必须**遵守 Android 位置权限 属性。此类数据包括但不限于
- 设备的位置(例如,纬度和经度),如 9.8.8 节 中所述。
- 可用于确定或估计设备位置的信息(例如,SSID、BSSID、Cell ID 或设备连接到的网络的位置)。
- 用户的身体活动或身体活动的分类。
更具体地说,设备实现
- [C-0-8] **必须**获得用户同意,以允许应用访问位置或身体活动数据。
- [C-0-9] **必须**仅向持有 SDK 中描述的足够权限的应用授予运行时权限。例如,TelephonyManager#getServiceState 需要
android.permission.ACCESS_FINE_LOCATION
)。
上述 Android 位置权限属性的唯一例外是对于不访问位置来推导或识别用户位置的应用;具体而言
- 当应用持有
RADIO_SCAN_WITHOUT_LOCATION
权限时。 - 对于设备配置和设置目的,系统应用持有
NETWORK_SETTINGS
或NETWORK_SETUP_WIZARD
权限时。
权限可以标记为受限,从而改变其行为。
[C-0-10] 标记为
hardRestricted
标志的权限**不得**授予应用,除非- 应用 APK 文件位于系统分区中。
- 用户为应用分配了与
hardRestricted
权限关联的角色。 - 安装程序将
hardRestricted
授予应用。 - 应用在较早的 Android 版本上被授予
hardRestricted
。
[C-0-11] 持有
softRestricted
权限的应用**必须**仅获得有限访问权限,并且在按照 SDK 中的描述列入允许列表之前,**不得**获得完全访问权限,其中为每个softRestricted
权限定义了完全和有限访问权限(例如,READ_EXTERNAL_STORAGE
)。[C-0-12] **不得**提供任何自定义功能或 API 来绕过 setPermissionPolicy 和 setPermissionGrantState API 中定义的权限限制。
[C-0-13] **必须**使用 AppOpsManager API 来记录和跟踪来自 Android 活动和服务对受危险权限保护的数据的每一次程序化访问。
[C-0-14] **必须**仅将角色分配给功能满足角色要求的应用程序。
[C-0-15] **不得**定义与平台定义的角色重复或超集功能的角色。
如果设备报告 android.software.managed_users
,则它们
- [C-1-1] **不得**让管理员静默授予以下权限
- 位置(ACCESS_BACKGROUND_LOCATION、ACCESS_COARSE_LOCATION、ACCESS_FINE_LOCATION)。
- 摄像头 (CAMERA)
- 麦克风 (RECORD_AUDIO)
- 身体传感器 (BODY_SENSORS)
- 身体活动 (ACTIVITY_RECOGNITION)
如果设备实现提供用户界面来选择哪些应用可以使用处理 ACTION_MANAGE_OVERLAY_PERMISSION
intent 的活动在其他应用之上绘制,则它们
- [C-2-1] **必须**确保所有具有
ACTION_MANAGE_OVERLAY_PERMISSION
intent 的 intent 过滤器的活动都具有相同的 UI 界面,无论启动应用或其提供的任何信息如何。
如果设备实现报告 android.software.device_admin
,则它们
- [C-3-1] 在完全托管设备设置(设备所有者设置)期间,**必须**显示免责声明,声明 IT 管理员将有权允许应用控制手机上的设置,包括麦克风、摄像头和位置,并提供用户继续设置或退出设置的选项,**除非**管理员已选择不控制设备上的权限。
如果设备实现预安装了任何持有 System UI Intelligence、System Ambient Audio Intelligence、System Audio Intelligence、System Notification Intelligence、System Text Intelligence 或 System Visual Intelligence 角色的软件包,则这些软件包
- [C-4-1] **必须**满足“9.8.6 内容捕获”节中为设备实现概述的所有要求。
- [C-4-2] **不得**具有 android.permission.INTERNET 权限。这比 9.8.6 节中列出的**强烈建议**更严格。
- [C-4-3] **不得**绑定到其他应用,以下系统应用除外:蓝牙、联系人、媒体、电话、SystemUI 和提供 Internet API 的组件。这比 9.8.6 节中列出的**强烈建议**更严格。
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 应用程序,并遵守标准 Android 安全模型,如 第 9 节 中的其他位置所述。
[C-0-2] **不得**向备选运行时授予对受权限保护的资源的访问权限,而这些权限未通过
<uses-permission>
机制在运行时的AndroidManifest.xml
文件中请求。[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] 当应用程序需要使用设备资源时,如果该资源存在相应的 Android 权限(例如摄像头、GPS 等),则备选运行时**必须**告知用户应用程序将能够访问该资源。
[C-0-10] 当运行时环境不以这种方式记录应用程序功能时,运行时环境在安装使用该运行时的任何应用程序时,**必须**列出运行时本身持有的所有权限。
备选运行时**应该**通过
PackageManager
将应用安装到单独的 Android 沙箱(Linux 用户 ID 等)中。备选运行时**可以**提供一个由使用备选运行时的所有应用程序共享的单个 Android 沙箱。
9.5. 多用户支持
Android 包含 对多用户的支持,并提供对完全用户隔离和具有部分隔离的克隆用户配置文件(即,类型为 android.os.usertype.profile.CLONE
的单个额外用户配置文件)的支持。
- 如果设备实现使用 可移动介质 作为主外部存储,则设备实现**可以**启用多用户,但**不应该**启用。
如果设备实现包含对多用户的支持,则它们
- [C-1-2] **必须**为每个用户实现与 Android 平台安全模型一致的安全模型,如 安全和权限参考文档 的 API 中所定义。
- [C-1-3] **必须**为每个用户实例提供单独且隔离的共享应用程序存储(又名
/sdcard
)目录。 - [C-1-4] **必须**确保给定用户拥有和代表其运行的应用程序无法列出、读取或写入任何其他用户拥有的文件,即使两个用户的数据都存储在同一卷或文件系统上。
- [C-1-5] 如果设备实现使用可移动介质用于外部存储 API,则当启用多用户时,**必须**加密 SD 卡的内容,并使用仅存储在系统可访问的不可移动介质上的密钥。由于这将使主机 PC 无法读取介质,因此设备实现将需要切换到 MTP 或类似系统,以便为主机 PC 提供对当前用户数据的访问。
如果设备实现包含对多用户的支持,则对于除专门为运行同一应用的双实例而创建的用户之外的所有用户,它们
- [C-2-1] **必须**为每个用户实例提供单独且隔离的共享应用程序存储(又名 /sdcard)目录。
- [C-2-2] **必须**确保给定用户拥有和代表其运行的应用程序无法列出、读取或写入任何其他用户拥有的文件,即使两个用户的数据都存储在同一卷或文件系统上。
设备实现**可以**针对主用户(且仅针对主用户)创建一个类型为 android.os.usertype.profile.CLONE
的单个额外用户配置文件,用于运行同一应用的双实例。这些双实例共享部分隔离的存储,同时在启动器中呈现给最终用户,并出现在同一最近视图中。例如,这可以用于支持用户在双 SIM 卡设备上安装单个应用的两个单独实例。
如果设备实现创建了上述额外的用户配置文件,则它们
- [C-3-1] **必须**仅提供对父用户配置文件已可访问或由此额外用户配置文件直接拥有的存储或数据的访问权限。
- [C-3-2] **不得**将其作为工作配置文件。
- [C-3-3] **必须**具有与父用户帐户隔离的私有应用数据目录。
- [C-3-4] 如果已配置设备所有者(请参阅 3.9.1 节),**不得**允许创建额外的用户配置文件,或者在不首先删除额外的用户配置文件的情况下允许配置设备所有者。
9.6. 高级短信警告
Android 包含对警告用户任何外发 高级短信 的支持。高级短信是发送给运营商注册的服务的短信,可能会向用户收取费用。
如果设备实现声明支持 android.hardware.telephony
,则它们
- [C-1-1] 在向设备中
/data/misc/sms/codes.xml
文件中定义的正则表达式标识的号码发送短信之前,**必须**警告用户。上游 Android 开源项目提供了一种满足此要求的实现。
9.7. 安全功能
设备实现**必须**确保符合内核和平台中的安全功能,如下所述。
Android 沙箱包括使用 Security-Enhanced Linux (SELinux) 强制访问控制 (MAC) 系统、seccomp 沙箱和 Linux 内核中的其他安全功能的功能。设备实现
- [C-0-1] 即使在 Android 框架下实现了 SELinux 或任何其他安全功能,**必须**保持与现有应用程序的兼容性。
- [C-0-2] 当检测到安全违规并被 Android 框架下实现的安全功能成功阻止时,**不得**具有可见的用户界面,但是当发生未阻止的安全违规并导致成功利用时,**可以**具有可见的用户界面。
- [C-0-3] **不得**使用户或应用开发者可以配置在 Android 框架下实现的 SELinux 或任何其他安全功能。
- [C-0-4] **不得**允许可以通过 API(例如设备管理 API)影响另一个应用程序的应用程序配置破坏兼容性的策略。
- [C-0-5] **必须**将媒体框架拆分为多个进程,以便可以更精细地为每个进程授予访问权限,如 Android 开源项目站点中 所述。
- [C-0-6] **必须**实现内核应用程序沙箱机制,该机制允许使用来自多线程程序的可配置策略过滤系统调用。上游 Android 开源项目通过启用带有线程组同步 (TSYNC) 的 seccomp-BPF 来满足此要求,如 source.android.com 的内核配置部分 中所述。
内核完整性和自我保护功能是 Android 安全不可或缺的一部分。设备实现
- [C-0-7] **必须**实现内核堆栈缓冲区溢出保护机制。此类机制的示例包括
CC_STACKPROTECTOR_REGULAR
和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] 如果硬件容易受到 CVE-2017-5754 攻击,则在最初搭载 API 级别 28 或更高版本的所有设备上,**必须**实现内核页表隔离(例如,
CONFIG_PAGE_TABLE_ISOLATION
或CONFIG_UNMAP_KERNEL_AT_EL0
)。 - [C-0-13] 如果硬件容易受到 CVE-2017-5715 攻击,则在最初搭载 API 级别 28 或更高版本的所有设备上,**必须**实现分支预测强化(例如,
CONFIG_HARDEN_BRANCH_PREDICTOR
)。 - [C-SR-1] **强烈建议**在初始化后将仅在初始化期间写入的内核数据标记为只读(例如,
__ro_after_init
)。 [C-SR-2] **强烈建议**随机化内核代码和内存的布局,并避免会损害随机化的暴露(例如,使用通过
/chosen/kaslr-seed 设备树节点
或EFI_RNG_PROTOCOL
的引导加载程序熵的CONFIG_RANDOMIZE_BASE
)。[C-SR-3] **强烈建议**在内核中启用控制流完整性 (CFI),以提供针对代码重用攻击的额外保护(例如,
CONFIG_CFI_CLANG
和CONFIG_SHADOW_CALL_STACK
)。[C-SR-4] **强烈建议**不要在已启用控制流完整性 (CFI)、影子调用堆栈 (SCS) 或整数溢出清理 (IntSan) 的组件上禁用它们。
[C-SR-5] **强烈建议**为任何其他安全敏感的用户空间组件启用 CFI、SCS 和 IntSan,如 CFI 和 IntSan 中所述。
[C-SR-6] **强烈建议**在内核中启用堆栈初始化,以防止使用未初始化的局部变量(
CONFIG_INIT_STACK_ALL
或CONFIG_INIT_STACK_ALL_ZERO
)。此外,设备实现**不应该**假定编译器用于初始化局部变量的值。[C-SR-7] **强烈建议**在内核中启用堆初始化,以防止使用未初始化的堆分配(
CONFIG_INIT_ON_ALLOC_DEFAULT_ON
),并且它们**不应该**假定内核用于初始化这些分配的值。
如果设备实现使用的 Linux 内核能够支持 SELinux,则它们
- [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 策略,并且仅为他们自己的设备特定配置进一步添加到此策略中。
如果设备实现使用的内核不是 Linux 或不带 SELinux 的 Linux,则它们
- [C-2-1] **必须**使用等效于 SELinux 的强制访问控制系统。
如果设备实现使用能够进行 DMA 的 I/O 设备,则它们
- [C-SR-9] **强烈建议**使用 IOMMU(例如 ARM SMMU)隔离每个能够进行 DMA 的 I/O 设备。
Android 包含多项深度防御功能,这些功能是设备安全不可或缺的一部分。此外,Android 专注于减少导致质量和安全性下降的关键类别的常见错误。
为了减少内存错误,设备实现
- [C-SR-10] **强烈建议**使用用户空间内存错误检测工具进行测试,例如 ARMv9 设备的 MTE、ARMv8+ 设备的 HWASan 或其他设备类型的 ASan。
- [C-SR-11] **强烈建议**使用内核内存错误检测工具进行测试,例如 KASAN(ARMv9 设备的 CONFIG_KASAN、CONFIG_KASAN_HW_TAGS、ARMv8 设备的 CONFIG_KASAN_SW_TAGS 或其他设备类型的 CONFIG_KASAN_GENERIC)。
- [C-SR-12] **强烈建议**在生产中使用内存错误检测工具,例如 MTE、GWP-ASan 和 KFENCE。
如果设备实现使用基于 Arm TrustZone 的 TEE,则它们
- [C-SR-13] **强烈建议**在 Android 和 TEE 之间使用标准协议进行内存共享,例如用于 Armv8-A 的 Arm 固件框架 (FF-A)。
- [C-SR-14] **强烈建议**限制受信任的应用程序仅访问通过上述协议显式与其共享的内存。如果设备支持 Arm S-EL2 异常级别,则应由安全分区管理器强制执行。否则,应由 TEE 操作系统强制执行。
9.8. 隐私
9.8.1. 使用历史记录
Android 存储用户选择的历史记录,并通过 UsageStatsManager 管理此类历史记录。
设备实现
- [C-0-1] **必须**保持此类用户历史记录的合理保留期限。
- [C-SR-1] 强烈建议保留 AOSP 实现中默认配置的 14 天保留期。
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-0-2] 每当通过
MediaProjection
或专有 API 启用屏幕投射或屏幕录制时,必须显示并获得明确的用户同意,允许捕获用户屏幕上显示的任何敏感信息。禁止为用户提供禁用未来显示用户同意提示的功能。 - [C-0-3] 屏幕投射或屏幕录制启用时,必须向用户显示持续通知。AOSP 通过在状态栏中显示持续通知图标来满足此要求。
如果设备实现包含系统中捕获屏幕上显示的内容和/或录制设备上播放的音频流的功能(通过系统 API ContentCaptureService
或 9.8.6 节内容捕获中描述的其他专有方式除外),则设备实现
- [C-1-1] 每当此功能启用并主动捕获/录制时,必须向用户显示持续通知。
如果设备实现包含开箱即用启用的组件,能够录制环境音频和/或录制设备上播放的音频以推断有关用户上下文的有用信息,则设备实现
- [C-2-1] 禁止在持久性设备存储中存储或传输到设备外录制的原始音频或任何可以转换回原始音频或近似副本的格式,除非获得用户的明确同意。
“麦克风指示器”是指屏幕上的一个视图,该视图对用户始终可见且无法被遮挡,用户理解为麦克风正在使用中(通过独特的文本、颜色、图标或某种组合)。
“摄像头指示器”是指屏幕上的一个视图,该视图对用户始终可见且无法被遮挡,用户理解为摄像头正在使用中(通过独特的文本、颜色、图标或某种组合)。
在首次显示一秒钟后,指示器可以发生视觉变化,例如变得更小,并且不需要像最初呈现和理解的那样显示。
麦克风指示器可以与主动显示的摄像头指示器合并,前提是文本、图标或颜色向用户指示麦克风使用已开始。
摄像头指示器可以与主动显示的麦克风指示器合并,前提是文本、图标或颜色向用户指示摄像头使用已开始。
如果设备实现声明 android.hardware.microphone
,则
- [C-SR-1] 强烈建议在应用访问来自麦克风的音频数据时显示麦克风指示器,但当麦克风仅被
HotwordDetectionService
、SOURCE_HOTWORD
、ContentCaptureService
或 9.1 节权限中 CDD 标识符为 [C-3-X] 的角色中调用的应用访问时,则不显示。 - [C-SR-2] 强烈建议显示从
PermissionManager.getIndicatorAppOpUsageData()
返回的使用麦克风的最近和活动应用列表,以及与它们关联的任何归因消息。 - [C-SR-3] 强烈建议对于具有可见用户界面或直接用户交互的系统应用,不要隐藏麦克风指示器。
如果设备实现声明了 android.hardware.camera.any
,则设备实现
- [C-SR-4] 强烈建议在应用访问实时摄像头数据时显示摄像头指示器,但当摄像头仅被 9.1 节权限中 CDD 标识符为 [C-3-X] 的角色中调用的应用访问时,则不显示。
- [C-SR-5] 强烈建议显示从
PermissionManager.getIndicatorAppOpUsageData()
返回的使用摄像头的最近和活动应用列表,以及与它们关联的任何归因消息。 - [C-SR-6] 强烈建议对于具有可见用户界面或直接用户交互的系统应用,不要隐藏摄像头指示器。
9.8.3. 连接性
如果设备实现具有支持 USB 外围设备模式的 USB 端口,则
- [C-1-1] 在允许通过 USB 端口访问共享存储的内容之前,必须呈现用户界面,请求用户同意。
9.8.4. 网络流量
设备实现
- [C-0-1] 必须预安装与上游 Android 开源项目中提供的系统信任证书颁发机构 (CA) 存储相同的根证书。
- [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
文件中始终开启 VPN 服务的应用,必须禁用此用户功能,方法是将SERVICE_META_DATA_SUPPORTS_ALWAYS_ON
属性设置为false
。
9.8.5. 设备标识符
设备实现
- [C-0-1] 必须阻止应用访问设备序列号,以及在适用的情况下,IMEI/MEID、SIM 卡序列号和国际移动用户识别码 (IMSI),除非该应用满足以下要求之一
- 是由设备制造商验证的已签名运营商应用。
- 已被授予
READ_PRIVILEGED_PHONE_STATE
权限。 - 具有 UICC 运营商特权中定义的运营商特权。
- 是已被授予
READ_PHONE_STATE
权限的设备所有者或个人资料所有者。 - (仅针对 SIM 卡序列号/ICCID)具有本地法规要求应用检测用户身份变化。
9.8.6. 内容捕获和应用搜索
Android 通过系统 API ContentCaptureService
、AugmentedAutofillService
、AppSearchGlobalManager.query
或其他专有方式,支持设备实现捕获以下应用数据交互的机制:应用与用户之间的交互
- 屏幕上呈现的文本和图形,包括但不限于,通过
AssistStructure
API 发送的通知和辅助数据。 - 媒体数据,例如设备录制或播放的音频或视频。
- 输入事件(例如,按键、鼠标、手势、语音、视频和辅助功能)。
- 应用通过
内容捕获
API 或AppSearchManager
API 或类似功能的 Android 和专有 API 提供给系统的任何其他事件。 - 通过
TextClassifier API
发送到系统 TextClassifier 的任何文本或其他数据,即发送到系统服务以理解文本的含义,以及根据文本生成预测的后续操作。 - 平台 AppSearch 实现索引的数据,包括但不限于文本、图形、媒体数据或其他类似数据。
如果设备实现捕获上述数据,则设备实现
- [C-1-1] 当数据存储在设备中时,必须加密所有此类数据。此加密可以使用 Android 基于文件的加密,或 Cipher SDK 中描述的 API 版本 26+ 中列出的任何密码。
- [C-1-2] 禁止使用 Android 备份方法或任何其他备份方法备份原始数据或加密数据。
- [C-1-3] 必须仅使用隐私保护机制发送所有此类数据和设备日志。隐私保护机制定义为“仅允许汇总分析,并防止将记录的事件或派生的结果与单个用户匹配”,以防止任何按用户数据可被内省(例如,使用差分隐私技术实现,例如
RAPPOR
)。 - [C-1-4] 禁止将此类数据与设备上的任何用户身份(例如
Account
)关联,除非每次关联数据时都获得用户的明确同意。 - [C-1-5] 禁止与不遵循本节(9.8.6 内容捕获)中概述要求的其他操作系统组件共享此类数据,除非每次共享时都获得用户的明确同意。
- [C-1-6] 如果
ContentCaptureService
或专有方式收集的数据以任何形式存储在设备上,则必须提供用户功能来擦除此类数据。 - [C-1-7] 必须提供用户功能来选择退出在 android 平台(例如启动器)中显示通过 AppSearch 或专有方式收集的数据。
- [C-SR-1] 强烈建议不要请求 INTERNET 权限。
- [C-SR-2] 强烈建议仅通过公开可用的开源实现支持的结构化 API 访问互联网。
如果设备实现包括实现系统 API ContentCaptureService
、AppSearchManager.index
或任何专有服务(捕获如上所述的数据)的服务,则设备实现
- [C-2-1] 禁止允许用户使用用户可安装的应用或服务替换这些服务,并且必须仅允许预安装的服务捕获此类数据。
- [C-2-2] 禁止允许除预安装的服务机制之外的任何应用能够捕获此类数据。
- [C-2-3] 必须提供用户功能来禁用这些服务。
- [C-2-4] 禁止省略用户功能来管理服务持有的 Android 权限,并遵循 9.1 节权限中描述的 Android 权限模型。
[C-SR-3] 强烈建议将这些服务与其他系统组件(例如,不绑定服务或共享进程 ID)分开,以下组件除外
- 电话、联系人、系统 UI 和媒体
Android 通过 SpeechRecognizer#onDeviceSpeechRecognizer()
提供在设备上执行语音识别的能力,无需涉及网络。任何设备上 SpeechRecognizer 的实现必须遵循本节中概述的策略。
9.8.7. 剪贴板访问
设备实现
- [C-0-1] 禁止从剪贴板返回剪切的数据(例如,通过
ClipboardManager
API),除非第三方应用是默认 IME 或当前具有焦点的应用。 - [C-0-2] 必须在剪贴板数据最后一次放入剪贴板或从剪贴板读取后最多 60 分钟清除剪贴板数据。
9.8.8. 位置信息
位置信息包括 Android Location 类中的信息(例如纬度、经度、海拔),以及可以转换为位置信息的标识符。位置信息的精度可以像 DGPS(差分全球定位系统)一样精细,也可以像国家/地区级位置(如国家/地区代码位置 - MCC - 移动国家/地区代码)一样粗略。
以下是直接导出用户位置信息或可以转换为用户位置信息的位置类型列表。这并非详尽的列表,但应作为示例,说明位置信息可以直接或间接导出自
- GPS/GNSS/DGPS/PPP
- 全球定位解决方案或全球导航卫星系统或差分全球定位解决方案
- 这还包括原始 GNSS 测量值和 GNSS 状态
- 可以从原始 GNSS 测量值导出精确定位信息
- 具有唯一标识符的无线技术,例如
- WiFi 接入点(MAC、BSSID、名称或 SSID)
- 蓝牙/BLE(MAC、BSSID、名称或 SSID)
- UWB(MAC、BSSID、名称或 SSID)
- 蜂窝基站 ID(3G、4G、5G… 包括所有未来具有唯一标识符的蜂窝调制解调器技术)
作为主要参考点,请参阅需要 ACCESS_FINE_Location 或 ACCESS_COARSE_Location 权限的 Android API。
设备实现
- [C-0-1] 禁止在没有用户明确同意或用户发起的情况下,打开/关闭设备位置设置和 Wi-Fi/蓝牙扫描设置。
- [C-0-2] 必须提供用户功能来访问位置相关信息,包括最近的位置请求、应用级权限以及使用 Wi-Fi/蓝牙扫描来确定位置。
- [C-0-3] 必须确保使用紧急位置信息绕过 API [LocationRequest.setLocationSettingsIgnored()] 的应用是用户发起的紧急会话(例如,拨打 911 或发送短信至 911)。但是,对于汽车,在检测到碰撞/事故的情况下,车辆可以在没有主动用户交互的情况下发起紧急会话(例如,为了满足 eCall 要求)。
- [C-0-4] 必须保留紧急位置信息绕过 API 绕过设备位置设置的能力,而无需更改设置。
- [C-0-5] 必须在后台应用使用 [
ACCESS_BACKGROUND_LOCATION
] 权限访问其位置信息后,安排通知提醒用户。
9.8.9. 已安装的应用
以 API 级别 30 或更高级别为目标的 Android 应用默认情况下无法查看有关其他已安装应用的详细信息(请参阅 Android SDK 文档中的软件包可见性)。
设备实现
- [C-0-1] 禁止向任何以 API 级别 30 或更高级别为目标的应用公开有关任何其他已安装应用的详细信息,除非该应用已能够通过托管 API 查看有关其他已安装应用的详细信息。这包括但不限于设备实现者添加的任何自定义 API 或可通过文件系统访问的详细信息。
- [C-0-2] 禁止向任何应用授予读取或写入外部存储中任何其他应用的 专用应用特定目录中的文件的权限。唯一的例外情况如下
- 外部存储提供程序授权(例如 DocumentsUI 等应用)。
- 下载提供程序,它使用“downloads”提供程序授权将文件下载到应用存储。
- 平台签名的媒体传输协议 (MTP) 应用,它们使用特权权限 ACCESS_MTP 来启用将文件传输到另一台设备。
- 安装其他应用且具有 INSTALL_PACKAGES 权限的应用只能访问 “obb” 目录,以管理 APK 扩展文件。
9.8.10. 连接性错误报告
如果设备实现声明了 android.hardware.telephony
功能标志,则设备实现
- [C-1-1] 必须支持通过带有 BugreportManager 的
BUGREPORT_MODE_TELEPHONY
生成连接性错误报告。 - [C-1-2] 每次使用
BUGREPORT_MODE_TELEPHONY
生成报告时,必须获得用户同意,并且禁止提示用户同意来自应用程序的所有未来请求。 - [C-1-3] 未经用户明确同意,禁止将生成的报告返回给请求的应用。
- [C-1-4] 使用
BUGREPORT_MODE_TELEPHONY
生成的报告必须至少包含以下信息TelephonyDebugService
转储TelephonyRegistry
转储WifiService
转储ConnectivityService
转储- 调用软件包的
CarrierService
实例的转储(如果已绑定) - 无线电日志缓冲区
- [C-1-5] 禁止在生成的报告中包含以下内容
- 任何与连接性调试不直接相关的信息。
- 任何类型的用户安装的应用程序流量日志或用户安装的应用程序/软件包的详细配置文件(UID 可以,软件包名称不行)。
- 可以包含与任何用户身份无关的其他信息。(例如,供应商日志)。
如果设备实现在错误报告中包含其他信息(例如,供应商日志),并且该信息具有隐私/安全/电池/存储/内存影响,则设备实现
- [C-SR-1] 强烈建议具有默认禁用的开发者设置。AOSP 参考实现通过在开发者设置中提供
启用详细供应商日志记录
选项来满足此要求,以便在错误报告中包含其他设备特定的供应商日志。
9.8.11. 数据 blob 共享
Android 通过 BlobStoreManager 允许应用向系统贡献数据 blob,以便与选定的一组应用共享。
如果设备实现支持 SDK 文档中描述的共享数据 blob,则设备实现
- [C-1-1] 禁止共享属于应用的超出其预期允许范围的数据 blob(即,默认访问范围和可以使用 BlobStoreManager.session#allowPackageAccess()、BlobStoreManager.session#allowSameSignatureAccess() 或 BlobStoreManager.session#allowPublicAccess() 指定的其他访问模式不得修改)。AOSP 参考实现满足这些要求。
- [C-1-2] 禁止发送到设备外或与其他应用共享数据 blob 的安全哈希值(用于控制访问)。
9.8.12. 音乐识别
Android 通过系统 API MusicRecognitionManager 支持设备实现请求音乐识别的机制,给定音频记录,并将音乐识别委托给实现 MusicRecognitionService API 的特权应用。
如果设备实现包含实现系统 API MusicRecognitionManager 或任何专有服务(流式传输如上所述的音频数据)的服务,则设备实现
- [C-1-1] 必须强制执行 MusicRecognitionManager 的调用者持有
MANAGE_MUSIC_RECOGNITION
权限 - [C-1-2] 必须强制执行单个预安装的音乐识别应用程序实现 MusicRecognitionService。
- [C-1-3] 禁止允许用户使用用户可安装的应用或服务替换 MusicRecognitionManagerService 或 MusicRecognitionService。
- [C-1-4] 必须确保当 MusicRecognitionManagerService 访问音频记录并将其转发到实现 MusicRecognitionService 的应用程序时,音频访问通过 AppOpsManager.noteOp / startOp 的调用进行跟踪。
如果 MusicRecognitionManagerService 或 MusicRecognitionService 的设备实现存储任何捕获的音频数据,则设备实现
- [C-2-1] 禁止在磁盘上或内存中存储任何原始音频或音频指纹,超过 14 天。
- [C-2-2] 禁止将此类数据共享到 MusicRecognitionService 之外,除非每次共享时都获得用户的明确同意。
9.8.13. SensorPrivacyManager
如果设备实现为用户提供软件功能来关闭设备实现的摄像头和/或麦克风输入,则设备实现
- [C-1-1] 对于相关的 supportsSensorToggle() API 方法,必须准确返回“true”。
- [C-1-2] 当应用尝试访问被阻止的麦克风或摄像头时,必须向用户呈现不可取消的用户功能,清楚地指示传感器已被阻止,并且需要选择继续阻止或取消阻止,如满足此要求的 AOSP 实现中所述。
- [C-1-3] 必须仅将空白(或伪造)摄像头和音频数据传递给应用,并且不得报告错误代码,因为用户未通过上述 [C-1-2] 中呈现的用户功能打开摄像头或麦克风。
9.9. 数据存储加密
所有设备必须满足 9.9.1 节的要求。在本文档的 API 级别之前发布的设备免于 9.9.2 和 9.9.3 节的要求;相反,它们必须满足与设备发布的 API 级别相对应的 Android 兼容性定义文档的 9.9 节中的要求。
9.9.1. 直接启动
设备实现
[C-0-1] 即使设备不支持存储加密,必须实现 直接启动模式 API。
[C-0-2]
ACTION_LOCKED_BOOT_COMPLETED
和ACTION_USER_UNLOCKED
Intent 必须仍然广播,以向直接启动感知应用程序发出设备加密 (DE) 和凭据加密 (CE) 存储位置可供用户使用的信号。
9.9.2. 加密要求
设备实现
- [C-0-1] 必须加密应用私有数据(
/data
分区),以及应用共享存储分区(/sdcard
分区),如果它是设备的永久性、不可移动的部分。 - [C-0-2] 必须在用户完成开箱即用设置体验时默认启用数据存储加密。
[C-0-3] 必须通过实施以下两种加密方法之一来满足上述数据存储加密要求
9.9.3. 加密方法
如果设备实现已加密,则设备实现
- [C-1-1] 必须在启动时无需用户提供凭据,并允许直接启动感知应用在
ACTION_LOCKED_BOOT_COMPLETED
消息广播后访问设备加密 (DE) 存储。 - [C-1-2] 仅在用户通过提供其凭据(例如,密码、PIN 码、图案或指纹)解锁设备且
ACTION_USER_UNLOCKED
消息广播后,必须才允许访问凭据加密 (CE) 存储。 - [C-1-13] 禁止提供任何方法来解锁 CE 保护的存储,而无需用户提供的凭据、注册的托管密钥或满足 9.9.4 节中重新启动时恢复的要求。
- [C-1-4] 必须使用已验证启动。
9.9.3.1. 基于文件的加密和元数据加密
如果设备实现使用基于文件的加密和元数据加密,则设备实现
- [C-1-5] 必须使用 AES-256-XTS 或 Adiantum 加密文件内容和文件系统元数据。AES-256-XTS 指的是高级加密标准,其密码密钥长度为 256 位,以 XTS 模式运行;密钥的完整长度为 512 位。Adiantum 指的是 Adiantum-XChaCha12-AES,如 https://github.com/google/adiantum 中所指定。文件系统元数据是指文件大小、所有权、模式和扩展属性 (xattrs) 等数据。
- [C-1-6] 必须使用 AES-256-CBC-CTS 或 Adiantum 加密文件名。
- [C-1-12] 如果设备具有高级加密标准 (AES) 指令(例如基于 ARM 的设备上的 ARMv8 加密扩展,或基于 x86 的设备上的 AES-NI),则必须使用上述基于 AES 的选项进行文件名、文件内容和文件系统元数据加密,而不是 Adiantum。
- [C-1-13] 必须使用密码学上强且不可逆的密钥派生函数(例如 HKDF-SHA512)从 CE 和 DE 密钥派生任何所需的子密钥(例如,每个文件密钥)。“密码学上强且不可逆”意味着密钥派生函数具有至少 256 位的安全强度,并且在其输入上表现为伪随机函数族。
- [C-1-14] 禁止对不同的密码学目的使用相同的基于文件的加密 (FBE) 密钥或子密钥(例如,用于加密和密钥派生,或用于两种不同的加密算法)。
- [C-1-15] 必须确保持久性存储上加密文件内容的所有未删除块都使用加密密钥和初始化向量 (IV) 的组合进行加密,这些组合都取决于文件和文件内的偏移量。此外,所有此类组合必须是不同的,除非加密是使用仅支持 32 位 IV 长度的内联加密硬件完成的。
- [C-1-16] 必须确保持久性存储上不同目录中的所有未删除的加密文件名都使用加密密钥和初始化向量 (IV) 的不同组合进行加密。
[C-1-17] 必须确保持久性存储上的所有加密文件系统元数据块都使用加密密钥和初始化向量 (IV) 的不同组合进行加密。
保护 CE 和 DE 存储区域和文件系统元数据的密钥
- [C-1-7] 必须以密码方式绑定到硬件支持的 Keystore。此 Keystore 必须绑定到已验证启动和设备的硬件信任根。
- [C-1-8] CE 密钥必须绑定到用户的锁屏凭据。
- [C-1-9] 当用户未指定锁屏凭据时,CE 密钥必须绑定到默认密码。
- [C-1-10] 必须是唯一且不同的,换句话说,没有用户的 CE 或 DE 密钥与任何其他用户的 CE 或 DE 密钥匹配。
- [C-1-11] 必须使用强制支持的密码、密钥长度和模式。
- [C-1-12] 必须在 bootloader 解锁和锁定时按照此处描述进行安全擦除。
应该使预装的基本应用(例如,闹钟、电话、信息)支持 Direct Boot。
上游 Android 开源项目提供了基于 Linux 内核 "fscrypt" 加密功能的基于文件的加密首选实现,以及基于 Linux 内核 "dm-default-key" 功能的元数据加密首选实现。
9.9.3.2. 每用户块级加密
如果设备实现使用每用户块级加密,则它们
- [C-1-1] 必须启用 9.5 节中描述的多用户支持。
- [C-1-2] 必须提供每用户分区,可以使用原始分区或逻辑卷。
- [C-1-3] 必须为每个用户的底层块设备的加密使用唯一且不同的加密密钥。
[C-1-4] 必须对用户分区的块级加密使用 AES-256-XTS。
保护每用户块级加密设备的密钥
- [C-1-5] 必须以加密方式绑定到硬件支持的密钥库。此密钥库必须绑定到 Verified Boot 和设备的硬件信任根。
- [C-1-6] 必须绑定到相应用户的锁屏凭据。
可以使用 Linux 内核 "dm-crypt" 功能在每用户分区上实现每用户块级加密。
9.9.4. 重启后恢复
重启后恢复允许在 OTA 发起的重启后解锁所有应用的 CE 存储,包括那些尚不支持 Direct Boot 的应用。此功能使用户能够在重启后接收来自已安装应用的通知。
重启后恢复的实现必须继续确保,当设备落入攻击者手中时,即使设备已开机、CE 存储已解锁且用户在接收 OTA 后已解锁设备,攻击者也极难恢复用户的 CE 加密数据。为了抵抗内部人员攻击,我们还假设攻击者获得了广播加密签名密钥的访问权限。
具体来说
[C-0-1] CE 存储即使对于物理拥有设备并具有以下能力和限制的攻击者也必须不可读
- 可以使用任何供应商或公司的签名密钥来签署任意消息。
- 可以导致设备接收 OTA。
- 可以修改任何硬件(AP、闪存等)的操作,但以下详细说明的除外,但此类修改涉及至少一小时的延迟和破坏 RAM 内容的断电重启。
- 无法修改防篡改硬件(例如 Titan M)的操作。
- 无法读取实时设备的 RAM。
- 无法获取用户的凭据(PIN、图案、密码)或以其他方式导致其被输入。
例如,符合此处找到的所有描述的设备实现将符合 [C-0-1]。
9.10. 设备完整性
以下要求确保设备完整性状态的透明度。设备实现
[C-0-1] 必须通过 System API 方法
PersistentDataBlockManager.getFlashLockState()
正确报告其 bootloader 状态是否允许刷写系统镜像。[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] 除非用户已明确解锁 bootloader,否则必须不允许修改设备上的已验证分区。
- [C-SR-1] 如果设备中有多个离散芯片(例如,无线电、专用图像处理器),则强烈建议每个芯片的启动过程在启动时验证每个阶段。
- [C-1-8] 必须使用防篡改存储:用于存储 bootloader 是否已解锁。防篡改存储意味着 bootloader 可以检测到存储是否已从 Android 内部被篡改。
- [C-1-9] 必须在使用设备时提示用户,并在允许从 bootloader 锁定模式过渡到 bootloader 解锁模式之前要求物理确认。
- [C-1-10] 必须为 Android 使用的分区(例如,boot、系统分区)实施回滚保护,并使用防篡改存储来存储用于确定最低允许 OS 版本的元数据。
- [C-1-11] 必须按照“9.12. 数据删除”(包括 userdata 分区和任何 NVRAM 空间)安全擦除 bootloader 解锁和锁定期间的所有用户数据。
- [C-SR-2] 强烈建议使用植根于 Verified Boot 保护的分区的信任链来验证所有特权应用 APK 文件。
- [C-SR-3] 强烈建议在执行特权应用从其 APK 文件外部加载的任何可执行工件(例如,动态加载的代码或编译的代码)之前对其进行验证,或者强烈建议完全不要执行它们。
- 应该为具有持久固件的任何组件(例如,调制解调器、摄像头)实施回滚保护,并且应该使用防篡改存储来存储用于确定最低允许版本的元数据。
如果设备实现在较早版本的 Android 上已发布而未支持 C-1-8 到 C-1-11,并且无法通过系统软件更新添加对这些要求的支持,则可以豁免这些要求。
上游 Android 开源项目在 external/avb/
仓库中提供了此功能的首选实现,可以将其集成到用于加载 Android 的 bootloader 中。
设备实现
- [C-0-3] 必须支持针对受信任密钥以加密方式验证文件内容,而无需读取整个文件。
- [C-0-4] 当读取内容未通过针对受信任密钥的验证时,必须不允许对受保护文件的读取请求成功。
如果设备实现在较早版本的 Android 上已发布而没有针对受信任密钥验证文件内容的能力,并且无法通过系统软件更新添加对此功能的支持,则可以豁免此要求。上游 Android 开源项目提供了基于 Linux 内核 fs-verity 功能的此功能的首选实现。
设备实现
- [C-SR-4] 强烈建议支持 Android Protected Confirmation API。
如果设备实现支持 Android Protected Confirmation API,则它们
[C-3-1] 必须为
ConfirmationPrompt.isSupported()
API 报告true
。[C-3-2] 必须确保在没有用户交互的情况下,Android 操作系统(包括其内核,无论是恶意的还是其他的)中运行的代码都无法生成肯定响应。
[C-3-3] 必须确保即使在 Android 操作系统(包括其内核)被入侵的情况下,用户也能够查看和批准提示的消息。
9.11. 密钥和凭据
Android Keystore 系统允许应用开发者将加密密钥存储在容器中,并通过 KeyChain API 或 Keystore API 在加密操作中使用它们。设备实现
- [C-0-1] 必须允许导入或生成至少 8,192 个密钥。
- [C-0-2] 锁屏身份验证必须在失败尝试之间实施时间间隔。当失败尝试计数为 n 时,对于 9 < n < 30,时间间隔必须至少为 30 秒。对于 n > 29,时间间隔值必须至少为 30*2^floor((n-30)/10)) 秒或至少 24 小时,以较小者为准。
- 不应该限制可以生成的密钥数量
当设备实现支持安全锁屏时,它
- [C-1-1] 必须使用隔离的执行环境来支持密钥库实现。
- [C-1-2] 必须具有 RSA、AES、ECDSA、ECDH(如果支持 IKeyMintDevice)、3DES 和 HMAC 加密算法以及 MD5、SHA1 和 SHA-2 系列哈希函数的实现,以便在与内核及以上代码安全隔离的区域中正确支持 Android Keystore 系统支持的算法。安全隔离必须阻止内核或用户空间代码可能访问隔离环境内部状态的所有潜在机制,包括 DMA。上游 Android 开源项目 (AOSP) 通过使用 Trusty 实现来满足此要求,但另一个基于 ARM TrustZone 的解决方案或第三方审查的基于适当 hypervisor 的隔离的安全实现是替代选项。
- [C-1-3] 必须在隔离的执行环境中执行锁屏身份验证,并且仅在成功时,才允许使用绑定到身份验证的密钥。锁屏凭据的存储方式必须仅允许隔离的执行环境执行锁屏身份验证。上游 Android 开源项目提供了 Gatekeeper 硬件抽象层 (HAL) 和 Trusty,可用于满足此要求。
- [C-1-4] 必须支持密钥证明,其中证明签名密钥受安全硬件保护,并且签名在安全硬件中执行。证明签名密钥必须在足够多的设备之间共享,以防止密钥被用作设备标识符。满足此要求的一种方法是共享相同的证明密钥,除非生产了至少 100,000 个给定 SKU 的单元。如果生产了超过 100,000 个 SKU 的单元,则每个 100,000 个单元可以使用不同的密钥。
请注意,如果设备实现已在较早的 Android 版本上启动,则此类设备可以免除密钥库由隔离的执行环境支持和支持密钥证明的要求,除非它声明需要密钥库由隔离的执行环境支持的 android.hardware.fingerprint
功能。
- [C-1-5] 必须允许用户选择从解锁状态过渡到锁定状态的睡眠超时时间,最小允许超时时间为 15 秒。每当抬头显示器关闭或用户切换时锁定屏幕的汽车设备可以没有睡眠超时配置。
- [C-1-6] 必须支持以下之一
- IKeymasterDevice 3.0,
- IKeymasterDevice 4.0,
- IKeymasterDevice 4.1,
- IKeyMintDevice 版本 1,或
- IKeyMintDevice 版本 2。
- [C-SR-1] 强烈建议支持 IKeyMintDevice 版本 1。
9.11.1. 安全锁屏、身份验证和虚拟设备
AOSP 实现遵循分层身份验证模型,其中基于知识因子的主要身份验证可以由二级强生物识别或较弱的三级模式支持。
设备实现
- [C-SR-1] 强烈建议仅将以下方法之一设置为主要身份验证方法
- 数字 PIN 码
- 字母数字密码
- 3x3 点网格上的滑动图案
请注意,以上身份验证方法在本文件中被称为推荐的主要身份验证方法。
如果设备实现添加或修改了推荐的主要身份验证方法,并使用新的身份验证方法作为锁定屏幕的安全方式,则新的身份验证方法
- [C-2-1] 必须是密钥使用需要用户身份验证中描述的用户身份验证方法。
如果设备实现添加或修改了基于已知秘密的身份验证方法以解锁锁屏,并使用新的身份验证方法被视为锁定屏幕的安全方式
- [C-3-1] 最短允许输入长度的熵必须大于 10 位。
- [C-3-2] 所有可能输入的最大熵必须大于 18 位。
- [C-3-3] 新的身份验证方法不得替换 AOSP 中实现和提供的任何推荐的主要身份验证方法(即 PIN 码、图案、密码)。
- [C-3-4] 当设备策略控制器 (DPC) 应用通过 DevicePolicyManager.setRequiredPasswordComplexity() 设置了密码要求策略,且复杂度常量比 PASSWORD_COMPLEXITY_NONE 更严格,或者通过 DevicePolicyManager.setPasswordQuality() 方法设置了密码质量策略,且常量比 PASSWORD_QUALITY_BIOMETRIC_WEAK 更严格时,必须禁用新的身份验证方法。
- [C-3-5] 新的身份验证方法必须每 72 小时或更短时间回退到推荐的主要身份验证方法(即 PIN 码、图案、密码),或者明确告知用户某些数据将不会被备份,以保护他们的数据隐私。
如果设备实现添加或修改了推荐的主要身份验证方法以解锁锁屏,并使用新的基于生物识别的身份验证方法被视为锁定屏幕的安全方式,则新方法
- [C-4-1] 必须满足 7.3.10 节中描述的 Class 1(以前称为 Convenience)的所有要求。
- [C-4-2] 必须具有回退机制,以使用基于已知秘密的推荐的主要身份验证方法之一。
- [C-4-3] 当设备策略控制器 (DPC) 应用通过调用方法
DevicePolicyManager.setKeyguardDisabledFeatures()
设置了锁屏保护功能策略,且使用了任何相关的生物识别标志(即KEYGUARD_DISABLE_BIOMETRICS
、KEYGUARD_DISABLE_FINGERPRINT
、KEYGUARD_DISABLE_FACE
或KEYGUARD_DISABLE_IRIS
)时,必须禁用新的身份验证方法,并且仅允许推荐的主要身份验证方法解锁屏幕。
如果生物识别身份验证方法不满足 7.3.10 节中描述的 Class 3(以前称为 Strong)的要求
- [C-5-1] 如果设备策略控制器 (DPC) 应用通过 DevicePolicyManager.setRequiredPasswordComplexity() 设置了密码要求质量策略,且复杂度桶比
PASSWORD_COMPLEXITY_LOW
更严格,或者使用 DevicePolicyManager.setPasswordQuality() 方法设置了密码质量策略,且常量比PASSWORD_QUALITY_BIOMETRIC_WEAK
更严格时,必须禁用这些方法。 - [C-5-2] 用户必须按照 7.3.10 节中的 [C-1-7] 和 [C-1-8] 的描述,使用推荐的主要身份验证方法(例如:PIN 码、图案、密码)进行身份验证。
- [C-5-3] 这些方法不得被视为安全锁屏,并且必须满足本节下面以 C-8 开头的要求。
如果设备实现添加或修改了用于解锁锁屏的身份验证方法,并且新的身份验证方法基于物理令牌或位置
- [C-6-1] 它们必须具有回退机制,以使用基于已知秘密的推荐的主要身份验证方法之一,并满足被视为安全锁屏的要求。
- [C-6-2] 当设备策略控制器 (DPC) 应用通过以下方式设置策略时,必须禁用新方法,并且仅允许推荐的主要身份验证方法之一解锁屏幕
DevicePolicyManager.setKeyguardDisabledFeatures(KEYGUARD_DISABLE_TRUST_AGENTS)
方法- 使用
DevicePolicyManager.setPasswordQuality()
方法,且质量常量比PASSWORD_QUALITY_NONE
更严格。 - 使用 DevicePolicyManager.setRequiredPasswordComplexity() 方法,且复杂度桶比
PASSWORD_COMPLEXITY_NONE
更严格。
- [C-6-3] 用户必须至少每 4 小时或更短时间使用推荐的主要身份验证方法之一(例如 PIN 码、图案、密码)进行身份验证。当物理令牌满足 C-X 中 TrustAgent 实现的要求时,适用 C-9-5 中定义的超时限制。
- [C-6-4] 新方法不得被视为安全锁屏,并且必须遵循下面 C-8 中列出的约束。
如果设备实现具有安全锁屏并包含一个或多个信任代理(实现 TrustAgentService
System API),则它们
- [C-7-1] 在设置菜单和锁屏上必须有清晰的指示,表明设备锁定已延迟或可以由信任代理解锁。例如,AOSP 通过在设置菜单中显示“自动锁定设置”和“电源按钮立即锁定”的文本描述以及锁屏上可区分的图标来满足此要求。
- [C-7-2] 必须尊重并完全实现
DevicePolicyManager
类中的所有信任代理 API,例如KEYGUARD_DISABLE_TRUST_AGENTS
常量。 - [C-7-3] 不得在用作主要个人设备(例如手持设备)的设备上完全实现
TrustAgentService.addEscrowToken()
函数,但可以在通常共享的设备实现(例如 Android TV 或汽车设备)上完全实现该函数。 - [C-7-4] 必须加密所有由
TrustAgentService.addEscrowToken()
添加的存储令牌。 - [C-7-5] 不得在密钥使用的同一设备上存储加密密钥或托管令牌。例如,允许存储在手机上的密钥解锁电视上的用户帐户。对于汽车设备,不允许将托管令牌存储在车辆的任何部分。
- [C-7-6] 在启用托管令牌以解密数据存储之前,必须告知用户有关安全影响的信息。
- [C-7-7] 必须具有回退机制,以使用推荐的主要身份验证方法之一。
- [C-7-8] 用户必须至少每 72 小时或更短时间使用推荐的主要身份验证方法之一(例如:PIN 码、图案、密码)进行身份验证,除非用户的安全(例如驾驶员分心)受到关注。
- [C-7-9] 用户必须按照 7.3.10 节中的 [C-1-7] 和 [C-1-8] 的描述,使用推荐的主要身份验证方法之一(例如:PIN 码、图案、密码)进行身份验证,除非用户的安全(例如驾驶员分心)受到关注。
- [C-7-10] 不得被视为安全锁屏,并且必须遵循下面 C-8 中列出的约束。
- [C-7-11] 不得允许主要个人设备(例如:手持设备)上的 TrustAgent 解锁设备,并且只能使用它们将已解锁的设备保持在解锁状态最多 4 小时。AOSP 中 TrustManagerService 的默认实现满足此要求。
- [C-7-12] 必须使用加密安全(例如 UKEY2)的通信通道将托管令牌从存储设备传递到目标设备。
如果设备实现添加或修改了用于解锁锁屏的身份验证方法,该方法不是如上所述的安全锁屏,并且使用新的身份验证方法来解锁锁屏保护
- [C-8-1] 当设备策略控制器 (DPC) 应用通过
DevicePolicyManager.setPasswordQuality()
方法设置了密码质量策略,且质量常量比PASSWORD_QUALITY_NONE
更严格,或者通过DevicePolicyManager.setRequiredPasswordComplexity()
设置了密码复杂度策略,且复杂度常量比 'PASSWORD_COMPLEXITY_NONE' 更严格时,必须禁用新方法。 - [C-8-2] 不得重置
DevicePolicyManager.setPasswordExpirationTimeout()
设置的密码过期计时器。 - [C-8-3] 不得公开 API 以供第三方应用使用来更改锁定状态。
如果设备实现允许应用程序创建辅助 虚拟显示屏,并且不支持相关的输入事件,例如通过 VirtualDeviceManager
,则它们
- [C-9-1] 当设备的默认显示屏锁定时,必须锁定这些辅助虚拟显示屏,并在设备的默认显示屏解锁时解锁这些辅助虚拟显示屏。
如果设备实现允许应用程序创建辅助 虚拟显示屏,并且支持相关的输入事件,例如通过 VirtualDeviceManager,则它们
- [C-10-1] 必须支持每个虚拟设备的单独锁定状态
- [C-10-2] 必须在空闲超时后断开所有虚拟设备的连接
- [C-10-3] 必须具有空闲超时
- [C-10-4] 当用户发起锁定(包括通过手持设备所需的锁定用户操作界面(参见 第 2.2.5[9.11/H-1-2] 节))时,必须锁定所有显示屏。
- [C-10-5] 必须具有每个用户的单独虚拟设备实例
- [C-10-6] 当
DevicePolicyManager.setNearbyAppStreamingPolicy
指示时,必须禁用通过VirtualDeviceManager
创建关联的输入事件 - [C-10-7] 必须为每个虚拟设备单独使用剪贴板(或禁用虚拟设备的剪贴板)
- [C-10-11] 必须禁用虚拟设备上的身份验证 UI,包括知识因子输入和生物识别提示
- [C-10-12] 必须限制从虚拟设备发起的 intent 仅在同一虚拟设备上显示
- [C-10-13] 不得将虚拟设备锁定状态用作 Android Keystore 系统的用户身份验证授权。请参阅
KeyGenParameterSpec.Builder.setUserAuthentication*
。
当设备实现允许用户将主要身份验证知识因子从源设备传输到目标设备时,例如用于目标设备的初始设置,它们
- [C-11-1] 在将知识因子从源设备传输到目标设备时,必须使用与 Google Cloud Key Vault Service 安全白皮书中描述的保护保证类似的保护保证来加密知识因子,以使知识因子无法被远程解密或用于远程解锁任何设备。
- [C-11-2] 必须在源设备上,在将知识因子传输到目标设备之前,要求用户确认源设备的知识因子。
- [C-11-3] 必须在缺少任何已设置的主要身份验证知识因子的目标设备上,在目标设备上要求用户确认传输的知识因子,然后再将该知识因子设置为目标设备的主要身份验证知识因子,并在提供从源设备传输的任何数据之前进行确认。
如果设备实现具有安全锁屏并包含一个或多个信任代理,这些信任代理使用 FLAG_GRANT_TRUST_TEMPORARY_AND_RENEWABLE
标志调用 TrustAgentService.grantTrust()
System API,则它们
- [C-12-1] 仅当连接到具有自身锁屏的邻近物理设备,并且用户已针对该锁屏验证其身份时,才必须使用该标志调用
grantTrust()
。邻近设备可以在一次性用户解锁后使用腕上或身上检测机制来满足用户身份验证要求。 - [C-12-2] 当屏幕关闭时(例如通过按钮按下或显示超时)且 TrustAgent 未撤销信任时,必须将设备实现置于
TrustState.TRUSTABLE
状态。AOSP 满足此要求。 - [C-12-3] 仅当 TrustAgent 仍基于 C-12-1 中的要求授予信任时,才必须将设备从
TrustState.TRUSTABLE
状态移动到TrustState.TRUSTED
状态。 - [C-12-4] 必须调用
TrustManagerService.revokeTrust()
- 在授予信任后最多 24 小时后,或
- 在 8 小时空闲窗口后,或
- 如果实现未使用 [C-12-5] 中定义的加密安全且准确的测距,则当与邻近物理设备的底层连接丢失时。
- [C-12-5] 依赖于安全且准确的测距以满足 [C-12-4] 要求的实现必须使用以下解决方案之一
- 使用 UWB 的实现
- 使用 Wi-Fi 邻居感知网络 (NAN) 的实现
- 必须满足 2.2.1 [7.4.2.5/H-SR-1] 中的准确性要求,使用 160 MHz 带宽(或更高),并遵循 Presence Calibration 中指定的测量设置步骤。
- 必须使用 IEEE 802.11az 中定义的安全 LTF。
如果设备实现允许应用创建辅助虚拟显示屏,并支持相关的输入事件(例如通过 VirtualDeviceManager),且这些显示屏未标记为 VIRTUAL_DISPLAY_FLAG_SECURE,则它们
- [C-13-8] 必须阻止将属性 android:canDisplayOnRemoteDevices 或 meta-data android.activity.can_display_on_remote_devices 设置为 false 的 Activity 在虚拟设备上启动。
- [C-13-9] 必须阻止未明确启用流式传输并且表明它们显示敏感内容的 Activity(包括通过 SurfaceView#setSecure、FLAG_SECURE 或 SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS),在虚拟设备上启动。
如果设备实现通过 DeviceStateManager
支持单独的显示屏电源状态,**并且** 通过 KeyguardDisplayManager
支持单独的显示屏锁定状态,则它们
- [C-SR-2] **强烈建议** 使用符合第 9.11.1 节中定义的要求的凭据或符合第 7.3.10 节中定义的至少 Class 1 规范的生物识别技术,以允许与默认设备显示屏独立解锁。
- [C-SR-3] **强烈建议** 通过定义的显示屏超时来约束单独的显示屏解锁。
- [C-SR-4] **强烈建议** 允许用户通过主手持设备的锁定功能全局锁定所有显示屏。
9.11.2. StrongBox
Android Keystore 系统 允许应用开发者在专用安全处理器以及上述隔离的执行环境中存储加密密钥。这种专用安全处理器称为“StrongBox”。以下 C-1-3 到 C-1-11 条要求定义了设备必须满足的、才能被认定为 StrongBox 的要求。
具有专用安全处理器的设备实现
- [C-SR-1] **强烈建议** 支持 StrongBox。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] **必须** 包含已通过 Secure IC Protection Profile BSI-CC-PP-0084-2014 认证的硬件,或由国家认可的测试实验室根据 Common Criteria Application of Attack Potential to Smartcards 进行的高攻击潜力漏洞评估。
- [C-1-11] **必须** 包含已由国家认可的测试实验室根据 Common Criteria Application of Attack Potential to Smartcards 进行的高攻击潜力漏洞评估的固件。
- [C-SR-2] **强烈建议** 包含使用安全目标、评估保证级别 (EAL) 5 并通过 AVA_VAN.5 增强的硬件进行评估。EAL 5 认证很可能在未来的版本中成为一项强制要求。
- [C-SR-3] **强烈建议** 提供内部人员攻击抵抗 (IAR),这意味着有权访问固件签名密钥的内部人员无法生成导致 StrongBox 泄漏机密、绕过功能安全要求或以其他方式启用对敏感用户数据的访问的固件。实现 IAR 的推荐方法是仅当通过 IAuthSecret HAL 提供主用户密码时才允许固件更新。
9.11.3. 身份凭据
身份凭据系统的定义和实现是通过实施 android.security.identity.*
包中的所有 API 来完成的。这些 API 允许应用开发者存储和检索用户身份文档。设备实现
- [C-SR-1] **强烈建议** 实现身份凭据系统。
如果设备实现实现了身份凭据系统,则它们
[C-1-1] **必须** 为 IdentityCredentialStore#getInstance() 方法返回非空值。
[C-1-2] **必须** 使用与受信任应用通信的代码在安全隔离于内核和更高层级上运行的代码的区域中实现身份凭据系统(例如,
android.security.identity.*
API)。安全隔离 **必须** 阻止内核或用户空间代码可能访问隔离环境内部状态的所有潜在机制,包括 DMA。[C-1-3] 实现身份凭据系统(例如,
android.security.identity.*
API)所需的加密操作 **必须** 完全在受信任的应用中执行,并且私钥材料 **绝不能** 离开隔离的执行环境,除非更高级别的 API(例如,createEphemeralKeyPair() 方法)明确要求。[C-1-4] 受信任的应用的实现方式 **必须** 确保即使 Android 运行异常或被入侵,其安全属性也不会受到影响(例如,除非满足访问控制条件,否则不会发布凭据数据,MAC 也不能为任意数据生成)。
上游 Android 开源项目提供了一个受信任应用的参考实现 (libeic),可用于实现身份凭据系统。
9.12. 数据删除
所有设备实现
- [C-0-1] **必须** 为用户提供执行“恢复出厂设置”的机制。
- [C-0-2] 执行“恢复出厂设置”时,**必须** 删除 userdata 文件系统上的所有数据。
- [C-0-3] 执行“恢复出厂设置”时,**必须** 以满足相关行业标准(如 NIST SP800-88)的方式删除数据。
- [C-0-4] 当主用户的设备政策控制器应用调用
DevicePolicyManager.wipeData()
API 时,**必须** 触发上述“恢复出厂设置”流程。 - **可以** 提供仅执行逻辑数据擦除的快速数据擦除选项。
9.13. 安全启动模式
Android 提供了安全启动模式,该模式允许用户启动到仅允许预装系统应用运行且禁用所有第三方应用的模式。此模式(称为“安全启动模式”)为用户提供了卸载潜在有害第三方应用的功能。
设备实现是
- [C-SR-1] **强烈建议** 实现安全启动模式。
如果设备实现实现了安全启动模式,则它们
[C-1-1] **必须** 为用户提供进入安全启动模式的选项,并且进入方式不会被设备上安装的第三方应用中断,除非第三方应用是设备政策控制器并且已将
UserManager.DISALLOW_SAFE_BOOT
标志设置为 true。[C-1-2] **必须** 为用户提供在安全模式下卸载任何第三方应用的功能。
**应** 为用户提供从启动菜单进入安全启动模式的选项,并使用与正常启动不同的工作流程。
9.14. 汽车车辆系统隔离
Android Automotive 设备预计将通过使用 vehicle HAL 在车辆网络(如 CAN 总线)上发送和接收消息,从而与关键车辆子系统交换数据。
可以通过在 Android 框架层以下实现安全功能来保护数据交换,以防止恶意或意外地与这些子系统交互。
9.15. 订阅计划
“订阅计划”是指移动运营商通过 SubscriptionManager.setSubscriptionPlans()
提供的结算关系计划详细信息。
所有设备实现
- [C-0-1] **必须** 仅向最初提供订阅计划的移动运营商应用返回订阅计划。
- [C-0-2] **不得** 远程备份或上传订阅计划。
- [C-0-3] **必须** 仅允许来自当前提供有效订阅计划的移动运营商应用的覆盖,例如
SubscriptionManager.setSubscriptionOverrideCongested()
。
9.16. 应用数据迁移
如果设备实现包含将数据从一个设备迁移到另一个设备的功能,并且不限制其复制的应用数据为应用开发者在清单中通过 android:fullBackupContent 属性配置的数据,则它们
- [C-1-1] **不得** 从用户未设置 9.11.1 安全锁屏和身份验证 中描述的主身份验证的设备启动应用数据传输。
- [C-1-2] **必须** 安全地确认源设备上的主身份验证,并在传输任何数据之前与用户确认在源设备上复制数据的意图。
- [C-1-3] **必须** 使用安全密钥证明来确保设备到设备迁移中的源设备和目标设备都是合法的 Android 设备并且具有锁定的引导加载程序。
- [C-1-4] **必须** 仅将应用数据迁移到目标设备上的同一应用,且具有相同的软件包名称 **和** 签名证书。
- [C-1-5] **必须** 在设置菜单中显示指示,表明源设备已通过设备到设备数据迁移迁移了数据。用户 **不应** 能够删除此指示。
9.17. Android 虚拟化框架
如果设备实现了对 Android 虚拟化框架 API (android.system.virtualmachine.*
) 的支持,则 Android 主机
- [C-1-1] **必须** 支持
android.system.virtualmachine.*
包定义的所有 API。 - [C-1-2] **不得** 修改 Android SELinux 和权限模型以用于受保护虚拟机的管理。
- [C-1-3] **不得** 修改、省略或替换上游 Android 开源项目 (AOSP) 中提供的 system/sepolicy 中的 neverallow 规则,并且策略 **必须** 在所有 neverallow 规则都存在的情况下进行编译。
- [C-1-4] **不得** 允许不受信任的代码(例如,第三方应用)创建和运行受保护虚拟机。注意:这在未来的 Android 版本中可能会发生变化。
- [C-1-5] **不得** 允许受保护虚拟机执行不属于出厂映像或其更新的代码。任何未被 Android 验证启动覆盖的内容(例如,从互联网下载或侧载的文件)**不得** 允许在受保护虚拟机中运行。
如果设备实现了对 Android 虚拟化框架 API (android.system.virtualmachine.*
) 的支持,则任何受保护虚拟机实例
- [C-2-1] **必须** 能够运行虚拟化 APEX 中可用的所有操作系统在受保护虚拟机中。
- [C-2-2] **不得** 允许受保护虚拟机运行未经设备实现者或操作系统供应商签名的操作系统。
- [C-2-3] **不得** 允许受保护虚拟机将数据作为代码执行(例如,SELinux neverallow execmem)。
- [C-2-4] **不得** 修改、省略或替换上游 Android 开源项目 (AOSP) 中提供的 system/sepolicy/microdroid 中的 neverallow 规则。
- [C-2-5] **必须** 实现受保护虚拟机的深度防御机制(例如,用于 pVM 的 SELinux),即使对于非 Microdroid 操作系统也是如此。
- [C-2-6] **必须** 确保 pVM 固件在无法验证初始映像时拒绝启动。
- [C-2-7] **必须** 确保 pVM 固件在 instance.img 的完整性受到破坏时拒绝启动。
如果设备实现了对 Android 虚拟化框架 API (android.system.virtualmachine.*
) 的支持,则虚拟机监控程序
- [C-3-1] **不得** 允许任何 pVM 访问属于另一个实体(即,其他 pVM 或虚拟机监控程序)的页面,除非页面所有者明确共享。这包括主机 VM。这适用于 CPU 和 DMA 访问。
- [C-3-2] **必须** 在 VM 使用页面后以及在将其返回给主机之前擦除页面(例如,pVM 被销毁)。
- [C-3-3] **必须** 确保 pVM 固件在 pVM 中的任何代码之前加载和执行。
- [C-3-4] **必须** 确保提供给 pVM 实例的 BCC 和 CDI 只能由该特定实例派生。
如果设备实现了对 Android 虚拟化框架 API 的支持,则在所有领域
- [C-4-1] **不得** 向 pVM 提供允许绕过 Android 安全模型的功能。
如果设备实现了对 Android 虚拟化框架 API 的支持,则
- [C-5-1] **必须** 支持 ART 运行时更新的隔离编译。
如果设备实现了对 Android 虚拟化框架 API 的支持,则对于密钥管理
- [C-6-1] **必须** 将 DICE 链植根于用户无法修改的点,即使在解锁的设备上也是如此。(以确保它不会被欺骗)。
- [C-6-2] **必须** 正确执行 DICE,即提供正确的值。
10. 软件兼容性测试
设备实现 **必须** 通过本节中描述的所有测试。但是,请注意,没有哪个软件包测试是完全全面的。因此,**强烈建议** 设备实现者尽可能少地更改来自 Android 开源项目的 Android 参考实现和首选实现。这将最大程度地降低引入错误的风险,这些错误会导致不兼容性,需要返工和潜在的设备更新。
10.1. 兼容性测试套件
设备实现
[C-0-1] **必须** 使用设备上的最终交付软件,通过来自 Android 开源项目的 Android 兼容性测试套件 (CTS)。
[C-0-2] **必须** 确保在 CTS 存在歧义的情况下以及对于参考源代码任何重新实现的部分的兼容性。
CTS 旨在在实际设备上运行。与任何软件一样,CTS 本身可能包含错误。CTS 的版本将独立于此兼容性定义,并且可能会为 Android 13 发布 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 软件包含满足此要求的更新机制。
[C-0-3] 整个更新 **必须** 签名,并且设备上的更新机制 **必须** 针对设备上存储的公钥验证更新和签名。
[C-SR-1] **强烈建议** 签名机制使用 SHA-256 对更新进行哈希处理,并使用 ECDSA NIST P-256 针对公钥验证哈希值。
如果设备实现包含对非按流量计费数据连接(如 802.11 或蓝牙 PAN(个人区域网))配置文件的支持,则它们
- [C-1-1] **必须** 支持 OTA 下载,通过重启进行离线更新。
设备实现 **应** 验证系统映像在 OTA 之后是否与预期结果完全相同。自 Android 5.1 以来添加的上游 Android 开源项目中的基于块的 OTA 实现满足此要求。
此外,设备实现 **应** 支持 A/B 系统更新。AOSP 使用引导控制 HAL 实现此功能。
如果在设备发布后但在其合理的产品生命周期内(经与 Android 兼容性团队协商确定)发现设备实现中存在影响第三方应用兼容性的错误,则
- [C-2-1] 设备实现者 **必须** 通过可用的软件更新来纠正错误,该软件更新可以按照刚刚描述的机制应用。
Android 包含允许设备所有者应用(如果存在)控制系统更新安装的功能。如果设备的系统更新子系统报告 android.software.device_admin,则它们
- [C-3-1] **必须** 实现 SystemUpdatePolicy 类中描述的行为。
12. 文档变更日志
以下是此版本中对兼容性定义的更改摘要
2023 年 10 月 4 日
2. 设备类型
-
请参阅修订版本
- [9.8/H-1-14] **必须** 显示麦克风指示器,如第 9.8.2 节中所述
[9.8/C-3-1],当成功的热词结果传输到语音时
- [9.8/H-1-14] **必须** 显示麦克风指示器,如第 9.8.2 节中所述
-
请参阅修订版本
[5.1/H-1-7] 对于所有硬件视频编码器,在负载下,1080p 或更小视频编码会话的编解码器初始化延迟必须为 40 毫秒或更短。此处的负载定义为使用硬件视频编解码器并发进行的 1080p 到 720p 纯视频转码会话,以及 1080p 音视频录制初始化。对于杜比视界编解码器,编解码器初始化延迟必须为 50 毫秒或更短。
[5.1/H-1-12] 对于所有硬件视频解码器,在负载下,1080p 或更小视频解码会话的编解码器初始化延迟必须为 40 毫秒或更短。此处的负载定义为使用硬件视频编解码器并发进行的 1080p 到 720p 纯视频转码会话,以及 1080p 音视频播放初始化。对于杜比视界编解码器,编解码器初始化延迟必须为 50 毫秒或更短。
[5.1/H-1-13] 对于所有音频解码器,在负载下,128 kbps 或更低比特率音频解码会话的编解码器初始化延迟必须为 30 毫秒或更短。此处的负载定义为使用硬件视频编解码器并发进行的 1080p 到 720p 纯视频转码会话,以及 1080p 音视频播放初始化。
7.4. 数据连接
-
请参阅修订版本
如果设备实现报告
android.hardware.telephony.calling
功能,则它们 -
请参阅修订版本
如果设备实现报告
android.hardware.telephony.calling
,则它们
9.11. 密钥和凭据
-
请参阅修订版本
通过 IAuthSecret HAL 提供。
删除了 *IAR 将在 Android 14 中成为强制要求。*
2023 年 6 月 26 日
2. 设备类型
-
删除了要求 7.2.3/H-0-5、7.2.3/H-0-6、7.2.3/H-0-7
其他更新
请参阅修订版本
**强烈建议** 遵循 Presence Calibration
Requirements中指定的测量设置步骤。
-
请参阅修订版本
如果 Automotive 设备实现是 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 或更高
3. 软件
-
请参阅修订版本
如果设备实现报告 android.hardware.telephony.calling
,则它们android.hardware.telephony
7. 硬件兼容性
9. 安全模型兼容性
-
请参阅修订版本
设备实现
[C-0-5] **不得** 向
预装应用授予任何运行时权限,除非- 它们在设备出厂时已安装,**并且**
- 在应用使用
它权限 之前可以获得用户的同意,
**或者**
-
- 删除了要求 [C-13-10] 和 9.11.4。
2023 年 3 月 20 日
2. 设备类型
-
请参阅修订版本
如果手持设备实现的设置应用程序使用活动嵌入来实现 分屏功能,那么它们
- [
C-17-13.2.3.1/ H-1-1] 当分屏功能开启时,**必须** 具有一个 Activity 来处理 Settings#ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY intent。该 Activity **必须** 受android.permission.LAUNCH_MULTI_PANE_SETTINGS_DEEP_LINK
保护,并且 **必须** 启动从 Settings#EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_INTENT_URI 解析的 Intent 的 Activity。
新的要求结束
- [
-
请参阅修订版本
如果具有 VP9 硬件解码器的电视设备实现支持 VP9 解码和 UHD 解码配置文件,则它们
- [5.3.7/T-
2-1SR1] **强烈建议** 支持 60 帧/秒的 UHD 解码配置文件,配置文件 2(10 位颜色深度)。
- [5.3.7/T-
-
请参阅修订版本
汽车设备实现
[7.3/A-
0-1SR1] **可以** 通过融合 GPS/GNSS 与其他传感器来航位推算 Location。如果 Location 是航位推算的,则 **强烈建议** 实现和报告使用的相应 Sensor 类型和/或 Vehicle Property IDs。[7.3/A-
0-20-4] 通过 LocationManager#requestLocationUpdates() 请求的 Location **不得** 进行地图匹配。
3. 软件
-
请参阅修订版本
新联系人的**默认帐户:** 联系人提供程序提供 API 来管理创建新联系人时默认帐户的设置。
如果设备实现预加载了联系人应用,则预加载的联系人应用
[C-2-1] **必须** 处理 intent
ContactsContract.Settings.ACTION_SET_DEFAULT_ACCOUNT
以启动用于帐户选择的 UI,并在选择帐户时将设置保存到联系人提供程序。[C-2-2] 在处理
Intent.ACTION_INSERT
和Intent.ACTION_INSERT_OR_EDIT
(针对ContactsContracts.Contacts.CONTENT_TYPE
和ContactsContract.RawContacts.CONTENT_TYPE
)时,**必须** 遵守默认帐户设置,方法是最初选择帐户。
新的要求结束
-
请参阅修订版本
[已移至 2.2.3]
如果设备实现的“设置”应用使用活动嵌入实现了分屏功能,则它们
- [C-17-1] 当分屏功能开启时,**必须** 具有一个 Activity 来处理 Settings#ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY intent。该 Activity **必须** 受
android.permission.LAUNCH_MULTI_PANE_SETTINGS_DEEP_LINK
保护,并且 **必须** 启动从 Settings#EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_INTENT_URI 解析的 Intent 的 Activity。
新的要求结束
- [C-17-1] 当分屏功能开启时,**必须** 具有一个 Activity 来处理 Settings#ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY intent。该 Activity **必须** 受
6. 开发者工具和选项兼容性
-
请参阅修订版本
- Monkey
- [C-0-8] **必须** 包含 Monkey 框架,并使其可供应用使用。
- Monkey
7. 硬件兼容性
-
请参阅修订版本
[已移至 7.4.9]
如果设备实现包含对 802.1.15.4 的支持并将该功能公开给第三方应用,则它们
- [C-1-1] 必须在 android.uwb 中实现相应的 Android API。
- [C-1-2] 必须报告硬件功能标志 android.hardware.uwb。
- [C-1-3] 必须支持 Android 实现中定义的所有相关 UWB 配置文件。
- [C-1-4] 必须提供用户界面以允许用户切换 UWB 无线电的开/关状态。
- [C-1-5] 必须强制执行使用 UWB 无线电的应用持有 UWB_RANGING 权限(在 NEARBY_DEVICES 权限组下)。
- [C-1-6] **强烈建议** 通过标准组织(包括 FIRA、CCC 和 CSA)定义的相关一致性和认证测试。
新的要求结束
-
请参阅修订版本
如果设备实现
包含 GSM 或 CDMA 电话报告android.hardware.telephony
功能,则- [C-6-1]
SmsManager#sendTextMessage
和SmsManager#sendMultipartTextMessage
必须导致对CarrierMessagingService
的相应调用,以提供文本消息功能。SmsManager#sendMultimediaMessage
和SmsManager#downloadMultimediaMessage
必须导致对CarrierMessagingService
的相应调用,以提供多媒体消息功能。 - [C-6-2] 由
android.provider.Telephony.Sms#getDefaultSmsPackage
指定的应用程序在发送和接收 SMS 和 MMS 消息时必须使用 SmsManager API。packages/apps/Messaging 中的 AOSP 参考实现满足此要求。 - [C-6-3] 响应
Intent#ACTION_DIAL
的应用程序必须支持输入格式为*#*#CODE#*#*
的任意拨号器代码,并触发相应的TelephonyManager#ACTION_SECRET_CODE
广播。 - [C-6-4] 响应
Intent#ACTION_DIAL
的应用程序如果支持可视化语音邮件转录,则必须使用VoicemailContract.Voicemails#TRANSCRIPTION
向用户显示可视化语音邮件转录。 - [C-6-5] 必须将具有等效 group UUID 的所有 SubscriptionInfo 表示为单个订阅,在所有显示和控制 SIM 卡信息的用户可见的工具中。此类工具的示例包括与
Settings#ACTION_MANAGE_ALL_SIM_PROFILES_SETTINGS
或EuiccManager#ACTION_MANAGE_EMBEDDED_SUBSCRIPTIONS
匹配的设置界面。 - [C-6-6] 绝不能在任何允许配置或控制 SIM 卡设置的用户可见的工具中显示或允许控制具有非空 group UUID 和 opportunistic bit 的任何 SubscriptionInfo。
如果设备实现
包含 GSM 或 CDMA 电话报告android.hardware.telephony
功能并提供系统状态栏,则- [C-
6-7-1] **必须** 为给定的 group UUID 选择一个有代表性的活动订阅,以便在提供 SIM 卡状态信息的任何工具(例如状态栏蜂窝信号图标或快速设置磁贴)中向用户显示。 - [C-SR-1] 强烈建议将代表性订阅选择为 活动数据订阅,除非设备正在进行语音通话,在这种情况下,强烈建议代表性订阅是活动语音订阅。
如果设备实现
包含 GSM 或 CDMA 电话报告android.hardware.telephony
功能,则- [C-6-
87] **必须** 能够为每个 UICC 打开并同时利用每个 ETSI TS 102 221 的最大逻辑通道数(总共 20 个)。 - [C-6-
108] **不得** 自动或在没有明确用户确认的情况下将以下任何行为应用于活动的运营商应用(由TelephonyManager#getCarrierServicePackageName
指定)- 撤销或限制网络访问
- 撤销权限
- 超出 AOSP 中包含的现有电源管理功能,限制后台或前台应用程序执行
- 禁用或卸载应用程序
如果设备实现
包含 GSM 或 CDMA 电话报告android.hardware.telephony
功能,并且共享 group UUID 的所有活动的、非机会性订阅 都被禁用、从设备中物理移除或标记为机会性订阅,则设备- [C-
78-1] **必须** 自动禁用同一组中所有剩余的活动 机会性 订阅。
如果设备实现包括 GSM 电话功能但不包括 CDMA 电话功能,则它们
- [C-
89-1] **不得** 声明PackageManager#FEATURE_TELEPHONY_CDMA
。 - [C-
89-2] 在尝试在首选或允许的网络类型位掩码中设置任何 3GPP2 网络类型时,**必须** 抛出IllegalArgumentException
。 - [C-
89-3] **必须** 从TelephonyManager#getMeid
返回空字符串。
如果设备实现支持具有多个端口和配置文件的 eUICC,则它们
- [C-
1110-1] **必须** 声明android.hardware.telephony.euicc.mep
功能标志。
- [C-6-1]
-
请参阅修订版本
如果设备实现通过如果设备实现包含对 802.1.15.4 的支持并将该功能公开给第三方应用, 则它们android.content.pm.PackageManager
类报告对功能android.hardware.uwb
的支持,- [C-1-1] 必须在 android.uwb 中实现相应的 Android API。
- [C-1-2] 必须报告硬件功能标志 android.hardware.uwb。
- [C-1-3] 必须支持 Android 实现中定义的所有相关 UWB 配置文件。
- [C-1-4] 必须提供用户界面以允许用户切换 UWB 无线电的开/关状态。
- [C-1-5] 必须强制执行使用 UWB 无线电的应用持有 UWB_RANGING 权限(在 NEARBY_DEVICES 权限组下)。
- [C-SR-1] 强烈建议通过标准组织(包括 FIRA、CCC 和 CSA)定义的相关一致性和认证测试。
- [C-1-
16] **必须** 确保在视线环境中的 1 米距离处,在非反射腔室中,95% 的距离测量值在 +/-15 厘米以内。 - [C-1-
27] **必须** 确保距参考设备 1 米处的距离测量值的中位数在 [0.75 米,1.25 米] 范围内,其中真实距离是从面朝上并倾斜 45 度的 DUT 的顶边测量的。 - [C-SR-2] **强烈建议** 遵循 Presence Calibration Requirements 中指定的测量设置步骤。
**强烈建议** 遵循 Presence Calibration Requirements 中指定的测量设置步骤。新的要求结束
-
请参阅修订版本
为了与使用 USB-C 连接器并在整个 Android 生态系统中实现(USB 音频类)的耳机和其他音频配件兼容,如 Android USB 耳机规范 中所定义的那样。
2022 年 10 月 19 日
2. 设备类型
-
请参阅修订版本
如果手持设备实现未在 锁任务模式 下运行,当内容复制到剪贴板时,它们
- [3.8.17/H-1-1] **必须** 向用户显示确认数据已复制到剪贴板的确认信息(例如,缩略图或“内容已复制。”的警报)。此外,此处还应包含剪贴板数据是否将在设备之间同步的指示。
3. 软件
-
请参阅修订版本
如果设备实现的“设置”应用使用活动嵌入实现了 分屏功能,则它们
- [C-17-1] 当分屏功能开启时,**必须** 具有一个 Activity 来处理 Settings#ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY intent。该 Activity **必须** 受
android.permission.LAUNCH_MULTI_PANE_SETTINGS_DEEP_LINK
保护,并且 **必须** 启动从 Settings#EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_INTENT_URI 解析的 Intent 的 Activity。
如果设备实现支持
VoiceInteractionService
,并且同时安装了多个使用此 API 的应用,则它们- [C-18-1] **必须** 遵守
android.settings.ACTION_VOICE_INPUT_SETTINGS
intent,以显示用于语音输入和辅助功能的默认应用设置菜单。
- [C-17-1] 当分屏功能开启时,**必须** 具有一个 Activity 来处理 Settings#ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY intent。该 Activity **必须** 受
-
请参阅修订版本
- [C-1-4]**必须**在与实例化 WebView 的应用不同的进程中渲染提供的'内容或远程 URL 内容。具体而言,单独的渲染器进程 **必须** 保持较低的权限,以单独的用户 ID 运行,无权访问应用的数据目录,无直接网络访问权限,并且只能通过 Binder 访问最低要求的系统服务。WebView 的 AOSP 实现满足此要求。
7. 硬件兼容性
-
请参阅修订版本
如果设备实现包含对 IEEE 802.11 标准中定义的 Wi-Fi 省电模式的支持,则它们
[C-3-1] 必须应 在应用通过WifiManager.createWifiLock()
和WifiManager.WifiLock.acquire()
获取WIFI_MODE_FULL_HIGH_PERF
锁或WIFI_MODE_FULL_LOW_LATENCY
锁时关闭 Wi-Fi 省电模式
-
请参阅修订版本
如果设备实现包含对蓝牙低功耗 (BLE) 的支持,则它们
- [C-3-5] **必须** 实现不超过 15 分钟的可解析私有地址 (RPA) 超时,并在超时时轮换地址以保护用户隐私,当设备主动使用 BLE 进行扫描或广播时。为了防止定时攻击,超时间隔 **必须** 也在 5 到 15 分钟之间随机化。
请参阅修订版本
如果设备实现具有前置或后置摄像头,则此类相机
- [C-1-1] 必须定向,使相机的长尺寸与屏幕的长尺寸对齐。也就是说,当设备处于横向方向时,相机必须以横向方向捕获图像。这适用于设备的自然方向,即适用于横向主设备以及纵向主设备。
满足以下所有条件的设备可免除上述要求- 设备实现了可变几何形状屏幕,例如可折叠或铰链式显示屏。
- 当设备的折叠或铰链状态改变时,设备会在纵向主方向和横向主方向(或反之亦然)之间切换方向。
新的要求结束
9. 安全模型兼容性
-
请参阅修订版本
当设备实现支持安全锁屏时,它
- [C-1-6] 必须支持 IKeymasterDevice 4.0,IKeymasterDevice 4.1、IKeyMintDevice 版本 1 或 IKeyMintDevice 版本 2。
-
请参阅修订版本
如果设备实现了对 Android 虚拟化框架 API (
android.system.virtualmachine.*
) 的支持,则 Android 主机[C-1-3] **不得** 修改、省略或替换上游 Android 开源项目 (AOSP) 中提供的 system/sepolicy 中的 neverallow 规则,并且策略 **必须** 在所有 neverallow 规则都存在的情况下进行编译。
如果设备实现了对 Android 虚拟化框架 API (
android.system.virtualmachine.*
) 的支持,则任何受保护虚拟机实例[C-2-4] **不得** 修改、省略或替换上游 Android 开源项目 (AOSP) 中提供的 system/sepolicy/microdroid 中的 neverallow 规则。
如果设备实现了对 Android 虚拟化框架 API 的支持,则对于密钥管理
- [C-6-2] 必须正确执行 DICE,即提供正确的值。
但它可能不必深入到那个细节层面。
2022 年 8 月 15 日
2. 设备类型
2.2.1 硬件:硬件要求的更改如下。
输入设备
请参阅修订版本
手持设备实现
- [7.2.3/H-0-5] 当后退手势开始或按下后退按钮 (
KEYCODE_BACK
) 时,必须在当前焦点窗口上调用OnBackInvokedCallback.onBackStarted()
。 - [7.2.3/H-0-6] 当后退手势提交或释放后退按钮 (UP) 时,必须调用
OnBackInvokedCallback.onBackInvoked()
。 - [7.2.3/H-0-7] 当后退手势未提交或
KEYCODE_BACK
事件被取消时,必须调用OnBackInvokedCallback.onBackCancelled()
。
新的要求结束
如果设备通过声明
PackageManager.FEATURE_WIFI_AWARE
支持 Wi-Fi 邻居感知网络 (NAN) 协议,并通过声明PackageManager.FEATURE_WIFI_RTT
支持 Wi-Fi 定位(Wi-Fi 往返时间 - RTT),则它们[7.4.2.5/H-1-1] 必须在 160 MHz 带宽下第 68 个百分位数(使用累积分布函数计算)内准确报告 +/-1 米的范围,在 80 MHz 带宽下第 68 个百分位数内准确报告 +/-2 米,在 40 MHz 带宽下第 68 个百分位数内准确报告 +/-4 米,以及在 20 MHz 带宽下第 68 个百分位数内准确报告 +/-8 米的范围,距离为 10 厘米、1 米、3 米和 5 米,通过 WifiRttManager#startRanging Android API 观察到。
[7.4.2.5/H-SR] 强烈建议在 160 MHz 带宽下第 90 个百分位数(使用累积分布函数计算)内准确报告 +/-1 米的范围,在 80 MHz 带宽下第 90 个百分位数内准确报告 +/-2 米,在 40 MHz 带宽下第 90 个百分位数内准确报告 +/-4 米,以及在 20 MHz 带宽下第 90 个百分位数内准确报告 +/-8 米的范围,距离为 10 厘米,通过 WifiRttManager#startRanging Android API 观察到。
**强烈建议** 遵循 Presence Calibration Requirements 中指定的测量设置步骤。
新的要求结束
- [7.2.3/H-0-5] 当后退手势开始或按下后退按钮 (
音频延迟
请参阅修订版本
如果手持设备实现声明了
android.hardware.audio.output
和android.hardware.microphone
,则它们- [5.6/H-1-1] 必须在 5 次测量中,在 500 毫秒或更短的时间内具有平均连续往返延迟,平均绝对偏差小于 50 毫秒,在 以下数据路径上:“扬声器到麦克风”、3.5 毫米环回适配器(如果支持)、USB 环回(如果支持)。
至少一个支持的路径。
- [5.6/H-1-1] 必须在扬声器到麦克风数据路径上,至少 5 次测量中,具有 500 毫秒或更短的平均点击到音调延迟。
新的要求结束
- [5.6/H-1-1] 必须在 5 次测量中,在 500 毫秒或更短的时间内具有平均连续往返延迟,平均绝对偏差小于 50 毫秒,在 以下数据路径上:“扬声器到麦克风”、3.5 毫米环回适配器(如果支持)、USB 环回(如果支持)。
触感输入
请参阅修订版本
如果手持设备实现包含至少一个触觉致动器,则它们
- [7.10/H]* 不应使用偏心旋转质量 (ERM) 触感致动器(振动器)。
- [7.10/H]* 应将致动器的位置放置在设备通常被手握持或触摸的位置附近。
- [7.10/H]* 应为 清晰触感 实现 android.view.HapticFeedbackConstants 中的所有公共常量,即 (CLOCK_TICK、CONTEXT_CLICK、KEYBOARD_PRESS、KEYBOARD_RELEASE、KEYBOARD_TAP、LONG_PRESS、TEXT_HANDLE_MOVE、VIRTUAL_KEY、VIRTUAL_KEY_RELEASE、CONFIRM、REJECT、GESTURE_START 和 GESTURE_END)。
- [7.10/H]* 应为 清晰触感 实现 android.os.VibrationEffect 中的所有公共常量,即 (EFFECT_TICK、EFFECT_CLICK、EFFECT_HEAVY_CLICK 和 EFFECT_DOUBLE_CLICK) 以及 丰富触感 中 android.os.VibrationEffect.Composition 的所有 可行的公共
PRIMITIVE_*
常量,即(PRIMITIVE_CLICK 和 PRIMITIVE_TICK)(CLICK、TICK、LOW_TICK、QUICK_FALL、QUICK_RISE、SLOW_RISE、SPIN、THUD)。如果振动器可以支持相对较低的频率,则某些基元(例如 LOW_TICK 和 SPIN)可能才可行。
- [7.10/H]* **应该**遵循 映射公共常量的指南,将 android.view.HapticFeedbackConstants 中的公共常量映射到推荐的 android.os.VibrationEffect 常量,并具有相应的振幅关系。
新的要求结束
- [7.10/H]* 应验证公共 android.os.Vibrator.hasAmplitudeControl() API 的结果是否正确反映了其振动器的功能。
新的要求结束
- [7.10/H]* 应通过运行 android.os.Vibrator.hasAmplitudeControl() 来验证幅度可扩展性的功能。
如果手持设备实现包含至少一个线性谐振致动器,则它们
-
Auth Trivial Device Cotntrols
请参阅修订版本
- [3.8.16/H-1-5] 必须提供用户界面来选择退出应用指定的、由第三方应用程序通过
ControlsProviderService
和Control
Control.isAuthRequired
API 注册的、无需身份验证的设备控件。
- [3.8.16/H-1-5] 必须提供用户界面来选择退出应用指定的、由第三方应用程序通过
MediaStyle 通知
请参阅修订版本
如果手持设备实现支持 MediaStyle 通知,则它们
- [3.8.3.1/H-1-SR] 强烈建议提供可从系统 UI 访问的用户界面(例如“输出切换器”),当应用发布带有 MediaSession 令牌 的 MediaStyle 通知时,允许用户在适当的可用媒体路由(例如,蓝牙设备和提供给 MediaRouter2Manager 的路由)之间切换。
2.2.4 性能和电源:针对运行前台服务的应用的新要求。
请参阅修订版本
手持设备实现
- [8.5/H-0-1] 必须在“设置”菜单中提供用户界面,以便能够停止正在运行前台服务的应用,并显示所有具有活动前台服务的应用以及自服务启动以来每个服务的持续时间,如 SDK 文档 中所述。
- 某些应用程序**可以**被豁免停止或列在此类用户操作界面中,如 SDK 文档中所述。
新的要求结束
- [8.5/H-0-1] 必须在“设置”菜单中提供用户界面,以便能够停止正在运行前台服务的应用,并显示所有具有活动前台服务的应用以及自服务启动以来每个服务的持续时间,如 SDK 文档 中所述。
2.2.7.1 媒体:对手持设备要求媒体部分进行的更新如下
请参阅修订版本
如果手持设备实现为
android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
返回android.os.Build.VERSION_CODES.T
,则它们- [5.1/H-1-1] 必须通过
CodecCapabilities.getMaxSupportedInstances()
和VideoCapabilities.getSupportedPerformancePoints()
方法通告可以在任何编解码器组合中并发运行的最大硬件视频解码器会话数。 - [5.1/H-1-2] 必须支持 6 个硬件视频解码器会话实例(AVC、HEVC、VP9、AV1 或更高版本),这些实例可以在任何编解码器组合中以 1080p 分辨率 @ 30 fps 的速度并发运行。
- [5.1/H-1-3] 必须通过
CodecCapabilities.getMaxSupportedInstances()
和VideoCapabilities.getSupportedPerformancePoints()
方法通告可以在任何编解码器组合中并发运行的最大硬件视频编码器会话数。 - [5.1/H-1-4] 必须支持 6 个硬件视频编码器会话实例(AVC、HEVC、VP9、AV1 或更高版本),这些实例可以在任何编解码器组合中以 1080p 分辨率 @ 30fps 的速度并发运行。
- [5.1/H-1-5] 必须通过
CodecCapabilities.getMaxSupportedInstances()
和VideoCapabilities.getSupportedPerformancePoints()
方法通告可以在任何编解码器组合中并发运行的最大硬件视频编码器和解码器会话数。 - [5.1/H-1-6] 必须支持 6 个硬件视频解码器和硬件视频编码器会话实例(AVC、HEVC、VP9、AV1 或更高版本),这些实例可以在任何编解码器组合中以 1080p@30fps 分辨率并发运行。
- [5.1/H-1-7] 对于所有硬件视频编码器,当负载下进行 1080p 或更小视频编码会话时,必须具有 40 毫秒或更短的编解码器初始化延迟。此处的负载定义为使用硬件视频编解码器同时进行的 1080p 到 720p 纯视频转码会话,以及 1080p 音视频录制初始化。
- [5.1/H-1-8] 对于所有音频编码器,在负载下,128 kbps 或更低比特率音频编码会话的编解码器初始化延迟必须为 30 毫秒或更短。此处的负载定义为使用硬件视频编解码器并发进行的 1080p 到 720p 纯视频转码会话,以及 1080p 音视频录制初始化。
- [5.1/H-1-9] 必须支持 2 个安全硬件视频解码器会话实例(AVC、HEVC、VP9、AV1 或更高版本),这些实例可以在任何编解码器组合中以 1080p 分辨率 @ 30 fps 的速度并发运行。
- [5.1/H-1-10] 必须支持 3 个非安全硬件视频解码器会话实例和 1 个安全硬件视频解码器会话实例(总共 4 个实例)(AVC、HEVC、VP9、AV1 或更高版本),这些实例可以在任何编解码器组合中以 1080p 分辨率 @ 30fps 的速度并发运行。
- [5.1/ H-1-11] 设备上的每个硬件 AVC、HEVC、VP9 或 AV1 解码器都必须支持安全解码器。
- [5.1/H-1-12] 必须具有 40 毫秒或更短的视频解码器初始化延迟。
- [5.1/H-1-13] 必须具有 30 毫秒或更短的音频解码器初始化延迟。
- [5.1/H-1-14] 必须支持 AV1 硬件解码器 Main 10,Level 4.1。
- [5.1/H-SR] 强烈建议支持 AV1 硬件解码器的胶片颗粒。
- [5.1/H-1-15] 必须至少有 1 个支持 4K60 的硬件视频解码器。
- [5.1/H-1-16] 必须至少有 1 个支持 4K60 的硬件视频编码器。
- [5.3/H-1-1] 在负载下,对于 1080p 60 fps 视频会话,每 10 秒不得丢帧超过 1 帧(即,丢帧率低于 0.167%)。负载定义为使用硬件视频编解码器并发进行的 1080p 到 720p 纯视频转码会话,以及 128 kbps AAC 音频播放。
- [5.3/H-1-2] 在负载下,在 60 fps 视频会话中进行视频分辨率更改期间,每 10 秒不得丢帧超过 1 帧。负载定义为使用硬件视频编解码器并发进行的 1080p 到 720p 纯视频转码会话,以及 128 kbps AAC 音频播放。
- [5.6/H-1-1] 使用 OboeTester 点击到音调测试或 CTS Verifier 点击到音调测试,点击到音调的延迟必须为 80 毫秒或更短。
- [5.6/H-1-2] 在至少一条受支持的数据路径上,往返音频延迟必须为 80 毫秒或更短。
- [5.6/H-1-3] 如果存在 3.5 毫米音频插孔,并且如果通过整个数据路径支持 USB 音频以实现低延迟和流式传输配置,则必须支持 >=24 位音频的立体声输出。对于低延迟配置,应用应在低延迟回调模式下使用 AAudio。对于流式传输配置,应用应使用 Java AudioTrack。在低延迟和流式传输配置中,HAL 输出接收器应接受
AUDIO_FORMAT_PCM_24_BIT
、AUDIO_FORMAT_PCM_24_BIT_PACKED
、AUDIO_FORMAT_PCM_32_BIT
或AUDIO_FORMAT_PCM_FLOAT
作为其目标输出格式。 - [5.6/H-1-4] 必须支持 >=4 声道 USB 音频设备(DJ 控制器使用此功能来预览歌曲。)
- [5.6/H-1-5] 必须支持类兼容 MIDI 设备并声明 MIDI 功能标志。
- [5.7/H-1-2] 必须支持具有以下内容解密功能的
MediaDrm.SECURITY_LEVEL_HW_SECURE_ALL
。
最小样本大小 4 MiB 最小子样本数 - H264 或 HEVC 32 最小子样本数 - VP9 9 最小子样本数 - AV1 288 最小子样本缓冲区大小 1 MiB 最小通用加密缓冲区大小 500 KiB 最小并发会话数 30 每个会话的最小密钥数 20 最小密钥总数(所有会话) 80 最小 DRM 密钥总数(所有会话) 6 消息大小 16 KiB 每秒解密帧数 60 fps 新的要求结束
- [5.1/H-1-1] 必须通过
2.2.7.2 相机:对媒体性能等级相机要求的更新。
请参阅修订版本
如果手持设备实现为
android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
返回android.os.Build.VERSION_CODES.T
,则它们- [7.5/H-1-1] 必须配备分辨率至少为 12 兆像素的主后置摄像头,并支持 4k@30fps 视频拍摄。主后置摄像头是摄像头 ID 最低的后置摄像头。
- [7.5/H-1-2] 必须配备分辨率至少为 5 兆像素的主前置摄像头,并支持 1080p@30fps 视频拍摄。主前置摄像头是摄像头 ID 最低的前置摄像头。
- [7.5/H-1-3] 对于主摄像头和辅助摄像头,必须支持
android.info.supportedHardwareLevel
属性为FULL
或更高。 - [7.5/H-1-4] 对于两个主摄像头,都必须支持
CameraMetadata.SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME
。 - [7.5/H-1-5] 对于两个主摄像头,在 ITS 照明条件 (3000K) 下,CTS 摄像头性能测试测得的 1080p 分辨率下,camera2 JPEG 拍摄延迟必须 < 1000 毫秒。
- [7.5/H-1-6] 对于两个主摄像头,在 ITS 照明条件 (3000K) 下,CTS 摄像头性能测试测得的 camera2 启动延迟(打开摄像头到第一帧预览帧)必须 < 500 毫秒。
- [7.5/H-1-8] 对于后置主摄像头,必须支持
CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_RAW
和android.graphics.ImageFormat.RAW_SENSOR
。 - [7.5/H-1-9] 必须配备支持 720p 或 1080p @ 240fps 的后置主摄像头。
- [7.5/H-1-10] 如果有朝向同一方向的超广角 RGB 摄像头,则主摄像头的最小 ZOOM_RATIO 必须 < 1.0。
- [7.5/H-1-11] 必须实现主摄像头上的前后并发流式传输。
- [7.5/H-1-12] 对于主前置和主后置摄像头,必须支持
CONTROL_VIDEO_STABILIZATION_MODE_PREVIEW_STABILIZATION
。 - [7.5/H-1-13] 如果有多个 RGB 摄像头朝向同一方向,则主摄像头必须支持
LOGICAL_MULTI_CAMERA
功能。 - [7.5/H-1-14] 对于前置主摄像头和后置主摄像头,都必须支持
STREAM_USE_CASE
功能。
新的要求结束
2.2.7.3 硬件:对媒体性能等级硬件要求的更新。
请参阅修订版本
如果手持设备实现为
android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
返回android.os.Build.VERSION_CODES.T
,则它们- [7.1.1.1/H-2-1] 必须具有至少 1080p 的屏幕分辨率。
- [7.1.1.3/H-2-1] 必须具有至少 400 dpi 的屏幕密度。
- [7.6.1/H-2-1] 必须具有至少 8 GB 的物理内存。
新的要求结束
2.2.7.4 性能:对媒体性能等级性能的更新。
请参阅修订版本
如果手持设备实现为
android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
返回android.os.Build.VERSION_CODES.T
,则它们- [8.2/H-1-1] 必须确保至少 125 MB/s 的顺序写入性能。
- [8.2/H-1-2] 必须确保至少 10 MB/s 的随机写入性能。
- [8.2/H-1-3] 必须确保至少 250 MB/s 的顺序读取性能。
- [8.2/H-1-4] 必须确保至少 40 MB/s 的随机读取性能。
新的要求结束
2.5.1 硬件:对 3 轴加速度计和 3 轴陀螺仪要求以及外部视图摄像头要求的更新。
请参阅修订版本
汽车设备实现
- [7.3.1/A-0-4] 必须符合 Android 汽车传感器坐标系。
- [7.3/A-SR] 强烈建议包含 3 轴加速度计和 3 轴陀螺仪。
- [7.3/A-SR] 强烈建议实现并报告
TYPE_HEADING
传感器。
如果汽车设备实现包含加速度计,则它们
- [7.3.1/A-1-1] 必须能够以至少 100 Hz 的频率报告事件。
如果设备实现包含 3 轴加速度计,则它们
- [7.3.1/A-SR] 强烈建议为有限轴加速度计实现复合传感器。
如果汽车设备实现包含轴数少于 3 轴的加速度计,则它们
- [7.3.1/A-1-3] 必须实现并报告
TYPE_ACCELEROMETER_LIMITED_AXES
传感器。 - [7.3.1/A-1-4] 必须实现并报告
TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED
传感器。
如果汽车设备实现包含陀螺仪,则它们
- [7.3.4/A-2-1] 必须能够以至少 100 Hz 的频率报告事件。
- [7.3.4/A-2-3] 必须能够测量高达每秒 250 度的方向变化。
- [7.3.4/A-SR] 强烈建议将陀螺仪的测量范围配置为 +/-250dps,以便最大限度地提高可能的分辨率。
新的要求结束
如果汽车设备实现包含 3 轴陀螺仪,则它们
- [7.3.4/A-SR] 强烈建议为有限轴陀螺仪实现复合传感器。
如果汽车设备实现包含轴数少于 3 轴的陀螺仪,则它们
- [7.3.4/A-4-1] 必须实现并报告
TYPE_GYROSCOPE_LIMITED_AXES
传感器。 - [7.3.4/A-4-2] 必须实现并报告
TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED
传感器。
如果汽车设备实现包含
TYPE_HEADING
传感器,则它们- [7.3.4/A-4-3] 必须能够以至少 1 Hz 的频率报告事件。
- [7.3.4/A-SR] 强烈建议以至少 10 Hz 的频率报告事件。
- 应该参考正北方向。
- 应该即使在车辆静止时也可用。
- 应该具有至少 1 度的分辨率。
新的要求结束
外部视图摄像头是一种对设备实施外部场景成像的摄像头,例如后视摄像头
行车记录仪。如果汽车设备实现包含外部视图摄像头,则对于此类摄像头,它们
[7.5.5/A-SR] 强烈建议将其方向设置为使摄像头的长尺寸与水平线对齐。应支持 Android 同步框架。可以在摄像头驱动程序中实现硬件自动对焦或软件自动对焦。
如果汽车设备实现包含一个或多个外部视图摄像头,并加载外部视图系统 (EVS) 服务,则对于此类摄像头,它们
- [7.5/A-2-1] 不得旋转或水平镜像摄像头预览。
汽车设备实现
- 可以包含一个或多个可供第三方应用程序使用的摄像头。
如果汽车设备实现包含至少一个摄像头并使其可供第三方应用程序使用,则它们
- [7.5/A-3-1] 必须报告功能标志
android.hardware.camera.any
。 - [7.5/A-3-2] 不得将摄像头声明为 系统摄像头。
- 可以支持 第 7.5.3 节 中描述的外部摄像头。
- 可以包含 第 7.5.1 节 中描述的后置摄像头可用的功能(例如,自动对焦等)。
新的要求结束
2.5.5 安全模型:汽车设备相机权限的新要求。
请参阅修订版本
2.6.1 平板电脑要求 — 硬件:平板电脑屏幕尺寸要求的更新。
请参阅修订版本
**Android 平板电脑设备**是指通常满足以下所有条件的 Android 设备实现
- 屏幕显示尺寸大于 7 英寸且小于 18 英寸,以对角线测量。
屏幕尺寸
- [7.1.1.1/Tab-0-1] 必须具有 7 到 18 英寸范围内的屏幕。
3. 软件
3.2.2 构建参数:
getSerial()
中更新的 ASCII 字符。请参阅修订版本
- [C-0-1] 为了在设备实现中提供一致且有意义的值,下表包含对设备实现**必须**符合的这些值的格式的其他限制。
参数 详细信息 getSerial() 必须(是或返回)硬件序列号,该序列号必须在具有相同型号和制造商的设备之间可用且唯一。此字段的值必须可编码为 7 位 ASCII,并且与正则表达式 “^[a-zA-Z0-9]+$” 匹配。 3.2.3.5 条件应用程序 Intent:对条件应用程序 Intent 要求的更新。
请参阅修订版本
如果设备实现包括大显示屏(通常显示屏宽度和高度为 600dp+)并支持 拆分功能,则它们
- [C-17-1] 当分屏功能开启时,**必须** 具有一个 Activity 来处理 Settings#ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY intent。该 Activity **必须** 受
android.permission.LAUNCH_MULTI_PANE_SETTINGS_DEEP_LINK
保护,并且 **必须** 启动从 Settings#EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_INTENT_URI 解析的 Intent 的 Activity。
新的要求结束
- [C-17-1] 当分屏功能开启时,**必须** 具有一个 Activity 来处理 Settings#ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY intent。该 Activity **必须** 受
3.5.1 应用程序限制:对应用程序限制的更新。
请参阅修订版本
如果设备实现实现了限制应用程序的专有机制(例如,更改或限制 SDK 中描述的 API 行为),并且该机制比 受限应用待机存储分区 更严格,则它们
- [C-1-1] **必须** 允许用户查看受限应用列表。
- [C-1-2] **必须** 提供用户操作界面,以针对每个应用开启/关闭所有这些专有限制。
- [C-1-3] **不得** 在没有系统运行状况不佳行为的证据的情况下自动应用这些专有限制,但可以根据对卡住的唤醒锁、长时间运行的服务和其他标准等系统运行状况不佳行为的检测来应用限制。这些标准可以由设备实现者确定,但**必须**与应用对系统运行状况的影响相关。其他与系统运行状况纯粹无关的标准,例如应用在市场中的受欢迎程度不足,**不得**用作标准。
- [C-1-4] 当用户手动关闭应用限制时,**不得** 自动应用这些专有限制,并且可以建议用户应用这些专有限制。
[C-1-5] 如果自动将这些专有限制应用于应用,**必须** 通知用户。此类信息**必须**在应用这些专有限制之前的 24 小时内提供。
[C-1-6] **必须** 为来自应用的任何 API 调用,为 ActivityManager.isBackgroundRestricted() 方法返回 true。
[C-1-7] **不得** 限制用户明确使用的顶部前台应用。
[C-1-8] 每当用户开始明确使用应用并使其成为顶部前台应用时,**必须** 暂停对该应用的这些专有限制。
[C-1-9] 必须通过 UsageStats 报告所有这些专有限制事件。
[C-1-10] **必须** 提供一份公开且清晰的文档或网站,描述如何应用专有限制。此文档或网站**必须**可从 Android SDK 文档链接,并且**必须**包含
- 专有限制的触发条件。
- 可以限制哪些应用以及如何限制。
- 应用如何免除此类限制。
- 应用如何请求免除专有限制(如果它们支持为此类用户可以安装的应用提供豁免)。
如果某个应用预装在设备上,并且用户从未明确使用超过 30 天,则可以免除 [C-1-3] 和 [C-1-5]。
新的要求结束
3.8.1 启动器(主屏幕):更新以支持
monochrome/adaptive-icon
。请参阅修订版本
3.8.2 小部件:更新启动器中小部件的存在。
请参阅修订版本
如果设备实现支持第三方应用小部件,则它们
- [C-1-2] 必须包含对 AppWidget 的内置支持,并公开用户界面,以便在
启动器内直接添加、配置、查看和移除 AppWidget。
- [C-1-2] 必须包含对 AppWidget 的内置支持,并公开用户界面,以便在
3.8.3.1 通知的呈现:澄清浮动通知的定义。
请参阅修订版本
浮动通知是指当用户正在操作某个表面时,独立于该表面而呈现给用户的通知。
3.8.3.3 DND(请勿打扰)/ 优先模式:更新以在 DND(请勿打扰)要求中包含优先模式。
请参阅修订版本
3.8.3.3. DND(请勿打扰)/ 优先模式
如果设备实现支持 DND 功能(也称为优先模式),则它们
3.8.6 主题:动态颜色色调调色板的新要求。
请参阅修订版本
如果设备实现包含屏幕或视频输出,则它们
[C-1-4] 必须按照
Settings.THEME_CUSTOMIZATION_OVERLAY_PACKAGES
的 AOSP 文档(参见android.theme.customization.system_palette
和android.theme.customization.theme_style
)中的规定生成动态颜色色调调色板。[C-1-5] 必须使用
Settings.THEME_CUSTOMIZATION_OVERLAY_PACKAGES
文档(参见android.theme.customization.theme_styles
)中枚举的颜色主题样式生成动态颜色色调调色板,即TONAL_SPOT
、VIBRANT
、EXPRESSIVE
、SPRITZ
、RAINBOW
、FRUIT_SALAD
。当与
android.theme.customization.system_palette
一起发送时(如Settings.THEME_CUSTOMIZATION_OVERLAY_PACKAGES
中所述),用于生成动态颜色色调调色板的“源颜色”。[C-1-6] 必须具有大于或等于 5 的
CAM16
色度值。应该通过
com.android.systemui.monet.ColorScheme#getSeedColors
从壁纸派生,这提供了多个有效的源颜色可供选择。如果提供的颜色均不满足上述源颜色要求,则应该使用值
0xFF1B6EF3
。
新的要求结束
3.8.17 剪贴板:为剪贴板上的内容添加了新的要求部分。
请参阅修订版本
3.8.17. 剪贴板
设备实现
- [C-0-1] 未经用户明确操作(例如,按下叠加层上的按钮),不得将剪贴板数据发送到任何组件、活动、服务或跨任何网络连接,但 9.8.6 内容捕获和应用搜索 中提及的服务除外。
如果设备实现在内容复制到剪贴板时为任何
ClipData
项生成用户可见的预览,其中ClipData.getDescription().getExtras()
包含android.content.extra.IS_SENSITIVE
,则它们- [C-1-1] 必须编辑用户可见的预览
AOSP 参考实现满足这些剪贴板要求。
新的要求结束
3.9.1.1 设备所有者配置:设备所有者配置要求的更新。
请参阅修订版本
如果设备实现声明
android.software.device_admin
,则它们- [C-1-1] 必须支持将设备策略客户端 (DPC) 注册为 设备所有者应用,如下所述
- 当设备实现既没有用户也没有配置用户数据时,它
- [C-1-5] 如果设备通过功能标志
android.hardware.nfc
声明支持近场通信 (NFC) 并接收包含 MIME 类型为MIME_TYPE_PROVISIONING_NFC
的记录的 NFC 消息,则必须将 DPC 应用程序注册为设备所有者应用或使 DPC 应用程序能够选择是成为设备所有者还是个人资料所有者。 - [C-1-8] 设备所有者配置触发后,必须发送 ACTION_GET_PROVISIONING_MODE Intent,以便 DPC 应用程序可以选择是成为设备所有者还是个人资料所有者,具体取决于
android.app.extra.PROVISIONING_ALLOWED_PROVISIONING_MODES
的值,除非可以从上下文中确定只有一个有效的选项。(例如,对于不支持个人资料所有者配置的基于 NFC 的配置)。 - [C-1-9] 无论使用哪种配置方法,如果在配置期间建立了设备所有者,则必须向设备所有者应用发送 ACTION_ADMIN_POLICY_COMPLIANCE Intent。在设备所有者应用完成之前,用户不得在设置向导中继续操作。
- [C-1-5] 如果设备通过功能标志
- 当设备实现具有用户或用户数据时,它
- [C-1-7] 不得再将任何 DPC 应用注册为设备所有者应用。
- 当设备实现既没有用户也没有配置用户数据时,它
- [C-1-2] 必须显示适当的披露通知(例如 AOSP 中引用的通知),并在将应用设置为设备所有者之前获得最终用户的肯定同意,除非设备在屏幕上的最终用户交互之前以编程方式配置为 零售演示模式。
在配置过程中或之前需要采取一些肯定措施,以同意将应用设置为设备所有者。同意可以通过用户操作或通过某些编程方式获得,但在启动设备所有者配置之前,必须显示适当的披露通知(如 AOSP 中引用的通知)。此外,企业用于设备所有者配置的编程设备所有者同意机制不得干扰非企业用户的开箱即用体验。 [C-1-3] 不得硬编码同意或阻止使用其他设备所有者应用。
如果设备实现声明
android.software.device_admin
,但也包含专有的设备所有者设备管理解决方案,并提供一种机制来将他们的解决方案中配置的应用程序提升为“设备所有者等效项”,使其成为标准 Android DevicePolicyManager API 识别的标准“设备所有者”,则它们- [C-2-1] 必须制定流程来验证要提升的特定应用是否属于合法的企业设备管理解决方案,并且已在专有解决方案中配置为具有与“设备所有者”等效的权限。
- [C-2-2] 必须在将 DPC 应用注册为“设备所有者”之前,显示与
android.app.action.PROVISION_MANAGED_DEVICE
发起的流程相同的 AOSP 设备所有者同意披露声明。 - [C-2-3] 不得硬编码同意,也不得阻止使用其他设备所有者应用。
可以在将 DPC 应用程序注册为“设备所有者”之前,在设备上拥有用户数据。
- [C-1-1] 必须支持将设备策略客户端 (DPC) 注册为 设备所有者应用,如下所述
3.9.4 设备管理角色要求:添加了设备管理角色要求部分。
请参阅修订版本
3.9.4 设备策略管理角色要求
如果设备实现报告
android.software.device_admin
或android.software.managed_users
,则它们- [C-1-1] 必须支持 第 9.1 节 中定义的设备策略管理角色。持有设备策略管理角色的应用可以通过将
config_devicePolicyManagement
设置为软件包名称来定义。软件包名称后必须跟:
和签名证书,除非该应用已预加载。
如果未如上所述为
config_devicePolicyManagement
定义软件包名称- [C-2-1] 设备实现必须支持在没有设备策略管理角色持有者应用的情况下进行配置(AOSP 提供了参考实现)。
如果如上所述为
config_devicePolicyManagement
定义了软件包名称- [C-3-1] 该应用必须安装在 用户 的所有个人资料上。
- [C-3-2] 设备实现可以定义一个应用,该应用通过设置
config_devicePolicyManagementUpdater
在配置之前更新设备策略管理角色持有者。
如果如上所述为
config_devicePolicyManagementUpdater
定义了软件包名称- [C-4-1] 该应用必须预装在设备上。
- [C-4-2] 该应用必须实现一个 Intent 过滤器,该过滤器解析
android.app.action.UPDATE_DEVICE_POLICY_MANAGEMENT_ROLE_HOLDER
。
新的要求结束
- [C-1-1] 必须支持 第 9.1 节 中定义的设备策略管理角色。持有设备策略管理角色的应用可以通过将
3.18 联系人:添加了有关新联系人的信息。
请参阅修订版本
新联系人的**默认帐户:** 联系人提供程序提供 API 来管理创建新联系人时默认帐户的设置。
如果设备实现预加载了联系人应用,则预加载的联系人应用
[C-2-1] **必须** 处理 intent
ContactsContract.Settings.ACTION_SET_DEFAULT_ACCOUNT
以启动用于帐户选择的 UI,并在选择帐户时将设置保存到联系人提供程序。[C-2-2] 在处理
Intent.ACTION_INSERT
和Intent.ACTION_INSERT_OR_EDIT
(针对ContactsContracts.Contacts.CONTENT_TYPE
和ContactsContract.RawContacts.CONTENT_TYPE
)时,**必须** 遵守默认帐户设置,方法是最初选择帐户。
新的要求结束
4. 应用封装兼容性
4. 应用程序打包兼容性:APK 签名方案版本更新。
请参阅修订版本
设备实现
[C-0-2] 必须支持使用 APK 签名方案 v3.1、APK 签名方案 v3、APK 签名方案 v2 和 JAR 签名验证“.apk”文件。
[C-0-9] 必须支持使用 APK 签名方案 v4 和 APK 签名方案 v4.1 验证 .apk 文件。
5. 多媒体兼容性
5.1.2 音频解码:为能够输出多通道音频的解码器添加了新要求。
请参阅修订版本
如果设备实现支持通过
android.media.MediaCodec
API 中的默认 AAC 音频解码器将多声道流(即超过两个声道)的 AAC 输入缓冲区解码为 PCM,则必须支持以下内容- [C-7-1] 必须能够通过应用程序使用密钥
KEY_MAX_OUTPUT_CHANNEL_COUNT
进行解码配置,以控制内容是下混为立体声(当使用值 2 时)还是使用原生声道数输出(当使用等于或大于该声道数的值时)。例如,当输入 5.1 内容时,值 6 或更大将配置解码器输出 6 个声道。 - [C-7-2] 解码时,解码器必须使用
KEY_CHANNEL_MASK
密钥在输出格式上公布正在使用的声道掩码,并使用android.media.AudioFormat
常量(示例:CHANNEL_OUT_5POINT1
)。
如果设备实现支持除默认 AAC 音频解码器之外的其他音频解码器,并且能够在输入压缩多声道内容时输出多声道音频(即超过 2 个声道),则
- [C-SR] 强烈建议解码器能够由应用程序使用解码和密钥
KEY_MAX_OUTPUT_CHANNEL_COUNT
进行配置,以控制内容是下混为立体声(当使用值 2 时)还是使用本机通道数输出(当使用等于或大于该数字的值时)。例如,值 6 或更大将配置解码器在馈送 5.1 内容时输出 6 个通道。 - [C-SR] 解码时,强烈建议解码器使用
KEY_CHANNEL_MASK
密钥在输出格式上通告正在使用的通道掩码,使用 android.media.AudioFormat 常量(示例:CHANNEL_OUT_5POINT1
)。
新的要求结束
- [C-7-1] 必须能够通过应用程序使用密钥
5.4.1 原始音频捕获和麦克风信息:更新了音频输入流的受支持音频源。
请参阅修订版本
如果设备实现声明
android.hardware.microphone
,则[C-1-1] 必须允许捕获具有以下特征的原始音频内容,对于任何成功打开的
AudioRecord
或AAudio
INPUT 流。至少必须支持以下特性- 格式:线性 PCM,16 位
- 采样率:8000、11025、16000、44100、48000 Hz
- 声道:单声道
- 音频源:
DEFAULT
、MIC
、CAMCORDER
、VOICE_RECOGNITION
、VOICE_COMMUNICATION
、UNPROCESSED
或VOICE_PERFORMANCE
。这也适用于AAudio
中的等效输入预设,例如AAUDIO_INPUT_PRESET_CAMCORDER
。 - [C-1-4] 必须遵守
MicrophoneInfo
API,并正确填写设备上可通过AudioManager.getMicrophones()
API 供第三方应用程序访问的可用麦克风的信息,对于使用MediaRecorder.AudioSources DEFAULT
、MIC
、CAMCORDER
、VOICE_RECOGNITION
、VOICE_COMMUNICATION
、UNPROCESSED
或VOICE_PERFORMANCE
的活动 AudioRecord。以及当前活动的、可通过AudioRecord.getActiveMicrophones()
和MediaRecorder.getActiveMicrophones()
API 供第三方应用程序访问的麦克风。
5.4.2 语音识别捕获:更新了语音识别音频流的要求,并添加了麦克风增益级别的要求。
请参阅修订版本
如果设备实现声明
android.hardware.microphone
,则- 应记录具有近似平坦幅度与频率特性的语音识别音频流:具体而言,在 100 Hz 到 4000 Hz 范围内为 ±3 dB。
- 应记录语音识别音频流,输入灵敏度设置为使 1000 Hz 频率下的 90 dB 声功率级 (SPL) 源产生 16 位采样的 2500 RMS。
- 对于用于录制语音识别音频源的每个麦克风,应该在中频范围内展现大致平坦的幅度-频率特性:具体而言,100 Hz 到 4000 Hz 的范围内为 ±3dB。
- [C-SR] 强烈建议在低频范围内表现出幅度水平:具体而言,与用于记录语音识别音频源的每个麦克风的中频范围相比,在 30 Hz 到 100 Hz 范围内为 ±20 dB。
- [C-SR] 强烈建议在高频范围内表现出幅度水平:具体而言,与用于记录语音识别音频源的每个麦克风的中频范围相比,在 4000 Hz 到 22 KHz 范围内为 ±30 dB。
- 应该设置音频输入灵敏度,使得以 90 dB 声压级 (SPL)(在麦克风旁边测量)播放的 1000 Hz 正弦波音源对于 16 位采样产生 RMS 2500 的理想响应,范围在 1770 到 3530 之间(或者对于浮点/双精度采样,为 -22.35 db ±3dB 满量程),适用于用于录制语音识别音频源的每个麦克风。
新的要求结束
5.4.6 麦克风增益级别:将麦克风增益级别的要求移至 5.4.2 节。
请参阅修订版本
5.4.6. 麦克风增益级别 [已移至 5.4.2]
如果设备实现声明
android.hardware.microphone
,则- 对于用于录制语音识别音频源的每个麦克风,应该在中频范围内展现大致平坦的幅度-频率特性:具体而言,100 Hz 到 4000 Hz 的范围内为 ±3dB。
- [C-SR] 强烈建议在低频范围内表现出幅度水平:具体而言,与用于记录语音识别音频源的每个麦克风的中频范围相比,在 5 Hz 到 100 Hz 范围内为 ±20 dB。
- [C-SR] 强烈建议在高频范围内表现出幅度水平:具体而言,与用于记录语音识别音频源的每个麦克风的中频范围相比,在 4000 Hz 到 22 KHz 范围内为 ±30 dB。
- 应设置音频输入灵敏度,使得以 90 dB 声压级 (SPL) 播放的 1000 Hz 正弦波音调源为用于记录语音识别音频源的每个麦克风产生 16 位采样 RMS 为 2500(或浮点/双精度采样的 -22.35 dB 满量程)的响应。
5.5.4 音频卸载:音频卸载播放要求的更新。
请参阅修订版本
如果设备实现支持 音频卸载播放,则
- [C-SR] 强烈建议在 AudioTrack 无缝 API 和 MediaPlayer 的媒体容器指定时,修剪两个具有相同格式的片段之间播放的无缝音频内容。
5.6 音频延迟:音频延迟要求的更新。
请参阅修订版本
就本节而言,请使用以下定义
- 冷输出抖动。冷输出延迟值的不同测量值之间的变异性。
- 冷输入抖动。冷输入延迟值的不同测量值之间的变异性。
如果设备实现声明
android.hardware.audio.output
,则它们必须满足或超过以下要求- [C-1-2] 冷输出延迟为 500 毫秒或更短。
- [C-1-3] 使用
AAudioStreamBuilder_openStream()
打开输出流的时间必须少于 1000 毫秒。
如果设备实现声明
android.hardware.audio.output
,则强烈建议它们满足或超过以下要求- [C-SR] 扬声器数据路径上的冷输出延迟为 100 毫秒或更短。
运行此 Android 版本的新设备和现有设备现在强烈建议满足这些要求。在未来的平台版本中,我们将要求冷输出延迟为 200 毫秒或更短作为必须项。 [C-SR] 尽量减少冷输出抖动。
如果设备实现包括
android.hardware.microphone
,则它们必须满足这些输入音频要求- [C-3-2] 冷输入延迟为 500 毫秒或更短。
- [C-3-3] 使用
AAudioStreamBuilder_openStream()
打开输入流的时间必须少于 1000 毫秒。
如果设备实现包括
android.hardware.microphone
,则强烈建议它们满足这些输入音频要求- [C-SR] 麦克风数据路径上的冷输入延迟为 100 毫秒或更短。
运行此 Android 版本的新设备和现有设备现在强烈建议满足这些要求。在未来的平台版本中,我们将要求冷输入延迟为 200 毫秒或更短作为必须项。
- [C-SR] 连续输入延迟为 30 毫秒或更短。
- [C-SR] 尽量减少冷输入抖动。
5.10 专业音频:专业音频支持的音频延迟要求的更新。
请参阅修订版本
如果设备实现通过 android.content.pm.PackageManager 类报告支持
android.hardware.audio.pro
功能,则- [C-1-2] 必须具有 5.6 音频延迟 部分中定义的连续往返音频延迟,为 25 毫秒或更短,
并且应为 10 毫秒或更短,至少在一个支持的路径上。 - [C-1-5] 必须使用 AAudio 原生音频 API 和
AAUDIO_PERFORMANCE_MODE_LOW_LATENCY
满足延迟和 USB 音频要求。 - [C-1-8] 必须具有平均点击到声音的延迟,在从扬声器到麦克风数据路径的 5 次测量中为 80 毫秒或更短。
- [C-SR] 强烈建议在音频活动且 CPU 负载变化时提供一致的 CPU 性能水平。应使用 Android 应用 SynthMark 对此进行测试。SynthMark 使用在模拟音频框架上运行的软件合成器来测量系统性能。有关基准的说明,请参阅 SynthMark 文档。SynthMark 应用需要使用“Automated Test”选项运行并实现以下结果:* voicemark.90 >= 32 voices * latencymark.fixed.little <= 15 msec * latencymark.dynamic.little <= 50 msec
触摸输入到音频输出的延迟应小于或等于 40 毫秒。
如果设备实现包括 4 导体 3.5 毫米音频插孔,则
- [C-1-2] 必须具有 5.6 音频延迟 部分中定义的连续往返音频延迟,为 25 毫秒或更短,
5.12 HDR 视频:添加了 HDR 视频要求的新部分。
6. 开发者工具和选项兼容性
6.1 开发者工具:连接性和 GPU 内核要求的更新。
请参阅修订版本
如果设备实现支持通过 Wi-Fi 或以太网连接到主机,则它们
- [C-4-1] 必须 使
AdbManager#isAdbWifiSupported()
方法返回true
。
如果设备实现支持通过 Wi-Fi 或以太网连接到主机,并且至少包含一个摄像头,则它们
- [C-5-1] 必须 使
AdbManager#isAdbWifiQrSupported()
方法返回true
。
GPU 工作信息
设备实现
- [C-6-1] 必须实现 shell 命令
dumpsys gpu --gpuwork
以显示power/gpu_work_period
内核跟踪点返回的聚合 GPU 工作数据,如果不支持跟踪点,则不显示数据。AOSP 实现为frameworks/native/services/gpuservice/gpuwork/
。
- [C-6-1] 必须实现 shell 命令
新的要求结束
- [C-4-1] 必须 使
7. 硬件兼容性
7.1.4.1 OpenGL ES:更新到推荐的扩展。
请参阅修订版本
如果设备实现支持任何 OpenGL ES 版本,则它们
- 应该 支持
EGL_IMG_context_priority
和EGL_EXT_protected_content
扩展。
新的要求结束
- 应该 支持
7.1.4.2 Vulkan:更新到 Vulkan 支持的版本。
请参阅修订版本
如果设备实现支持 OpenGL ES 3.1,则它们
- [SR] 强烈建议包含对 Vulkan 1.3 的支持。
Vulkan 1.1 - 不得支持 Vulkan 变体版本(即,Vulkan 核心版本的变体部分必须为零)。
如果设备实现包含屏幕或视频输出,则它们
- [SR] 强烈建议包含对 Vulkan 1.3 的支持。
Vulkan 1.1
如果设备实现包含对 Vulkan 1.0 或更高版本的支持,则它们
- 应支持
VkPhysicalDeviceProtectedMemoryFeatures
和VK_EXT_global_priority
。 - [C-1-12] 不得枚举对
VK_KHR_performance_query
扩展的支持。 - [C-SR] 强烈建议满足 Android Baseline 2021 配置文件指定的要求。
- [SR] 强烈建议包含对 Vulkan 1.3 的支持。
请参阅修订版本
设备实现
- [C-SR] 强烈建议将所有导航功能都设为可取消。“可取消”定义为,如果滑动未释放超过某个阈值,用户可以阻止导航功能执行(例如,返回主页、后退等)的能力。
新的要求结束
如果提供了返回导航功能,并且用户取消了返回手势,则
- [C-8-1] 必须调用
OnBackInvokedCallback.onBackCancelled()
。 - [C-8-2] 不得调用
OnBackInvokedCallback.onBackInvoked()
。 - [C-8-3] 不得分派 KEYCODE_BACK 事件。
如果提供了返回导航功能,但前台应用程序未注册
OnBackInvokedCallback
,则- 系统应为前台应用程序提供动画,以表明用户正在返回,如 AOSP 中提供的那样。
如果设备实现提供对系统 API
setNavBarMode
的支持,以允许任何具有android.permission.STATUS_BAR
权限的系统应用程序设置导航栏模式,则它们- [C-9-1] 必须提供对 AOSP 代码中提供的儿童友好图标或基于按钮的导航的支持。
新的要求结束
7.3.1 加速度计:加速度计的传感器要求更新。
请参阅修订版本
如果设备实现包含加速度计,
3 轴加速度计,则它们[C-1-2] 必须实现并报告TYPE_ACCELEROMETER
传感器。[SR] 强烈建议实现TYPE_SIGNIFICANT_MOTION
复合传感器。[SR] 强烈建议实现并报告TYPE_ACCELEROMETER_UNCALIBRATED
传感器。强烈建议 Android 设备满足此要求,以便它们能够升级到未来的平台版本,其中此要求可能会变为必需。应该实现 Android SDK 文档中描述的TYPE_SIGNIFICANT_MOTION
、TYPE_TILT_DETECTOR
、TYPE_STEP_DETECTOR
、TYPE_STEP_COUNTER
复合传感器。
如果设备实现包含 3 轴加速度计,则它们
- [C-2-1] 必须实现并报告
TYPE_ACCELEROMETER
传感器。 - [C-SR] 强烈建议实现
TYPE_SIGNIFICANT_MOTION
复合传感器。 - [C-SR] 强烈建议实现并报告
TYPE_ACCELEROMETER_UNCALIBRATED
传感器。强烈建议 Android 设备满足此要求,以便它们能够升级到未来的平台版本,其中此要求可能会变为必需。 - 应该实现 Android SDK 文档中描述的
TYPE_SIGNIFICANT_MOTION
、TYPE_TILT_DETECTOR
、TYPE_STEP_DETECTOR
、TYPE_STEP_COUNTER
复合传感器。
如果设备实现包括少于 3 个轴的加速度计,则它们
- [C-3-1] 必须实现并报告
TYPE_ACCELEROMETER_LIMITED_AXES
传感器。 - [C-SR] 强烈建议实现并报告
TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED
传感器。
新的要求结束
如果设备实现包括一个 3 轴加速度计,并且实现了
TYPE_SIGNIFICANT_MOTION
、TYPE_TILT_DETECTOR
、TYPE_STEP_DETECTOR
、TYPE_STEP_COUNTER
复合传感器中的任何一个- [C-4-1] 它们的功耗总和必须始终小于 4 mW。
如果设备实现包括一个 3 轴加速度计和一个 3 轴陀螺仪传感器,则它们
- [C-5-1] 必须实现
TYPE_GRAVITY
和TYPE_LINEAR_ACCELERATION
复合传感器。
如果设备实现包括一个 3 轴加速度计、一个 3 轴陀螺仪传感器和一个磁力计传感器,则它们
- [C-6-1] 必须实现
TYPE_ROTATION_VECTOR
复合传感器。
7.3.4 陀螺仪:陀螺仪的传感器要求更新。
请参阅修订版本
如果设备实现包括一个陀螺仪,则它们
- [C-1-1] 必须能够报告高达至少 50 Hz 频率的事件。
- [C-1-4] 必须具有 12 位或更高的分辨率。
- [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。
- [C-SR] 强烈建议当设备在室温下静止时,校准误差小于 0.01 rad/s。
- [C-SR] 强烈建议具有 16 位或更高的分辨率。
- 应该报告高达至少 200 Hz 的事件。
新的要求结束
如果设备实现包含3 轴陀螺仪,则它们
- [C-2-1] 必须实现
TYPE_GYROSCOPE
传感器。
如果设备实现包括一个少于 3 个轴的陀螺仪,则它们
- [C-3-1] 必须实现并报告
TYPE_GYROSCOPE_LIMITED_AXES
传感器。 - [C-SR] 强烈建议实现并报告
TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED
传感器。
新的要求结束
如果设备实现包括一个 3 轴陀螺仪、一个加速度计传感器和一个磁力计传感器,则它们
- [C-4-1] 必须实现
TYPE_ROTATION_VECTOR
复合传感器。
如果设备实现包括一个 3 轴加速度计和一个 3 轴陀螺仪传感器,则它们
- [C-5-1] 必须实现
TYPE_GRAVITY
和TYPE_LINEAR_ACCELERATION
复合传感器。
7.3.10 生物识别传感器:生物识别传感器的传感器要求更新。
请参阅修订版本
生物识别传感器可以根据其欺骗和冒名顶替接受率以及生物识别管道的安全性分为Class 3(以前称为Strong)、Class 2(以前称为Weak)或 Class 1(以前称为 Convenience)。此分类确定了生物识别传感器必须具有的与平台和第三方应用程序接口的功能。如果传感器希望被归类为 Class 1、Class 2 或 Class 3,则需要满足下面详述的附加要求。
传感器默认归类为 Class 1,如果传感器希望被归类为 Class 2 或 Class 3,则需要满足下面详述的附加要求。Class 2 和 Class 3 生物识别技术都获得了下面详述的附加功能。如果设备实现希望将生物识别传感器视为 1 类(以前称为 便捷),则它们
- [C-1-11] 欺骗和冒名顶替接受率必须不高于 30%,其中 (1) A 级演示攻击工具 (PAI) 物种的欺骗和冒名顶替接受率不高于 30%,以及 (2) B 级 PAI 物种的欺骗和冒名顶替接受率不高于 40%,如 Android 生物识别测试协议所衡量。
新的要求结束
如果设备实现希望将生物识别传感器视为Class 2(以前称为Weak),则它们
- [C-2-2] 欺骗和冒名顶替接受率必须不高于 20%,其中 (1) A 级演示攻击工具 (PAI) 物种的欺骗和冒名顶替接受率不高于 20%,并且 (2) B 级 PAI 物种的欺骗和冒名顶替接受率不高于 30%,由 Android 生物识别测试协议 测量。
如果设备实现希望将生物识别传感器视为 Class 3(以前称为 Strong),则它们
- [C-3-3] 欺骗和冒名顶替接受率必须不高于 7%,其中 (1) A 级演示攻击工具 (PAI) 物种的欺骗和冒名顶替接受率不高于 7%,并且 (2) B 级 PAI 物种的欺骗和冒名顶替接受率不高于 20%,由 Android 生物识别测试协议 测量。
7.3.13 IEEE 802.1.15.4 (UWB):为 UWB 添加了新的要求部分。
请参阅修订版本
7.3.13. IEEE 802.1.15.4 (UWB)
如果设备实现包含对 802.1.15.4 的支持并将该功能公开给第三方应用,则它们
- [C-1-1] 必须在 android.uwb 中实现相应的 Android API。
- [C-1-2] 必须报告硬件功能标志 android.hardware.uwb。
- [C-1-3] 必须支持 Android 实现中定义的所有相关 UWB 配置文件。
- [C-1-4] 必须提供用户界面以允许用户切换 UWB 无线电的开/关状态。
- [C-1-5] 必须强制执行使用 UWB 无线电的应用持有 UWB_RANGING 权限(在 NEARBY_DEVICES 权限组下)。
- [C-1-6] **强烈建议** 通过标准组织(包括 FIRA、CCC 和 CSA)定义的相关一致性和认证测试。
新的要求结束
7.4.1 电话:GSM 和 CDMA 电话以及蜂窝网络使用设置的电话要求更新。
请参阅修订版本
如果设备实现支持 eUICC 或 eSIM/嵌入式 SIM,并包含使第三方开发人员可以使用 eSIM 功能的专有机制,则它们
- [C-3-1] 必须声明
android.hardware.telephony.euicc
功能标志。提供EuiccManager API
的完整实现。
如果设备实现包括 GSM 或 CDMA 电话,则
- [C-6-1]
SmsManager#sendTextMessage
和SmsManager#sendMultipartTextMessage
必须导致对CarrierMessagingService
的相应调用,以提供文本消息功能。SmsManager#sendMultimediaMessage
和SmsManager#downloadMultimediaMessage
必须导致对CarrierMessagingService
的相应调用,以提供多媒体消息功能。 - [C-6-2] 由
android.provider.Telephony.Sms#getDefaultSmsPackage
指定的应用程序在发送和接收 SMS 和 MMS 消息时必须使用 SmsManager API。packages/apps/Messaging 中的 AOSP 参考实现满足此要求。 - [C-6-3] 响应
Intent#ACTION_DIAL
的应用程序必须支持输入格式为*#*#CODE#*#*
的任意拨号器代码,并触发相应的TelephonyManager#ACTION_SECRET_CODE
广播。 - [C-6-4] 响应
Intent#ACTION_DIAL
的应用程序如果支持可视化语音邮件转录,则必须使用VoicemailContract.Voicemails#TRANSCRIPTION
向用户显示可视化语音邮件转录。 - [C-6-5] 必须将具有等效 group UUID 的所有 SubscriptionInfo 表示为单个订阅,在所有显示和控制 SIM 卡信息的用户可见的工具中。此类工具的示例包括与
Settings#ACTION_MANAGE_ALL_SIM_PROFILES_SETTINGS
或EuiccManager#ACTION_MANAGE_EMBEDDED_SUBSCRIPTIONS
匹配的设置界面。 - [C-6-6] 绝不能在任何允许配置或控制 SIM 卡设置的用户可见的工具中显示或允许控制具有非空 group UUID 和 opportunistic bit 的任何 SubscriptionInfo。
如果设备实现包括 GSM 或 CDMA 电话并提供系统状态栏,则
- [C-6-7] 必须为给定的 group UUID 选择一个具有代表性的活动订阅,以在任何提供 SIM 卡状态信息的工具(如状态栏蜂窝信号图标或快速设置磁贴)中向用户显示。
- [C-SR] 强烈建议将代表性订阅选择为活动数据订阅,除非设备正在进行语音通话,在这种情况下,强烈建议将代表性订阅选择为活动语音订阅。
如果设备实现包括 GSM 或 CDMA 电话,则
- [C-6-8] 必须能够为每个 UICC 打开并同时利用每个 ETSI TS 102 221 规定的最大逻辑通道数(总共 20 个)。
- [C-6-10] 不得在未经过用户明确确认的情况下,自动对活动的运营商应用(由
TelephonyManager#getCarrierServicePackageName
指定)应用以下任何行为- 撤销或限制网络访问
- 撤销权限
- 超出 AOSP 中包含的现有电源管理功能,限制后台或前台应用程序执行
- 禁用或卸载应用程序
如果设备实现包括 GSM 或 CDMA 电话,并且共享 group UUID 的所有活动的、非机会性订阅均被禁用、从设备上物理移除或标记为机会性,则设备
- [C-7-1] 必须自动禁用同一组中的所有剩余活动机会性订阅。
如果设备实现包括 GSM 电话功能但不包括 CDMA 电话功能,则它们
- [C-8-1] 不得声明
PackageManager#FEATURE_TELEPHONY_CDMA
。 - [C-8-2] 必须在尝试在首选或允许的网络类型位掩码中设置任何 3GPP2 网络类型时抛出
IllegalArgumentException
。 - [C-8-3] 必须从
TelephonyManager#getMeid
返回空字符串。
如果设备实现支持具有多个端口和配置文件的 eUICC,则它们
- [C-11-1] 必须声明
android.hardware.telephony.euicc.mep
功能标志。
新的要求结束
- [C-3-1] 必须声明
7.4.1.1 号码屏蔽兼容性:号码屏蔽要求的更新。
请参阅修订版本
如果设备实现报告
android.hardware.telephony feature
,则- [C-1-4] 不得为被屏蔽的呼叫写入 平台通话记录提供程序。
- [C-1-4] 必须为被阻止的呼叫写入 平台通话记录提供程序,并且必须在预安装的拨号器应用程序的默认通话记录视图中过滤掉具有
BLOCKED_TYPE
的呼叫。 - 应提供用户工具,以在预安装的拨号器应用程序中显示阻止的呼叫。
新的要求结束
7.4.1.3 蜂窝网络 NAT-T Keepalive 卸载:蜂窝网络 NAT-T Keepalive 卸载的新章节。
请参阅修订版本
7.4.1.3. 蜂窝 NAT-T Keepalive 卸载
设备实现
- 应包含对蜂窝 keepalive 卸载的支持。
如果设备实现包含对蜂窝 keepalive 卸载的支持并向第三方应用程序公开该功能,则它们
- [C-1-1] 必须支持 SocketKeepAlive API。
- [C-1-2] 必须支持蜂窝网络上至少一个并发 keepalive 插槽。
- [C-1-3] 必须支持与蜂窝无线电 HAL 支持的并发蜂窝 keepalive 插槽一样多的数量。
- [C-SR] 强烈建议每个无线实例至少支持三个蜂窝网络 keepalive 插槽。
如果设备实现不包含对蜂窝 keepalive 卸载的支持,则它们
- [C-2-1] 必须返回 ERROR_UNSUPPORTED。
新的要求结束
7.4.2.5 Wi-Fi 定位(Wi-Fi 往返时间 - RTT):Wi-Fi 定位精度的更新。
请参阅修订版本
如果设备实现包含对 Wi-Fi 位置的支持并向第三方应用程序公开该功能,则它们
- [C-1-4] 在 80 MHz 带宽下,第 68 个百分位数(使用累积分布函数计算)的精度必须在 2 米以内。
- [C-SR] 强烈建议在 80 MHz 带宽下,在第 68 个百分位数(使用累积分布函数计算)内,准确报告到 1.5 米以内。
新的要求结束
7.4.2.6 Wi-Fi Keepalive 卸载:已更新以添加蜂窝网络 keepalive 卸载要求。
请参阅修订版本
设备实现
- 应包含对 Wi-Fi keepalive 卸载的支持。
如果设备实现包含对 Wi-Fi keepalive 卸载的支持并向第三方应用程序公开该功能,则它们
- [C-1-1] 必须支持 SocketKeepAlive API。
- [C-1-2] 必须支持通过 Wi-Fi 至少三个并发 keepalive 插槽
以及通过蜂窝网络至少一个 keepalive 插槽。
如果设备实现不包含对 Wi-Fi keepalive 卸载的支持,则它们
- [C-2-1] 必须返回
ERROR_UNSUPPORTED
。
7.4.2.9 首次使用时信任 (TOFU):添加了首次使用时信任要求部分。
请参阅修订版本
7.4.2.9 首次使用时信任 (TOFU)
如果设备实现支持首次使用信任 (TOFU) 并允许用户定义 WPA/WPA2/WPA3-企业版配置,则它们
- [C-4-1] 必须向用户提供选择使用 TOFU 的选项。
新的要求结束
7.4.3 蓝牙:蓝牙要求的更新。
请参阅修订版本
如果设备实现支持蓝牙音频配置文件,则它们
- 应该支持带 A2DP 的高级音频编解码器和蓝牙音频编解码器(例如 LDAC)。
如果设备实现为
BluetoothAdapter.isLeAudioSupported()
API 返回true
,则它们- [C-7-1] 必须支持单播客户端。
- [C-7-2] 必须支持 2M PHY。
- [C-7-3] 必须支持 LE 扩展广播。
- [C-7-4] 必须在 CIG 中支持至少 2 个 CIS 连接。
- [C-7-5] 必须同时启用 BAP 单播客户端、CSIP 集协调器、MCP 服务器、VCP 控制器、CCP 服务器。
- [C-SR] 强烈建议启用 HAP 单播客户端。
如果设备实现为
BluetoothAdapter.isLeAudioBroadcastSourceSupported()
API 返回true
,则它们- [C-8-1] 必须在 BIG 中支持至少 2 个 BIS 链接。
- [C-8-2] 必须同时启用 BAP 广播源、BAP 广播助手。
- [C-8-3] 必须支持 LE 周期性广播。
如果设备实现为
BluetoothAdapter.isLeAudioBroadcastAssistantSupported()
API 返回true
,则它们- [C-9-1] 必须支持 PAST(周期性广播同步传输)。
- [C-9-2] 必须支持 LE 周期性广播。
如果设备实现声明
FEATURE_BLUETOOTH_LE
,则它们- [C-10-1] 必须使 RSSI 测量值在视线环境中,距以
ADVERTISE_TX_POWER_HIGH
发射的参考设备 1 米距离处,95% 的测量值在 +/-9dB 范围内。 - [C-10-2] 必须包含 Rx/Tx 校正,以减少每通道偏差,以便在每个天线(如果使用多个天线)的 3 个通道上的测量值,95% 的测量值彼此之间在 +/-3dB 范围内。
- [C-SR] 强烈建议测量和补偿 Rx 偏移,以确保在参考设备以
ADVERTISE_TX_POWER_HIGH
发射功率发射且设备方向为“平行平面”且屏幕朝向同一方向的情况下,在距离 1 米处,BLE RSSI 中值为 -60dBm +/-10 dB。 - [C-SR] 强烈建议测量和补偿 Tx 偏移,以确保在参考设备位于 1 米距离并以
ADVERTISE_TX_POWER_HIGH
发射功率发射且设备方向为“平行平面”且屏幕朝向同一方向的情况下,从参考设备扫描时,BLE RSSI 中值为 -60dBm +/-10 dB。
**强烈建议** 遵循 Presence Calibration Requirements 中指定的测量设置步骤。
如果设备实现支持蓝牙 5.0 版本,则它们
- [C-SR] 强烈建议提供对以下各项的支持:
- LE 2M PHY
- LE 编解码器 PHY
- LE 广播扩展
- 周期性广播
- 至少 10 个广播集
- 至少 8 个 LE 并发连接。每个连接可以在任一连接拓扑角色中。
- LE 链路层隐私
- “解析列表”大小至少为 8 个条目
新的要求结束
7.4.9 UWB:添加了 UWB 硬件的要求部分。
请参阅修订版本
7.4.9. UWB
如果设备实现报告通过
android.content.pm.PackageManager
类支持android.hardware.uwb
功能,则它们- [C-1-1] 必须确保在非反射室中 1 米距离的视线环境测量中,95% 的距离测量值在 +/-15 厘米以内。
- [C-1-2] 必须确保在距离参考设备 1 米处,距离测量值的中值在 [0.75 米,1.25 米] 范围内,其中真实距离是从面朝上并倾斜 45 度的 DUT 的顶边测量的。
**强烈建议** 遵循 Presence Calibration Requirements 中指定的测量设置步骤。
新的要求结束
7.5 相机:HDR 10 位输出能力的要求更新。
请参阅修订版本
如果设备实现支持 HDR 10 位输出能力,则它们
- [C-2-1] 对于每个支持 10 位输出的摄像头设备,必须至少支持 HLG HDR 配置文件。
- [C-2-2] 必须为主要后置摄像头或主要前置摄像头支持 10 位输出。
- [C-SR] 强烈建议主摄像头和副摄像头都支持 10 位输出。
- [C-2-3] 对于支持 10 位 HDR 的逻辑摄像头设备,必须为逻辑摄像头本身及其所有向后兼容的物理子摄像头支持相同的 HDR 配置文件。
对于支持 10 位 HDR 并实现
android.hardware.camera2.CaptureRequest#CONTROL_ZOOM_RATIO
API 的逻辑摄像头设备,它们- [C-3-1] 必须支持通过逻辑摄像头上的
CONTROL_ZOOM_RATIO
控件在所有向后兼容的物理摄像头之间切换。
新的要求结束
7.7.2 USB 主机模式:双重角色端口的修订。
请参阅修订版本
如果设备实现包含支持主机模式和 USB C 型的 USB 端口,则
- [C-4-1] 必须实现 USB Type-C 规范(第 4.5.1.3.3 节)定义的双重角色端口功能。对于双重角色端口,在包含 3.5 毫米音频插孔的设备上,USB sink 检测(主机模式)默认可以关闭,但必须允许用户启用它。
7.11 媒体性能等级:已更新以包含 Android T。
请参阅修订版本
如果设备实现为
android.os.Build.VERSION_CODES.MEDIA_PERFORMANCE_CLASS
返回非零值,则有关特定于设备的要求,请参阅 第 2.2.7 节。
9. 安全模型兼容性
9.1 权限:扩展预安装应用权限允许列表的接受路径到 APEX 文件。
请参阅修订版本
- [C-0-2]
protectionLevel
为PROTECTION_FLAG_PRIVILEGED
的权限只能授予预安装在系统映像的特权路径(以及 APEX 文件)中的应用,并且必须在每个应用的显式允许列表权限的子集中。AOSP 实现通过从etc/permissions/
路径中的文件读取并遵守每个应用的允许列表权限,并将system/priv-app
路径用作特权路径来满足此要求。
- [C-0-2]
9.7 安全功能:内核完整性维护的初始化要求更新。
请参阅修订版本
内核完整性和自我保护功能是 Android 安全不可或缺的一部分。设备实现
- [C-SR] 强烈建议在内核中启用堆栈初始化,以防止使用未初始化的局部变量(
CONFIG_INIT_STACK_ALL
或CONFIG_INIT_STACK_ALL_ZERO
)。此外,设备实现不应假定编译器用于初始化局部变量的值。
新的要求结束
- [C-SR] 强烈建议在内核中启用堆栈初始化,以防止使用未初始化的局部变量(
9.8.7 隐私 — 剪贴板访问:在剪切/复制/粘贴活动后 60 分钟自动清除剪贴板数据,以保护用户隐私。
请参阅修订版本
设备实现
- [C-0-1] 除非 第三方 应用是默认 IME 或当前具有焦点的应用,否则不得从剪贴板返回剪切的数据(例如,通过
ClipboardManager
API)。 - [C-0-2] 必须在剪贴板数据最后一次放入剪贴板或从剪贴板读取后最多 60 分钟清除剪贴板数据。
- [C-0-1] 除非 第三方 应用是默认 IME 或当前具有焦点的应用,否则不得从剪贴板返回剪切的数据(例如,通过
9.11 密钥和凭据:安全锁屏要求的更新,包括将 ECDH 和 3DES 添加到加密算法中。
请参阅修订版本
当设备实现支持安全锁屏时,它
- [C-1-2] 必须具有 RSA、AES、ECDSA、ECDH(如果支持 IKeyMintDevice)、3DES 和 HMAC 加密算法以及 MD5、SHA1 和 SHA-2 系列哈希函数的实现,以正确支持 Android Keystore 系统在安全隔离于内核和以上层级代码运行的区域中支持的算法。安全隔离必须阻止内核或用户空间代码可能访问隔离环境内部状态的所有潜在机制,包括 DMA。上游 Android 开源项目 (AOSP) 通过使用 Trusty 实现来满足此要求,但另一个基于 ARM TrustZone 的解决方案或第三方审查的基于适当虚拟机监控程序的安全实现是替代方案。
9.11.1 安全锁屏、身份验证和虚拟设备:添加了虚拟设备和身份验证传输的要求部分。
请参阅修订版本
如果设备实现添加或修改了用于解锁锁屏的身份验证方法,并且新的身份验证方法基于物理令牌或位置
- [C-6-3] 必须至少每 4 小时或更短时间要求用户使用一种推荐的主要身份验证方法(例如 PIN 码、图案、密码)进行身份验证。当物理令牌满足 C-X 中 TrustAgent 实现的要求时,则适用 C-9-5 中定义的超时限制。
如果设备实现允许应用程序创建辅助 虚拟显示屏,并且不支持相关的输入事件,例如通过
VirtualDeviceManager
,则它们- [C-9-1] 当设备的默认显示屏锁定时,必须锁定这些辅助虚拟显示屏,并在设备的默认显示屏解锁时解锁这些辅助虚拟显示屏。
如果设备实现允许应用程序创建辅助 虚拟显示屏,并且支持相关的输入事件,例如通过 VirtualDeviceManager,则它们
- [C-10-1] 必须支持每个虚拟设备的单独锁定状态
- [C-10-2] 必须在空闲超时后断开所有虚拟设备的连接
- [C-10-3] 必须具有空闲超时
- [C-10-4] 必须在用户启动 锁定时锁定所有显示屏,包括通过手持设备所需的锁定用户工具(请参阅 第 2.2.5[9.11/H-1-2] 节)进行锁定。
- [C-10-5] 必须具有每个用户的单独虚拟设备实例
- [C-10-6] 当
DevicePolicyManager.setNearbyAppStreamingPolicy
指示时,必须禁用通过VirtualDeviceManager
创建关联的输入事件 - [C-10-7] 必须为每个虚拟设备单独使用剪贴板(或禁用虚拟设备的剪贴板)
- [C-10-11] 必须禁用虚拟设备上的身份验证 UI,包括知识因子输入和生物识别提示
- [C-10-12] 必须限制从虚拟设备发起的 intent 仅在同一虚拟设备上显示
- [C-10-13] 不得将虚拟设备锁定状态用作 Android Keystore 系统的用户身份验证授权。请参阅
KeyGenParameterSpec.Builder.setUserAuthentication*
。
当设备实现允许用户将主要身份验证知识因子从源设备传输到目标设备时,例如用于目标设备的初始设置,它们
- [C-11-1] 在将知识因子从源设备传输到目标设备时,必须使用与 Google Cloud Key Vault Service 安全白皮书中描述的保护保证类似的保护保证来加密知识因子,以使知识因子无法被远程解密或用于远程解锁任何设备。
- [C-11-2] 必须在源设备上,在将知识因子传输到目标设备之前,要求用户确认源设备的知识因子。
- [C-11-3] 必须在缺少任何已设置的主要身份验证知识因子的目标设备上,在目标设备上要求用户确认传输的知识因子,然后再将该知识因子设置为目标设备的主要身份验证知识因子,并在提供从源设备传输的任何数据之前进行确认。
如果设备实现具有安全锁屏并包含一个或多个信任代理,这些信任代理使用
FLAG_GRANT_TRUST_TEMPORARY_AND_RENEWABLE
标志调用TrustAgentService.grantTrust()
System API,则它们- [C-12-1] 仅当连接到具有自身锁屏的邻近物理设备,并且用户已针对该锁屏验证其身份时,才必须使用该标志调用
grantTrust()
。邻近设备可以在一次性用户解锁后使用腕上或身上检测机制来满足用户身份验证要求。 - [C-12-2] 当屏幕关闭时(例如通过按钮按下或显示超时)且 TrustAgent 未撤销信任时,必须将设备实现置于
TrustState.TRUSTABLE
状态。AOSP 满足此要求。 - [C-12-3] 仅当 TrustAgent 仍基于 C-12-1 中的要求授予信任时,才必须将设备从
TrustState.TRUSTABLE
状态移动到TrustState.TRUSTED
状态。 - [C-12-4] 必须在授予信任后最多 24 小时、8 小时空闲窗口或与附近的物理设备的底层连接丢失时调用
TrustManagerService.revokeTrust()
。
如果设备实现允许应用创建辅助虚拟显示屏,并支持相关的输入事件(例如通过 VirtualDeviceManager),且这些显示屏未标记为 VIRTUAL_DISPLAY_FLAG_SECURE,则它们
- [C-13-8] 必须阻止在 virtualdevice 上启动属性 android:canDisplayOnRemoteDevices 或元数据 android.activity.can_display_on_remote_devices 设置为 false 的 activity。
- [C-13-9] 必须阻止未明确启用流式传输并且表明它们显示敏感内容的 Activity(包括通过 SurfaceView#setSecure、FLAG_SECURE 或 SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS),在虚拟设备上启动。
- [C-13-10] 必须禁用从虚拟设备启动的应用安装。
新的要求结束
9.11.2 Strongbox:使内部人员攻击抵抗 (IAR) 成为必要的要求。
请参阅修订版本
为了验证是否符合 [C-1-3] 到 [C-1-9] 的要求,设备实现
- [C-SR] 强烈建议提供内部人员攻击抵抗 (IAR),这意味着具有固件签名密钥的内部人员无法生成导致 StrongBox 泄露机密、绕过功能安全要求或以其他方式允许访问敏感用户数据的固件。实现 IAR 的推荐方法是仅当通过 IAuthSecret HAL 提供主用户密码时才允许固件更新。IAR 将在 Android 14 中成为必须要求。
9.11.3 身份凭据:添加了有关身份凭据系统参考实现的信息。
请参阅修订版本
身份凭据系统的定义和实现是通过实施
android.security.identity.*
包中的所有 API 来完成的。这些 API 允许应用开发者存储和检索用户身份文档。设备实现上游 Android 开源项目提供了一个受信任应用的参考实现 (libeic),可用于实现身份凭据系统。
新的要求结束
9.11.4 ID 证明:添加了 ID 证明要求的部分。
请参阅修订版本
9.17 Android 虚拟化框架:添加了 Android 虚拟化框架的要求部分。
请参阅修订版本
9.17. Android 虚拟化框架
如果设备实现了对 Android 虚拟化框架 API (
android.system.virtualmachine.*
) 的支持,则 Android 主机- [C-1-1] **必须** 支持
android.system.virtualmachine.*
包定义的所有 API。 - [C-1-2] **不得** 修改 Android SELinux 和权限模型以用于受保护虚拟机的管理。
- [C-1-3] **不得** 修改、省略或替换上游 Android 开源项目 (AOSP) 中提供的 system/sepolicy 中的 neverallow 规则,并且策略 **必须** 在所有 neverallow 规则都存在的情况下进行编译。
- [C-1-4] **不得** 允许不受信任的代码(例如,第三方应用)创建和运行受保护虚拟机。注意:这在未来的 Android 版本中可能会发生变化。
- [C-1-5] **不得** 允许受保护虚拟机执行不属于出厂映像或其更新的代码。任何未被 Android 验证启动覆盖的内容(例如,从互联网下载或侧载的文件)**不得** 允许在受保护虚拟机中运行。
如果设备实现了对 Android 虚拟化框架 API (
android.system.virtualmachine.*
) 的支持,则任何受保护虚拟机实例- [C-2-1] **必须** 能够运行虚拟化 APEX 中可用的所有操作系统在受保护虚拟机中。
- [C-2-2] **不得** 允许受保护虚拟机运行未经设备实现者或操作系统供应商签名的操作系统。
- [C-2-3] **不得** 允许受保护虚拟机将数据作为代码执行(例如,SELinux neverallow execmem)。
- [C-2-4] **不得** 修改、省略或替换上游 Android 开源项目 (AOSP) 中提供的 system/sepolicy/microdroid 中的 neverallow 规则。
- [C-2-5] **必须** 实现受保护虚拟机的深度防御机制(例如,用于 pVM 的 SELinux),即使对于非 Microdroid 操作系统也是如此。
- [C-2-6] **必须** 确保 pVM 固件在无法验证初始映像时拒绝启动。
- [C-2-7] **必须** 确保 pVM 固件在 instance.img 的完整性受到破坏时拒绝启动。
如果设备实现了对 Android 虚拟化框架 API (
android.system.virtualmachine.*
) 的支持,则虚拟机监控程序- [C-3-1] **不得** 允许任何 pVM 访问属于另一个实体(即,其他 pVM 或虚拟机监控程序)的页面,除非页面所有者明确共享。这包括主机 VM。这适用于 CPU 和 DMA 访问。
- [C-3-2] **必须** 在 VM 使用页面后以及在将其返回给主机之前擦除页面(例如,pVM 被销毁)。
- [C-3-3] **必须** 确保 pVM 固件在 pVM 中的任何代码之前加载和执行。
- [C-3-4] **必须** 确保提供给 pVM 实例的 BCC 和 CDI 只能由该特定实例派生。
如果设备实现了对 Android 虚拟化框架 API 的支持,则在所有领域
- [C-4-1] **不得** 向 pVM 提供允许绕过 Android 安全模型的功能。
如果设备实现了对 Android 虚拟化框架 API 的支持,则
- [C-5-1] **必须** 支持 ART 运行时更新的隔离编译。
如果设备实现了对 Android 虚拟化框架 API 的支持,则对于密钥管理
- [C-6-1] **必须** 将 DICE 链植根于用户无法修改的点,即使在解锁的设备上也是如此。(以确保它不会被欺骗)。
- [C-6-2] 必须正确执行 DICE,即提供正确的值。但它可能不必深入到那个细节级别。
新的要求结束
- [C-1-1] **必须** 支持
13. 联系我们
您可以加入 android-compatibility 论坛,并提出您认为文档未涵盖的澄清或问题。