1. 简介
本文档列出了设备必须满足哪些要求,才能与 Android 10 兼容。
本文档按照 RFC2119 中定义的 IETF 标准使用“必须”“不得”“必需”“会”“不会”“应”“不应”“建议”“可以”和“非强制”字样。
在本文档中,“设备实现者”或“实现者”指的是运行 Android 10 的硬件/软件解决方案的开发人员或组织。“设备实现”或“实现”指的是所开发的硬件/软件解决方案。
设备实现必须满足本兼容性定义文档(包括以参考资料的形式纳入的任何文档)中列出的要求,才会被视为与 Android 10 兼容。
本定义或第 10 节中所述的软件测试如有未提及、含糊不清或不完整之处,设备实现者需负责确保与现有实现兼容。
因此,Android 开源项目既是参考 Android 实现,也是首选 Android 实现。强烈建议设备实现者尽可能使其实现基于 Android 开源项目提供的“上游”源代码。虽然从理论上来说某些组件可以替换为替代实现,但强烈建议不要这样做,否则通过软件测试的难度会大大增加。实现者需负责确保行为与标准 Android 实现(包括兼容性测试套件及其他内容)完全兼容。最后请注意,本文档明确禁止替换和修改某些组件。
本文档中链接到的许多资源都直接或间接来自 Android SDK,并且与该 SDK 的文档中包含的信息作用相同。如果本兼容性定义文档或兼容性测试套件与 SDK 文档有任何不一致的情况,均以 SDK 文档为准。本文档中链接到的资源内提供的所有技术详细信息都被视为本兼容性定义文档的一部分。
1.1 文档结构
1.1.1. 针对各种设备类型的要求
第 2 节中包含适用于特定设备类型的所有要求。第 2 节中的每个小节均分别针对一种特定设备类型。
第 2 节之后的各节中列出了普遍适用于所有 Android 设备实现的所有其他要求。本文档中将这些要求称为“核心要求”。
1.1.2. 要求 ID
“必须”满足的要求都被分配了要求 ID。
- 只有“必须”满足的要求被分配了 ID。
- “强烈建议”满足的要求带有 [SR] 标记,但未被分配 ID。
- ID 由以下部分构成:设备类型 ID - 条件 ID - 要求 ID(例如 C-0-1)。
每个 ID 的定义如下:
- 设备类型 ID(如需了解详情,请参阅 2. 设备类型)
- C:核心(适用于所有 Android 设备实现的要求)
- H:Android 手持设备
- T:Android TV 设备
- A:Android Automotive 实现
- W:Android Watch 实现
- Tab:Android 平板电脑实现
- 条件 ID
- 如果要求是无条件的,则此 ID 会被设置为 0。
- 如果要求是有条件的,在同一节的同一设备类型下,为第 1 个条件分配的 ID 为 1,为后续条件分配的 ID 逐个加 1 递增。
- 要求 ID
- 在同一节的同一条件下,第 1 项要求的 ID 为 1,后续要求的 ID 则按 1 递增。
1.1.3. 第 2 节中的要求 ID
第 2 节中的要求 ID 以相应的小节 ID 开头,后跟上述要求 ID。
- 第 2 节中的 ID 由以下几个部分构成:小节 ID/设备类型 ID - 条件 ID - 要求 ID(例如 7.4.3/A-0-1)。
2. 设备类型
虽然 Android 开源项目提供了一个可用于各种设备类型和外形规格的软件堆栈,但还有些设备类型具有相对来说更为完善的应用分发生态系统。
本节介绍了这些设备类型,以及适用于每种设备类型的额外要求和建议。
不属于任何所述设备类型的所有 Android 设备实现仍必须满足本兼容性定义文档其他各节中的所有要求。
2.1. 设备配置
如需了解各种设备类型在硬件配置方面的主要区别,请参阅本节中随后介绍的设备专属要求。
2.2. 手持设备相关要求
Android 手持设备:一种 Android 设备实现,通常拿在手中使用,例如 mp3 播放器、手机或平板电脑。
满足以下所有条件的 Android 设备实现可归类为手持设备:
- 具有能够使设备实现移动性的电源,例如电池。
- 屏幕的物理对角线尺寸介于 2.5 到 8 英寸之间。
本节其余部分中的附加要求针对的是 Android 手持设备实现。
2.2.1. 硬件
手持设备实现:
- [7.1.1.1/H-0-1] 必须具有至少一个物理对角线尺寸至少为 2.5 英寸的与 Android 兼容的显示屏,并且每个与 Android 兼容的显示屏都必须符合本文档中所述的所有要求。
- [7.1.1.3/H-SR] 强烈建议为用户提供一种用于更改显示大小(屏幕密度)的方式。
如果手持设备实现通过 Configuration.isScreenHdr()
声明支持高动态范围屏幕,则:
- [7.1.4.5/H-1-1] 必须通告对
EGL_EXT_gl_colorspace_bt2020_pq
、EGL_EXT_surface_SMPTE2086_metadata
、EGL_EXT_surface_CTA861_3_metadata
、VK_EXT_swapchain_colorspace
和VK_EXT_hdr_metadata
扩展的支持。
手持设备实现:
- [7.1.5/H-0-1] 必须支持上游 Android 开放源代码所实现的旧应用兼容模式。也就是说,设备实现不得更改启用该兼容模式的触发条件或阈值,也不得更改该兼容模式本身的行为。
- [7.2.1/H-0-1] 必须支持第三方输入法 (IME) 应用。
- [7.2.3/H-0-3] 必须在提供主屏幕的所有 Android 兼容屏幕上提供“主屏幕”功能。
- [7.2.3/H-0-4] 必须在所有 Android 兼容屏幕上提供“返回”功能,并至少在其中一个 Android 兼容屏幕上提供“最近用过”功能。
- [7.2.3/H-0-2] 必须将“返回”功能 (
KEYCODE_BACK
) 的常规按下事件和长按事件都发送到前台应用。上述事件不得被系统占用,且可以从 Android 设备外部触发(例如,连接到 Android 设备的外部硬件键盘)。 - [7.2.4/H-0-1] 必须支持触摸屏输入。
- [7.2.4/H-SR] 强烈建议启动用户选择的辅助应用(也就是实现 VoiceInteractionService 的应用)或在长按
KEYCODE_MEDIA_PLAY_PAUSE
或KEYCODE_HEADSETHOOK
时负责处理ACTION_ASSIST
的 activity(如果前台 activity 不处理上述长按事件)。 - [7.3.1/H-SR] 强烈建议包含 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 m/s² 的加速度移动时,至少在 95% 的情况下能够计算出 20 米以内的位置以及 0.2 m/s 以内的速度。
如果手持设备实现包含 3 轴陀螺仪,则:
如果手持设备实现可以进行语音通话,并且在 getPhoneType
中指出了 PHONE_TYPE_NONE
以外的任何其他值,则:
- [7.3.8/H] 应包含近程传感器。
手持设备实现:
如果手持设备实现包含按流量计费的网络连接,则:
- [7.4.7/H-1-1] 必须提供流量节省程序模式。
如果手持设备实现包含使用 CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
列出功能的逻辑摄像头设备,则:
- [7.5.4/H-1-1] 必须默认具有常规视野范围 (FOV),且该范围必须在 50 度和 90 度之间。
手持设备实现:
- [7.6.1/H-0-1] 必须有至少 4 GB 的非易失性存储空间可用于存储应用专属数据(该空间也称为“/data”分区)。
- [7.6.1/H-0-2] 可供内核和用户空间使用的内存少于 1 GB 时,必须针对
ActivityManager.isLowRamDevice()
返回“true”。
如果手持设备实现声明仅支持 32 位 ABI,则:
-
[7.6.1/H-1-1] 如果默认屏幕使用最高可达 qHD 的帧缓冲区分辨率(例如 FWVGA),可供内核和用户空间使用的内存必须至少为 416 MB。
-
[7.6.1/H-2-1] 如果默认屏幕使用最高可达 HD+ 的帧缓冲区分辨率(例如 HD、WSVGA),则可供内核和用户空间使用的内存必须至少为 592 MB。
-
[7.6.1/H-3-1] 如果默认屏幕使用最高可达 FHD 的帧缓冲区分辨率(例如 WSXGA+),可供内核和用户空间使用的内存必须至少为 896 MB。
-
[7.6.1/H-4-1] 如果默认屏幕使用最高可达 QHD 的帧缓冲区分辨率(例如 QWXGA),则可供内核和用户空间使用的内存必须至少为 1344 MB。
如果手持设备实现声明支持任何 64 位 ABI(无论是否支持任何 32 位 ABI),则:
-
[7.6.1/H-5-1] 如果默认屏幕使用最高可达 qHD 的帧缓冲区分辨率(例如 FWVGA),则可供内核和用户空间使用的内存必须至少为 816 MB。
-
[7.6.1/H-6-1] 如果默认屏幕使用最高可达 HD+ 的帧缓冲区分辨率(例如 HD、WSVGA),则可供内核和用户空间使用的内存必须至少为 944 MB。
-
[7.6.1/H-7-1] 如果默认屏幕使用最高可达 FHD 的帧缓冲区分辨率(例如 WSXGA+),则可供内核和用户空间使用的内存必须至少为 1280 MB。
-
[7.6.1/H-8-1] 如果默认屏幕使用最高可达 QHD 的帧缓冲区分辨率(例如 QWXGA),则可供内核和用户空间使用的内存必须至少为 1824 MB。
请注意,上文提到的“可供内核和用户空间使用的内存”是指除了已专门用于硬件组件(例如设备实现上的无线装置、视频组件,以及其他不受内核控制的组件)的所有内存之外另行提供的内存空间。
如果手持设备实现包含的可供内核和用户空间使用的内存不超过 1 GB,则:
- [7.6.1/H-9-1] 必须声明
android.hardware.ram.low
功能标志。 - [7.6.1/H-9-2] 必须有至少 1.1 GB 的非易失性存储空间可用于存储应用专属数据(该空间也称为“/data”分区)。
如果手持设备实现包含的可供内核和用户空间使用的内存超过 1 GB,则:
- [7.6.1/H-10-1] 必须有至少 4 GB 的非易失性存储空间可用于存储应用专属数据(该空间也称为“/data”分区)。
- 应声明
android.hardware.ram.normal
功能标志。
手持设备实现:
如果手持设备实现包含支持外围设备模式的 USB 端口,则:
- [7.7.1/H-1-1] 必须实现 Android Open Accessory (AOA) API。
如果手持设备实现包含支持主机模式的 USB 端口,则:
手持设备实现:
如果手持设备实现能够满足关于支持 VR 模式的所有性能要求且支持 VR 模式,则:
- [7.9.1/H-1-1] 必须声明
android.hardware.vr.high_performance
功能标志。 - [7.9.1/H-1-2] 必须包含用于实现
android.service.vr.VrListenerService
(可以由 VR 应用通过android.app.Activity#setVrModeEnabled
启用)的应用。
如果手持设备实现包含一个或多个支持主机模式和实现(USB 音频类)的 USB-C 端口,则除了要满足第 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,但只能在正确枚举 USB 音频接口和端点之后才能触发,以便识别已连接终端的类型。
在检测到 USB 音频终端类型 0x0302 时:
- [7.8.2.2/H-2-1] 必须广播 intent ACTION_HEADSET_PLUG,并将“麦克风”extra 设置为 0。
在检测到 USB 音频终端类型 0x0402 时:
- [7.8.2.2/H-3-1] 必须广播 intent ACTION_HEADSET_PLUG,并将“麦克风”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] 强烈建议在连接 USB-C 音频外围设备后的 1000 毫秒内枚举 USB 描述符、识别终端类型并广播 intent ACTION_HEADSET_PLUG。
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.4.1/H-0-1] 必须提供
android.webkit.Webview
API 的完整实现。 - [3.4.2/H-0-1] 必须包含独立的浏览器应用,以供用户进行一般的网页浏览。
- [3.8.1/H-SR] 强烈建议实现一个支持在应用内固定快捷方式、widget 和 widgetFeatures 的默认启动器。
- [3.8.1/H-SR] 强烈建议实现一个可让用户快速访问第三方应用通过 ShortcutManager API 提供的其他快捷方式的默认启动器。
- [3.8.1/H-SR] 强烈建议包含一个会为应用图标显示标记的默认启动器应用。
- [3.8.2/H-SR] 强烈建议支持第三方应用 widget。
- [3.8.3/H-0-1] 必须允许第三方应用通过
Notification
和NotificationManager
API 类向用户发出关于重要事件的通知。 - [3.8.3/H-0-2] 必须支持内容丰富的通知。
- [3.8.3/H-0-3] 必须支持浮动通知。
- [3.8.3/H-0-4] 必须包含通知栏,以便用户能够通过相应方式(例如 AOSP 中实现的操作按钮或控制面板)直接控制通知(例如回复、延后、关闭和屏蔽通知)。
- [3.8.3/H-0-5] 必须在通知栏显示通过
RemoteInput.Builder setChoices()
提供的选项。 - [3.8.3/H-SR] 强烈建议在无需用户额外互动的情况下在通知栏显示通过
RemoteInput.Builder setChoices()
提供的第一个选项。 - [3.8.3/H-SR] 强烈建议在用户展开通知栏中的所有通知时在通知栏显示通过
RemoteInput.Builder setChoices()
提供的所有选项。 - [3.8.3.1/H-SR] 强烈建议显示用于将
Notification.Action.Builder.setContextual
设置为true
并与Notification.Remoteinput.Builder.setChoices
显示的回复相符的操作。 - [3.8.4/H-SR] 强烈建议在设备上实现一个辅助程序来处理辅助操作。
如果手持设备实现支持辅助操作,则:
- [3.8.4/H-SR] 强烈建议将长按
HOME
键用作启动辅助应用的指定交互方式(如第 7.2.3 节中所述)。必须启动用户选择的辅助应用(也就是实现VoiceInteractionService
的应用)或负责处理ACTION_ASSIST
intent 的 activity。
如果 Android 手持设备实现支持锁定屏幕,则:
- [3.8.10/H-1-1] 必须显示包含媒体通知模板的锁定屏幕通知。
如果手持设备实现支持安全锁定屏幕,则:
- [3.9/H-1-1] 必须实现 Android SDK 文档中定义的所有设备管理政策。
- [3.9/H-1-2] 必须通过
android.software.managed_users
功能标志声明支持受管理资料,除非设备的配置决定了设备会将其自身报告为低 RAM 设备,或会将内部(不可移除)存储空间分配为共享存储空间。
手持设备实现:
- [3.10/H-0-1] 必须支持第三方无障碍服务。
- [3.10/H-SR] 强烈建议在设备上预加载无障碍服务,并且这些服务的功能要与 TalkBack 开源项目中提供的开关控制和 TalkBack(适用于预安装的文字转语音引擎支持的语言)无障碍服务的功能相当或更胜一筹。
- [3.11/H-0-1] 必须支持安装第三方 TTS 引擎。
- [3.11/H-SR] 强烈建议包含支持设备上可用语言的 TTS 引擎。
- [3.13/H-SR] 强烈建议包含快捷设置界面组件。
如果 Android 手持设备实现声明支持 FEATURE_BLUETOOTH
或 FEATURE_WIFI
,则:
- [3.16/H-1-1] 必须支持配套设备配对功能。
如果导航功能是作为基于手势的屏幕上操作提供的,则:
- [7.2.3/H]“主屏幕”功能的手势识别区域从屏幕底部开始的高度不得高于 32 dp。
如果手持设备实现将导航功能作为从屏幕左右边缘任何位置执行的手势来提供,则:
- [7.2.3/H-0-1] 导航功能的手势区域每一侧的宽度必须小于 40 dp。手势区域宽度应默认为 24 dp。
2.2.4. 性能和功耗
- [8.1/H-0-1] 一致的帧延迟。帧延迟或帧渲染延迟不一致的发生频率不得超过每秒 5 帧,并且应低于每秒 1 帧。
- [8.1/H-0-2] 界面延迟。设备实现必须确保实现低延迟用户体验,具体方式是确保滚动完包含 10K 个列表条目的列表(具体定义详见 Android 兼容性测试套件 [CTS])所用的时间不超过 36 秒。
- [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,并展示一个会显示此功耗的设置菜单。
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 密钥库系统支持的算法。安全隔离必须能够阻止内核或用户空间代码可能会借以获取隔离环境内部状态的所有潜在机制,包括 DMA。上游 Android 开源项目 (AOSP) 通过使用 Trusty 实现来满足此要求,但也可以使用其他基于 ARM TrustZone 的解决方案,或使用基于 Hypervisor 的适当隔离方法的安全实现(需要经过第三方审核)。
- [9.11/H-0-4]* 必须在隔离的执行环境中执行锁定屏幕身份验证,并且只有在成功通过验证后,才允许使用与身份验证绑定的密钥。锁定屏幕凭据的存储方式必须只允许隔离的执行环境执行锁屏身份验证。上游 Android 开源项目提供了可用于满足此要求的 Gatekeeper 硬件抽象层 (HAL) 和 Trusty。
- [9.11/H-0-5]* 如果认证签名密钥有安全硬件保护,并且签名是在安全硬件中进行,则必须支持密钥认证。认证签名密钥必须在足够多的设备之间共享,以防止此类密钥被用作设备标识符。若要满足此要求,可以采用的一种方法是共享相同的认证密钥,除非生成了至少 10 万个单元的给定 SKU。如果生成了超过 10 万个单元的 SKU,可以针对每 10 万个单元使用一个不同的密钥。
请注意,如果设备实现已搭载较低 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 实现保持一致。
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-2]* 必须向 shell 用户公开
2.3. TV 设备相关要求
Android TV 设备:一种 Android 设备实现,是适合用户坐在约 10 英尺远的距离处观看的娱乐界面(“提供大屏幕娱乐体验的界面”或“距离 10 英尺观看的界面”),可供用户观看数字媒体、影片、电视直播,玩游戏和/或使用应用。
满足以下所有条件的 Android 设备实现可归类为 TV 设备:
- 提供了可远程控制屏幕(可能距用户 10 英尺远)上呈现的界面的机制。
- 具有对角线长度超过 24 英寸的嵌入式屏幕,或包含视频输出端口,例如用于连接屏幕的 VGA、HDMI、DisplayPort 或无线端口。
本节其余部分中的附加要求针对的是 Android TV 设备实现。
2.3.1. 硬件
TV 设备实现:
- [7.2.2/T-0-1] 必须支持方向键。
- [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] 应提供可让用户使用非触摸导航和核心导航键输入功能的遥控器。
如果 TV 设备实现包含 3 轴陀螺仪,则:
TV 设备实现:
如果 TV 设备实现包含支持主机模式的 USB 端口,则:
- [7.5.3/T-1-1] 必须支持通过此 USB 端口连接但无需保持连接的外接摄像头。
如果 TV 设备实现是 32 位:
-
[7.6.1/T-1-1] 如果使用了以下任何密度,可供内核和用户空间使用的内存必须至少为 896MB:
- 400 dpi 或更高(小屏幕/普通屏幕)
- xhdpi 或更高(大屏幕)
- tvdpi 或更高(超大屏幕)
如果 TV 设备实现是 64 位:
-
[7.6.1/T-2-1] 如果使用了以下任何密度,则可供内核和用户空间使用的内存必须至少为 1280 MB:
- 400 dpi 或更高(小屏幕/普通屏幕)
- xhdpi 或更高(大屏幕)
- tvdpi 或更高(超大屏幕)
请注意,上文提到的“可供内核和用户空间使用的内存”是指除了已专门用于硬件组件(例如设备实现上的无线装置、视频组件,以及其他不受内核控制的组件)的所有内存之外另行提供的内存空间。
TV 设备实现:
2.3.2. 多媒体
TV 设备实现必须支持以下音频编码和解码格式,并使其可供第三方应用使用:
- [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)
TV 设备实现必须支持以下视频编码格式,并使其可供第三方应用使用:
TV 设备实现:
- [5.2.2/T-SR] 强烈建议支持以 30 帧/秒的帧速率对分辨率为 720p 和 1080p 的视频进行 H.264 编码。
TV 设备实现必须支持以下视频解码格式,并使其可供第三方应用使用:
- [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
TV 设备实现必须支持以标准的视频帧速率进行 MPEG-2 解码(第 5.3.1 节中对此进行了详细说明),且视频的分辨率不得高于:
- [5.3.1/T-1-1] 高清 1080p,29.97 帧/秒,Main Profile High Level。
- [5.3.1/T-1-2] 高清 1080i,59.94 帧/秒,Main Profile High Level。它们必须对隔行扫描的 MPEG-2 视频进行去除隔行扫描处理,并使其可供第三方应用使用。
TV 设备实现必须支持以标准的视频帧速率进行 H.264 解码(第 5.3.4 节中对此进行了详细说明),视频的分辨率不得高于:
- [5.3.4/T-1-1] 高清 1080p,60 帧/秒,Baseline Profile
- [5.3.4/T-1-2] 高清 1080p,60 帧/秒,Main Profile
- [5.3.4/T-1-3] 高清 1080p,60 帧/秒,High Profile Level 4.2
配备 H.265 硬件解码器的 TV 设备实现必须支持以标准的视频帧速率进行 H.265 解码(第 5.3.5 节中对此进行了详细说明),视频的分辨率不得高于:
- [5.3.5/T-1-1] 高清 1080p,60 帧/秒,Main Profile Level 4.1
如果配备 H.265 硬件解码器的 TV 设备实现支持 H.265 解码和超高清解码配置文件,则:
- [5.3.5/T-2-1] 必须以每秒 60 帧的速率支持超高清解码配置文件和 Main10 Level 5 Main Tier 配置文件。
TV 设备实现必须支持以标准的视频帧速率进行 VP8 解码(第 5.3.6 节中对此进行了详细说明),视频的分辨率不得高于:
- [5.3.6/T-1-1] 高清 1080p,60 帧/秒解码配置
配备 VP9 硬件解码器的 TV 设备实现必须支持以标准的视频帧速率进行 VP9 解码(第 5.3.7 节中对此进行了详细说明),视频的分辨率不得高于:
- [5.3.7/T-1-1] 高清 1080p,60 帧/秒,profile 0(8 位色深)
如果配备 VP9 硬件解码器的 TV 设备实现支持 VP9 解码和超高清解码配置文件,则:
- [5.3.7/T-2-1] 必须以每秒 60 帧的速率支持超高清解码配置文件和 profile 0(8 位色深)。
- [5.3.7/T-2-1] 强烈建议以每秒 60 帧的速率支持超高清解码配置文件和 profile 2(10 位色深)。
TV 设备实现:
- [5.5/T-0-1] 必须支持在支持的输出装置上进行系统主音量和数字音频输出音量衰减,使用压缩音频透传输出装置时(在这种情况下,设备上不会进行任何音频解码)除外。
如果 TV 设备实现没有内置屏幕,但支持通过 HDMI 连接的外接屏幕,则:
- [5.8/T-0-1] 必须将 HDMI 输出模式设置为选择 50 Hz 或 60 Hz 刷新率可支持的最高分辨率。
- [5.8/T-SR] 强烈建议提供用户可配置的 HDMI 刷新率选择器。
- [5.8] 应将 HDMI 输出模式刷新率设置为 50 Hz 或 60 Hz,具体取决于出售设备的地区的视频刷新率。
如果 TV 设备实现没有内置屏幕,但支持通过 HDMI 连接的外接屏幕,则:
- [5.8/T-1-1] 必须支持 HDCP 2.2。
如果 TV 设备实现不支持超高清解码,但支持通过 HDMI 连接的外接屏幕,则:
- [5.8/T-2-1] 必须支持 HDCP 1.4
2.3.3. 软件
TV 设备实现:
- [3/T-0-1] 必须声明
android.software.leanback
和android.hardware.type.television
功能。 - [3.4.1/T-0-1] 必须提供
android.webkit.Webview
API 的完整实现。
如果 Android TV 设备实现支持锁定屏幕,则:
- [3.8.10/T-1-1] 必须显示包含媒体通知模板的锁定屏幕通知。
TV 设备实现:
- [3.8.14/T-SR] 强烈建议支持画中画 (PIP) 多窗口模式。
- [3.10/T-0-1] 必须支持第三方无障碍服务。
- [3.10/T-SR] 强烈建议在设备上预加载无障碍服务,并且这些服务的功能要与 TalkBack 开源项目中提供的开关控制和 TalkBack(适用于预安装的文字转语音引擎支持的语言)无障碍服务的功能相当或更胜一筹。
如果 TV 设备实现报告 android.hardware.audio.output
功能,则:
TV 设备实现:
- [3.12/T-0-1] 必须支持 TV 输入框架。
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] 必须确保顺序读取性能至少为 15 MB/s。
- [8.2/T-0-4] 必须确保随机读取性能至少为 3.5 MB/s。
如果 TV 设备实现中的某些功能可改进 AOSP 中的设备电源管理或扩展 AOSP 中的功能,则:
- [8.3/T-1-1] 必须提供一种方式,让用户能够启用和停用省电模式。
如果 TV 设备实现没有电池,则:
如果 TV 设备实现有电池,则:
- [8.3/T-1-3] 必须提供一种方式,让用户能够显示免于进入节能模式(应用待机模式和低电耗模式)的所有应用。
TV 设备实现:
- [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. 安全模型
TV 设备实现:
- [9.11/T-0-1] 必须通过隔离的执行环境备份密钥库实现。
- [9.11/T-0-2] 必须具有 RSA、AES、ECDSA 和 HMAC 加密算法以及 MD5、SHA1 和 SHA-2 系列哈希函数的实现,以便建立一个与在内核上及更上层运行的代码安全隔离的区域,并在该区域中正确支持 Android 密钥库系统支持的算法。安全隔离必须能够阻止内核或用户空间代码可能会借以获取隔离环境内部状态的所有潜在机制,包括 DMA。上游 Android 开源项目 (AOSP) 通过使用 Trusty 实现来满足此要求,但也可以使用其他基于 ARM TrustZone 的解决方案,或使用基于 Hypervisor 的适当隔离方法的安全实现(需要经过第三方审核)。
- [9.11/T-0-3] 必须在隔离的执行环境中执行锁定屏幕身份验证,并且只有在成功通过验证后,才允许使用与身份验证绑定的密钥。锁定屏幕凭据的存储方式必须只允许隔离的执行环境执行锁屏身份验证。上游 Android 开源项目提供了可用于满足此要求的 Gatekeeper 硬件抽象层 (HAL) 和 Trusty。
- [9.11/T-0-4] 如果认证签名密钥有安全硬件保护,并且签名是在安全硬件中进行,必须支持密钥认证。认证签名密钥必须在足够多的设备之间共享,以防止此类密钥被用作设备标识符。若要满足此要求,可以采用的一种方法是共享相同的认证密钥,除非生成了至少 10 万个单元的给定 SKU。如果生成了超过 10 万个单元的 SKU,可以针对每 10 万个单元使用一个不同的密钥。
请注意,如果设备实现已搭载较低 Android 版本,则此类设备无需满足具有由隔离的执行环境支持的密钥库并支持密钥认证这一要求,除非它声明了 android.hardware.fingerprint
功能(该功能需要受隔离的执行环境支持的密钥库)。
如果 TV 设备实现支持安全锁定屏幕,则:
- [9.11/T-1-1] 必须允许用户为从解锁状态到锁定状态的过渡时间选择休眠超时,允许的最短超时时间为 15 秒。
如果 TV 设备实现包含多用户,并且未声明 android.hardware.telephony
功能标志,则:
- [9.5/T-2-1] 必须支持受限资料,此类资料可让设备所有者管理设备上的其他用户以及他们可以使用的功能。借助受限资料,设备所有者可以快速设置供其他用户使用的单独环境,同时还能在可于这些环境中运行的应用内管理更精细的限制。
如果 TV 设备实现包含多用户,并声明 android.hardware.telephony
功能标志,则:
- [9.5/T-3-1] 不得支持受限资料,但必须与用于允许/禁止其他用户访问语音通话和短信的控件的 AOSP 实现保持一致。
2.3.6. 开发者工具和选项兼容性
TV 设备实现:
-
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. Watch 设备相关要求
Android Watch 设备:一种应穿戴在身上(也许是戴在手腕上)的 Android 设备实现。
满足以下所有条件的 Android 设备实现可归类为 Watch 设备:
- 具有物理对角线长度介于 1.1 到 2.5 英寸之间的屏幕。
- 具有旨在方便穿戴在身上的机制。
本节其余部分中的附加要求针对的是 Android Watch 设备实现。
2.4.1. 硬件
Watch 设备实现:
-
[7.1.1.1/W-0-1] 必须具有物理对角线尺寸介于 1.1 到 2.5 英寸之间的屏幕。
-
[7.2.3/W-0-1] 必须为用户提供“主屏幕”功能,还必须提供“返回”功能(处于
UI_MODE_TYPE_WATCH
模式时除外)。 -
[7.2.4/W-0-1] 必须支持触摸屏输入。
-
[7.3.1/W-SR] 强烈建议包含 3 轴加速度计。
如果 Watch 设备实现包含 GPS/GNSS 接收器,并且通过 android.hardware.location.gps
功能标志向应用报告该功能,则:
- [7.3.3/W-1-1] 必须在发现 GNSS 测量结果后立即报告,即使尚未报告通过 GPS/GNSS 计算出的位置信息也是如此。
- [7.3.3/W-1-2] 必须报告 GNSS 伪距和伪距率,以便在确定位置之后,在露天条件下,当设备处于静止状态或以小于 0.2 m/s² 的加速度移动时,至少在 95% 的情况下能够计算出 20 米以内的位置以及 0.2 m/s 以内的速度。
如果 Watch 设备实现包含 3 轴陀螺仪,则:
- [7.3.4/W-2-1] 必须能够测量高达 1000 度/秒的方向变化。
Watch 设备实现:
-
[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. 软件
Watch 设备实现:
- [3/W-0-1] 必须声明
android.hardware.type.watch
功能。 - [3/W-0-2] 必须支持 uiMode = UI_MODE_TYPE_WATCH。
Watch 设备实现:
声明 android.hardware.audio.output
功能标志的 Watch 设备实现:
- [3.10/W-1-1] 必须支持第三方无障碍服务。
-
[3.10/W-SR] 强烈建议在设备上预加载无障碍服务,并且这些服务的功能要与 TalkBack 开源项目中提供的开关控制和 TalkBack(适用于预安装的文字转语音引擎支持的语言)无障碍服务的功能相当或更胜一筹。
-
[3.11/W-SR] 强烈建议包含支持设备上可用语言的 TTS 引擎。
-
[3.11/W-0-1] 必须支持安装第三方 TTS 引擎。
2.4.4. 性能和功耗
如果手表设备实现中的功能可改进 AOSP 中的设备电源管理或扩展 AOSP 中的功能,则:
Watch 设备实现:
- [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. 安全模型
如果手表设备实现包含多用户,并且未声明 android.hardware.telephony
功能标志,则:
- [9.5/W-1-1] 必须支持受限资料,此类资料可让设备所有者管理设备上的其他用户以及他们可以使用的功能。借助受限资料,设备所有者可以快速设置供其他用户使用的单独环境,同时还能在可于这些环境中运行的应用内管理更精细的限制。
如果手表设备实现包含多用户,并声明 android.hardware.telephony
功能标志,则:
- [9.5/W-2-1] 不得支持受限资料,但必须与用于允许/禁止其他用户访问语音通话和短信的控件的 AOSP 实现保持一致。
2.5. Automotive 设备相关要求
Android Automotive 实现:一种汽车音响主机,运行 Android 操作系统来实现部分或全部的系统功能和/或信息娱乐功能。
声明了 android.hardware.type.automotive
功能或满足以下所有条件的 Android 设备实现可归类为 Automotive 设备。
- 作为部件嵌入到车辆上或可插入到车辆上。
- 使用驾驶侧的屏幕作为主要屏幕。
本节其余部分中的附加要求针对的是 Android Automotive 设备实现。
2.5.1. 硬件
Automotive 设备实现:
- [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-0-1] 可能会通过将 GPS/GNSS 与其他传感器融合,对位置进行航位推算。如果对位置进行航位推算,强烈建议实现并报告所使用的相应传感器类型和/或车辆属性 ID。
- [7.3/A-0-2] 通过 LocationManager#requestLocationUpdates() 请求的位置不得与地图匹配。
如果 Automotive 设备实现包含 3 轴加速度计,则:
如果 Automotive 设备实现包含 3 轴陀螺仪,则:
- [7.3.4/A-2-1] 必须能够以至少 100 Hz 的频率报告事件。
- [7.3.4/A-2-2] 还必须实现
TYPE_GYROSCOPE_UNCALIBRATED
传感器。 - [7.3.4/A-2-3] 必须能够测量高达 250 度/秒的方向变化。
- [7.3.4/A-SR] 强烈建议将陀螺仪的测量范围配置为 +/-250 dps,以最大限度提高分辨率
Automotive 设备实现:
- [7.4.3/A-0-1] 必须支持蓝牙,并且应支持蓝牙 LE。
-
[7.4.3/A-0-2] Android Automotive 实现必须支持以下蓝牙配置文件:
- 通过免触摸操作配置文件 (HFP) 拨打电话。
- 通过音频分发配置文件 (A2DP) 播放媒体。
- 通过远程控制配置文件 (AVRCP) 控制媒体播放。
- 使用电话簿访问配置文件 (PBAP) 分享联系人信息。
-
[7.4.3/A-SR] 强烈建议支持消息访问配置文件 (MAP)。
-
[7.4.5/A] 应支持基于移动网络的数据连接。
- [7.4.5/A] 可以针对可供系统应用使用的网络使用系统 API
NetworkCapabilities#NET_CAPABILITY_OEM_PAID
常量。
外景摄像头是一种用来拍摄设备实现外部场景的摄像头(如 dashcam)。
Automotive 设备实现:
- 应包含一个或多个外景摄像头。
如果 Automotive 设备实现包含一个外景摄像头,则对于此类摄像头,这类实现:
- [7.5/A-1-1] 不得有可通过 Android Camera API 访问的外景摄像头,除非它们符合摄像头核心要求。
- [7.5/A-SR] 强烈建议不要旋转或水平镜像摄像头预览。
- [7.5.5/A-SR] 强烈建议置于正确方向,以便摄像头的长边与地平线对齐。
- [7.5/A-SR] 强烈建议分辨率至少为 130 万像素。
- 应具有固定焦距硬件或 EDOF(扩展景深)硬件。
- 可以在摄像头驱动程序中实现硬件自动对焦或软件自动对焦。
Automotive 设备实现:
-
[7.6.1/A-0-1] 必须有至少 4 GB 的非易失性存储空间可用于存储应用专属数据(该空间也称为“/data”分区)。
-
[7.6.1/A] 应格式化数据分区以提升闪存的性能和使用寿命(例如采用
f2fs
文件系统)。
如果 Automotive 设备实现通过一部分内部(不可移除)存储设备来提供共享的外部存储空间,则:
- [7.6.1/A-SR] 强烈建议减少对外部存储空间执行操作所需的 I/O 开销(例如使用
SDCardFS
)。
如果 Automotive 设备实现是 32 位:
-
[7.6.1/A-1-1] 如果使用了以下任何密度,则可供内核和用户空间使用的内存必须至少为 512MB:
- 280 dpi 或更低(小屏幕/普通屏幕)
- ldpi 或更低(超大屏幕)
- mdpi 或更低(大屏幕)
-
[7.6.1/A-1-2] 如果使用了以下任何密度,则可供内核和用户空间使用的内存必须至少为 608MB:
- xhdpi 或更高(小屏幕/普通屏幕)
- hdpi 或更高(大屏幕)
- mdpi 或更高(超大屏幕)
-
[7.6.1/A-1-3] 如果使用了以下任何密度,则可供内核和用户空间使用的内存必须至少为 896MB:
- 400 dpi 或更高(小屏幕/普通屏幕)
- xhdpi 或更高(大屏幕)
- tvdpi 或更高(超大屏幕)
-
[7.6.1/A-1-4] 如果使用了以下任何密度,则可供内核和用户空间使用的内存必须至少为 1344MB:
- 560 dpi 或更高(小屏幕/普通屏幕)
- 400dpi 或更高(大屏幕)
- xhdpi 或更高(超大屏幕)
如果 Automotive 设备实现是 64 位:
-
[7.6.1/A-2-1] 如果使用了以下任何密度,则可供内核和用户空间使用的内存必须至少为 816 MB:
- 280 dpi 或更低(小屏幕/普通屏幕)
- ldpi 或更低(超大屏幕)
- mdpi 或更低(大屏幕)
-
[7.6.1/A-2-2] 如果使用了以下任何密度,则可供内核和用户空间使用的内存必须至少为 944MB:
- xhdpi 或更高(小屏幕/普通屏幕)
- hdpi 或更高(大屏幕)
- mdpi 或更高(超大屏幕)
-
[7.6.1/A-2-3] 如果使用了以下任何密度,则可供内核和用户空间使用的内存必须至少为 1280MB:
- 400 dpi 或更高(小屏幕/普通屏幕)
- xhdpi 或更高(大屏幕)
- tvdpi 或更高(超大屏幕)
-
[7.6.1/A-2-4] 如果使用了以下任何密度,则可供内核和用户空间使用的内存必须至少为 1824MB:
- 560 dpi 或更高(小屏幕/普通屏幕)
- 400dpi 或更高(大屏幕)
- xhdpi 或更高(超大屏幕)
请注意,上文提到的“可供内核和用户空间使用的内存”是指除了已专门用于硬件组件(例如设备实现上的无线装置、视频组件,以及其他不受内核控制的组件)的所有内存之外另行提供的内存空间。
Automotive 设备实现:
- [7.7.1/A] 应包含支持外围设备模式的 USB 端口。
Automotive 设备实现:
- [7.8.1/A-0-1] 必须包含麦克风。
Automotive 设备实现:
- [7.8.2/A-0-1] 必须具有音频输出机制,并声明
android.hardware.audio.output
。
2.5.2. 多媒体
Automotive 设备实现必须支持以下音频编码和解码格式,并使其可供第三方应用使用:
- [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)
Automotive 设备实现必须支持以下视频编码格式,并使其可供第三方应用使用:
Automotive 设备实现必须支持以下视频解码格式,并使其可供第三方应用使用:
强烈建议 Automotive 设备实现支持以下视频解码:
- [5.3/A-SR] H.265 HEVC
2.5.3. 软件
Automotive 设备实现:
-
[3/A-0-1] 必须声明
android.hardware.type.automotive
功能。 -
[3/A-0-2] 必须支持 uiMode =
UI_MODE_TYPE_CAR
。 -
[3/A-0-3] 必须支持
android.car.*
命名空间中的所有公共 API。 -
[3.2.1/A-0-1] 必须支持并强制执行“Automotive 权限”参考页面中所述的所有权限常量。
-
[3.4.1/A-0-1] 必须提供
android.webkit.Webview
API 的完整实现。 -
[3.8.3/A-0-1] 必须能够应第三方应用的请求显示使用
Notification.CarExtender
API 的通知。
如果 Automotive 设备实现包含按键通话按钮,则:
- [3.8.4/A-1-1] 必须将短按按键通话按钮用作启动用户选择的辅助应用(也就是实现
VoiceInteractionService
的应用)的指定交互。
Automotive 设备实现:
- [3.8.3.1/A-0-1] 必须正确呈现
Notifications on Automotive OS
SDK 文档中所述的资源。 - [3.8.3.1/A-0-2] 必须针对取代通过以下函数提供的操作的通知操作显示“播放”和“静音”:
Notification.Builder.addAction()
- [3.8.3.1/A] 应限制使用丰富的管理任务,例如通知渠道级控制。可以按应用使用界面功能以削弱控制力。
Automotive 设备实现:
- [3.14/A-0-1] 必须包含一个界面框架,以支持使用媒体 API 的第三方应用(如第 3.14 节中所述)。
- [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] 必须提供一种方式来导航至媒体应用的首选项 activity,但只能在汽车用户体验限制未生效时启用。
- [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
定义。
如果 Automotive 设备实现包含默认启动器应用,则:
- [3.14/A-1-1] 必须包含媒体服务并通过
CAR_INTENT_ACTION_MEDIA_TEMPLATE
intent 打开这些服务。
Automotive 设备实现:
- [3.8/A] 可限制应用请求以限制进入全屏模式的功能(如
immersive documentation
中所述)。 - [3.8/A] 可始终保持状态栏和导航栏可见。
- [3.8/A] 可限制应用请求以限制用于更改系统界面元素背后颜色的功能,确保这些元素始终清晰可见,如
WindowManager.LayoutParams#FLAG_TRANSLUCENT_STATUS
和WindowManager.LayoutParams#FLAG_TRANSLUCENT_NAVIGATION
中所述。
2.5.4. 性能和功耗
Automotive 设备实现:
- [8.2/A-0-1] 必须按每个进程的 UID 报告读取和写入非易失性存储空间的字节数,以便开发者通过系统 API
android.car.storagemonitoring.CarStorageMonitoringManager
获取统计信息。Android 开源项目通过uid_sys_stats
内核模块来满足此要求。 - [8.3/A-1-3] 在汽车熄火之前,必须至少进入一次车库模式。
- [8.3/A-1-4] 必须至少处于车库模式 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. 安全模型
如果 Automotive 设备实现支持多个用户,则:
- [9.5/A-1-1] 不得允许用户与无头系统用户互动或切换为无头系统用户(设备配置除外)。
- [9.5/A-1-2] 必须在
BOOT_COMPLETED
之前切换为次要用户。 - [9.5/A-1-3] 即使已达到设备最大用户数,也必须支持创建访客用户的功能。
Automotive 设备实现:
- [9.11/A-0-1] 必须通过隔离的执行环境备份密钥库实现。
- [9.11/A-0-2] 必须具有 RSA、AES、ECDSA 和 HMAC 加密算法以及 MD5、SHA1 和 SHA-2 系列哈希函数的实现,以便建立一个与在内核上及更上层运行的代码安全隔离的区域,并在该区域中正确支持 Android 密钥库系统支持的算法。安全隔离必须能够阻止内核或用户空间代码可能会借以获取隔离环境内部状态的所有潜在机制,包括 DMA。上游 Android 开源项目 (AOSP) 通过使用 Trusty 实现来满足此要求,但也可以使用其他基于 ARM TrustZone 的解决方案,或使用基于 Hypervisor 的适当隔离方法的安全实现(需要经过第三方审核)。
- [9.11/A-0-3] 必须在隔离的执行环境中执行锁定屏幕身份验证,并且只有在成功通过验证后,才允许使用与身份验证绑定的密钥。锁定屏幕凭据的存储方式必须只允许隔离的执行环境执行锁屏身份验证。上游 Android 开源项目提供了可用于满足此要求的 Gatekeeper 硬件抽象层 (HAL) 和 Trusty。
- [9.11/A-0-4] 如果认证签名密钥有安全硬件保护,并且签名是在安全硬件中进行,必须支持密钥认证。认证签名密钥必须在足够多的设备之间共享,以防止此类密钥被用作设备标识符。若要满足此要求,可以采用的一种方法是共享相同的认证密钥,除非生成了至少 10 万个单元的给定 SKU。如果生成了超过 10 万个单元的 SKU,可以针对每 10 万个单元使用一个不同的密钥。
请注意,如果设备实现已搭载较低 Android 版本,则此类设备无需满足具有由隔离的执行环境支持的密钥库并支持密钥认证这一要求,除非它声明了 android.hardware.fingerprint
功能(该功能需要受隔离的执行环境支持的密钥库)。
如果 Automotive 设备实现支持安全锁定屏幕,则:
- [9.11/A-1-1] 必须允许用户为从解锁状态到锁定状态的过渡时间选择休眠超时,允许的最短超时时间为 15 秒。
Automotive 设备实现:
- [9.14/A-0-1] 必须对来自 Android 框架车载子系统的消息进行把关,例如将允许的消息类型和消息来源列入许可名单。
- [9.14/A-0-2] 必须监控来自 Android 框架或第三方应用的拒绝服务攻击。这是为了防范恶意软件利用流量对车载网络进行泛洪攻击,此类攻击可能会导致车载子系统无法正常运行。
2.5.6. 开发者工具和选项兼容性
Automotive 设备实现:
-
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 设备实现:
- 通常拿在双手中使用。
- 没有翻盖式或可翻转配置。
- 设备使用的任何实体键盘实现都必须通过标准连接进行连接。
- 具有能够使设备实现移动性的电源,例如电池。
- 具有物理对角线长度介于 7 到 18 英寸之间的屏幕。
平板电脑设备实现需要满足的要求与手持设备实现需要满足的要求类似。对于两者的不同之处,手持设备实现要求的相应章节中已使用 * 指明,本节中也提供了相应备注以供参考。
2.6.1. 硬件
屏幕尺寸
- [7.1.1.1/Tab-0-1] 必须具有尺寸介于 7 到 18 英寸之间的屏幕。
陀螺仪
如果平板电脑设备实现包含 3 轴陀螺仪,则:
- [7.3.4/Tab-1-1] 必须能够测量高达 1000 度/秒的方向变化。
最小内存和存储空间(第 7.6.1 节)
手持设备相关要求中为小屏幕/普通屏幕列出的屏幕密度不适用于平板电脑。
USB 外围设备模式(第 7.7.1 节)
如果平板电脑设备实现包含支持外围设备模式的 USB 端口,则:
- [7.7.1/Tab] 可以实现 Android Open Accessory (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 实现保持一致。
3. 软件
3.1. 受管理 API 兼容性
受管理 Dalvik 字节码执行环境是 Android 应用所需的主要容器。Android 应用编程接口 (API) 是一组 Android 平台接口,可供在受管理运行时环境中运行的应用使用。
设备实现:
-
[C-0-1] 必须提供以下 API 的完整实现(包括所有载述的行为):Android SDK 中载述的所有 API,或上游 Android 源代码中所有带“@SystemApi”标记的 API。
-
[C-0-2] 必须支持/保留所有标有 TestApi 注记 (@TestApi) 的类、方法和关联的元素。
-
[C-0-3] 除非本兼容性定义中明确许可,否则不得省略任何受管理 API,不得更改 API 接口或签名,不得违背载述的行为,也不得包含空操作。
-
[C-0-4] 必须仍保留 API 并使其采取合理的行为方式,即使 Android 包含的 API 所对应的某些硬件功能被省略也是如此。如需了解针对这种情况的具体要求,请参阅第 7 节。
-
[C-0-5] 不得允许第三方应用使用非 SDK 接口,这些接口在位于 AOSP 的启动类路径中的 Java 语言软件包中被定义为方法和字段,且不属于公共 SDK 的一部分。这包含带
@hide
注解但不带@SystemAPI
的 API(如 SDK 文档中所述)以及私有和软件包私有类成员。 -
[C-0-6] 必须在通过
prebuilts/runtime/appcompat/hiddenapi-flags.csv
路径下的临时和拒绝名单标志为 AOSP 中相应的 API 级别分支提供的相同受限列表中随附每个非 SDK 接口。不过:
- 如果隐藏 API 不存在或在设备实现中以其他方式实现,可以将隐藏 API 移入拒绝名单或从所有受限列表中将其省略。
- 如果 AOSP 中尚没有某个隐藏 API,可以将该隐藏 API 添加到任一受限列表中。
-
[C-0-7] 必须支持签名配置动态更新机制,以便通过在任何 APK 中嵌入签名配置,使用 AOSP 中现有的公钥从受限列表中移除非 SDK 接口。
3.1.1. Android 扩展
Android 支持在使 API 级别版本保持不变的情况下扩展受管理 API。
- [C-0-1] Android 设备实现必须预加载
ExtShared
共享库和ExtServices
服务(版本不低于每个 API 级别所允许的最低版本)的 AOSP 实现。例如,如果 Android 7.0 设备实现运行的 API 级别为 24,则包含的版本必须至少为 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,该 API 采用诸如以下形式:intent、权限,以及 Android 应用中在应用编译期间无法被强制执行的其他类似方面。
3.2.1. 权限
3.2.2. build 参数
Android API 在 android.os.Build 类中包含一些用于描述当前设备的常量。
- [C-0-1] 为了在设备实现之间提供一致且有意义的值,下表中列出了针对这些值的格式的一些额外限制,设备实现必须遵从这些限制。
参数 | 详细信息 |
---|---|
VERSION.RELEASE | 当前正在执行的 Android 系统的版本,采用人类可读懂的格式。此字段的值必须是 10 中定义的字符串值之一。 |
VERSION.SDK | 当前正在执行的 Android 系统的版本,采用第三方应用代码可访问的格式。对于 Android 10,该字段必须为整数值 10_INT。 |
VERSION.SDK_INT | 当前正在执行的 Android 系统的版本,采用第三方应用代码可访问的格式。对于 Android 10,该字段必须为整数值 10_INT。 |
VERSION.INCREMENTAL | 由设备实现者选择的值,用于指定当前正在执行的 Android 系统的具体 build,采用人类可读懂的格式。此值不得重复用于提供给最终用户的不同 build。此字段的一个典型用途是,指明生成相应 build 时使用的是哪个 build 号或哪个源代码控制更改标识符。此字段的值必须可编码为可打印的 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 |
该字符串用于独一无二地标识相应 build。应采用人类可读懂的格式。必须遵从以下模板:
$(BRAND)/$(PRODUCT)/ 例如:
acme/myproduct/ 该指纹不得包含空格。此字段的值必须可编码为 7 位的 ASCII 值。 |
HARDWARE | 硬件的名称(来自内核命令行或 /proc),应采用人类可读懂的格式。此字段的值必须可编码为 7 位的 ASCII 值,并与正则表达式“^[a-zA-Z0-9_-]+$”匹配。 |
HOST | 该字符串用于独一无二地标识构建相应 build 时所使用的主机,采用人类可读懂的格式。此字段不得为 null,也不得为空字符串 (""),除此之外,对此字段的具体格式没有任何其他要求。 |
ID | 由设备实现者选择的标识符,表示特定版本,采用人类可读懂的格式。此字段可与 android.os.Build.VERSION.INCREMENTAL 相同,但应是对最终用户来说有充分意义的值,以便他们区分各个软件 build。此字段的值必须可编码为 7 位的 ASCII 值,并与正则表达式“^[a-zA-Z0-9._-]+$”匹配。 |
MANUFACTURER | 产品的原始设备制造商 (OEM) 的商号。此字段不得为 null,也不得为空字符串 (""),除此之外,对该字段的具体格式没有任何其他要求。此字段在产品的生命周期内不得更改。 |
MODEL | 由设备实现者选择的值,其中包含最终用户所熟知的设备名称。此名称应与设备在营销时以及出售给最终用户时使用的名称相同。此字段不得为 null,也不得为空字符串 (""),除此之外,对该字段的具体格式没有任何其他要求。此字段在产品的生命周期内不得更改。 |
PRODUCT | 由设备实现者选择的值,其中包含具体产品 (SKU) 的开发名称或代号,在同一品牌中必须是唯一的。必须采用人类可读懂的格式,但不一定可供最终用户查看。此字段的值必须可编码为 7 位的 ASCII 值,并与正则表达式“^[a-zA-Z0-9_-]+$”匹配。此产品名称在产品的生命周期内不得更改。 |
SERIAL | 必须返回“UNKNOWN”。 |
TAGS | 由设备实现者选择的一系列标记(用于进一步区分 build),各个标记之间以英文逗号分隔。标记必须可编码为 7 位的 ASCII 值,且与正则表达式“^[a-zA-Z0-9._-]+”匹配,而且其值必须是与以下三种典型 Android 平台签名配置对应的值之一:release-keys、dev-keys 和 test-keys。 |
TIME | 该值用于表示生成相应 build 时的时间戳。 |
TYPE | 由设备实现者选择的值,用于指定相应 build 的运行时配置。此字段的值必须是与以下三种典型 Android 运行时配置对应的值之一:user、userdebug 或 eng。 |
USER | 生成相应 build 的用户(或自动用户)的名称或 ID。此字段不得为 null,也不得为空字符串 (""),除此之外,对此字段的具体格式没有任何其他要求。 |
SECURITY_PATCH | 该值用于指明相应 build 的安全补丁级别。它必须表明相应 build 在任何方面都不容易受到指定的 Android 公共安全公告中所述的任何问题的影响。它必须采用 [YYYY-MM-DD] 格式,并且与 Android 公共安全公告或 Android 安全建议中载述的已定义字符串匹配,例如“2015-11-01”。 |
BASE_OS | 该值表示以下 build 的 FINGERPRINT 参数:除了 Android 公共安全公告中提供的补丁以外,与相应 build 完全相同的 build。它必须报告正确的值,如果这样的 build 不存在,则报告一个空字符串 ("")。 |
BOOTLOADER | 由设备实现者选择的值,用于标识设备使用的具体内部引导加载程序版本,采用人类可读懂的格式。此字段的值必须可编码为 7 位的 ASCII 值,并与正则表达式“^[a-zA-Z0-9._-]+$”匹配。 |
getRadioVersion() | 必须是或必须返回由设备实现者选择的值,该值用于标识设备使用的具体内部无线装置/调制解调器版本,采用人类可读懂的格式。如果设备没有任何内部无线装置/调制解调器,则该方法必须返回 NULL。此字段的值必须可编码为 7 位的 ASCII 值,并与正则表达式“^[a-zA-Z0-9._-,]+$”匹配。 |
getSerial() | 必须(是或返回)硬件序列号;如果有多款 MODEL 和 MANUFACTURER 相同的设备,则必须为其提供硬件序列号,并且提供的硬件序列号在这些设备中必须是唯一的。此字段的值必须可编码为 7 位的 ASCII 值,并且与正则表达式“^[a-zA-Z0-9._-,]+$”匹配。 |
3.2.3. intent 兼容性
3.2.3.1. 核心应用 intent
通过 Android intent,应用组件可以请求其他 Android 组件的功能。Android 上游项目包含一系列被视为核心 Android 应用的应用,这些应用可实现多种 intent 模式来执行常见操作。
-
[C-0-1] 对于 AOSP 中的以下核心 Android 应用定义的所有公共 intent 过滤器模式,设备实现都必须预加载带有 intent 处理程序的一个或多个应用或服务组件:
- 桌面时钟
- 浏览器
- 日历
- 通讯录
- 图库
- GlobalSearch
- 启动器
- 音乐
- 设置
3.2.3.2. intent 解析
-
[C-0-1] 由于 Android 是一个可扩展的平台,因此设备实现必须允许第三方应用替换第 3.2.3.1 节中提到的每种 intent 模式(“设置”除外)。上游 Android 开源实现默认允许这么做。
-
[C-0-2] 设备实现者不得为系统应用使用这些 intent 模式的情况附加特殊权限,也不得阻止第三方应用绑定到这些模式以及取得对这些模式的控制权。具体来说,此项规定包括但不限于停用“选择器”界面(用户可通过该界面在多个均可处理相同 intent 模式的应用之间进行选择)。
-
[C-0-3] 设备实现必须提供一个界面来供用户修改 intent 的默认 activity。
-
不过,如果默认 activity 为数据 URI 提供更具体的属性,设备实现可以为特定 URI 模式(例如 http://play.google.com)提供默认 activity。例如,与针对“http://”的浏览器核心 intent 模式相比,用于指定数据 URI“http://www.android.com”的 intent 过滤器模式更为具体。
Android 还包含可让第三方应用为某些类型的 Web URI intent 声明权威性默认应用链接行为的机制。如果此类权威声明是在某个应用的 intent 过滤器模式中定义的,则设备实现:
- [C-0-4] 必须尝试执行 Digital Asset Links 规范(由上游 Android 开源项目中的软件包管理器实现)中规定的验证步骤,来验证所有 intent 过滤器。
- [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 组件:遵从任何使用 ACTION、使用 CATEGORY 或使用 android. 或 com.android. 命名空间中的其他键字符串的新 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 文档中也有相应说明。
3.2.3.5. 默认应用设置
Android 包含可让用户轻松选择默认应用(例如选择默认的主屏幕应用或短信应用)的设置。
在适当的情况下,设备实现必须提供类似的设置菜单,并与 SDK 文档中所述的 intent 过滤器模式和 API 方法兼容(详见下文)。
如果设备实现报告 android.software.home_screen
,则:
- [C-1-1] 必须遵从
android.settings.HOME_SETTINGS
intent,以显示主屏幕的默认应用设置菜单。
如果设备实现报告 android.hardware.telephony
,则:
-
[C-2-1] 必须提供一个设置菜单,并且该菜单将调用指定
RoleManager.ROLE_SMS
的RoleManager.createRequestRoleIntent(String)
intent,以显示用于更改默认短信应用的对话框。 -
[C-2-2] 必须遵从
android.telecom.action.CHANGE_DEFAULT_DIALER
intent,以显示可让用户更改默认“电话”应用的对话框。- 必须通过用户选择的默认“电话”应用的界面显示来电和去电,但紧急呼叫除外,它使用预安装的“电话”应用。
-
[C-2-3] 必须遵从 android.telecom.action.CHANGE_PHONE_ACCOUNTS intent,以提供相应方式来配置与
PhoneAccounts
关联的ConnectionServices
,以及电信服务提供商将用于拨出电话的默认 PhoneAccount。AOSP 实现通过在“通话”设置菜单中添加“电话账号选项”菜单来满足此要求。 -
[C-2-4] 必须允许
android.telecom.CallRedirectionService
用于保留android.app.role.CALL_REDIRECTION
角色的应用。 - [C-2-5] 必须提供一种方式,让用户能够选择保留
android.app.role.CALL_REDIRECTION
角色的应用。
如果设备实现报告 android.hardware.nfc.hce
,则:
- [C-3-1] 必须遵从 android.settings.NFC_PAYMENT_SETTINGS intent,以显示触碰付款的默认应用设置菜单。
如果设备实现支持 VoiceInteractionService
并且一次安装了多个使用此 API 的应用,则:
- [C-4-1] 必须遵从
android.settings.ACTION_VOICE_INPUT_SETTINGS
intent,以显示语音输入和语音助理的默认应用设置菜单。
3.2.4. 辅助屏幕/多屏幕上的 activity
如果设备实现允许在多个屏幕上启动常规 Android activity,则:
- [C-1-1] 必须设置
android.software.activities_on_secondary_displays
功能标志。 - [C-1-2] 必须保证 API 兼容性与在主要屏幕上运行的 activity 的 API 兼容性类似。
- [C-1-3] 如果某个 activity 在启动新的 activity 时没有通过
ActivityOptions.setLaunchDisplayId()
API 指定目标屏幕,则必须在前者所在的屏幕上启动后者。 - [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 能够在该屏幕上启动 activity。每个人都可以在具有 android.view.Display.FLAG_PUBLIC 标志的屏幕上启动 activity。
3.3. 原生 API 兼容性
实现原生代码兼容性是一项颇具挑战性的任务。因此,对于设备实现者:
- [SR] 强烈建议使用上游 Android 开源项目中的下列库的实现。
3.3.1. 应用二进制接口
受管理 Dalvik 字节码可以调用应用 .apk
文件中提供的原生代码,以便作为针对相应设备硬件架构编译的 ELF .so
文件。由于原生代码高度依赖于底层处理器技术,因此 Android 在 Android NDK 中定义了一些应用二进制接口 (ABI)。
设备实现:
- [C-0-1] 必须与一个或多个已定义的 ABI 兼容,并与 Android NDK 兼容。
- [C-0-2] 必须支持在受管理环境中运行的代码使用标准 Java 原生接口 (JNI) 语义调用原生代码。
- [C-0-3] 必须与下方列表中每个必需的库保持源代码兼容(即标头兼容)和二进制兼容(适用于 ABI)。
- [C-0-5] 必须通过
android.os.Build.SUPPORTED_ABIS
、android.os.Build.SUPPORTED_32_BIT_ABIS
和android.os.Build.SUPPORTED_64_BIT_ABIS
参数准确报告设备支持的原生应用二进制接口 (ABI),其中每个参数报告的都是一个以英文逗号分隔的 ABI 列表,列表中的条目按偏好程度从高到低排序。 -
[C-0-6] 必须(通过上述参数)报告以下 ABI 列表的子集,不得报告列表中没有的 ABI。
-
armeabi
-
armeabi-v7a
-
arm64-v8a
-
x86
-
x86-64
-
[C-0-7] 必须使以下所有提供原生 API 的库可供包含原生代码的应用使用:
-
libaaudio.so(AAudio 原生音频支持)
- libamidi.so(原生 MIDI 支持,如果如第 5.9 节中所述来声明
android.software.midi
功能) - 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 (Neural Networks API)
- libOpenMAXAL.s(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] 在 AOSP 中作为系统库实现和提供的任何其他原生库均为保留库,不得将其提供给目标 API 级别为 24 或更高的第三方应用使用。
- [C-0-11] 必须通过
libGLESv3.so
库导出所有 OpenGL ES 3.1 和 Android Extension Pack 函数符号(具体定义请参见 NDK)。请注意,所有这些符号都必须存在。第 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] 必须始终使以下操作可执行,即使在 ARMv8 架构上实现 ABI(通过原生 CPU 支持或软件模拟)也是如此:
- SWP 和 SWPB 指令。
- SETEND 指令。
- 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 10 分支上的上游 Android 开源项目中的 Chromium 项目 build 来实现
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 的应用不同的进程中渲染提供的内容或远程网址内容。具体而言,单独的渲染程序进程必须保持更低的权限、作为单独的用户 ID 运行、无法访问应用的数据目录、无法直接访问网络且只能通过 Binder 访问要求最低的系统服务。WebView 的 AOSP 实现符合此要求。
请注意,如果设备实现为 32 位或声明 android.hardware.ram.low
功能标志,则不受 C-1-3 限制。
3.4.2. 浏览器兼容性
如果设备实现包含独立的浏览器应用,以供用户进行一般的网页浏览,则:
- [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 类型(受管理 API、软 API、原生 API 和 Web API)的行为都必须与上游 Android 开源项目的首选实现一致。兼容性的一些具体方面如下:
- [C-0-1] 设备不得更改标准 intent 的行为或语义。
- [C-0-2] 设备不得更改特定类型的系统组件(例如 Service、activity、ContentProvider 等)的生命周期或生命周期语义。
- [C-0-3] 设备不得更改标准权限的语义。
- 设备不得更改对后台应用实施的限制。更具体地说,对于后台应用:
- [C-0-4] 设备必须停止执行应用为接收
GnssMeasurement
和GnssNavigationMessage
的输出而注册的回调。 - [C-0-5] 设备必须通过
LocationManager
API 类或WifiManager.startScan()
方法限制为应用提供更新的频率。 - [C-0-6] 如果应用的目标 API 级别为 25 或更高,则设备不得允许在应用清单中注册广播接收器来接收标准 Android intent 的隐式广播,除非广播 intent 要求
"signature"
或"signatureOrSystem"
protectionLevel
权限,或位于豁免列表中。 - [C-0-7] 如果应用的目标 API 级别为 25 或更高,则设备必须停止应用的后台服务,就像应用已调用这些服务的
stopSelf()
方法一样,除非应用被列入临时许可名单中,以便处理某项用户可见的任务。 - [C-0-8] 如果应用的目标 API 级别为 25 或更高,则设备必须解除应用的唤醒锁定。
- [C-0-4] 设备必须停止执行应用为接收
- [C-0-9] 设备必须按指定顺序且使用指定名称(由
Provider.getName()
返回)和类将以下安全提供程序作为Security.getProviders()
方法的前 7 个数组值返回,除非应用已通过insertProviderAt()
或removeProvider()
修改了列表。设备可以在以下指定的提供程序列表之后返回其他提供程序。-
AndroidNSSP -
android.security.net.config.NetworkSecurityConfigProvider
-
AndroidOpenSSL -
com.android.org.conscrypt.OpenSSLProvider
-
CertPathProvider -
sun.security.provider.CertPathProvider
-
AndroidKeyStoreBCWorkaround -
android.security.keystore.AndroidKeyStoreBCWorkaroundProvider
-
BC -
com.android.org.bouncycastle.jce.provider.BouncyCastleProvider
-
HarmonyJSSE -
com.android.org.conscrypt.JSSEProvider
-
AndroidKeyStore -
android.security.keystore.AndroidKeyStoreProvider
-
AndroidNSSP -
上述列表并不是详尽无遗的。兼容性测试套件 (CTS) 用于测试平台重要部分的行为兼容性,而不是测试整个平台的行为兼容性。实现者需负责确保与 Android 开源项目保持行为兼容。为此,设备实现者应尽可能使用通过 Android 开源项目获得的源代码,而不是重新实现系统的重要部分。
3.5.1. 后台限制
如果设备实现已实现 AOSP 中包含的应用限制或扩展应用限制,则:
- [C-1-1] 必须提供一种方式,让用户能够查看受限应用列表。
- [C-1-2] 必须提供一种方式,让用户能够启用/停用对每个应用的限制。
- [C-1-3] 在没有系统运行状况不佳的证据的情况下,不得自动应用限制,但可以在检测到系统运行状况不佳(例如唤醒锁卡住、服务长时间运行)时以及根据其他标准应用限制。可以由设备实现者制定标准,但标准必须与应用对系统运行状况的影响相关。不得将其他不完全与系统运行状况相关的标准(例如应用在市场中不受欢迎)用作标准。
- [C-1-4] 不得在用户已手动停用应用限制时自动应用限制,但可以建议用户应用限制。
- [C-1-5] 如果已自动应用限制,则必须通知用户。
- [C-1-6] 必须在受限应用调用
ActivityManager.isBackgroundRestricted()
时确保此 API 返回true
。 - [C-1-7] 不得限制用户显式使用的热门前台应用。
- [C-1-8] 在用户开始显式使用过去受限的应用时,必须暂停对成为热门前台应用的应用的限制。
3.6. API 命名空间
Android 遵循 Java 编程语言定义的软件包和类命名空间惯例。为了确保与第三方应用兼容,设备实现者不得对以下软件包命名空间进行任何禁止执行的修改(见下文):
-
java.*
-
javax.*
-
sun.*
-
android.*
-
androidx.*
-
com.android.*
也就是说,他们:
- [C-0-1] 不得通过更改任何方法或类签名或者通过移除类或类字段的方式,修改 Android 平台上公开提供的 API。
- [C-0-2] 不得向上述命名空间中的 API 添加任何公开提供的元素(例如类或接口,或现有类或接口的字段或方法)、测试 API 或系统 API。“公开提供的元素”是指在上游 Android 源代码中使用时不带“@hide”标记的任何构造。
设备实现者可以修改 API 的底层实现,但此类修改:
- [C-0-3] 不得影响任何已公开提供的 API 的既定行为和 Java 语言签名。
- [C-0-4] 不得向开发者通告或以其他方式向开发者公开这些修改。
不过,设备实现者可以在标准 Android 命名空间以外添加自定义 API,但这些自定义 API:
- [C-0-5] 不得位于归其他组织所有或提及其他组织的命名空间内。例如,设备实现者不得向
com.google.*
或类似命名空间添加 API:只有 Google 可以在此类命名空间内添加 API。同样,Google 也不得向其他公司的命名空间添加 API。 - [C-0-6] 必须打包到 Android 共享库中,以便只有明确使用它们的应用(通过 <uses-library> 机制)会受到此类 API 内存用量增加的影响。
如果设备实现者提议改善上述某个软件包命名空间(例如向现有 API 添加实用的新功能,或添加新的 API),实现者应访问 source.android.com,并按照该网站上的信息开始贡献更改和代码。
请注意,上述限制对应于 Java 编程语言中命名 API 的标准惯例;本节只是为了强调这些惯例,并通过将其纳入本兼容性定义文档来使其具有约束力。
3.7. 运行时兼容性
设备实现:
-
[C-0-1] 必须支持完整的 Dalvik 可执行文件 (DEX) 格式以及 Dalvik 字节码规范和语义。
-
[C-0-2] 必须将 Dalvik 运行时配置为根据上游 Android 平台来分配内存,如下表所示。(如需了解屏幕尺寸和屏幕密度的定义,请参阅第 7.1.1 节。)
-
应使用 Android 运行时 (ART)、Dalvik 可执行文件格式的参考上游实现,以及该参考实现的软件包管理系统。
-
应在执行和定位架构的多种模式下运行模糊测试,以确保运行时的稳定性。请参阅 Android 开源项目网站上的 JFuzz 和 DexFuzz。
请注意,下面指定的内存值被视为最小值,设备实现可以为每个应用分配更多内存。
屏幕布局 | 屏幕密度 | 最小应用内存 |
---|---|---|
Android Watch | 120 dpi (ldpi) | 32 MB |
140 dpi (140dpi) | ||
160 dpi (mdpi) | ||
180 dpi (180dpi) | ||
200 dpi (200dpi) | ||
213 dpi (tvdpi) | ||
220 dpi (220dpi) | 36 MB | |
240 dpi (hdpi) | ||
280 dpi (280dpi) | ||
320 dpi (xhdpi) | 48 MB | |
360 dpi (360dpi) | ||
400 dpi (400dpi) | 56 MB | |
420 dpi (420dpi) | 64 MB | |
480 dpi (xxhdpi) | 88 MB | |
560 dpi (560dpi) | 112 MB | |
640 dpi (xxxhdpi) | 154 MB | |
小/普通 | 120 dpi (ldpi) | 32 MB |
140 dpi (140dpi) | ||
160 dpi (mdpi) | ||
180 dpi (180dpi) | 48 MB | |
200 dpi (200dpi) | ||
213 dpi (tvdpi) | ||
220 dpi (220dpi) | ||
240 dpi (hdpi) | ||
280 dpi (280dpi) | ||
320 dpi (xhdpi) | 80 MB | |
360 dpi (360dpi) | ||
400 dpi (400dpi) | 96 MB | |
420 dpi (420dpi) | 112 MB | |
480 dpi (xxhdpi) | 128 MB | |
560 dpi (560dpi) | 192 MB | |
640 dpi (xxxhdpi) | 256 MB | |
大 | 120 dpi (ldpi) | 32 MB |
140 dpi (140dpi) | 48 MB | |
160 dpi (mdpi) | ||
180 dpi (180dpi) | 80 MB | |
200 dpi (200dpi) | ||
213 dpi (tvdpi) | ||
220 dpi (220dpi) | ||
240 dpi (hdpi) | ||
280 dpi (280dpi) | 96 MB | |
320 dpi (xhdpi) | 128 MB | |
360 dpi (360dpi) | 160 MB | |
400 dpi (400dpi) | 192 MB | |
420 dpi (420dpi) | 228 MB | |
480 dpi (xxhdpi) | 256 MB | |
560 dpi (560dpi) | 384 MB | |
640 dpi (xxxhdpi) | 512 MB | |
超大 | 120 dpi (ldpi) | 48 MB |
140 dpi (140dpi) | 80 MB | |
160 dpi (mdpi) | ||
180 dpi (180dpi) | 96 MB | |
200 dpi (200dpi) | ||
213 dpi (tvdpi) | ||
220 dpi (220dpi) | ||
240 dpi (hdpi) | ||
280 dpi (280dpi) | 144 MB | |
320 dpi (xhdpi) | 192 MB | |
360 dpi (360dpi) | 240 MB | |
400 dpi (400dpi) | 288 MB | |
420 dpi (420dpi) | 336 MB | |
480 dpi (xxhdpi) | 384 MB | |
560 dpi (560dpi) | 576 MB | |
640 dpi (xxxhdpi) | 768 MB |
3.8. 界面兼容性
3.8.1. 启动器(主屏幕)
Android 包含一个启动器应用(主屏幕),并且支持第三方应用更换设备启动器(主屏幕)。
如果设备实现允许第三方应用更换设备主屏幕,则:
- [C-1-1] 必须声明平台功能
android.software.home_screen
。 - [C-1-2] 如果第三方应用使用
<adaptive-icon>
标记提供其图标,同时用于检索图标的PackageManager
方法被调用时,必须返回AdaptiveIconDrawable
对象。
如果设备实现包含支持应用内固定快捷方式的默认启动器,则:
- [C-2-1] 必须针对
ShortcutManager.isRequestPinShortcutSupported()
报告true
。 - [C-2-2] 必须提供一种方式,在添加应用通过
ShortcutManager.requestPinShortcut()
API 方法请求的快捷方式之前先询问用户。 - [C-2-3] 必须支持已固定的快捷方式以及动态和静态快捷方式,如“应用快捷方式”页面上所述。
反之,如果设备实现不支持应用内固定快捷方式,则:
- [C-3-1] 必须针对
ShortcutManager.isRequestPinShortcutSupported()
报告false
。
如果设备实现已实现一个可让用户快速访问第三方应用通过 ShortcutManager API 提供的其他快捷方式的默认启动器,则:
- [C-4-1] 必须支持载述的所有快捷方式功能(例如静态和动态快捷方式、固定快捷方式),并完整实现
ShortcutManager
API 类的 API。
如果设备实现包含会为应用图标显示标记的默认启动器应用,则:
- [C-5-1] 必须遵从
NotificationChannel.setShowBadge()
API 方法。也就是说,如果相应值被设置为true
,则显示与应用图标关联的可见标记;如果应用的所有通知渠道均将相应值设置为false
,则不显示任何应用图标标记方案。 - 如果第三方应用指明通过使用专有 API 支持专有标记方案,则可以使用专有标记方案替换应用图标标记,但应使用通过 SDK 中所述的通知标记 API(例如
Notification.Builder.setNumber()
和Notification.Builder.setBadgeIconType()
API)提供的资源和值。
3.8.2. widget
Android 定义了一种组件类型以及对应的 API 和生命周期,以便应用向最终用户提供“AppWidget”,因此 Android 支持第三方应用 widget。
如果设备实现支持第三方应用 widget,则:
- [C-1-1] 必须声明支持平台功能
android.software.app_widgets
。 - [C-1-2] 必须包含对 AppWidget 的内置支持,并提供用于直接在启动器中添加、配置、查看和移除 AppWidget 的界面方式。
- [C-1-3] 必须能够呈现标准网格大小为 4 x 4 的 widget。有关详细信息,请参阅 Android SDK 文档中的应用 widget 设计指南。
- 可以支持位于锁定屏幕上的应用 widget。
如果设备实现支持第三方应用 widget 和应用内固定快捷方式,则:
- [C-2-1] 必须针对
AppWidgetManager.html.isRequestPinAppWidgetSupported()
报告true
。 - [C-2-2] 必须提供一种方式,在添加应用通过
AppWidgetManager.requestPinAppWidget()
API 方法请求的快捷方式之前先询问用户。
3.8.3. 通知
Android 包含 Notification
和 NotificationManager
API,以便第三方应用开发者使用设备的硬件组件(例如声音、振动和指示灯组件)和软件功能(例如通知栏、系统栏)向用户通知重要事件以及吸引用户的注意力。
3.8.3.1. 通知的呈现方式
如果设备实现允许第三方应用向用户通知重要事件,则:
- [C-1-1] 必须支持使用硬件功能的通知(如 SDK 文档中所述),并尽可能提供相关的设备实现硬件。例如,如果设备实现包含振动器,则必须正确实现振动 API。如果设备实现缺少硬件,则必须将对应的 API 实现为空操作。第 7 节中对此行为进行了进一步的详细说明。
- [C-1-2] 必须正确呈现 API 或状态栏/系统栏图标样式指南中提供的所有资源(图标、动画文件等),不过,它们可以针对通知提供替代用户体验,而不使用参考 Android 开源实现所提供的体验。
- [C-1-3] 必须遵从并正确实现为 API 描述的行为,以便更新、移除通知以及对通知进行分组。
- [C-1-4] 必须提供 SDK 中载述的 NotificationChannel API 的完整行为。
- [C-1-5] 必须提供一种方式,让用户能够按每个渠道和应用包级别屏蔽和修改特定第三方应用的通知。
- [C-1-6] 还必须提供一种方式,让用户能够查看已删除的通知渠道。
- [C-1-7] 必须在无需用户额外互动的情况下正确呈现通过 Notification.MessagingStyle 提供的所有资源(图片、贴纸和图标等)以及通知文本。例如,必须显示所有资源,包括通过 setGroupConversation 设置的群组对话中通过 android.app.Person 提供的图标。
- [C-SR] 强烈建议自动提供一种方式,让用户能够在多次忽略特定第三方应用的通知后按每个渠道和应用包级别屏蔽该通知。
- 应支持内容丰富的通知。
- 应以浮动通知的形式显示某些优先级较高的通知。
- 应具有可让用户暂停通知的方式。
- 只能管理是否以及何时显示第三方应用针对重要事件向用户发出的通知,以避免安全问题(例如分散驾驶员的注意力)。
如果设备实现支持内容丰富的通知,则:
- [C-2-1] 对于呈现的资源元素,必须使用通过
Notification.Style
API 类及其子类提供的确切资源。 - 应呈现
Notification.Style
API 类及其子类中定义的每个资源元素(例如图标、标题和摘要文本)。
如果设备实现支持提醒式通知,则:
- [C-3-1] 在呈现浮动通知时,必须使用浮动通知视图和资源(如
Notification.Builder
API 类中所述)。 - [C-3-2] 必须在无需用户额外互动的情况下显示通过
Notification.Builder.addAction()
提供的操作以及通知内容(如 SDK 中所述)。
3.8.3.2. 通知监听器服务
Android 包含 NotificationListenerService
API,任何通知一经发布或更新,此类 API 便可让应用(用户明确启用后)收到其副本。
如果设备实现报告 android.hardware.ram.normal
功能标志,则:
- [C-1-1] 必须正确、及时地将通知完整地更新到所有已安装且用户已启用的此类监听器服务,包括附加到通知对象的所有元数据。
- [C-1-2] 必须遵从
snoozeNotification()
API 调用,并在 API 调用中设置的暂停时长过后关闭通知并执行回调。
如果设备实现具有可让用户暂停通知的方式,则:
- [C-2-1] 必须通过标准 API(例如
NotificationListenerService.getSnoozedNotifications()
)正确反映已暂停通知状态。 - [C-2-2] 必须使该方式可用于暂停每个已安装的第三方应用发出的通知,除非通知来自常驻/前台服务。
3.8.3.3. DND(勿扰)
如果设备实现支持 DND 功能,则:
- [C-1-1] 必须实现会响应 ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS intent 的 activity;对于设置为 UI_MODE_TYPE_NORMAL 的实现,它必须是用户可用于授权或拒绝应用访问 DND 政策配置的 activity。
- [C-1-2] 当设备实现为用户提供了用于授权或拒绝第三方应用访问 DND 政策配置的方式时,必须随同用户创建的规则和预定义的规则一起显示应用创建的自动 DND 规则。
- [C-1-3] 必须遵从随同
NotificationManager.Policy
传递的suppressedVisualEffects
值;如果应用已设置 SUPPRESSED_EFFECT_SCREEN_OFF 或 SUPPRESSED_EFFECT_SCREEN_ON 标志,则应向用户指明 DND 设置菜单中不会显现视觉效果。
3.8.4. 搜索
Android 包含一些可让开发者在其应用中纳入搜索功能以及将其应用中的数据提供给全局系统搜索功能使用的 API。一般来说,此功能会包括一个系统级界面,以便用户输入查询、在用户输入内容时显示建议,以及显示搜索结果。这些 Android API 可让开发者重复使用此界面,以在其应用内提供搜索功能,还可让开发者向通用的全局搜索界面提供搜索结果。
- Android 设备实现应包含全局搜索界面,即单个共享的系统级搜索界面,能够在用户输入内容时实时提供建议。
如果设备实现已实现全局搜索界面,则:
- [C-1-1] 必须实现可让第三方应用向搜索框(当它以全局搜索模式运行时)中添加建议的 API。
如果未安装任何使用全局搜索界面的第三方应用,则:
- 默认行为应为显示网页搜索引擎提供的搜索结果和建议。
Android 还包含一些辅助 API,以便应用选择与设备上的辅助程序分享多少关于当前上下文的信息。
如果设备实现支持辅助操作,则:
- [C-2-1] 当分享上下文时,必须通过以下方式之一向最终用户清楚地指明这一点:
- 每当辅助应用访问上下文时,都在屏幕边缘显示白光,并且其持续时间和亮度达到或超过 Android 开源项目实现中的持续时间和亮度。
- 对于预安装的辅助应用,提供距默认语音输入和辅助应用设置菜单不超过两个导航步骤的用户可见内容,并且仅在用户通过启动指令或辅助导航键输入显式调用辅助应用的情况下才分享上下文。
- [C-2-2] 用于启动辅助应用的指定交互(如第 7.2.3 节中所述)必须启动用户选择的辅助应用(也就是实现
VoiceInteractionService
的应用)或负责处理ACTION_ASSIST
intent 的 activity。
3.8.5. 提醒和消息框
应用可以使用 Toast
API 向最终用户显示简短的非模态字符串(这些字符串会在短暂显示后消失),并使用 TYPE_APPLICATION_OVERLAY
窗口类型 API 使提醒窗口显示在其他应用的前方。
如果设备实现包含屏幕或视频输出机制,则:
-
[C-1-1] 必须提供一种方式,让用户能够阻止应用显示使用
TYPE_APPLICATION_OVERLAY
的提醒窗口。AOSP 实现通过在通知栏中提供相应控件来满足此要求。 -
[C-1-2] 必须遵从 Toast API,并以某种非常显眼的方式向最终用户显示来自应用的消息框。
3.8.6. 主题
Android 提供“主题”这一机制,以供应用在整个 activity 或应用中应用样式。
Android 包含“Holo”和“Material”主题系列(一组已定义的样式),如果应用开发者希望与 Android SDK 定义的 Holo 主题外观和风格保持一致,可以使用它们。
如果设备实现包含屏幕或视频输出机制,则:
- [C-1-1] 不得更改任何可供应用使用的 Holo 主题属性。
- [C-1-2] 必须支持“Material”主题系列,并且不得更改任何可供应用使用的 Material 主题属性或其素材资源。
Android 还包含一个“Device Default”主题系列(一组已定义的样式),如果应用开发者希望与设备实现者定义的设备主题的外观和风格保持一致,可以使用该主题系列。
- 设备实现可以修改可供应用使用的 Device Default 主题属性。
Android 支持带有半透明系统栏的变体主题,以便应用开发者将其应用内容填充到状态栏和导航栏后面的区域。为了在采用此配置时实现一致的开发者体验,请务必在不同的设备实现之间保持一致的状态栏图标样式。
如果设备实现包含系统状态栏,则:
- [C-2-1] 必须使用白色来显示系统状态图标(例如信号强度和电池电量)以及系统发出的通知,除非相应图标用于指明有问题状态,或者应用使用 SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 标志请求使用浅色状态栏。
- [C-2-2] 当应用请求使用浅色状态栏时,Android 设备实现必须将系统状态图标的颜色更改为黑色(有关详细信息,请参阅 R.style)。
3.8.7. 动态壁纸
Android 定义了一种组件类型以及对应的 API 和生命周期,以便应用向最终用户提供一个或多个动态壁纸。动态壁纸是具备有限输入功能且作为壁纸显示在其他应用之后的动画、图案或类似图片。
如果硬件能够在不限制功能且不会对其他应用造成负面影响的情况下,以合理的帧速率运行所有动态壁纸,则会被视为能够可靠地运行动态壁纸。如果硬件中的限制会导致壁纸和/或应用崩溃、无法正常运行、占用过多 CPU/消耗过多电池电量,或者运行时的帧速率低得令人无法接受,相应硬件会被视为无法运行动态壁纸。例如,有些动态壁纸可能会利用 OpenGL 2.0 或 3.x 上下文来呈现其内容。动态壁纸将无法在不支持多个 OpenGL 上下文的硬件上可靠地运行,因为使用 OpenGL 上下文的动态壁纸可能会与其他同样使用 OpenGL 上下文的应用发生冲突。
- 如果设备实现能够可靠地运行动态壁纸(如上所述),则应实现动态壁纸。
如果设备实现已实现动态壁纸,则:
- [C-1-1] 必须报告 android.software.live_wallpaper 平台功能标志。
3.8.8. activity 切换
上游 Android 源代码包含概览屏幕,该屏幕是一个系统级界面,可用于切换任务,以及使用缩略图(对应于用户上次离开应用时应用的图形状态)显示用户最近访问的 activity 和任务。
如果设备实现包含“最近用过”功能导航键(第 7.2.3 节中对此进行了详细说明),则可以更改该界面。
如果设备实现包含“最近用过”功能导航键(第 7.2.3 节中对此进行了详细说明),并且要更改该界面,则:
- [C-1-1] 必须支持显示至少 7 个 activity。
- 一次应至少显示 4 个 activity 的名称。
- [C-1-2] 必须实现屏幕固定行为,并向用户提供用于开启/关闭该功能的设置菜单。
- 应在“最近用过”中显示亮显颜色、图标和屏幕标题。
- 应显示关闭选项 (x),但可以延迟到用户与界面互动之后显示。
- 应实现一个可让用户轻松切换到前一个 activity 的快捷方式。
- 当用户点按两次“最近用过”功能键时,应触发在最近用过的两个应用之间进行快速切换。
- 当用户长按“最近用过”功能键时,应触发分屏多窗口模式(如果支持的话)。
- 可以将最近用过的关联项显示为一组(它们会一起移动)。
- [SR] 强烈建议为概览屏幕使用上游 Android 界面(或类似的基于缩略图的界面)。
3.8.9. 输入管理
Android 支持输入管理,并且支持第三方输入法。
如果设备实现允许用户在设备上使用第三方输入法,则:
- [C-1-1] 必须声明平台功能 android.software.input_methods,并支持 IME API(如 Android SDK 文档中所定义)。
- [C-1-2] 必须提供一种可供用户使用的机制,以便因应 android.settings.INPUT_METHOD_SETTINGS intent 来添加和配置第三方输入法。
如果设备实现声明了 android.software.autofill
功能标志,则:
- [C-2-1] 必须完整实现
AutofillService
和AutofillManager
API,并遵从android.settings.REQUEST_SET_AUTOFILL_SERVICE
intent,以显示一个默认应用设置菜单,让用户能够启用和停用自动填充服务以及更改默认自动填充服务。
3.8.10. 锁定屏幕媒体控件
Remote Control Client API 从 Android 5.0 开始便被废弃了,取而代之的是可让媒体应用与锁定屏幕上显示的播放控件相集成的媒体通知模板。
3.8.11. 屏保(之前称为 Dreams)
Android 支持交互式屏保(之前称为 Dreams)。当接通电源的设备处于空闲状态或放在桌面基座中时,屏保让用户能够与应用互动。Android Watch 设备可以实现屏保,但其他类型的设备实现应支持屏保,并且应能够为用户提供用于配置屏保的设置选项,以便响应 android.settings.DREAM_SETTINGS
intent。
3.8.12. 位置
如果设备实现包含能够提供位置坐标的硬件传感器(例如 GPS),则
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 的货币符号块中的所有字形。
- 应支持 Unicode 技术报告 #51 中指定的肤色和各种家庭表情符号。
如果设备实现包含 IME,则:
- 应为用户提供一种可输入这些表情符号的输入法。
Android 支持呈现缅甸字体。缅甸具有多种用于呈现缅甸语言的非 Unicode 兼容字体,通常称为“Zawgyi”。
如果设备实现支持缅甸语,则:
* [C-2-1] MUST render text with Unicode compliant font as default;
non-Unicode compliant font MUST NOT be set as default font unless the user
chooses it in the language picker.
* [C-2-2] MUST support a Unicode font and a non-Unicode compliant font if a
non-Unicode compliant font is supported on the device. Non-Unicode
compliant font MUST NOT remove or overwrite the Unicode font.
* [C-2-3] MUST render text with non-Unicode compliant font ONLY IF a
language code with [script code Qaag](
http://unicode.org/reports/tr35/#unicode_script_subtag_validity) is
specified (e.g. my-Qaag). No other ISO language or region codes (whether
assigned, unassigned, or reserved) can be used to refer to non-Unicode
compliant font for Myanmar. App developers and web page authors can
specify my-Qaag as the designated language code as they would for any
other language.
3.8.14. 多窗口模式
如果设备实现能够同时显示多个 activity,则:
- [C-1-1] 必须按照 Android SDK 多窗口模式支持文档中所述的应用行为和 API 实现此类多窗口模式,并满足以下要求:
- [C-1-2] 必须遵从应用在
AndroidManifest.xml
文件中设置的android:resizeableActivity
(如此 SDK 中所述)。 - [C-1-3] 如果屏幕高度和宽度均小于 440 dp,则不得提供分屏或自由窗口模式。
- [C-1-4] 在除画中画以外的多窗口模式中,不得将 activity 的大小调整为小于 220 dp。
- 屏幕尺寸为
xlarge
的设备实现应支持自由窗口模式。
如果设备实现支持多窗口模式和分屏模式,则:
- [C-2-1] 必须预加载一个大小可调整的启动器作为默认启动器。
- [C-2-2] 如果启动器应用是获得焦点的窗口,则必须剪裁处于分屏多窗口模式的停靠 activity,但应显示它的部分内容。
- [C-2-3] 必须遵从第三方启动器应用声明的
AndroidManifestLayout_minWidth
和AndroidManifestLayout_minHeight
值,并且在显示停靠 activity 的部分内容时不得替换这些值。
如果设备实现支持多窗口模式和画中画多窗口模式,则:
- [C-3-1] 如果应用符合以下任一条件,则必须在画中画多窗口模式下启动 Activity:* 以 API 级别 26 或更高级别为目标,并声明
android:supportsPictureInPicture
* 以 API 级别 25 或更低级别为目标,同时还声明android:resizeableActivity
和android:supportsPictureInPicture
。 - [C-3-2] 必须在 SystemUI 中公开当前画中画 activity 通过
setActions()
API 指定的操作。 - [C-3-3] 必须支持画中画 activity 通过
setAspectRatio()
API 指定的大于等于 1:2.39 且小于等于 2.39:1 的宽高比。 - [C-3-4] 必须使用
KeyEvent.KEYCODE_WINDOW
控制画中画窗口;如果未实现画中画模式,则该键必须可供前台 activity 使用。 - [C-3-5] 必须提供一种方式,让用户能够阻止应用以画中画模式显示;AOSP 实现通过在通知栏中提供相应控件来满足此要求。
- [C-3-6] 必须为画中画窗口分配 108 dp 的最小宽度和高度;当
Configuration.uiMode
配置为UI_MODE_TYPE_TELEVISION
时,必须为画中画窗口分配 240 dp 的最小宽度和 135 dp 的最小高度。
3.8.15. 刘海屏
Android 支持刘海屏(如 SDK 文档中所述)。DisplayCutout
API 在显示屏的边缘指定了不用于显示内容的区域。
如果设备实现包含刘海屏,则:
- [C-1-1] 必须仅在设备的短边设置刘海屏。反之,如果设备的宽高比为 1.0 (1:1),则不得包含刘海屏。
- [C-1-2] 每边的凹口只能有一个。
- [C-1-3] 必须遵从应用通过
WindowManager.LayoutParams
API 设置的刘海屏标志(如 SDK 中所述)。 - [C-1-4] 必须为
DisplayCutout
API 中指定的所有刘海屏指标报告正确的值。
3.9. 设备管理
Android 包含一些可让注重安全性的应用在系统级执行设备管理工作的功能,例如通过 Android Device Administration 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] 必须支持将 Device Policy Client (DPC) 注册为设备所有者应用,如下所述:
- 如果设备实现尚未配置任何用户数据,则:
- [C-1-3] 必须针对
DevicePolicyManager.isProvisioningAllowed(ACTION_PROVISION_MANAGED_DEVICE)
报告true
。 - [C-1-4] 必须能够因应 intent 操作
android.app.action.PROVISION_MANAGED_DEVICE
将 DPC 应用注册为设备所有者应用。 - [C-1-5] 如果设备通过
android.hardware.nfc
功能标志声明支持近距离无线通信 (NFC),并且它收到的 NFC 消息中包含 MIME 类型为MIME_TYPE_PROVISIONING_NFC
的记录,则必须将 DPC 应用注册为设备所有者应用。
- [C-1-3] 必须针对
- 如果设备实现有用户数据,则:
- [C-1-6] 必须针对
DevicePolicyManager.isProvisioningAllowed(ACTION_PROVISION_MANAGED_DEVICE)
报告false
。 - [C-1-7] 不得再将任何 DPC 应用注册为设备所有者应用。
- [C-1-6] 必须针对
- 如果设备实现尚未配置任何用户数据,则:
- [C-1-2] 必须在配置过程中要求用户执行肯定性操作,同意将应用设置为设备所有者应用。可在配置过程中通过用户操作或程序化方式征得用户同意,但不得采用硬编码,也不得禁止使用其他设备所有者应用。
如果设备实现声明了 android.software.device_admin
,但还包含专有的设备所有者管理解决方案,并提供了相应机制来向标准 Android DevicePolicyManager API 识别出的标准“设备所有者”通告在其解决方案中配置为“与设备所有者同等”的应用,则:
- [C-2-1] 必须部署相应的流程来验证所通告的应用属于合法的企业设备管理解决方案,并且已在专有的解决方案中配置为具备与“设备所有者”同等的权利。
- [C-2-2] 在将 DPC 应用注册为“设备所有者”之前,必须先按照
android.app.action.PROVISION_MANAGED_DEVICE
启动的流程显示相同的 AOSP 设备所有者意见征求披露信息。 - 在将 DPC 应用注册为“设备所有者”之前,设备上可以有用户数据。
3.9.1.2 受管理个人资料配置
如果设备实现声明了 android.software.managed_users
,则:
-
[C-1-1] 必须实现相应的 API,以便将设备政策控制器 (DPC) 应用注册为新增受管理个人资料的所有者。
-
[C-1-2] 受管理个人资料配置流程(该流程由 android.app.action.PROVISION_MANAGED_PROFILE 启动)用户体验必须与 AOSP 实现保持一致。
-
[C-1-3] 当设备政策控制器 (DPC) 停用了某项系统功能时,必须在“设置”部分提供以下用户可见内容,以便向用户指明这一点:
- 当设备管理员限制了某项设置时,显示一致的图标或其他用户可见内容(例如上游 AOSP 信息图标)来向用户指明这一点。
- 简短的说明消息,由设备管理员通过
setShortSupportMessage
提供。 - DPC 应用图标。
3.9.2 受管理个人资料支持
如果设备实现声明了 android.software.managed_users
,则:
- [C-1-1] 必须通过
android.app.admin.DevicePolicyManager
API 支持受管理个人资料。 - [C-1-2] 必须允许且只允许创建一个受管理个人资料。
- [C-1-3] 必须使用图标标记(类似于 AOSP 上游工作标记)来表示受管理应用和 widget 以及其他带有标记的界面元素(例如“最近用过”和“通知”)。
- [C-1-4] 当用户位于受管理个人资料应用中时,必须显示通知图标(类似于 AOSP 上游工作标记)来指明这一点。
- [C-1-5] 当设备唤醒 (ACTION_USER_PRESENT) 且前台应用在受管理资料中时,必须显示消息框来指明用户在受管理资料中。
- [C-1-6] 如果存在受管理资料,并且该资料已由设备政策控制器启用,则必须在 intent“选择器”中显示可见方式,以便用户将 intent 从受管理资料转发给主要用户,反之亦然。
- [C-1-7] 如果存在受管理个人资料,则必须针对主要用户和受管理个人资料公开以下用户方式:
- 分别计算主要用户和受管理资料的耗电量、位置信息、移动流量和存储空间用量。
- 单独管理安装在主要用户或受管理资料中的 VPN 应用。
- 单独管理安装在主要用户或受管理个人资料中的应用。
- 单独管理主要用户或受管理个人资料中的账号。
- [C-1-8] 如果设备政策控制器允许,必须确保预安装的拨号器、通讯录和即时通讯应用可以搜索和查询受管理资料(如果存在)以及主要资料中的来电者信息。
- [C-1-9] 必须确保满足适用于启用了多用户的设备的所有安全性要求(请参阅第 9.5 节),虽然除了主要用户之外,受管理资料不算作其他用户。
- [C-1-10] 必须支持指定满足以下要求的单独锁定屏幕,以便向在受管理个人资料中运行的应用授予访问权限。
- 设备实现必须遵从
DevicePolicyManager.ACTION_SET_NEW_PASSWORD
intent,并显示一个界面,以便用户为受管理个人资料配置单独的锁屏凭据。 - 受管理资料的锁定屏幕凭据必须使用与父级资料相同的凭据存储和管理机制,如 Android 开源项目网站上所述。
- 除非在通过 getParentProfileInstance 返回的
DevicePolicyManager
实例上被调用,否则 DPC 密码政策必须仅适用于受管理个人资料的锁定屏幕凭据。
- 设备实现必须遵从
- 当受管理资料中的联系人信息显示在预安装的通话记录、通话界面、进行中和未接来电提醒、通讯录和即时通讯应用中时,它们应带有用于表示受管理资料应用的相同标记。
3.9.3 受管理用户支持
如果设备实现声明了 android.software.managed_users
,则:
- [C-1-1] 必须提供一种方式,让用户能够在
isLogoutEnabled
返回true
时在多用户会话中退出当前用户并切换回主要用户。这种方式必须让用户能够在锁屏的情况下(无需解锁设备)访问。
3.10. 无障碍服务
Android 提供了一个无障碍服务层,以便残障用户更轻松地在其设备上进行导航。此外,Android 还提供了一些平台 API,以便无障碍服务实现接收针对用户和系统事件的回调并生成替代反馈机制,例如文字转语音、触感反馈,以及轨迹球/方向键导航。
如果设备实现支持第三方无障碍服务,则:
- [C-1-1] 必须提供 Android 无障碍服务框架(如无障碍服务 API SDK 文档中所述)的实现。
- [C-1-2] 必须生成无障碍服务事件,并将相应的
AccessibilityEvent
提交到所有已注册的AccessibilityService
实现(如 SDK 中所述)。 - [C-1-3] 必须遵从
android.settings.ACCESSIBILITY_SETTINGS
intent,以提供一种可供用户使用的机制,以便他们启用和停用第三方无障碍服务以及预安装的无障碍服务。 - [C-1-4] 如果已启用的无障碍服务声明了
AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON
,则必须在系统的导航栏中添加一个可让用户控制无障碍服务的按钮。请注意,此要求不适用于没有系统导航栏的设备实现,但设备实现应为用户提供一种用于控制这些无障碍服务的方式。
如果设备实现包含预安装的无障碍服务,则:
- [C-2-1] 如果数据存储采用文件级加密 (FBE) 方式进行加密,则必须将这些预安装的无障碍服务实现为直接启动感知型服务。
- 应在开箱设置流程中提供一种可让用户启用相关无障碍服务的机制,以及用于调整字体大小、显示区域大小和放大手势的选项。
3.11. 文字转语音
Android 包含一些可让应用使用文字转语音 (TTS) 服务的 API,并允许服务提供商提供 TTS 服务实现。
如果设备实现报告 android.hardware.audio.output 功能,则:
- [C-1-1] 必须支持 Android TTS 框架 API。
如果设备实现支持安装第三方 TTS 引擎,则:
- [C-2-1] 必须提供一种方式,让用户能够选择在系统级使用的 TTS 引擎。
3.12. TV 输入框架
Android TV 输入框架 (TIF) 能够简化向 Android TV 设备传输实时内容的过程。TIF 提供了一个相应的标准 API,以便创建用于控制 Android TV 设备的输入模块。
如果设备实现支持 TIF,则:
- [C-1-1] 必须声明平台功能
android.software.live_tv
。 - [C-1-2] 必须支持所有 TIF API,以便用户在设备上安装和使用利用此类 API 和基于 TIF 的第三方输入服务的应用。
3.13. 快捷设置
Android 提供了一个“快捷设置”界面组件,供用户快速进行频繁执行或急需执行的操作。
如果设备实现包含“快捷设置”界面组件,则:
- [C-1-1] 必须允许用户添加或移除第三方应用通过
quicksettings
API 提供的图块。 - [C-1-2] 不得自动将来自第三方应用的设置项直接添加到快捷设置中。
- [C-1-3] 必须随同系统提供的快捷设置图块一起显示由用户添加的来自第三方应用的所有设置项。
3.14. 媒体界面
如果设备实现包含通过 MediaBrowser
或 MediaSession
与第三方应用交互的非声控应用(简称应用),则应用:
-
[C-1-2] 必须清楚显示通过 getIconBitmap() 或 getIconUri() 获取的图标和通过 getTitle() 获取的标题(如
MediaDescription
中所述)。可缩短标题以遵守安全规定(例如关于防止驾驶员分心的规定)。 -
[C-1-3] 每当显示这个第三方应用提供的内容时,都必须显示此第三方应用的图标。
-
[C-1-4] 必须允许用户与整个
MediaBrowser
层次结构交互。可以限制访问部分层次结构以遵守安全规定(例如关于防止驾驶员分心的规定),但不得根据内容或内容提供方给予优待。 -
[C-1-5] 必须将点按两次
KEYCODE_HEADSETHOOK
或KEYCODE_MEDIA_PLAY_PAUSE
视为KEYCODE_MEDIA_NEXT
(对于MediaSession.Callback#onMediaButtonEvent
)。
3.15. 免安装应用
设备实现必须满足以下要求:
- [C-0-1] 对于免安装应用,只能向其授予将
android:protectionLevel
设置为"instant"
的权限。 - [C-0-2] 免安装应用不得通过隐式 intent 与安装式应用交互,除非以下某项为 true:
- 组件的 intent 模式过滤器已公开,并且具有 CATEGORY_BROWSABLE
- 操作是 ACTION_SEND、ACTION_SENDTO 或 ACTION_SEND_MULTIPLE
- 目标已通过 android:visibleToInstantApps 明确公开
- [C-0-3] 免安装应用不得与安装式应用明确交互,除非相应组件已通过 android:visibleToInstantApps 公开。
- [C-0-4] 安装式应用不得查看关于设备上免安装应用的详细信息,除非免安装应用明确关联到安装式应用。
- 设备实现必须提供以下方式,让用户能够与免安装应用交互。AOSP 满足默认系统界面、设置和启动器的要求。设备实现:
- [C-0-5] 必须提供一种方式,让用户能够查看并删除为每个应用软件包本地缓存的免安装应用。
- [C-0-6] 必须提供可在免安装应用于前台运行时收起的持久用户通知。此用户通知必须包含关于免安装应用不需要安装的相关信息,并提供一种方式,可将用户导向“设置”中的应用信息屏幕。对于通过网络 intent 启动的免安装应用,即使用操作设置为
Intent.ACTION_VIEW
的 intent,且网络协议为“http”或“https”,还需要提供一个选项:允许用户不启动免安装应用而使用配置的网络浏览器启动关联链接(如果设备上有浏览器可用)。 - [C-0-7] 必须允许从“最近用过”功能中访问正在运行的免安装应用(如果设备上提供“最近用过”功能)。
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
的安装式应用。如果用户在未明确退出的情况下离开此类应用(例如通过按“主屏幕”按钮导致 activity 在系统中仍然处于活动状态,而非按“返回”键使系统中不再有处于活动状态的 activity),则设备实现必须在 RAM 中优先运行该应用,就像对待其他需要继续运行的应用一样(例如前台服务)。虽然此类应用在后台运行,但是系统仍然可以对其应用电源管理功能(例如限制 CPU 和网络访问权限)。 - [C-1-2] 必须提供一个界面,以便用户在启动声明了
cantSaveState
属性的第二个应用时选择不加入常规状态保存/恢复机制的应用。 - [C-1-3] 不得将政策中的其他更改(例如更改 CPU 性能或更改调度优先级)应用于指定
cantSaveState
的应用。
如果设备实现没有声明 FEATURE_CANT_SAVE_STATE
功能,则:
- [C-1-1] 必须忽略应用设置的
cantSaveState
属性,且不得基于该属性更改应用行为。
4. 应用打包兼容性
设备实现:
- [C-0-1] 必须能够安装和运行由官方 Android SDK 中包含的“aapt”工具生成的 Android“.apk”文件。
- 由于上述要求可能不太容易满足,因此建议设备实现使用 AOSP 参考实现中的软件包管理系统。
设备实现:
- [C-0-2] 必须支持使用 APK 签名方案 v3、APK 签名方案 v2 和 JAR 签名验证“.apk”文件。
- [C-0-3] 扩展 .apk、Android 清单、Dalvik 字节码或 RenderScript 字节码格式时,采用的方式不得导致相应文件无法在其他 Android 兼容设备上正确安装和运行。
-
[C-0-4] 不得允许应用(软件包的当前“录制安装程序”除外)在没有用户确认的情况下静默卸载应用,如 SDK 中关于
DELETE_PACKAGE
权限的部分所述。仅有的两个例外应用是:负责处理 PACKAGE_NEEDS_VERIFICATION intent 的系统软件包验证程序应用,和负责处理 ACTION_MANAGE_STORAGE intent 的存储空间管理器应用。 -
[C-0-5] 必须有负责处理
android.settings.MANAGE_UNKNOWN_APP_SOURCES
intent 的 activity。 -
[C-0-6] 除非提出安装请求的应用满足以下所有要求,否则不得安装来自未知来源的应用包:
- 必须声明
REQUEST_INSTALL_PACKAGES
权限,或者将android:targetSdkVersion
设置为 24 或更低。 - 必须已获得用户授权,才能安装来自未知来源的应用。
- 必须声明
-
应提供一种方式,让用户能够按应用授予/撤消安装未知来源的应用的权限;但如果设备实现不希望为用户提供这种选择,则可以选择将该功能实现为空操作,并针对
startActivityForResult()
返回RESULT_CANCELED
。不过,即使在这种情况下,设备实现也应向用户表明为什么没有提供这种选择。 -
[C-0-7] 在已被系统 API
PackageManager.setHarmfulAppWarning
标记为“可能有害”的应用中启动某项 activity 之前,必须向用户显示警告对话框,其中的警告字符串是通过同一系统 APIPackageManager.setHarmfulAppWarning
提供的。 - 应提供一种方式,让用户能够在警告对话框中选择卸载或启动应用。
5. 多媒体兼容性
设备实现:
- [C-0-1] 必须支持第 5.1 节中针对通过
MediaCodecList
声明的每种编解码器定义的媒体格式、编码器、解码器、文件类型和容器格式。 - [C-0-2] 必须通过
MediaCodecList
声明并报告对可供第三方应用使用的编码器和解码器的支持情况。 - [C-0-3] 必须能够正确解码,并向第三方应用通告它可以解码的所有格式。其中包括其编码器生成的所有比特流,以及其
CamcorderProfile
中报告的配置文件。
设备实现:
- 应力争最大限度地缩短编解码器延迟,也就是说,它们
- 不应使用和存储输入缓冲区,而应在处理之后将其返回。
- 持有已解码缓冲区的时间不应超过相应标准(例如 SPS)指定的时间。
- 持有已编码缓冲区的时间不应超过 GOP 结构所要求的时间。
在 Android 开源项目提供的首选 Android 实现中,以下部分中列出的所有编解码器均作为软件实现提供。
请注意,Google 和开放手机联盟 (Open Handset Alliance) 均未做过任何关于这些编解码器中没有第三方专利的声明。打算在硬件或软件产品中使用此源代码的用户请注意,实现此代码(包括在开源软件或共享软件中实现此代码)可能需要获得相关专利持有者的专利许可。
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] PCM 16 位原生字节顺序音频帧(通过
android.media.MediaCodec
API)。
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
。 - [SR] 强烈建议所有 AAC 音频解码器都满足上述 C-2-1 和 C-2-2 要求。
解码 USAC 音频 MPEG-D (ISO/IEC 23003-4) 时:
- [C-3-1] 必须根据 MPEG-D DRC Dynamic Range Control Profile Level 1 解读和应用音量及 DRC 元数据。
- [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 Dynamic Range Control Profile 支持音量和动态范围控制。
如果设备实现支持 ISO/IEC 23003-4 且解码的比特流中存在 ISO/IEC 23003-4 和 ISO/IEC 14496-3 元数据,则:
- ISO/IEC 23003-4 元数据的优先级应更高。
所有音频解码器都必须支持输出:
- [C-6-1] PCM 16 位原生字节顺序音频帧(通过
android.media.MediaCodec
API)。
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-23.85 kbit/s 之间)可供选择,采样率为 16 kHz(如 AMR-WB、自适应多速率 - 宽带语音编解码器中所定义) | 3GPP (.3gp) |
FLAC | 对于编码器和解码器:必须至少支持单声道和立体声模式。必须支持高达 192 kHz 的采样率;必须支持 16 位和 24 位分辨率。FLAC 24 位音频数据处理必须具有浮点音频配置。 |
|
MP3 | 单声道/立体声 8-320 Kbps 恒定 (CBR) 或可变比特率 (VBR) |
|
MIDI | MIDI 类型 0 和 1。DLS 版本 1 和 2。XMF 和 Mobile XMF。支持铃声格式 RTTTL/RTX、OTA 和 iMelody |
|
Vorbis |
|
|
PCM/WAVE | PCM 编解码器必须支持 16 位线性 PCM 和 16 位浮点。WAVE 提取器必须支持 16 位、24 位、32 位线性 PCM 和 32 位浮点(比特率最高可达到硬件上限)。必须支持 8 kHz 至 192 kHz 的采样率。 | WAVE (.wav) |
Opus |
|
5.1.4. 图像编码
如需了解详情,请参阅 5.1.6. 图像编解码器详细信息。
设备实现必须支持以下图像编码:
- [C-0-1] JPEG
- [C-0-2] PNG
- [C-0-3] WebP
如果设备实现支持通过 android.media.MediaCodec
对媒体类型 MIMETYPE_IMAGE_ANDROID_HEIC
进行 HEIC 编码,则:
- [C-1-1] 必须提供支持
BITRATE_MODE_CQ
比特率控制模式、HEVCProfileMainStill
配置文件和 512 x 512 像素帧尺寸的硬件加速 HEVC 编码器编解码器。
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
- [C-0-7] HEIF (HEIC)
支持高位深格式(9+ 位/通道)的图像解码器
- [C-1-1] 必须支持输出 8 位等效格式(如果应用这么要求),例如通过
android.graphics.Bitmap
的ARGB_8888
配置。
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
)。 -
[SR] 强烈建议支持用于输入 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
)。强烈建议同时支持二者。 -
[SR] 强烈建议视频编码器和解码器至少支持一个硬件优化平面或半平面 YUV420 8:8:8 颜色格式(YV12、NV12、NV21 或等效供应商优化格式)。
-
[C-1-5] 支持高位深格式(9+ 位/通道)的视频解码器必须支持输出 8 位等效格式(如果应用发出请求)。必须通过支持 YUV420 8:8:8 颜色格式来反映这一点(通过
android.media.MediaCodecInfo
)。
如果设备实现通过 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] 必须默认为已针对 CPU 读取进行优化的 YUV420 8:8:8 颜色格式(如果配置为不使用 Surface 输出)。
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] 必须像在 Android 开源项目中那样通过 OMX 或 Codec 2.0 API(或二者)支持媒体编解码器,且不停用或规避安全保护措施。具体说来,这并不意味着每个编解码器都必须使用 OMX 或 Codec 2.0 API,只是意味着至少要支持这些 API 中的其中一个,而且对可用 API 的支持必须包含现有的安全保护措施。
- [C-SR] 强烈建议支持 Codec 2.0 API。
如果设备实现不支持 Codec 2.0 API,则:
- [C-2-1] 对于设备支持的每种媒体格式和类型(编码器或解码器),必须包含 Android 开源项目(如果有)中相应的 OMX 软件编解码器。
- [C-2-2] 名称以“OMX.google.”开头的编解码器必须基于其 Android 开源项目源代码。
- [C-SR] 强烈建议 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] 编解码器名称不得具有误导性。例如,名为“解码器”的编解码器必须支持解码,而名为“编码器”的编解码器必须支持编码。名称包含媒体格式的编解码器必须支持这些格式。
如果设备实现支持视频编解码器:
- [C-2-1] 所有视频编解码器都必须针对以下尺寸发布可实现的帧速率数据(如果编解码器支持的话):
标清(低画质) | 标清(高画质) | 高清 720p | 高清 1080p | 超高清 | |
---|---|---|---|---|---|
视频分辨率 |
|
|
|
1920 x 1080 px(MPEG4 除外) | 3840 x 2160 像素(HEVC、VP9) |
- [C-2-2] 具有硬件加速特征的视频编解码器必须发布性能点信息。它们必须各自列出所有支持的标准性能点(在
PerformancePoint
API 中列出),除非被其他支持的标准性能点覆盖。 - 此外,如果它们支持持续视频性能而非列出的标准性能点之一,则应发布扩展性能点。
5.2. 视频编码
如果设备实现支持任何视频编码器,并使其可供第三方应用使用,则:
- 采用两个滑窗时,比帧内 (I-frame) 间隔之间的比特率高出的幅度不应超过 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] 所有硬件加速视频和图片编码器都必须支持从硬件摄像头编码帧。
- 应支持通过所有视频或图片编码器从硬件摄像头编码帧。
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(任意 Slice 顺序)、FMO(灵活宏块顺序)和 RS(冗余 Slice)。此外,为了保持与其他 Android 设备兼容,对于 Baseline Profile,建议编码器不要使用 ASO、FMO 和 RS。
- [C-1-2] 必须支持下表中的标清视频编码配置。
- 应支持 Main Profile Level 4。
- 应支持下表中所列的高清视频编码配置。
如果设备实现通过媒体 API 报告支持对分辨率为 720p 或 1080p 的视频进行 H.264 编码,则:
- [C-2-1] 必须支持下表中的编码配置。
标清(低画质) | 标清(高画质) | 高清 720p | 高清 1080p | |
---|---|---|---|---|
视频分辨率 | 320 x 240 像素 | 720 x 480 像素 | 1280 x 720 像素 | 1920 x 1080 像素 |
视频帧速率 | 20 fps | 30 fps | 30 fps | 30 fps |
视频比特率 | 384 Kbps | 2 Mbps | 4 Mbps | 10 Mbps |
5.2.3. VP8
如果设备实现支持 VP8 编解码器,则:
- [C-1-1] 必须支持标清视频编码配置。
- 应支持以下高清视频编码配置。
- [C-1-2] 必须支持写入 Matroska WebM 文件。
- 应提供满足 WebM 项目 RTC 硬件编码要求的硬件 VP8 编解码器,以确保网络视频串流和视频会议服务的质量达到可接受的水平。
如果设备实现通过媒体 API 报告支持对分辨率为 720p 或 1080p 的视频进行 VP8 编码,则:
- [C-2-1] 必须支持下表中的编码配置。
标清(低画质) | 标清(高画质) | 高清 720p | 高清 1080p | |
---|---|---|---|---|
视频分辨率 | 320 x 180 像素 | 640 x 360 像素 | 1280 x 720 像素 | 1920 x 1080 像素 |
视频帧速率 | 30 fps | 30 fps | 30 fps | 30 fps |
视频比特率 | 800 Kbps | 2 Mbps | 4 Mbps | 10 Mbps |
5.2.4. VP9
如果设备实现支持 VP9 编解码器,则:
- [C-1-2] 必须支持 Profile 0 Level 3。
- [C-1-1] 必须支持写入 Matroska WebM 文件。
- [C-1-3] 必须生成 CodecPrivate 数据。
- 应支持下表中所列的高清解码配置。
- [SR] 强烈建议支持下表中所列的高清解码配置(如果有硬件编码器)。
标清 | 高清 720p | 高清 1080p | 超高清 | |
---|---|---|---|---|
视频分辨率 | 720 x 480 像素 | 1280 x 720 像素 | 1920 x 1080 像素 | 3840 x 2160 像素 |
视频帧速率 | 30 fps | 30 fps | 30 fps | 30 fps |
视频比特率 | 1.6 Mbps | 4 Mbps | 5 Mbps | 20 Mbps |
如果设备实现声明通过媒体 API 支持 Profile 2 或 Profile 3:
- 可选择是否支持 12 位格式。
5.2.5. H.265
如果设备实现支持 H.265 编解码器,则:
- [C-1-1] 必须支持 Main Profile Level 3。
- 应支持下表中所列的高清编码配置。
- [SR] 强烈建议支持下表中所列的高清编码配置文件(如果有硬件编码器的话)。
标清 | 高清 720p | 高清 1080p | 超高清 | |
---|---|---|---|---|
视频分辨率 | 720 x 480 像素 | 1280 x 720 像素 | 1920 x 1080 像素 | 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] 对于所有 VP8、VP9、H.264 和 H.265 编解码器,都必须支持通过标准 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(任意 Slice 顺序)、FMO(灵活宏块顺序)和 RS(冗余 Slice)。
- [C-1-2] 必须能够对以下视频进行解码:采用下表中所列的标清配置,且使用 Baseline Profile 和 Main Profile Level 3.1(包括 720p30)编码的视频。
- 应能够对采用下表中所列高清配置文件的视频进行解码。
如果 Display.getSupportedModes()
方法报告的高度等于或大于视频分辨率,则设备实现:
- [C-2-1] 必须支持下表中的高清 720p 视频解码配置。
- [C-2-2] 必须支持下表中的高清 1080p 视频解码配置。
标清(低画质) | 标清(高画质) | 高清 720p | 高清 1080p | |
---|---|---|---|---|
视频分辨率 | 320 x 240 像素 | 720 x 480 像素 | 1280 x 720 像素 | 1920 x 1080 像素 |
视频帧速率 | 30 fps | 30 fps | 60 fps | 30 fps (60 fpsTV) |
视频比特率 | 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] 设备实现必须至少支持 720、1080 和超高清配置文件的 H.265 或 VP9 解码之一。
标清(低画质) | 标清(高画质) | 高清 720p | 高清 1080p | 超高清 | |
---|---|---|---|---|---|
视频分辨率 | 352 x 288 像素 | 720 x 480 像素 | 1280 x 720 像素 | 1920 x 1080 像素 | 3840 x 2160 像素 |
视频帧速率 | 30 fps | 30 fps | 30 fps | 30/60 fps(60 fps采用 H.265 硬件解码的 TV) | 60 fps |
视频比特率 | 600 Kbps | 1.6 Mbps | 4 Mbps | 5 Mbps | 20 Mbps |
如果设备实现声明通过媒体 API 支持 HDR 配置文件(HEVCProfileMain10HDR10
、HEVCProfileMain10HDR10Plus
),则:
-
[C-3-1] 设备实现必须使用 MediaCodec API 从应用中接受所需的 HDR 元数据(对于所有 HDR 配置文件,该元数据为 MediaFormat#KEY_HDR_STATIC_INFO),并支持从相关规范定义的比特流和/或容器中提取所需的 HDR 元数据(对于所有 HDR 配置文件,该元数据为 MediaFormat#KEY_HDR_STATIC_INFO;对于 HDR10Plus 配置文件,该元数据为 MediaFormat#KEY_HDR10_PLUS_INFO)。此外,设备实现还必须支持从相关规范定义的比特流和/或容器中输出所需的 HDR 元数据(对于所有 HDR 配置文件,该元数据为 MediaFormat#KEY_HDR_STATIC_INFO)。
-
[C-SR] 强烈建议设备实现支持通过 MediaCodec#getOutputFormat(int) 输出 HDR10Plus 配置文件的元数据 MediaFormat#KEY_HDR10_PLUS_INFO
.
-
[C-3-2] 设备实现必须在设备屏幕或标准视频输出端口(例如 HDMI)上正确显示
HEVCProfileMain10HDR10
配置文件的 HDR 内容。 -
[C-SR] 强烈建议设备实现在设备屏幕或标准视频输出端口(例如 HDMI)上正确显示
HEVCProfileMain10HDR10Plus
配置文件的 HDR 内容。
5.3.6. VP8
如果设备实现支持 VP8 编解码器,则:
- [C-1-1] 必须支持下表中的标清解码配置。
- 应使用满足要求的硬件 VP8 编解码器。
- 应支持下表中的高清解码配置。
如果 Display.getSupportedModes()
方法报告的高度等于或大于视频分辨率,则:
- [C-2-1] 设备实现必须支持下表中的 720p 配置。
- [C-2-2] 设备实现必须支持下表中的 1080p 配置。
标清(低画质) | 标清(高画质) | 高清 720p | 高清 1080p | |
---|---|---|---|---|
视频分辨率 | 320 x 180 像素 | 640 x 360 像素 | 1280 x 720 像素 | 1920 x 1080 像素 |
视频帧速率 | 30 fps | 30 fps | 30 fps (60 fpsTV) | 30 (60 fpsTV) |
视频比特率 | 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] 设备实现必须至少支持 720、1080 和超高清配置文件的 VP9 或 H.265 解码之一。
标清(低画质) | 标清(高画质) | 高清 720p | 高清 1080p | 超高清 | |
---|---|---|---|---|---|
视频分辨率 | 320 x 180 像素 | 640 x 360 像素 | 1280 x 720 像素 | 1920 x 1080 像素 | 3840 x 2160 像素 |
视频帧速率 | 30 fps | 30 fps | 30 fps | 30 fps(60 fps采用 VP9 硬件解码的 TV) | 60 fps |
视频比特率 | 600 Kbps | 1.6 Mbps | 4 Mbps | 5 Mbps | 20 Mbps |
如果设备实现声明通过 CodecProfileLevel 媒体 API 支持 VP9Profile2
或 VP9Profile3
,则:
- 可选择是否支持 12 位格式。
如果设备实现声明通过媒体 API 支持 HDR 配置(VP9Profile2HDR
、VP9Profile2HDR10Plus
、VP9Profile3HDR
和 VP9Profile3HDR10Plus
),则:
-
[C-4-1] 设备实现必须使用 MediaCodec API 从应用中接受所需的 HDR 元数据(对于所有 HDR 配置文件,该元数据为
MediaFormat#KEY_HDR_STATIC_INFO
;对于HDR10Plus
配置文件,该元数据为MediaCodec#PARAMETER_KEY_HDR10_PLUS_INFO
参数),并且还必须支持从相关规范定义的比特流和/或容器中提取所需的 HDR 元数据(对于所有 HDR 配置文件,该元数据为MediaFormat#KEY_HDR_STATIC_INFO
;对于HDR10Plus
配置文件,该元数据为MediaFormat#KEY_HDR10_PLUS_INFO
)。此外,设备实现还必须支持从相关规范定义的比特流和/或容器中输出所需的 HDR 元数据(对于所有 HDR 配置文件,该元数据为MediaFormat#KEY_HDR_STATIC_INFO
)。 -
[C-4-2] 设备实现必须在设备屏幕或标准视频输出端口(例如 HDMI)上正确显示
VP9Profile2HDR
和VP9Profile3HDR
配置文件的 HDR 内容。 -
[C-SR] 强烈建议设备实现支持通过
MediaCodec#getOutputFormat(int)
输出HDR10Plus
配置文件的元数据MediaFormat#KEY_HDR10_PLUS_INFO
。 -
[C-SR] 强烈建议设备实现在设备屏幕或标准视频输出端口(例如 HDMI)上正确显示 VP9Profile2HDR10Plus 和 VP9Profile3HDR10Plus 配置文件的 HDR 内容。
5.3.8. 杜比视界
如果设备实现声明通过 HDR_TYPE_DOLBY_VISION
支持杜比视界解码器,则:
- [C-1-1] 必须提供具有杜比视界功能的提取器。
- [C-1-2] 必须在设备屏幕或标准视频输出端口(例如 HDMI)上正确显示杜比视界内容。
- [C-1-3] 必须将向后兼容的基本层(如果存在)的轨道索引设置为与组合式杜比视界层的轨道索引相同。
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] 必须允许捕获具有以下特征的原始音频内容:
- 格式:线性 PCM,16 位
- 采样率:8000、11025、16000、44100、48000 Hz
- 声道:单声道
-
应允许采集具有以下特征的原始音频内容:
- 格式:线性 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 供第三方应用访问的可用麦克风的信息,以及可通过AudioRecord.getActiveMicrophones()
和MediaRecorder.getActiveMicrophones()
API 供第三方应用访问的当前有效麦克风的信息。如果设备实现允许以 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
音频源的音频串流时,必须默认停用所有自动增益控制。 - 在录制语音识别音频串流时,应保持大致平坦的幅频特性,具体来说就是:±3 dB (100 Hz - 4000 Hz)。
- 在录制语音识别音频串流时,应设置适当的输入敏感度,以确保对于 16 位的样本,1000 Hz 的 90 dB 声压级 (SPL) 音频源产生的 RMS 为 2500。
- 在录制语音识别音频串流时,如果麦克风上的 SPL 为 90 dB,PCM 振幅级应能够线性跟踪输入 SPL 在至少 30 dB(-18 dB 到 +12 dB)范围内的变化。
- 在录制语音识别音频串流时,如果麦克风上输入 1 kHz 的 90 dB SPL 声音,则总谐波畸变率应小于 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
,则:
- 使用
AudioSource.VOICE_COMMUNICATION
捕获音频时,应实现针对语音通信微调并已应用于捕获路径的回声消除器 (AEC) 技术
如果设备实现提供在选择 AudioSource.VOICE_COMMUNICATION
时插入音频捕获路径中的回声消除器,则:
- [C-SR] 强烈建议通过 AcousticEchoCanceler API 方法 AcousticEchoCanceler.isAvailable() 声明这一点
- [C-SR] 强烈建议允许通过 AcousticEchoCanceler API 控制此音频效果。
- [C-SR] 强烈建议通过 AudioEffect.Descriptor.uuid 字段唯一标识每个 AEC 技术实现。
5.4.5. 并发捕获
如果设备实现声明了 android.hardware.microphone
,则必须实现并发捕获(如本文档中所述)。具体而言:
- [C-1-1] 必须允许通过
AudioSource.VOICE_RECOGNITION
捕获的无障碍服务以及至少一个由任何AudioSource
捕获的应用对麦克风进行并发访问。 - [C-1-2] 必须允许通过一个具有智能助理角色的预安装应用和至少一个由任何
AudioSource
捕获(AudioSource.VOICE_COMMUNICATION
或AudioSource.CAMCORDER
除外)的应用对麦克风进行并发访问。 - [C-1-3] 当一个应用正在通过
AudioSource.VOICE_COMMUNICATION
或AudioSource.CAMCORDER
捕获音频时,必须阻止任何其他应用(无障碍服务除外)捕获音频。不过,当一个应用正在通过AudioSource.VOICE_COMMUNICATION
捕获音频时,如果其他应用是具有权限CAPTURE_AUDIO_OUTPUT
的特权(预安装)应用,则可以捕获语音通话。 - [C-1-4] 如果两个或多个应用正在并发捕获音频,并且这些应用顶部都没有界面,则最近开始捕获的应用会接收音频。
5.4.6. 麦克风增益水平
如果设备实现声明了 android.hardware.microphone
,则:
- 对于每个用于对语音识别音频源进行录音的麦克风,在中频范围内应表现出大致平坦的幅频特性,具体来说就是:±3 dB (100 Hz - 4000 Hz)。
- 对于每个用于对语音识别音频源进行录音的麦克风,应设置音频输入敏感度,以 90 dB 声压级 (SPL) 播放频率为 1000 Hz 的正弦音调源会产生 RMS 为 2500 的 16 位的样本(或对于浮点/双精度样本,应为 -22.35 dB 全标度)。
- [C-SR] 对于每个用于对语音识别音频源进行录音的麦克风,强烈建议在低频范围内表现出适当的振幅等级,具体来说就是:±20 dB (5 Hz - 100 Hz)(与中频范围相比)。
- [C-SR] 对于每个用于对语音识别音频源进行录音的麦克风,强烈建议在高频范围内表现出适当的振幅等级,具体来说就是:±30 dB (4000 Hz - 22 KHz)(与中频范围相比)。
5.5. 音频播放
Android 支持应用通过音频输出外围设备(如第 7.8.2 节中定义)播放音频。
5.5.1. 原始音频播放
如果设备实现声明了 android.hardware.audio.output
,则:
-
[C-1-1] 必须允许播放具有以下特征的原始音频内容:
- 来源格式:线性 PCM、16 位、8 位、浮点型
- 声道:单声道、立体声,有效的多声道配置支持多达 8 声道
-
采样率(以 Hz 为单位):
- 8000、11025、16000、22050、32000、44100、48000(声道配置如上所列)
- 96000(单声道和立体声)
-
应允许播放具有以下特征的原始音频内容:
- 采样率:24000
5.5.2. 音效
Android 为设备实现提供了音效 API。
如果设备实现声明了 android.hardware.audio.output
功能,则:
- [C-1-1] 必须支持
EFFECT_TYPE_EQUALIZER
和EFFECT_TYPE_LOUDNESS_ENHANCER
实现,这两种实现可通过 AudioEffect 子类Equalizer
和LoudnessEnhancer
进行控制。 - [C-1-2] 必须支持可视化工具 API 实现(可通过
Visualizer
类进行控制)。 - [C-1-3] 必须支持
EFFECT_TYPE_DYNAMICS_PROCESSING
实现,该实现可通过 AudioEffect 子类DynamicsProcessing
进行控制。 - 应支持
EFFECT_TYPE_BASS_BOOST
、EFFECT_TYPE_ENV_REVERB
、EFFECT_TYPE_PRESET_REVERB
和EFFECT_TYPE_VIRTUALIZER
实现(可通过AudioEffect
子类BassBoost
、EnvironmentalReverb
、PresetReverb
和Virtualizer
进行控制)。 - [C-SR] 强烈建议支持浮点和多声道效果。
5.5.3. 音频输出音量
Automotive 设备实现:
- 应允许按每个音频串流单独调整音频音量(使用通过 AudioAttributes 定义的内容类型或用法,以及
android.car.CarAudioManager
中公开定义的车载音频系统用法)。
5.6. 音频延迟
音频延迟是指音频信号通过系统时的时间延迟。许多类别的应用都依赖于非常短的延迟来实现实时音效。
在本节中,使用以下定义:
- 输出延迟:从应用写入经过 PCM 编码的数据对应的帧到相应声音在设备内置变频器处的环境中播放出来之间的时间间隔,或者从信号通过端口离开设备到可在外部听到相应声音之间的时间间隔。
- 冷输出延迟:在收到相应请求之前音频输出系统处于空闲状态且已关闭时,第一帧的输出延迟。
- 连续输出延迟:设备已经开始播放音频时,后续帧的输出延迟。
- 输入延迟:从环境中发出声音到设备内置变频器处的设备捕获到该声音之间的时间间隔,或者从信号通过端口进入设备到应用读取经过 PCM 编码的数据对应的帧之间的时间间隔。
- 丢失输入:输入信号中不可用或无法捕获到的初始部分。
- 冷输入延迟:在收到相应请求之前音频输入系统处于空闲状态且已关闭时,丢失输入的时长与第一帧的输入延迟之和。
- 连续输入延迟:设备已经开始捕获音频时,后续帧的输入延迟。
- 冷输出抖动:冷输出延迟值的单独测量结果之间的变化。
- 冷输入抖动:冷输入延迟值的单独测量结果之间的变化。
- 连续往返延迟:连续输入延迟、连续输出延迟,再加一个缓冲期的总和。缓冲期可让应用有时间来处理信号,并有时间来降低输入和输出串流之间的相位差。
- OpenSL ES PCM 缓冲区队列 API:Android NDK 中的一组与 PCM 相关的 OpenSL ES API。
- AAudio 原生音频 API:Android NDK 中的一组 AAudio API。
- 时间戳:信息流中的相对帧位置与该帧在关联端点上进入或离开音频处理管道的大约时间的组合。另请参阅 AudioTimestamp。
- 小故障:音频信号临时中断或样例值不正确,这通常是由输出设备的缓冲区欠载、输入设备的缓冲区溢出或任何其他数字或模拟噪声源所致。
如果设备实现声明了 android.hardware.audio.output
,则必须满足或超出以下要求:
- [C-1-1] AudioTrack.getTimestamp 和
AAudioStream_getTimestamp
返回的输出时间戳精确到 +/- 2 毫秒。 - [C-1-2] 冷输出延迟不超过 500 毫秒。
如果设备实现声明了 android.hardware.audio.output
,则强烈建议它们满足或超出以下要求:
- [C-SR] 冷输出延迟不超过 100 毫秒。强烈建议运行此版 Android 的现有设备及新设备现在就满足这些要求。在 2021 年的未来平台版本中,我们将要求冷输出延迟不得超过 200 毫秒。
- [C-SR] 连续输出延迟不超过 45 毫秒。
- [C-SR] 最大限度地降低冷输出抖动。
- [C-SR] AudioTrack.getTimestamp 和
AAudioStream_getTimestamp
返回的输出时间戳精确到 +/- 1 毫秒。
同时使用 OpenSL ES PCM 缓冲区队列 API 和 AAudio 原生音频 API 时,如果设备实现在经过任何初始校准后满足了上述要求,则对于在至少一个受支持音频输出设备上的连续输出延迟和冷输出延迟:
- [C-SR] 强烈建议通过声明
android.hardware.audio.low_latency
功能标志报告低延迟音频。 - [C-SR] 强烈建议通过 AAudio API 满足针对低延迟音频的要求。
- [C-SR] 对于从
AAudioStream_getPerformanceMode()
返回AAUDIO_PERFORMANCE_MODE_LOW_LATENCY
的信息流,强烈建议确保AAudioStream_getFramesPerBurst()
返回的值小于或等于android.media.AudioManager.getProperty(String)
针对属性键AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER
返回的值。
如果设备实现未通过 OpenSL ES PCM 缓冲区队列 API 和 AAudio 原生音频 API 满足针对低延迟音频的要求,则:
- [C-2-1] 不得报告对低延迟音频的支持情况。
如果设备实现包含 android.hardware.microphone
,则必须满足以下针对输入音频的要求:
- [C-3-1] 将 AudioRecord.getTimestamp 或
AAudioStream_getTimestamp
返回的输入时间戳中的误差限制在 +/- 2 毫秒内。“误差”在此是指与正确值的偏差。 - [C-3-2] 冷输入延迟不超过 500 毫秒。
如果设备实现包含 android.hardware.microphone
,则强烈建议它们满足以下针对输入音频的要求:
- [C-SR] 冷输入延迟不超过 100 毫秒。强烈建议运行此版 Android 的现有设备及新设备现在就满足这些要求。在 2021 年的未来平台版本中,我们将要求冷输入延迟不得超过 200 毫秒。
- [C-SR] 连续输入延迟不超过 30 毫秒。
- [C-SR] 连续往返延迟不超过 50 毫秒。
- [C-SR] 最大限度地降低冷输入抖动。
- [C-SR] 将 AudioRecord.getTimestamp 或
AAudioStream_getTimestamp
返回的输入时间戳中的误差限制在 +/- 1 毫秒内。
5.7. 网络协议
设备实现必须支持 Android SDK 文档中指定的适用于音频和视频播放的媒体网络协议。
如果设备实现包含音频或视频解码器,则:
-
[C-1-1] 必须通过 HTTP(S) 支持第 5.1 节中列出的所有必须支持的编解码器和容器格式。
-
[C-1-2] 必须通过 HTTP Live Streaming 草案协议(第 7 版)支持下方“媒体段格式”表中列出的媒体段格式。
-
[C-1-3] 必须支持以下 RTP 音频视频配置以及下方 RTSP 表中的相关编解码器。有关例外情况,请参阅第 5.1 节中的表格脚注。
媒体段格式
段格式 | 参考 | 必须支持的编解码器 |
---|---|---|
MPEG-2 传输流 | ISO 13818 |
视频编解码器:
和 MPEG-2 的详细信息。 音频编解码器:
|
采用 ADTS 框架和 ID3 标记的 AAC | ISO 13818-7 | 请参阅第 5.1.1 节,了解有关 AAC 及其变体的详细信息 |
WebVTT | WebVTT |
RTSP(RTP、SDP)
配置名称 | 参考 | 必须支持的编解码器 |
---|---|---|
H264 AVC | RFC 6184 | 请参阅第 5.1.3 节,了解有关 H264 AVC 的详细信息 |
MP4A-LATM | RFC 6416 | 请参阅第 5.1.1 节,了解有关 AAC 及其变体的详细信息 |
H263-1998 |
RFC 3551 RFC 4629 RFC 2190 |
请参阅第 5.1.3 节,了解有关 H263 的详细信息 |
H263-2000 | RFC 4629 | 请参阅第 5.1.3 节,了解有关 H263 的详细信息 |
AMR | RFC 4867 | 请参阅第 5.1.1 节,了解有关 AMR-NB 的详细信息 |
AMR-WB | RFC 4867 | 请参阅第 5.1.1 节,了解有关 AMR-WB 的详细信息 |
MP4V-ES | RFC 6416 | 请参阅第 5.1.3 节,了解有关 MPEG-4 SP 的详细信息 |
mpeg4-generic | RFC 3640 | 请参阅第 5.1.1 节,了解有关 AAC 及其变体的详细信息 |
MP2T | RFC 2250 | 请参阅 HTTP Live Streaming 下的 MPEG-2 传输流,了解相关详细信息 |
5.8. 安全媒体
如果设备实现支持安全视频输出,并且能够支持安全 Surface,则:
- [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 支持)
5.10. 专业音频
如果设备实现通过 android.content.pm.PackageManager 类报告对 android.hardware.audio.pro
功能的支持情况,则:
- [C-1-1] 必须报告对
android.hardware.audio.low_latency
功能的支持情况。 - [C-1-2] 连续往返音频延迟(如第 5.6 节:音频延迟中定义)不得超过 20 毫秒,并且应在至少一条支持的路径上不超过 10 毫秒。
- [C-1-3] 必须包含支持 USB 主机模式和 USB 外围设备模式的 USB 端口。
- [C-1-4] 必须报告对
android.software.midi
功能的支持情况。 - [C-1-5] 必须结合使用 OpenSL ES PCM 缓冲区队列 API 和 AAudio 原生音频 API 的至少一个路径来满足延迟和 USB 音频方面的要求。
- [SR] 强烈建议 AAudio 原生音频 API 通过 MMAP 路径来满足延迟和 USB 音频方面的要求。
- [C-1-6] 冷输出延迟不得超过 200 毫秒。
- [C-1-7] 冷输入延迟不得超过 200 毫秒。
- [SR] 强烈建议当音频在播放并且 CPU 负载有变化时,提供一致水平的 CPU 性能。应使用 Android 应用版本的 SynthMark 提交 ID 09b13c6f49ea089f8c31e5d035f912cc405b7ab8 对此进行测试。SynthMark 会使用在测量系统性能的模拟音频框架上运行的软件合成器。SynthMark 应用需要使用“自动测试”选项运行并获得以下结果:
- voicemark.90 >= 32 个语音
- latencymark.fixed.little <= 15 毫秒
- latencymark.dynamic.little <= 50 毫秒
请参阅 SynthMark 文档,了解基准说明。
- 应最大限度地降低音频时钟相对于标准时间的不准确性和偏差。
- 应最大限度地降低音频时钟相对于 CPU
CLOCK_MONOTONIC
的偏差(当两者皆处于活动状态时)。 - 应最大限度地缩短设备内置变频器上的音频延迟。
- 应最大限度地缩短 USB 数字音频路径上的音频延迟。
- 应记录在所有路径上的音频延迟时间测量结果。
- 应最大限度地降低音频缓冲完成回调输入时间内的抖动,因为此类抖动会影响全 CPU 带宽中可供回调使用的百分比。
- 在正常使用情况下(符合报告的延迟),不应出现音频干扰。
- 声道间延迟时间差应为零。
- 采用各种传输方式时,都应最大限度地缩短 MIDI 平均延迟。
- 采用各种传输方式时,都应最大限度地降低在有负载状态下的 MIDI 延迟时间变化(抖动)。
- 采用各种传输方式时,都应提供准确的 MIDI 时间戳。
- 应最大限度地降低在设备内置变频器上的音频信号噪声,包括刚完成冷启动后一段时间内的噪声。
- 相应端点输入侧和输出侧(当两者皆处于活动状态时)之间的音频时钟差应为零。相应端点的示例包括设备上的麦克风和扬声器,或音频耳机插孔输入端和输出端。
- 应在同一线程上处理相应端点输入侧和输出侧(当两者皆处于活动状态时)的音频缓冲完成回调,并在从输入回调返回后立即进入输出回调。或者,如果在同一线程上处理回调不可行,则应在进入输入回调后很快进入输出回调,以便应用在输入侧和输出侧拥有一致的时间。
- 应最大限度地减小相应端点输入侧和输出侧 HAL 音频缓冲之间的相位差。
- 应最大限度地缩短触摸延迟。
- 应最大限度地降低在有负载状态下的触摸延迟时间变化(抖动)。
- 从轻触输入到音频输出的延迟时间应小于或等于 40 毫秒。
如果设备实现满足上述所有要求,则:
- [SR] 强烈建议通过
android.content.pm.PackageManager
类报告对android.hardware.audio.pro
功能的支持情况。
如果设备实现包含 4 导体 3.5 毫米音频耳机插孔,则:
- [C-2-1] 必须确保在音频耳机插孔路径上的连续往返音频延迟不超过 20 毫秒。
- [SR] 强烈建议遵从有线音频耳机规范 (v1.1) 的移动设备(耳机插孔)规范一节中的规定。
- 在音频耳机插孔路径上的连续往返音频延迟不应超过 10 毫秒。
如果设备实现省略了 4 导体 3.5 毫米音频耳机插孔,并且包含支持 USB 主机模式的 USB 端口,则:
- [C-3-1] 必须实现 USB 音频类。
- [C-3-2] 在 USB 主机模式端口(使用 USB 音频类)上的连续往返音频延迟不得超过 20 毫秒。
- 在 USB 主机模式端口(使用 USB 音频类)上的连续往返音频延迟不应超过 10 毫秒。
- [C-SR] 与同样支持这些要求的 USB 音频外围设备结合使用时,强烈建议支持每个方向最多 8 个声道的同时 I/O、96 kHz 采样率和 24 位或 32 位深。
如果设备实现包含 HDMI 端口,则:
- 应在至少一种配置中支持频率为 192 kHz、位深为 20 或 24 的八声道立体声输出,而不丢失位深或重新采样。
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] 对于每个用于对未处理音频源进行录音的麦克风,在中频范围内必须表现出大致平坦的幅频特性,具体来说就是:±10 dB (100 Hz - 7000 Hz)。
-
[C-1-3] 对于每个用于对未处理音频源进行录音的麦克风,在低频范围内必须表现出适当的振幅等级,具体来说就是:±20 dB (5 Hz - 100 Hz)(与中频范围相比)。
-
[C-1-4] 对于每个用于对未处理音频源进行录音的麦克风,在高频范围内必须表现出适当的振幅等级,具体来说就是:±30 dB (7000 Hz - 22 KHz)(与中频范围相比)。
-
[C-1-5] 对于每个用于对未处理音频源进行录音的麦克风,都必须设置适当的音频输入敏感度,以确保对于 16 位的样本,以 94 dB 声压级 (SPL) 播放的 1000 Hz 正弦音调源会产生 RMS 为 520 的响应(或对于浮点/双精度样本,则为 -36 dB 全标度)。
-
[C-1-6] 对于每个用于对未处理音频源进行录音的麦克风,信噪比 (SNR) 都不得低于 60 dB(SNR 是按照 94 dB SPL 和等效 SPL 自噪声之间的差异进行衡量,A 加权)。
-
[C-1-7] 对于每个用于对未处理音频源进行录音的麦克风,在频率为 1 kHZ、输入声压级为 90 dB SPL 时,总谐波畸变率都必须小于 1%。
-
除了用于将声压级提升到所需范围的声压级倍增器之外,路径中不得有任何其他信号处理机制(例如自动增益控制、高通滤波器,或回声消除)。也就是说:
- [C-1-8] 无论架构中出于任何原因而存在信号处理机制,此类机制都必须处于停用状态,并能够有效避免在信号路径中引入任何延迟。
- [C-1-9] 虽然路径中允许存在声压级倍增器,但该倍增器不得在信号路径中引入延迟。
所有 SPL 测量都是直接在接受测试的麦克风旁进行。对于多麦克风配置,这些要求适用于每个麦克风。
如果设备实现声明了 android.hardware.microphone
,但不支持未处理音频源,则:
- [C-2-1] 必须针对
AudioManager.getProperty(PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED)
API 方法返回null
,以适当指明不支持未处理音频源。 - [SR] 仍强烈建议尽可能多地满足未处理录音来源信号路径方面的要求。
6. 开发者工具和选项兼容性
6.1. 开发者工具
设备实现:
- [C-0-1] 必须支持 Android SDK 中提供的 Android 开发者工具。
-
- [C-0-2] 必须支持 adb(如 Android SDK 中所述)和 AOSP 中提供的 shell 命令(可供应用开发者使用,包括
dumpsys
cmd stats
) - [C-SR] 强烈建议支持 shell 命令
cmd testharness
。 - [C-0-3] 不得更改通过 dumpsys 命令记录的设备系统事件(batterystats、diskstats、fingerprint、graphicsstats、netstats、notification、procstats)的格式或内容。
- [C-0-10] 记录时不得有任何遗漏,并使以下事件可供
cmd stats
shell 命令和StatsManager
System API 类访问和使用。- ActivityForegroundStateChanged
- AnomalyDetected
- AppBreadcrumbReported
- AppCrashOccurred
- AppStartOccurred
- BatteryLevelChanged
- BatterySaverModeStateChanged
- BleScanResultReceived
- BleScanStateChanged
- ChargingStateChanged
- DeviceIdleModeStateChanged
- ForegroundServiceStateChanged
- GpsScanStateChanged
- JobStateChanged
- PluggedStateChanged
- ScheduledJobStateChanged
- ScreenStateChanged
- SyncStateChanged
- SystemElapsedRealtime
- UidProcessStateChanged
- WakelockStateChanged
- WakeupAlarmOccurred
- WifiLockStateChanged
- WifiMulticastLockStateChanged
- WifiScanStateChanged
- [C-0-4] 必须使设备侧 adb 守护程序默认处于停用状态,并有一个可供用户使用的 Android 调试桥开启机制。
- [C-0-5] 必须支持安全 adb。Android 支持安全 adb。安全 adb 能够在经过身份验证的已知主机上启用 adb。
-
[C-0-6] 必须提供可从主机连接 adb 的机制。例如:
- 如果设备实现没有支持外围设备模式的 USB 端口,则必须通过局域网(例如以太网或 Wi-Fi)实现 adb。
- 必须提供适用于 Windows 7、9 和 10 的驱动程序,以便开发者使用 adb 协议连接到设备。
- [C-0-2] 必须支持 adb(如 Android SDK 中所述)和 AOSP 中提供的 shell 命令(可供应用开发者使用,包括
-
- [C-0-7] 必须支持 Android SDK 中载述的所有 ddms 功能。由于 ddms 会使用 adb,因此虽然对 ddms 的支持应默认处于停用状态,但如果用户启用了 Android 调试桥,则必须支持 ddms,如上所述。
-
Monkey
- [C-0-8] 必须包含 Monkey 框架,并使其可供应用使用。
-
SysTrace
- [C-0-9] 必须支持 Android SDK 中所述的 Systrace 工具。Systrace 必须默认处于停用状态,并有一个可供用户使用的 Systrace 开启机制。
-
- [C-SR] 强烈建议向 shell 用户公开
/system/bin/perfetto
二进制文件,且 cmdline 符合 perfetto 文档要求。 - [C-SR] 强烈建议 perfetto 二进制文件接受符合 perfetto 文档中定义的架构的 protobuf 配置作为输入。
- [C-SR] 强烈建议 perfetto 二进制文件写入符合 perfetto 文档中定义的架构的 protobuf 跟踪记录作为输出。
- [C-SR] 强烈建议通过 perfetto 二进制文件至少提供 perfetto 文档中所述的数据源。
- [C-SR] 强烈建议向 shell 用户公开
-
如果设备实现支持 shell 命令
cmd testharness
并运行cmd testharness enable
,则:- [C-2-1] 必须针对
ActivityManager.isRunningInUserTestHarness()
返回true
- [C-2-2] 必须实现自动化测试框架模式(如自动化测试框架模式文档中所述)。
- [C-2-1] 必须针对
如果设备实现通过 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] 在 SDK 文档允许的情况下,该 API 的方法必须返回 null 值。
- [C-0-5] 在 SDK 文档不允许 null 值的情况下,该 API 的方法必须返回相应类的空操作实现。
- [C-0-6] 该 API 的方法不得抛出 SDK 文档中未载述的异常。
- [C-0-7] 对于相同的 build 指纹,设备实现必须能够始终如一地通过 android.content.pm.PackageManager 类中的
getSystemAvailableFeatures()
和hasSystemFeature(String)
方法报告准确的硬件配置信息。
这些要求的一个典型适用情况示例就是电话 API:即使在非手机设备上,这些 API 也必须实现为合理的空操作。
7.1. 显示和图形
Android 包含一些能够适当地为设备自动调整应用资产和界面布局的方式,以确保第三方应用能够在各种硬件配置上良好地运行。在所有与 Android 兼容的第三方应用可运行的 Android 兼容屏幕上,设备实现必须正确实现这些 API 和行为(本节中对此进行了详细说明)。
本节的要求中提到的单位定义如下:
- 物理对角线尺寸:屏幕亮显部分的两个对角之间的距离(以英寸为单位)。
- 每英寸的点数 (dpi):1 英寸的线性水平或垂直跨度内包含的像素数。如果列出了 dpi 值,则水平 dpi 和垂直 dpi 都必须在该范围内。
- 宽高比:屏幕的长度像素与宽度像素之比。例如,480x854 像素的显示屏的宽高比是 854/480 = 1.779,或约为“16:9”。
- 密度无关像素 (dp):按 160 dpi 屏幕标准化的虚拟像素单位,计算公式如下:像素 = dps *(密度/160)。
7.1.1. 屏幕配置
7.1.1.1. 屏幕尺寸和形状
Android 界面框架支持多种不同的逻辑屏幕布局尺寸,并且允许应用通过 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。
- 应提供一种方式,让用户能够切换为矩形角显示模式。
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-2] 如果设备实现的
Configuration.uiMode
设置为UI_MODE_TYPE_NORMAL
,则宽高比必须等于或大于 1.3333 (4:3),除非应用可通过满足下列某个条件拉伸得更宽:- 应用通过 android:resizeableActivity 属性声明其大小可以调整。
- 应用声明会对允许的宽高比造成限制的
android:minAspectRatio
。
-
[C-0-3] 如果设备实现的
Configuration.uiMode
设置为UI_MODE_TYPE_WATCH
,则宽高比值必须设置为 1.0 (1:1)。
7.1.1.3. 屏幕密度
Android 界面框架定义了一组标准逻辑密度,以便应用开发者确定要采用的应用资源。
-
[C-0-1] 默认情况下,设备实现必须通过
DENSITY_DEVICE_STABLE
API 仅报告DisplayMetrics
中列出的以下 Android 框架密度之一,并且在任何时间此值都必须保持不变;不过,设备可以根据初始启动后用户对屏幕配置(例如屏幕大小)所做的更改报告不同的任意密度。 -
设备实现应定义数值最接近屏幕物理密度的标准 Android 框架密度,除非该逻辑密度会导致报告的屏幕尺寸低于支持的最小值。如果数值最接近物理密度的标准 Android 框架密度会导致屏幕尺寸小于支持的最小兼容屏幕尺寸(宽度为 320 dp),则设备实现应报告下一个最低的标准 Android 框架密度。
如果有用于更改设备显示区域大小的方式,则:
- [C-1-1] 不得将显示区域大小调整为任何超过原生密度 1.5 倍的尺寸,也不得产生小于 320 dp(相当于资源限定尺寸为 sw320dp)的有效最小屏幕尺寸,以先达到者为准。
- [C-1-2] 不得将显示区域大小调整为小于原生密度 0.85 倍的尺寸。
- 为了确保良好的可用性和一致的字体大小,建议提供以下原生显示缩放比例选项(同时遵守上述限制)
- 小:0.85 倍
- 默认值:1 倍(原生显示比例)
- 大:1.15 倍
- 较大:1.3 倍
- 最大:1.45 倍
7.1.2. 显示指标
如果设备实现包含 Android 兼容屏幕或 Android 兼容显示屏幕的视频输出机制,则:
- [C-1-1] 必须为
android.util.DisplayMetrics
API 中指定的所有 Android 兼容屏幕指标报告正确的值。
如果设备实现不包含嵌入式屏幕或视频输出机制,则:
- [C-2-1] 必须报告 Android 兼容屏幕的正确值(如
android.util.DisplayMetrics
API 中针对模拟的默认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] 强烈建议支持 OpenGL ES 3.1。
- 应支持 OpenGL ES 3.2。
如果设备实现支持任何 OpenGL ES 版本,则:
- [C-2-1] 必须通过 OpenGL ES 受管理 API 和原生 API 报告已实现的所有其他 OpenGL ES 扩展;反过来说就是,不得报告不支持的扩展字符串。
- [C-2-2] 必须支持
EGL_KHR_image
、EGL_KHR_image_base
、EGL_ANDROID_image_native_buffer
、EGL_ANDROID_get_native_client_buffer
、EGL_KHR_wait_sync
、EGL_KHR_get_all_proc_addresses
、EGL_ANDROID_presentation_time
、EGL_KHR_swap_buffers_with_damage
、EGL_ANDROID_recordable
和EGL_ANDROID_GLES_layers
扩展。 - [C-SR] 强烈建议支持
EGL_KHR_partial_update
和OES_EGL_image_external
扩展。 - 应通过
getString()
方法准确报告支持的所有纹理压缩格式,这些格式通常是针对特定供应商的。
如果设备实现声明支持 OpenGL ES 3.0、3.1 或 3.2,则:
- [C-3-1] 除了导出 libGLESv2.so 库中的 OpenGL ES 2.0 函数符号之外,还必须导出这些版本的对应函数符号。
- [SR] 强烈建议支持
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 是一个适用于高性能 3D 图形的低开销、跨平台 API。
如果设备实现支持 OpenGL ES 3.1,则:
- [SR] 强烈建议支持 Vulkan 1.1。
如果设备实现包含屏幕或视频输出机制,则:
- 应支持 Vulkan 1.1。
如果设备实现支持 Vulkan 1.0,则:
- [C-1-1] 必须通过
android.hardware.vulkan.level
和android.hardware.vulkan.version
功能标志报告正确的整数值。 - [C-1-2] 必须针对 Vulkan 原生 API
vkEnumeratePhysicalDevices()
至少枚举一个VkPhysicalDevice
。 - [C-1-3] 必须针对枚举的每个
VkPhysicalDevice
完整实现 Vulkan 1.0 API。 - [C-1-4] 必须通过 Vulkan 原生 API
vkEnumerateInstanceLayerProperties()
和vkEnumerateDeviceLayerProperties()
枚举名为libVkLayer*.so
的原生库(位于应用包的原生库目录下)中包含的层。 - [C-1-5] 不得枚举应用软件包外的库提供的层,也不得提供其他方式来跟踪或拦截 Vulkan API,除非应用的
android:debuggable
属性设置为了true
。 - [C-1-6] 必须通过 Vulkan 原生 API 报告支持的所有扩展字符串;反过来说就是,不得报告无法正确支持的扩展字符串。
- [C-1-7] 必须支持 VK_KHR_surface、VK_KHR_android_surface、VK_KHR_swapchain 和 VK_KHR_incremental_present 扩展。
- [C-SR] 强烈建议支持 VK_KHR_driver_properties 和 VK_GOOGLE_display_timing 扩展。
如果设备实现不支持 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 纹理作为呈现目标集成到界面层次结构中。
设备实现:
- [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 空间内 90% DCI-P3 色域的屏幕。
- [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] 强烈建议支持
GL_EXT_sRGB
。
反之,如果设备实现不支持广色域屏幕,则:
- [C-2-1] 尽管并未定义屏幕色域,但应涵盖 CIE 1931 xyY 空间内 100% 或更多的 sRGB。
7.1.5. 旧应用兼容模式
Android 指定了一种“兼容模式”,在该模式下,框架能够以与“标准”屏幕尺寸等效的模式(宽度为 320dp)运行,这是为了服务于不是针对旧版 Android(在实现屏幕尺寸独立性之前发布的旧版 Android)开发的旧应用。
7.1.6. 屏幕技术
Android 平台包含一些可让应用在 Android 兼容屏幕上呈现丰富图形的 API。除非本文档中明确许可,否则设备必须支持所有这些 API(具体定义请参见 Android SDK)。
设备实现的所有 Android 兼容屏幕:
- [C-0-1] 必须能够呈现 16 位彩色图形。
- 应支持能够呈现 24 位彩色图形的屏幕。
- [C-0-2] 必须能够呈现动画。
- [C-0-3] 像素宽高比 (PAR) 必须介于 0.9 到 1.15 之间。也就是说,像素宽高比必须接近方形 (1.0),并且公差在 10-15% 的范围内。
7.1.7. 辅助屏幕
Android 支持用于实现媒体共享功能的辅助 Android 兼容屏幕以及用于访问外部屏幕的开发者 API。
如果设备实现支持采用有线、无线或嵌入式附加屏幕连接方式的外部屏幕,则:
- [C-1-1] 必须实现
DisplayManager
系统服务和 API(如 Android SDK 文档中所述)。
7.2. 输入设备
设备实现:
7.2.1. 键盘
如果设备实现支持第三方输入法 (IME) 应用,则:
- [C-1-1] 必须声明
android.software.input_methods
功能标志。 - [C-1-2] 必须完整实现
Input Management Framework
- [C-1-3] 必须有预安装的软件键盘。
设备实现:* [C-0-1] 不得包含与 android.content.res.Configuration.keyboard 中指定的任何格式(QWERTY 或 12 键)都不匹配的硬件键盘。* 应包含额外的软键盘实现。* 可以包含硬件键盘。
7.2.2. 非触摸导航
Android 支持使用方向键、轨迹球和滚轮进行非触摸导航。
设备实现:
- [C-0-1] 必须针对 android.content.res.Configuration.navigation 报告正确的值。
如果设备实现缺少非触摸导航,则:
- [C-1-1] 必须提供一个与输入管理引擎兼容且合理的替代界面机制,以便用户选择和编辑文字。上游 Android 开源实现包含一种适合在缺少非触摸导航输入法的设备上使用的选择机制。
7.2.3. 导航键
主屏幕、最近用过和返回功能(通常在用户与专用的实体按钮或触摸屏上的单独部分互动后提供)是 Android 导航范式的基本组成部分,因此,设备实现:
- [C-0-1] 必须提供一种方式,让用户能够启动具有满足以下条件的 activity 的安装式应用:对于 TV 设备实现,
<intent-filter>
设置为ACTION=MAIN
和CATEGORY=LAUNCHER
或CATEGORY=LEANBACK_LAUNCHER
。“主屏幕”功能应是提供此方式的机制。 - 应为“最近用过”和“返回”功能提供相应的按钮。
如果提供了“主屏幕”“最近用过”或“返回”功能,则:
- [C-1-1] 当其中任何功能处于可供访问状态时,都必须可通过单次操作(点按、双击或手势等)使用。
- [C-1-2] 必须明确指明各个单次操作会触发哪项功能。常见的指明方式示例包括:在按钮上印制可见图标、在屏幕的导航栏部分显示软件图标,或在开箱设置期间引导用户完成分步演示流程。
设备实现:
- [SR] 强烈建议不要为“菜单”功能提供输入机制。因为从 Android 4.0 开始,由于操作栏的出现,“菜单”功能被废弃了。
如果设备实现提供“菜单”功能,则:
- [C-2-1] 当操作溢出菜单弹出窗口不为空且操作栏处于可见状态时,必须显示操作溢出按钮。
- [C-2-2] 对于在操作栏中选择溢出按钮后显示的操作溢出弹出式窗口,不得修改其位置。但对于在选择“菜单”功能后显示的操作溢出弹出式窗口,可以在屏幕上将其呈现到修改后的位置。
如果设备实现未提供用于实现向后兼容性的“菜单”功能,则:* [C-SR] 当 targetSdkVersion
小于 10 时,强烈建议使该“菜单”功能可供应用使用(通过实体按钮、软件键或手势)。此“菜单”功能应可供访问,除非与其他导航功能一起隐藏起来。
如果设备实现提供“辅助”功能,则:
- [C-4-1] 当其他导航键可供访问时,必须使该“辅助”功能可通过单次操作(例如点按、双击或手势)访问。
- [SR] 强烈建议将长按“主屏幕”键用作这一指定交互。
如果设备实现使用屏幕上的单独部分来显示导航键,则:
- [C-5-1] 导航键必须位于屏幕上的单独部分,不能供应用使用,并且不得遮住或以其他方式影响屏幕上可供应用使用的部分。
- [C-5-2] 如果应用满足第 7.1.1 节中定义的要求,则必须将屏幕的一部分提供给它们使用。
- [C-5-3] 必须遵从应用通过
View.setSystemUiVisibility()
API 方法设置的标志,以便屏幕上这个单独的部分(也称为导航栏)能够正确隐藏起来(如 SDK 中所述)。
如果导航功能是作为基于手势的屏幕上操作提供的,则:
- [C-6-1]
WindowInsets#getMandatorySystemGestureInsets()
只能用于报告“主屏幕”手势识别区域。 - [C-6-2] 只要排除 rect 被允许在
View#setSystemGestureExclusionRects()
的文档中指定的最大排除限制内,在前台应用通过View#setSystemGestureExclusionRects()
提供的排除 rect 内部但在WindowInsets#getMandatorySystemGestureInsets()
的外部开始的手势就不得因导航功能而被拦截。 - [C-6-3] 一旦触摸开始因系统手势而被拦截,就必须向前台应用发送
MotionEvent.ACTION_CANCEL
事件(如果之前已向前台应用发送MotionEvent.ACTION_DOWN
事件)。 - [C-6-4] 必须提供一种方式,让用户能够切换到屏幕上基于按钮的导航操作(例如,在“设置”中)。
- 从屏幕当前方向的底部向上滑动,应可提供“主屏幕”功能。
- 从执行“主屏幕”手势的区域,向上滑动并按住再松开,应可提供“最近用过”功能。
- 在
WindowInsets#getMandatorySystemGestureInsets()
内开始执行的手势不应受到前台应用通过View#setSystemGestureExclusionRects()
提供的排除 rect 的影响。
如果导航功能是从屏幕当前方向的左右边缘的任何位置提供的:
- [C-7-1] 导航功能必须为“返回”,并从屏幕当前方向的左右边缘滑动时提供。
- [C-7-2] 如果在左边缘或右边缘提供自定义可滑动系统面板,必须将其置于屏幕顶部三分之一内,且具有清晰持久的视觉指示,指明拖动它将调用上述面板,因此不是“返回”。用户可以配置系统面板,使其位于屏幕边缘顶部三分之一处下面,但系统面板的使用不得超过边缘的三分之一。
- [C-7-3] 当前台应用设置了
View.SYSTEM_UI_FLAG_IMMERSIVE
或View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
标记后,从边缘滑动必须像在 AOSP 中实现一样,SDK 中对此有记录。 - [C-7-4] 当前台应用设置了
View.SYSTEM_UI_FLAG_IMMERSIVE
或View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
标志后,自定义可滑动系统面板必须隐藏,直到用户调出系统栏(也就是导航和状态栏),如在 AOSP 实现的。
7.2.4. 触摸屏输入
Android 支持多种指控输入系统,例如触摸屏、触摸板和模拟触控输入设备。基于触摸屏的设备实现会与屏幕相关联,从而让用户感觉像是在直接操控屏幕上的内容。由于用户会直接触摸屏幕,因此系统不需要使用任何额外的方式来指明所操控的对象。
设备实现:
- 应具有某种指控输入系统(类似于鼠标的输入系统或触摸式输入系统)。
- 应支持完全独立跟踪的指针。
如果设备实现包含触摸屏(单点触控或更好的触摸屏),则:
- [C-1-1] 必须针对
Configuration.touchscreen
API 字段报告TOUCHSCREEN_FINGER
。 - [C-1-2] 必须报告
android.hardware.touchscreen
和android.hardware.faketouch
功能标志。
如果设备实现包含可以跟踪多个单点触控的触摸屏,则:
- [C-2-1] 必须报告与设备上的具体触摸屏类型对应的适当功能标志
android.hardware.touchscreen.multitouch
、android.hardware.touchscreen.multitouch.distinct
和android.hardware.touchscreen.multitouch.jazzhand
。
如果设备实现不包含触摸屏(仅依靠指控设备),并且满足第 7.2.5 节中的模拟触摸要求,则:
- [C-3-1] 不得报告任何以
android.hardware.touchscreen
开头的功能标志,只能报告android.hardware.faketouch
。
7.2.5. 模拟触摸输入
模拟触摸界面会提供一个能够模拟部分触摸屏功能的用户输入系统。例如,驱动屏幕光标的鼠标或遥控器能够模拟触摸操作,但需要用户先指向或聚焦到目标,然后再点击。鼠标、触控板、基于陀螺仪的空中鼠标、陀螺仪指针、操纵杆和多点触控板等多种输入设备都可以支持模拟触摸交互。Android 包含功能常量 android.hardware.faketouch,该常量对应于高保真非触摸(指控式)输入设备,例如可以充分模拟触摸式输入的鼠标或触控板(包括基本手势支持),并且该常量可指明设备支持所模拟的触摸屏功能子集。
如果设备实现不包含触摸屏,但包含另一种它们想要提供的指控输入系统,则:
- 应声明支持
android.hardware.faketouch
功能标志。
如果设备实现声明支持 android.hardware.faketouch
,则:
- [C-1-1] 必须报告指针在屏幕中的绝对 X 和 Y 位置,并在屏幕中显示可见指针。
- [C-1-2] 必须通过操作代码(指定在屏幕中按下或松开指针时发生的状态变化)报告触摸事件。
- [C-1-3] 必须支持在屏幕中的对象上按下后再松开指针,以便用户模拟点按屏幕中的对象。
- [C-1-4] 必须支持于时间阈值内在屏幕中的对象上的同一位置按下、松开、按下后再松开指针,以便用户模拟点按两次屏幕中的对象。
- [C-1-5] 必须支持在屏幕中的任意一点按下指针,将指针移动到屏幕中的其他任意一点,然后再松开指针,以便用户模拟触摸拖动操作。
- [C-1-6] 必须支持按下指针后允许用户快速将对象移至屏幕中的其他位置,然后在屏幕中松开指针,以便用户快速滑动屏幕中的对象。
- [C-1-7] 必须针对
Configuration.touchscreen
API 字段报告TOUCHSCREEN_NOTOUCH
。
如果设备实现声明支持 android.hardware.faketouch.multitouch.distinct
,则:
- [C-2-1] 必须声明支持
android.hardware.faketouch
。 - [C-2-2] 必须支持对两个或更多个独立的指控输入分别进行跟踪。
如果设备实现声明支持 android.hardware.faketouch.multitouch.jazzhand
,则:
- [C-3-1] 必须声明支持
android.hardware.faketouch
。 - [C-3-2] 必须支持完全独立地分别跟踪 5 个(对一只手上五根手指的操作进行跟踪)或更多个指控输入。
7.2.6. 游戏控制器支持
7.2.6.1. 按钮映射
如果设备实现声明了 android.hardware.gamepad
功能标志,则:
- [C-1-1] 必须嵌入控制器,或在包装盒内随附单独的控制器,以便输入下表中列出的所有事件。
- [C-1-2] 必须能够将 HID 事件映射到其关联的 Android
view.InputEvent
常量(如下表中所列)。上游 Android 实现包含满足该要求的游戏控制器实现。
按钮 | HID 用法2 | Android 按钮 |
---|---|---|
A1 | 0x09 0x0001 | KEYCODE_BUTTON_A (96) |
B1 | 0x09 0x0002 | KEYCODE_BUTTON_B (97) |
X1 | 0x09 0x0004 | KEYCODE_BUTTON_X (99) |
Y1 | 0x09 0x0005 | KEYCODE_BUTTON_Y (100) |
向上方向键1 向下方向键1 |
0x01 0x00393 | AXIS_HAT_Y4 |
D-pad left1 D-pad right1 |
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) |
Home1 | 0x0c 0x0223 | KEYCODE_HOME (3) |
返回1 | 0x0c 0x0224 | KEYCODE_BACK (4) |
1 KeyEvent
2 必须在 Game pad CA (0x01 0x0005) 中声明上述 HID 用法。
3 这种用法的 Logical Minimum 必须为 0,Logical Maximum 必须为 7,Physical Minimum 必须为 0,Physical Maximum 必须为 315,Units 必须为 Degrees,并且 Report Size 必须为 4。逻辑值指从纵轴顺时针旋转的角度;例如,逻辑值为 0 表示不旋转,并且按下了向上按钮,逻辑值为 1 则表示旋转 45 度,并且同时按下了向上和向左键。
模拟控制1 | HID 用法 | Android 按钮 |
---|---|---|
左触发 | 0x02 0x00C5 | AXIS_LTRIGGER |
右触发 | 0x02 0x00C4 | AXIS_RTRIGGER |
左摇杆 |
0x01 0x0030 0x01 0x0031 |
AXIS_X AXIS_Y |
右摇杆 |
0x01 0x0032 0x01 0x0035 |
AXIS_Z AXIS_RZ |
7.2.7. 遥控器
请参阅第 2.3.1 节,了解设备专属要求。
7.3. 传感器
如果设备实现包含某种传感器,而这种传感器具有针对第三方开发者的对应 API,则设备实现必须实现该 API,如 Android SDK 文档和 Android 开放源代码文档中关于传感器的部分所述。
设备实现:
- [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] 必须报告传感器数据,并且最大延迟为 100 毫秒 + 2 * sample_time(如果传感器进行流式传输),最大请求延迟为 0 毫秒(如果应用处理器处于活动状态)。此延迟不包含任何过滤延迟。
- [C-1-3] 必须在启用传感器后的 400 毫秒 + 2 * sample_time 内报告第一个传感器样本。此样本的精度可以为 0。
-
[SR] 应以纳秒为单位报告事件时间(具体定义请见 Android SDK 文档),该时间表示事件发生时的时间,与 SystemClock.elapsedRealtimeNano() 时钟同步。强烈建议现有的及新的 Android 设备满足这些要求,以便升级到未来平台版本(在未来平台版本中,此组件可能会成为必需组件)。同步误差应在 100 毫秒以内。
-
[C-1-4] 对于 Android SDK 文档中指明为连续传感器的任何 API,设备实现都必须连续提供周期性数据样本,并且这些样本的抖动应低于 3%,抖动是指连续事件报告的时间戳值之差的标准偏差。
-
[C-1-5] 必须确保传感器事件流不得阻止设备 CPU 进入挂起状态或从挂起状态唤醒。
- 当多个传感器处于启用状态时,功耗不应超过各个传感器所报告的功耗的总和。
上述列表并不是详尽无遗的;请以 Android SDK 和 Android 开放源代码文档中关于传感器的部分载述的行为为准。
有些传感器为复合型,也就是说,它们可以从一个或多个其他传感器提供的数据推导出来。(例如方向传感器和线性加速度传感器。)
设备实现:
- 应实现这些传感器类型,但前提是设备实现包含必要的实体传感器(如传感器类型中所述)。
如果设备实现包含复合传感器,则:
- [C-2-1] 必须实现该传感器,如 Android 开放源代码文档中关于复合传感器的部分所述。
7.3.1. 加速度计
设备实现:
- [C-SR] 强烈建议包含 3 轴加速度计。
如果设备实现包含 3 轴加速度计,则:
- [C-1-1] 必须能够以至少 50 Hz 的频率报告事件。
- [C-1-2] 必须实现并报告
TYPE_ACCELEROMETER
传感器。 - [C-1-3] 必须遵从 Android 传感器坐标系(Android API 中对此进行了详细说明)。
- [C-1-4] 在任意轴上都必须能够测量从自由下落到高达四倍重力加速度 (4g) 的运动过程。
- [C-1-5] 分辨率必须至少为 12 位。
- [C-1-6] 标准偏差不得高于 0.05 m/s^,其中标准偏差应按每个轴进行计算,并且应使用以最大采样率在至少 3 秒内采集的样本进行计算。
- [SR] 强烈建议实现
TYPE_SIGNIFICANT_MOTION
复合传感器。 - [SR] 强烈建议实现并报告
TYPE_ACCELEROMETER_UNCALIBRATED
传感器。强烈建议 Android 设备满足此要求,以便能够升级到未来的平台版本(在这些版本中,这可能会成为必需组件)。 - 应实现
TYPE_SIGNIFICANT_MOTION
、TYPE_TILT_DETECTOR
、TYPE_STEP_DETECTOR
、TYPE_STEP_COUNTER
复合传感器(如 Android SDK 文档中所述)。 - 应以至少 200 Hz 的频率报告事件。
- 分辨率应至少为 16 位。
- 应在使用时进行校准(如果特性随生命周期发生变化)和补偿,并且在设备重新启动后直到再次重新启动之前应保留补偿参数。
- 应进行温度补偿。
如果设备实现包含 3 轴加速度计,并且实现了 TYPE_SIGNIFICANT_MOTION
、TYPE_TILT_DETECTOR
、TYPE_STEP_DETECTOR
和 TYPE_STEP_COUNTER
复合传感器中的任何一种,则:
- [C-2-1] 其功耗总和必须始终低于 4 mW。
- 每个传感器的功耗应在设备处于动态时低于 2 mW,在设备处于静态时低于 0.5 mW。
如果设备实现包含 3 轴加速度计和 3 轴陀螺仪传感器,则:
- [C-3-1] 必须实现
TYPE_GRAVITY
和TYPE_LINEAR_ACCELERATION
复合传感器。 - [C-SR] 强烈建议实现
TYPE_GAME_ROTATION_VECTOR
复合传感器。
如果设备实现包含 3 轴加速度计、3 轴陀螺仪传感器和磁力计传感器,则:
- [C-4-1] 必须实现
TYPE_ROTATION_VECTOR
复合传感器。
7.3.2. 磁力计
设备实现:
- [C-SR] 强烈建议包含 3 轴磁力计(罗盘)。
如果设备实现包含 3 轴磁力计,则:
- [C-1-1] 必须实现
TYPE_MAGNETIC_FIELD
传感器。 - [C-1-2] 必须能够以至少 10 Hz 的频率报告事件,并且应以至少 50 Hz 的频率报告事件。
- [C-1-3] 必须遵从 Android 传感器坐标系(Android API 中对此进行了详细说明)。
- [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,并且不应高于 0.5 µT,其中标准偏差是按每个轴进行计算,并且是使用以最大采样率在至少 3 秒内采集的样本进行计算。
- 应实现
TYPE_MAGNETIC_FIELD_UNCALIBRATED
传感器。 - [SR] 强烈建议现有的及新的 Android 设备实现
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] 强烈建议包含 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 m/s² 的加速度移动时:
- [C-1-3] 必须至少在 95% 的时间内能够确定 20 米以内的位置以及 0.5 m/s 以内的速度。
- [C-1-4] 必须通过
GnssStatus.Callback
同时跟踪和报告一个星群中的至少 8 颗卫星。 - 应能够同时跟踪多个星群(例如 GPS 以及 Glonass、Beidou、Galileo 中的至少一个)中的至少 24 颗卫星。
- [C-SR] 强烈建议在紧急通话期间继续通过 GNSS Location Provider API 提供正常的 GPS/GNSS 位置信息输出。
- [C-SR] 强烈建议报告跟踪的所有星群的 GNSS 测量结果(在 GnssStatus 消息中报告),SBAS 除外。
- [C-SR] 强烈建议报告 AGC 以及 GNSS 测量频率。
- [C-SR] 强烈建议在每次报告 GPS/GNSS 位置时均报告所有估算的测量结果(包括方位、速度和高度)。
- [C-SR] 强烈建议在发现 GNSS 测量结果后立即报告,即使尚未报告通过 GPS/GNSS 计算出的位置信息也是如此。
- [C-SR] 强烈建议报告 GNSS 伪距和伪距率,以便在确定位置之后,在露天条件下,当设备处于静止状态或以小于 0.2 m/s² 的加速度移动时,至少在 95% 的情况下能够计算出 20 米以内的位置以及 0.2 m/s 以内的速度。
7.3.4. 陀螺仪
设备实现:
- [C-SR] 强烈建议包含 3 轴加速度计,否则不应包含陀螺仪传感器。
如果设备实现包含 3 轴陀螺仪,则:
- [C-1-1] 必须能够以至少 50 Hz 的频率报告事件。
- [C-1-2] 必须实现
TYPE_GYROSCOPE
传感器,并且强烈建议也实现TYPE_GYROSCOPE_UNCALIBRATED
传感器。 - [C-1-4] 分辨率必须为 12 位或更高,并且应为 16 位或更高。
- [C-1-5] 必须进行温度补偿。
- [C-1-6] 必须在使用时进行校准和补偿,并在设备重新启动后直到再次重新启动之前保留补偿参数。
- [C-1-7] 每 Hz 方差不得超过 1e-7 rad^2/s^2(每 Hz 方差,或 rad^2/s)。方差可随采样率而变化,但不得超过该值。也就是说,如果以 1 Hz 的采样率测量陀螺仪的方差,则方差不应超过 1e-7 rad^2/s^2。
- [SR] 强烈建议设备在室温下处于静止状态时的校准误差小于 0.01 rad/s。
- 应以至少 200 Hz 的频率报告事件。
如果设备实现包含 3 轴陀螺仪、加速度计传感器和磁力计传感器,则:
- [C-2-1] 必须实现
TYPE_ROTATION_VECTOR
复合传感器。
如果设备实现包含 3 轴加速度计和 3 轴陀螺仪传感器,则:
- [C-3-1] 必须实现
TYPE_GRAVITY
和TYPE_LINEAR_ACCELERATION
复合传感器。 - [C-SR] 强烈建议实现
TYPE_GAME_ROTATION_VECTOR
复合传感器。
7.3.5. 气压计
设备实现:
- [C-SR] 强烈建议包含气压计(环境气压传感器)。
如果设备实现包含气压计,则:
- [C-1-1] 必须实现并报告
TYPE_PRESSURE
传感器。 - [C-1-2] 必须能够以至少 5 Hz 的频率传送事件。
- [C-1-3] 必须进行温度补偿。
- [SR] 强烈建议能够报告 300 hPa 到 1100 hPa 之间的压力测量结果。
- 绝对精度应为 1 hPa。
- 相对精度应为 20 hPa 范围内误差不超过 0.12 hPa(相当于在海平面上 200 m 左右的变化误差不超过 1 m 左右)。
7.3.6. 温度计
设备实现:
- 可以包含环境温度计(温度传感器)。
- 可以(但不应)包含 CPU 温度传感器。
如果设备实现包含环境温度计(温度传感器),则:
- [C-1-1] 必须将其定义为
SENSOR_TYPE_AMBIENT_TEMPERATURE
,并且必须从用户与设备互动的位置(室内/车厢内)测量环境温度(以摄氏度为单位)。 - [C-1-2] 必须将其定义为
SENSOR_TYPE_TEMPERATURE
。 - [C-1-3] 必须测量设备 CPU 的温度。
- [C-1-4] 不得测量任何其他温度。
请注意,SENSOR_TYPE_TEMPERATURE
传感器类型在 Android 4.0 中已被废弃。
7.3.7. 光度计
- 设备实现可以包含光度计(环境光传感器)。
7.3.8. 近程传感器
- 设备实现可以包含近程传感器。
如果设备实现包含近程传感器,则:
- [C-1-1] 必须沿与屏幕相同的方向测量物体的接近度。也就是说,近程传感器必须朝向适当方向,以便检测靠近屏幕的物体,因为此类传感器的主要用途是检测用户正在使用的手机。如果设备实现包含朝向任何其他方向的近程传感器,则不得通过此 API 访问此类传感器。
- [C-1-2] 精度必须至少为 1 位。
7.3.9. 高保真传感器
如果设备实现包含一套质量更高的传感器(如本节中定义),并使其可供第三方应用使用,则:
- [C-1-1] 必须通过
android.hardware.sensor.hifi_sensors
功能标志标识该功能。
如果设备实现声明了 android.hardware.sensor.hifi_sensors
,则:
-
[C-2-1] 必须具有符合以下要求的
TYPE_ACCELEROMETER
传感器:- 测量范围必须至少在 -8g 到 +8g 之间,应在 -16g 到 +16g 之间。
- 测量分辨率必须至少为 2048 LSB/g。
- 最小测量频率必须等于或低于 12.5 Hz。
- 最大测量频率必须等于或高于 400 Hz,且应支持 SensorDirectChannel
RATE_VERY_FAST
。 - 测量噪声不得高于 400 μg/√Hz。
- 必须实现这种传感器的非唤醒形式,并且至少能够缓冲 3000 个传感器事件。
- 批处理功耗不得高于 3 mW。
- [C-SR] 强烈建议采用 3 dB 的测量带宽以及至少 80% 的奈奎斯特频率,且此带宽中具有白噪音声谱。
- 在室温下测试的加速度随机游走应小于 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 dps 到 +1000 dps 之间。
- 测量分辨率必须至少为 16 LSB/dps。
- 最小测量频率必须等于或低于 12.5 Hz。
- 最大测量频率必须等于或高于 400 Hz,且应支持 SensorDirectChannel
RATE_VERY_FAST
。 - 测量噪声不得高于 0.014 °/s/√Hz。
- [C-SR] 强烈建议采用 3 dB 的测量带宽以及至少 80% 的奈奎斯特频率,且此带宽中具有白噪音声谱。
- 在室温下测试的速率随机游走应小于 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 µT 到 +900 µT 之间。
- 测量分辨率必须至少为 5 LSB/uT。
- 最小测量频率必须等于或低于 5 Hz。
- 最大测量频率必须等于或高于 50 Hz。
- 测量噪声不得高于 0.5 uT。
-
[C-2-6] 必须具有
TYPE_MAGNETIC_FIELD_UNCALIBRATED
,并且其除了符合与TYPE_GEOMAGNETIC_FIELD
相同的质量要求外,还要符合以下要求:- 必须实现这种传感器的非唤醒形式,并且至少能够缓冲 600 个传感器事件。
- [C-SR] 如果报告的速率为 50 Hz 或更高,强烈建议白噪声谱在 1 Hz 到至少 10 Hz 之间。
-
[C-2-7] 必须具有符合以下要求的
TYPE_PRESSURE
传感器:- 测量范围必须至少在 300 hPa 到 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. 生物识别传感器
如需了解衡量生物识别解锁模式的安全性的其他背景,请参阅衡量生物识别的安全性文档。
如果设备实现包含安全锁定屏幕,则:
- 应包含生物识别传感器
生物识别传感器可基于其欺骗和冒名攻击的接受率以及生物识别流水线的安全性分类为强、弱或便利。此分类确定生物识别传感器所具有的与平台和第三方应用接口的功能。传感器默认分类为便利,如果希望分类为弱或强,则需要满足下面详述的额外要求。弱和强生物识别都可以获得下面详述的额外功能。
要使生物识别传感器可用于第三方应用,设备实现:
- [C-0-1] 必须满足强或弱生物识别的要求,如本文档中所定义。
要允许访问第三方应用的密钥库密钥,设备实现:
- [C-0-2] 必须满足强生物识别的要求,如本文档中所定义。
此外:
- [C-0-3] 如果强生物识别处于被动状态(例如面部或虹膜没有明显的用户 intent 信号),则必须与明确的确认操作(例如按按钮)配合使用。
- [C-SR] 强烈建议妥善保护处于被动状态的生物识别的确认操作,使操作系统或内核攻击无法欺骗确认操作。例如,这意味着基于物理按钮的确认操作会通过安全元件(无法由按物理按钮之外的任何其他方式触发)的仅限输入通用输入/输出 (GPIO) 引脚进行路由。
如果设备实现希望将生物识别传感器视为便利,则:
- [C-1-1] 错误接受率必须低于 0.002%。
- [C-1-2] 必须披露此模式的安全性可能不及安全系数高的 PIN 码、图案或密码,并在欺骗和冒名攻击的接受率高于 7% 时明确列举启用此模式的风险。
- [C-1-3] 尝试生物识别验证的失败次数达到 5 次后,必须限制在至少 30 秒内不能再次进行生物识别验证,验证失败是指采集的足够有效信息 (
BIOMETRIC_ACQUIRED_GOOD
) 与已注册的生物识别信息不匹配。 - [C-1-4] 必须通过以下方式防止在没有先建立信任链的情况下添加新的生物识别信息:让用户确认现有设备凭据(PIN 码/图案/密码,受 TEE 保护)或添加新设备凭据;Android 开源项目实现在框架中提供了实现这一点的机制。
- [C-1-5] 必须在移除用户的账号(包括恢复出厂设置)时完全移除所有可识别的生物识别数据。
- [C-1-6] 必须遵从相应生物识别的各个标记(即
DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT
、DevicePolicymanager.KEYGUARD_DISABLE_FACE
或DevicePolicymanager.KEYGUARD_DISABLE_IRIS
)。 - [C-1-7] 对于搭载 Android 10 的新设备,必须至少每隔 24 小时对用户进行一次建议的主要身份验证(例如 PIN 码、图案、密码);对于从较早 Android 版本升级的设备,必须至少每隔 72 小时进行一次。
-
[C-1-8] 必须在执行以下操作之一后对用户进行建议的主要身份验证(例如 PIN 码、图案、密码):
- 达到 4 小时待机超时期限,或
- 尝试生物识别身份验证失败 3 次。
- 空闲超时期限和失败的身份验证计数将在每次成功确认设备凭据后重置。
从早期 Android 版本升级的设备无需遵守 C-1-8 要求。
-
[C-SR] 强烈建议确保在设备上测得的错误拒绝率低于 10%。
- [C-SR] 对于每个已注册的生物识别信息,强烈建议确保延迟时间(即从检测到生物识别信息到屏幕解锁的时间)低于 1 秒。
如果设备实现希望将生物识别传感器视为弱,则:
- [C-2-1] 必须满足上述便利的所有要求,[C-1-2] 除外。
- [C-2-2] 欺骗和冒名攻击的接受率不得高于 20%。
- [C-2-3] 必须实现有硬件支持的密钥库,并在 Android 用户或内核空间外部的隔离执行环境中(如可信执行环境 [TEE])或在具有通向隔离执行环境的安全通道的芯片上执行生物识别匹配。
- [C-2-4] 必须对所有可识别的数据进行加密,并对其采用密码形式的身份验证机制,以确保在隔离执行环境或具有通向隔离执行环境的安全信道的芯片之外无法获取、读取或更改这些数据(如 Android 开源项目网站上的实现准则中所述)。
- [C-2-5] 对于基于摄像头的生物识别,进行基于生物识别的身份验证或注册时:
- 必须在防止在隔离执行环境或具有通向隔离执行环境的安全信道的芯片之外读取或更改摄像头帧的模式中操作摄像头。
- 对于 RGB 单摄像头解决方案,可在隔离执行环境之外读取摄像头帧,以支持注册预览等操作,但仍不得更改。
- [C-2-6] 不得允许第三方应用区分已注册的生物识别信息。
- [C-2-7] 不得在 TEE 范围之外允许应用处理器对可识别的生物识别数据及其衍生的任何数据(例如嵌入)进行未加密的访问。
-
[C-2-8] 必须具有安全的处理管道,使操作系统或内核攻击不能直接注入数据并将攻击者错误验证为用户。
如果设备实现已搭载早期 Android 版本,且无法通过系统软件更新来满足 C-2-8 要求,则可以不遵守该要求。
如果设备实现希望将生物识别传感器视为强,则:
- [C-3-1] 必须满足上述弱的所有要求。从早期 Android 版本升级的设备无需遵守 C-2-7 要求。
- [C-3-2] 欺骗和冒名攻击的接受率不得高于 7%。
- [C-3-3] 必须至少每隔 72 小时对用户进行一次建议的主要身份验证(例如 PIN 码、图案、密码)。
7.3.12. 姿势传感器
设备实现:
- 可以支持具有 6 个自由度的姿势传感器。
如果设备实现支持具有 6 个自由度的姿势传感器,则:
- [C-1-1] 必须实现并报告
TYPE_POSE_6DOF
传感器。 - [C-1-2] 必须比只使用旋转矢量更准确。
7.4. 数据连接
7.4.1. 电话
在 Android API 和本文档中,“电话”专指与通过 GSM 或 CDMA 网络进行语音通话和发送短信相关的硬件。虽然这些语音通话可能采用也可能不采用分封交换技术,但都是为了使 Android 被视为独立于可通过同一网络实现的所有数据连接。也就是说,Android“电话”功能和 API 专指语音通话和短信。例如,如果设备实现无法打电话或收发短信,则无论它们是否使用移动网络进行数据连接,都不会被视为电话设备。
- Android 可以用在不包含电话硬件的设备上。也就是说,Android 可与非电话设备兼容。
如果设备实现包含 GSM 或 CDMA 电话,则:
- [C-1-1] 必须根据该技术声明
android.hardware.telephony
功能标志和其他子功能标志。 - [C-1-2] 必须完全支持针对该技术的 API。
如果设备实现不包含电话硬件,则:
- [C-2-1] 必须将所有相关 API 实现为空操作。
如果设备实现支持 eUICC 或 eSIM 卡/嵌入式 SIM 卡并包含专有机制以使 eSIM 卡功能可用于第三方开发者,则:
- [C-3-1] 必须提供
EuiccManager API
的完整实现。
7.4.1.1. 号码屏蔽兼容性
如果设备实现报告 android.hardware.telephony feature
,则:
- [C-1-1] 必须支持号码屏蔽
- [C-1-2] 必须完整实现
BlockedNumberContract
和对应的 API(如 SDK 文档中所述)。 - [C-1-3] 必须屏蔽从列入“BlockedNumberProvider”的电话号码打来的所有电话和发来的所有短信,而不与应用进行任何交互。唯一例外是当号码屏蔽被临时解除时,如 SDK 文档中所述。
- [C-1-4] 不得将被屏蔽的呼叫写入平台通话记录提供程序。
- [C-1-5] 不得将被屏蔽的短信写入电话提供程序。
- [C-1-6] 必须实现被屏蔽号码管理界面,并且系统可因应
TelecomManager.createManageBlockedNumbersIntent()
方法返回的 intent 打开该界面。 - [C-1-7] 不得允许次要用户查看或修改设备上被屏蔽的号码,因为 Android 平台会假设主用户对设备上的电话服务(单个实例)拥有完全控制权。对于次要用户,必须隐藏所有与屏蔽相关的界面,并且仍必须遵从屏蔽名单。
- 当设备更新到 Android 7.0 时,应将被屏蔽的号码迁移到提供程序。
7.4.1.2. Telecom API
如果设备实现报告 android.hardware.telephony
,则:
- [C-1-1] 必须支持
ConnectionService
API(如 SDK 中所述)。 - [C-1-2] 必须显示新的来电,并且当用户在进行来自不支持呼叫保持功能(通过
CAPABILITY_SUPPORT_HOLD
指定)的第三方应用的通话时,能够接听或拒绝来电。 - [C-1-3] 必须有实现 InCallService 的应用。
-
[C-SR] 强烈建议告知用户接听来电会导致正在进行的通话中断。
AOSP 实现通过提醒式通知满足上述要求,此类通知可提示用户接听来电会导致其他通话中断。
-
[C-SR] 强烈建议预加载默认的拨号器应用,当第三方应用将其
PhoneAccount
上的EXTRA_LOG_SELF_MANAGED_CALLS
extra 键设置为true
时,该拨号器应用会显示通话记录条目,并在通话记录中显示第三方应用的名称。 - [C-SR] 强烈建议按如下所述为
android.telecom
API 处理音频耳机的KEYCODE_MEDIA_PLAY_PAUSE
和KEYCODE_HEADSETHOOK
事件:- 在通话期间检测到短按键事件时调用
Connection.onDisconnect()
。 - 在来电期间检测到短按键事件时调用
Connection.onAnswer()
。 - 在来电期间检测到长按键事件时调用
Connection.onReject()
。 - 切换
CallAudioState
的静音状态。
- 在通话期间检测到短按键事件时调用
7.4.2. IEEE 802.11 (Wi-Fi)
设备实现:
- 应支持一种或多种形式的 802.11。
如果设备实现支持 802.11,并将该功能提供给第三方应用使用,则:
- [C-1-1] 必须实现对应的 Android API。
- [C-1-2] 必须报告硬件功能标志
android.hardware.wifi
。 - [C-1-3] 必须实现多播 API(如 SDK 文档中所述)。
- [C-1-4] 必须支持多播 DNS (mDNS),并且不得在操作过程中的任何时间过滤 mDNS 数据包 (224.0.0.251),其中包括:
- 即使屏幕未处于活动状态时。
- 即使处于待机状态时(适用于 Android TV 设备实现)。
- [C-1-5] 不得将
WifiManager.enableNetwork()
API 方法调用视为充分的指示信号来切换当前处于活动状态的Network
(默认用于提供应用流量,由getActiveNetwork
和registerDefaultNetworkCallback
等ConnectivityManager
API 方法返回)。也就是说,只有成功确认 Wi-Fi 网络在提供互联网连接后,设备实现才能停用任何其他网络服务提供商(例如移动数据网络)提供的互联网连接。 - [C-1-6] 强烈建议在调用
ConnectivityManager.reportNetworkConnectivity()
API 方法后重新评估Network
上的互联网连接,并在评估确定当前Network
不再提供互联网连接后,切换至提供互联网连接的任何其他可用网络(例如移动数据网络)。 - [C-SR] 强烈建议在 STA 断开连接时,在每次扫描开始时对探测请求帧的来源 MAC 地址和序列号进行一次随机化处理。
- 一次扫描中包含的每组探测请求帧都应使用一个一致的 MAC 地址(不应在扫描期间对 MAC 地址进行随机化处理)。
- 探测请求序列号应在扫描中包含的探测请求之间按正常方式(依序)迭代。
- 应在以下时间对探测请求序列号进行随机化处理:一次扫描包含的最后一个探测请求和下次扫描包含的第一个探测请求之间。
- [C-SR] 强烈建议在 STA 断开连接时,仅允许在探测请求帧中使用以下元素:
- SSID Parameter Set (0)
- DS Parameter Set (3)
如果设备实现支持 Wi-Fi 节电模式(如 IEEE 802.11 标准中所定义),则:
- [C-3-1] 每当应用获取
WIFI_MODE_FULL_HIGH_PERF
锁定或WIFI_MODE_FULL_LOW_LATENCY
锁定(通过WifiManager.createWifiLock()
和WifiManager.WifiLock.acquire()
API 并且锁定处于活动状态时,都必须关闭 Wi-Fi 省电模式。 - [C-3-2] 当设备处于 Wi-Fi 低延迟锁定 (
WIFI_MODE_FULL_LOW_LATENCY
) 模式时,设备和接入点之间的平均往返延迟必须小于 Wi-Fi 高性能锁定 (WIFI_MODE_FULL_HIGH_PERF
) 模式下的延迟。 - [C-SR] 每当低延迟锁定 (
WIFI_MODE_FULL_LOW_LATENCY
) 已获取并生效时,都强烈建议将 Wi-Fi 往返延迟降至最低。
如果设备实现支持 Wi-Fi 并将 Wi-Fi 用于位置信息扫描,则:
- [C-2-1] 必须提供一种方式,让用户能够启用/停用通过
WifiManager.isScanAlwaysAvailable
API 方法读取的值。
7.4.2.1. Wi-Fi 直连
设备实现:
- 应支持 Wi-Fi 直连(Wi-Fi 点对点)。
如果设备实现支持 Wi-Fi 直连,则:
- [C-1-1] 必须实现对应的 Android API(如 SDK 文档中所述)。
- [C-1-2] 必须报告硬件功能
android.hardware.wifi.direct
。 - [C-1-3] 必须支持常规的 WLAN 操作。
- [C-1-4] 必须支持并发执行 WLAN 和 WLAN 直连操作。
7.4.2.2. Wi-Fi 通道直接链路设置
设备实现:
- 应支持 Wi-Fi 通道直接链路设置 (TDLS)(如 Android SDK 文档中所述)。
如果设备实现支持 TDLS,并且 TDLS 已由 WiFiManager API 启用,则:
- [C-1-1] 必须通过
WifiManager.isTdlsSupported
声明支持 TDLS。 - 只在能够使用且有好处时才应使用 TDLS。
- 应进行一些试探,如果使用 TDLS 时的性能可能低于通过 Wi-Fi 接入点连接时的性能,则不应使用 TDLS。
7.4.2.3. Wi-Fi Aware
设备实现:
- 应支持 Wi-Fi Aware。
如果设备实现支持 Wi-Fi Aware,并使该功能可供第三方应用使用,则:
- [C-1-1] 必须实现
WifiAwareManager
API(如 SDK 文档中所述)。 - [C-1-2] 必须声明
android.hardware.wifi.aware
功能标志。 - [C-1-3] 必须支持并发执行 Wi-Fi 和 Wi-Fi Aware 操作。
- [C-1-4] 每当 Wi-Fi Aware 处于启用状态时,都必须以不超过 30 分钟的间隔对 Wi-Fi Aware 管理接口地址进行随机化处理。
如果设备实现支持 Wi-Fi Aware 和 Wi-Fi 位置信息服务(如第 7.4.2.5 节中所述),并使这些功能可供第三方应用使用,则:
- [C-2-1] 必须实现位置感知发现 API:setRangingEnabled、setMinDistanceMm、setMaxDistanceMm 和 onServiceDiscoveredWithinRange。
7.4.2.4. Wi-Fi Passpoint
设备实现:
- 应支持 Wi-Fi Passpoint。
如果设备实现支持 Wi-Fi Passpoint,则:
- [C-1-1] 必须实现与 Passpoint 相关的
WifiManager
API(如 SDK 文档中所述)。 - [C-1-2] 必须支持 IEEE 802.11u 标准,特别是与网络发现和选择相关的标准,例如通用通告服务协议 (GAS) 和接入网络查询协议 (ANQP)。
反之,如果设备实现不支持 Wi-Fi Passpoint,则:
- [C-2-1] 与 Passpoint 相关的
WifiManager
API 的实现必须抛出UnsupportedOperationException
。
7.4.2.5. WLAN 位置信息(WLAN 往返时间 - RTT)
设备实现:
- 应支持 Wi-Fi 位置信息。
如果设备实现支持 Wi-Fi 位置信息,并使该功能可供第三方应用使用,则:
- [C-1-1] 必须实现
WifiRttManager
API(如 SDK 文档中所述)。 - [C-1-2] 必须声明
android.hardware.wifi.rtt
功能标志。 - [C-1-3] 当执行 RTT 所在的 Wi-Fi 接口与接入点不相关时,必须为所执行的每个 RTT 高峰对源 MAC 地址进行随机化处理。
7.4.2.6. WLAN Keepalive 分流
设备实现:
- 应支持 WLAN keepalive 分流。
如果设备实现支持 Wi-Fi keepalive 分流,并使该功能可供第三方应用使用,则:
-
[C-1-1] 必须支持 SocketKeepAlive API。
-
[C-1-2] 必须支持至少三个 WLAN 上的并发 keepalive 槽和至少一个移动网络上的 keepalive 槽。
如果设备实现不支持 Wi-Fi keepalive 分流,则:
- [C-2-1] 必须返回
ERROR_UNSUPPORTED
。
7.4.2.7. WLAN Easy Connect(设备配置协议)
设备实现:
如果设备实现支持 Wi-Fi Easy Connect,并使该功能可供第三方应用使用,则:
- [C-1-1] 必须实现
Settings#ACTION_PROCESS_WIFI_EASY_CONNECT_URI
intent API(如 SDK 文档中所述)。 - [C-1-2] 必须使 WifiManager#isEasyConnectSupported() 方法返回
true
。
7.4.3. 蓝牙
如果设备实现支持蓝牙音频配置,则:
- 应支持高级音频编解码器和蓝牙音频编解码器(例如 LDAC)。
如果设备实现支持 HFP、A2DP 和 AVRCP,则:
- 应至少共支持 5 个连接设备。
如果设备实现声明了 android.hardware.vr.high_performance
功能,则:
- [C-1-1] 必须支持蓝牙 4.2 和蓝牙 LE 数据长度扩展。
Android 支持蓝牙和蓝牙低功耗。
如果设备实现支持蓝牙和蓝牙低功耗,则:
- [C-2-1] 必须声明相关平台功能(分别为
android.hardware.bluetooth
和android.hardware.bluetooth_le
),并实现平台 API。 - 应实现适合设备的相关蓝牙配置,例如 A2DP、AVRCP、OBEX 和 HFP 等。
如果设备实现支持蓝牙低功耗,则:
- [C-3-1] 必须声明硬件功能
android.hardware.bluetooth_le
。 - [C-3-2] 必须启用基于 GATT(通用属性配置文件)的蓝牙 API(如 SDK 文档中所述)以及 android.bluetooth。
- [C-3-3] 必须针对
BluetoothAdapter.isOffloadedFilteringSupported()
报告正确的值,以指明是否实现了针对 ScanFilter API 类的过滤逻辑。 - [C-3-4] 必须针对
BluetoothAdapter.isMultipleAdvertisementSupported()
报告正确的值,以指明是否支持低功耗通告。 - 应支持在实现 ScanFilter API 时将过滤逻辑分流到蓝牙芯片组。
- 应支持将批量扫描分流到蓝牙芯片组。
-
应支持至少为 4 个槽位的多通告。
-
[SR] 强烈建议实现不超过 15 分钟的可解析私有地址 (RPA) 超时,并在超时后轮转地址以保护用户隐私。
如果设备实现支持蓝牙 LE 并将蓝牙 LE 用于位置信息扫描,则:
- [C-4-1] 必须提供一种方式,让用户能够启用/停用通过系统 API
BluetoothAdapter.isBleScanAlwaysAvailable()
读取的值。
如果设备实现支持蓝牙 LE 和助听器配置文件(如使用蓝牙 LE 的助听器音频支持中所述),则:
- [C-5-1] 必须针对 BluetoothAdapter.getProfileProxy(context, listener, BluetoothProfile.HEARING_AID) 返回
true
。
7.4.4. 近距离无线通信
设备实现:
- 应包含近距离无线通信 (NFC) 所需的收发器和相关硬件。
- [C-0-1] 必须实现
android.nfc.NdefMessage
和android.nfc.NdefRecord
API,即使它们不支持 NFC 或未声明android.hardware.nfc
功能也是如此,因为这些类表示独立于协议的数据表示格式。
如果设备实现包含 NFC 硬件,并计划使其可供第三方应用使用,则:
- [C-1-1] 必须通过
android.content.pm.PackageManager.hasSystemFeature()
方法报告android.hardware.nfc
功能。 - 必须能够通过以下 NFC 标准读取和写入 NDEF 消息:
- [C-1-2] 必须能够通过以下 NFC 标准充当 NFC Forum 读取器/写入器(如 NFC Forum 技术规范 NFCForum-TS-DigitalProtocol-1.0 中所定义):
- NfcA (ISO14443-3A)
- NfcB (ISO14443-3B)
- NfcF (JIS X 6319-4)
- IsoDep (ISO 14443-4)
- NFC Forum 标签类型 1、2、3、4、5(由 NFC Forum 定义)
-
[SR] 强烈建议能够通过以下 NFC 标准读取和写入 NDEF 消息以及原始数据。请注意,虽然此处说这些 NFC 标准是“强烈建议”遵循的标准,但我们计划在未来版本的兼容性定义中将其更改为“必须”遵循的标准。这些标准在此版本中是非强制性标准,但在未来版本中将成为必须遵从的标准。强烈建议运行此版 Android 的现有设备及新设备现在就满足这些要求,以便能够升级到未来的平台版本。
-
[C-1-13] 在 NFC 发现模式下,必须轮询所有支持的技术。
- 当设备处于唤醒状态、屏幕处于活动状态,并且锁定屏幕已解锁时,应采用 NFC 发现模式。
- 应能够读取 Thinfilm NFC Barcode 产品的条形码和网址(如果已编码)。
请注意,上面提到的 JIS、ISO 和 NFC Forum 规范没有公开提供的链接。
Android 支持 NFC 主机卡模拟 (HCE) 模式。
如果设备实现包含支持 HCE(适用于 NfcA 和/或 NfcB)的 NFC 控制器芯片组,并且支持应用 ID (AID) 路由,则:
- [C-2-1] 必须报告
android.hardware.nfc.hce
功能常量。 - [C-2-2] 必须支持 NFC HCE API(具体定义请参见 Android SDK)。
如果设备实现包含支持 HCE(适用于 NfcF)的 NFC 控制器芯片组,并且针对第三方应用实现了该功能,则:
- [C-3-1] 必须报告
android.hardware.nfc.hcef
功能常量。 - [C-3-2] 必须实现 NfcF 卡模拟 API(具体定义请参见 Android SDK)。
如果设备实现支持常规 NFC(如本节中所述),并且支持读取器/写入器角色中的 MIFARE 技术(MIFARE Classic、MIFARE Ultralight、NDEF on MIFARE Classic),则:
- [C-4-1] 必须实现对应的 Android API(如 Android SDK 中所述)。
- [C-4-2] 必须通过
android.content.pm.PackageManager.hasSystemFeature
() 方法报告com.nxp.mifare
功能。请注意,这不是标准的 Android 功能,因此不会在android.content.pm.PackageManager
类中显示为常量。
7.4.5. 最低网络功能
设备实现:
- [C-0-1] 必须支持一种或多种形式的数据网络。具体而言,设备实现必须支持至少一种能够达到 200 Kbit/sec 或更高的数据标准。满足此要求的技术包括 EDGE、HSPA、EV-DO、802.11g、以太网和蓝牙 PAN。
- 当物理网络标准(例如以太网)是主要数据连接标准时,还应支持至少一种常用的无线数据连接标准,例如 802.11 (Wi-Fi)。
- 可以实现多种形式的数据连接。
- [C-0-2] 必须包含 IPv6 网络堆栈,并支持使用受管理 API(例如
java.net.Socket
和java.net.URLConnection
)以及原生 API(例如AF_INET6
套接字)进行 IPv6 通信。 - [C-0-3] 必须默认启用 IPv6。
- 必须确保 IPv6 通信和其他通信(例如 IPv4)一样可靠:
- [C-0-4] 在低电耗模式下必须保持 IPv6 连接。
- [C-0-5] 限制发送次数不得导致设备断开与任何符合 IPv6 标准的网络(使用的 RA 生命周期至少为 180 秒)的 IPv6 连接。
- [C-0-6] 连接到 IPv6 网络时,必须为第三方应用提供与网络的直接 IPv6 连接,无需在设备本地进行任何形式的地址或端口转换。受管理 API(例如
Socket#getLocalAddress
或Socket#getLocalPort
)和 NDK API(例如getsockname()
或IPV6_PKTINFO
)都必须返回实际用于发送和接收网络上的数据包的 IP 地址和端口。
所需的 IPv6 支持级别取决于网络类型,如以下要求中所示。
如果设备实现支持 WLAN,则:
- [C-1-1] 必须支持通过 WLAN 执行双栈和 IPv6-only 操作。
如果设备实现支持以太网,则:
- [C-2-1] 必须支持通过以太网执行双栈操作。
如果设备实现支持移动数据网络,则:
- 应支持通过移动数据网络执行 IPv6 操作(IPv6-only 操作,也可能是双栈操作)。
如果设备实现支持多种类型的网络(例如 Wi-Fi 和移动数据网络),则:
- [C-3-1] 当设备同时连接到多种类型的网络时,必须同时满足上述针对连接到每种网络的要求。
7.4.6. 同步设置
设备实现:
- [C-0-1] 必须默认启用主自动同步设置,以便方法
getMasterSyncAutomatically()
返回“true”。
7.4.7. 流量节省程序
如果设备实现包含按流量计费的网络连接,则:
- [SR] 强烈建议提供流量节省程序模式。
如果设备实现提供流量节省程序模式,则:
- [C-1-1] 必须支持
ConnectivityManager
类中的所有 API(如 SDK 文档中所述) - [C-1-2] 必须在设置中提供一个界面来处理
Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS
intent,以便用户向许可名单中添加应用或从中移除应用。
如果设备实现未提供流量节省程序模式,则:
- [C-2-1] 必须针对
ConnectivityManager.getRestrictBackgroundStatus()
返回值RESTRICT_BACKGROUND_STATUS_DISABLED
- [C-2-2] 不得广播
ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED
。 - [C-2-3] 必须有负责处理
Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS
intent 的 activity,但可以将其实现为空操作。
7.4.8. 安全元件
如果设备实现支持 Open Mobile API 安全元件,并使其可供第三方应用使用,则:
- [C-1-1] 必须在调用
android.se.omapi.SEService.getReaders()
方法时枚举可用的安全元件读取器。
7.5. 摄像头
如果设备实现包含至少一个摄像头,则:
- [C-1-1] 必须声明
android.hardware.camera.any
功能标志。 - [C-1-2] 当摄像头打开着以进行基本预览和静态拍摄时,必须确保应用可以同时分配 3 个 RGBA_8888 位图,并且其大小与设备上分辨率最高的摄像头传感器所生成的图片相同。
- [C-1-3] 必须确保处理
MediaStore.ACTION_IMAGE_CAPTURE
、MediaStore.ACTION_IMAGE_CAPTURE_SECURE
或MediaStore.ACTION_VIDEO_CAPTURE
intent 的预安装默认摄像头应用负责先移除图像元数据中的用户位置,再将其发送至接收应用(如果接收应用没有ACCESS_FINE_LOCATION
)。
7.5.1. 后置摄像头
后置摄像头指位于设备上背向显示屏一侧的摄像头,也就是说,与传统摄像头一样,它拍摄的是背向设备显示屏一侧的景物。
设备实现:
- 应包含后置摄像头。
如果设备实现包含至少一个后置摄像头,则:
- [C-1-1] 必须报告功能标志
android.hardware.camera
和android.hardware.camera.any
。 - [C-1-2] 分辨率必须至少为 200 万像素。
- 应在摄像头驱动程序中实现硬件自动对焦或软件自动对焦(对应用软件透明)。
- 可以具有固定焦距硬件或 EDOF(扩展景深)硬件。
- 可以包含闪光灯。
如果摄像头包含闪光灯,则:
- [C-2-1] 当已在摄像头预览 Surface 上注册
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] 必须按照镜像摄像头预览图像串流时的方式,镜像由 postview 显示的图像。
- 可以包含可供后置摄像头使用的功能,例如自动对焦、闪光灯等(如第 7.5.1 节中所述)。
如果用户能够旋转设备实现(例如通过加速度计自动旋转或通过用户输入手动旋转),则:
- [C-2-1] 必须相对于设备的当前方向水平镜像摄像头预览。
7.5.3. 外接摄像头
设备实现:
- 可以支持无需一直连接到设备的外接摄像头。
如果设备实现支持外接摄像头,则:
- [C-1-1] 必须声明平台功能标志
android.hardware.camera.external
和android.hardware camera.any
。 - [C-1-2] 如果通过 USB 主机端口连接外接摄像头,则必须支持 USB Video Class(UVC 1.0 或更高版本)。
- [C-1-3] 必须在连接实体外接摄像头设备的情况下通过摄像头 CTS 测试。有关摄像头 CTS 测试的详细信息,请参阅 source.android.com。
- 应支持 MJPEG 等视频压缩格式,以便传输高品质的未编码串流(即原始照片串流或独立压缩的照片串流)。
- 可以支持多个摄像头。
- 可以支持基于摄像头的视频编码。
如果支持基于摄像头的视频编码,则:
- [C-2-1] 并发的未编码/MJPEG 流(QVGA 或更高分辨率)必须可供设备实现访问。
7.5.4. 摄像头 API 行为
Android 包含两个用于访问摄像头的 API 包,较新的 android.hardware.camera2 API 使应用可以对摄像头进行较低级别的控制,包括高效的零复制连拍/视频串流,以及按帧对曝光、增益、白平衡增益、颜色转换、去噪、锐化等进行控制。
较旧的 API 软件包 android.hardware.Camera
在 Android 5.0 中被标为已废弃,但由于该软件包应仍可供应用使用,因此 Android 设备实现必须确保持续支持该 API(如本节和 Android SDK 中所述)。
已废弃的 android.hardware.Camera 类和较新的 android.hardware.camera2 软件包都具备的功能在这两种 API 中的性能和质量必须相当。例如,具有等效设置,自动对焦速度和精确度必须完全相同,且所拍图片的质量必须相同。依赖这两种 API 的不同语义的功能无需在速度和质量方面保持一致,但应尽可能保持一致。
设备实现必须为所有可用的摄像头实现摄像头相关 API 的以下行为。设备实现:
- [C-0-1] 对于提供给应用回调的预览数据,必须使用
android.hardware.PixelFormat.YCbCr_420_SP
(如果应用从未调用过android.hardware.Camera.Parameters.setPreviewFormat(int)
)。 - [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] 对于在
android.request.availableCapabilities
中通告REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
功能的android.hardware.camera2
设备,必须通过android.media.ImageReader
API 支持使用android.hardware.ImageFormat.YUV_420_888
和android.hardware.ImageFormat.JPEG
作为输出格式。 - [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-SR] 对于多个 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] 必须对该共享存储空间强制执行
android.permission.WRITE_EXTERNAL_STORAGE
权限(如 SDK 中所述)。 - [C-0-5] 除以下情况外,必须对以 API 级别 29 或更高级别为目标的所有应用默认启用分区存储:
- 当应用是在设备升级到 API 29 级之前安装的(不管应用的目标 API 是什么)。
- 当应用在其清单中请求了
android:requestLegacyExternalStorage="true"
时。 - 当应用被授予
android.permission.WRITE_MEDIA_STORAGE
权限时。
- [C-0-6] 必须强制启用了分区存储的应用不得直接对其由
Context
API 方法(如Context.getExternalFilesDirs()
、Context.getExternalCacheDirs()
、Context.getExternalMediaDirs()
和Context.getObbDirs()
方法)返回的应用特定目录之外的文件进行文件系统访问。 - [C-0-7] 必须遮盖通过
MediaStore
访问的媒体文件中存储的位置元数据(如 GPS Exif 标签),发出调用的应用具有ACCESS_MEDIA_LOCATION
权限时除外。
设备实现可以使用以下两者之一来满足上述要求:
- 可供用户使用的可移动存储设备,例如安全数字 (SD) 卡插槽。
- Android 开源项目 (AOSP) 中实现的内部(不可移动)存储空间的一部分。
如果设备实现使用可移除存储设备来满足上述要求,则:
- [C-1-1] 必须实现在插槽中未插入存储媒介时警告用户的消息框或弹出界面。
- [C-1-2] 必须包含经过 FAT 格式化的存储媒介(例如 SD 卡),或者在包装箱上以及购买时随附的其他材料上注明需单独购买存储媒介。
如果设备实现使用不可移动存储空间的一部分来满足上述要求,则:
- 应使用内部应用共享存储空间的 AOSP 实现。
- 可以与应用专属数据共享存储空间。
如果设备实现包含多个共享存储空间路径(例如 SD 卡插槽和共享内部存储空间),则:
- [C-2-1] 只能允许具有
WRITE_MEDIA_STORAGE
权限的预安装 Android 特权应用对辅助外部存储设备执行写入操作,写入到其软件包专用目录或写入到通过触发ACTION_OPEN_DOCUMENT_TREE
intent 返回的URI
中时除外。 - [C-2-2] 必须要求仅在同时授予
android.permission.WRITE_EXTERNAL_STORAGE
权限时才能向用户可见的应用授予与android.permission.WRITE_MEDIA_STORAGE
权限相关的直接访问权限。 - [SR] 强烈建议预安装的 Android 特权应用使用公共 API(如
MediaStore
)与存储设备互动,而不是依赖于由android.permission.WRITE_MEDIA_STORAGE
授权的直接访问权限。
如果设备实现具有支持 USB 外围设备模式的 USB 端口,则:
- [C-3-1] 必须提供一种用于从主机访问应用共享存储空间内的数据的机制。
- 应通过 Android 的媒体扫描程序服务和
android.provider.MediaStore
透明地公开上述两个存储空间路径中的内容。 - 可以使用 USB 大容量存储设备,但应使用媒体传输协议来满足此要求。
如果设备实现具有支持 USB 外围设备模式的 USB 端口,并且支持媒体传输协议,则:
- 应与 Android MTP 参考主机(Android 文件传输)兼容。
- 应报告 USB 设备类 0x00。
- 应报告 USB 接口名称“MTP”。
7.6.3. 可合并的存储设备
如果设备应具有移动性(不同于 TV),则对于设备实现:
- [SR] 强烈建议在长期不变的固定位置实现可合并的存储设备,因为意外断开它们可能会导致数据丢失/损坏。
如果可移动存储设备端口位于长期不变的固定位置(例如电池盒或其他防护盖内),则对于设备实现:
- [SR] 强烈建议实现可合并的存储设备。
7.7. 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 充电器,并检测通告中的变化。
- [SR] 该端口应使用 micro-B 型、micro-AB 型或 C 型 USB 外形规格。强烈建议现有的及新的 Android 设备满足这些要求,以便能够升级到未来的平台版本。
- [SR] 该端口应位于设备底部(根据自然方向),或为所有应用(包括主屏幕)启用软件屏幕旋转功能,以便设备在按照该端口位于底部的方位放置时,屏幕能够正确呈现内容。强烈建议现有的及新的 Android 设备满足这些要求,以便能够升级到未来的平台版本。
- [SR] 应支持在 HS 线性调频和流量传输期间采用 1.5 A 电流(如 USB 电池充电规范 - 修订版 1.2 中所规定)。强烈建议现有的及新的 Android 设备满足这些要求,以便能够升级到未来的平台版本。
- [SR] 强烈建议不要支持会修改高于默认电压的 Vbus 电压或更改接收端/源端角色的专有充电方法,因为这样可能会导致支持标准 USB Power Delivery 方法的充电器或设备出现互操作性问题。虽然此处说的是“强烈建议”,但在未来的 Android 版本中,我们可能会要求所有 C 型端口的设备支持与标准 C 型充电器进行完全互操作。
- [SR] 如果它们支持 C 型 USB 和 USB 主机模式,则强烈建议支持 Power Delivery 以进行数据角色和电源角色交换。
- 应支持 Power Delivery 以进行高压充电,并且应支持显示输出等替代模式。
- 应实现 Android Open Accessory (AOA) API 和规范(如 Android SDK 文档中所述)。
如果设备实现包含 USB 端口,并且实现了 AOA 规范,则:
- [C-2-1] 必须声明支持硬件功能
android.hardware.usb.accessory
。 - [C-2-2] USB 大容量存储类别必须在 USB 大容量存储设备的接口描述
iInterface
字符串末尾添加字符串“android” - 不应实现 Android Open Accessory Protocol 2.0 文档中载述的 AOAv2 音频。从 Android 8.0(API 级别 26)开始,AOAv2 音频便被废弃了。
7.7.2. USB 主机模式
如果设备实现包含支持主机模式的 USB 端口,则:
- [C-1-1] 必须实现 Android USB 主机 API(如 Android SDK 中所述),并声明支持硬件功能
android.hardware.usb.host
。 - [C-1-2] 必须支持连接标准 USB 外围设备,也就是说,它们必须满足以下条件之一:
- 具有设备自带的 C 型端口,或附带用于将设备自带的专有端口适配到标准 USB C 型端口(USB C 型设备)的数据线。
- 具有设备自带的 A 型端口,或附带用于将设备自带的专有端口适配到标准 USB A 型端口的数据线。
- 具有设备自带的 micro-AB 型端口,该端口应附带用于适配到标准 A 型端口的数据线。
- [C-1-3] 不得附带将 USB A 型端口或 micro-AB 端口转接到 C 型端口(插口)的适配器。
- [C-SR] 强烈建议实现 USB 音频类(如 Android SDK 文档中所述)。
- 应支持在主机模式下为连接的 USB 外围设备充电;为 USB C 型连接器使用至少 1.5 A 的源电流(如 USB C 型数据线和连接器规范 - 修订版 1.2 中的“端接参数”部分所规定),或为 micro-AB 型连接器使用充电下行端口 (CDP) 输出电流范围(如 USB 电池充电规范 - 修订版 1.2 中所规定)。
- 应实现并支持与 USB C 型相关的标准。
如果设备实现包含支持主机模式和 USB 音频类的 USB 端口,则:
- [C-2-1] 必须支持 USB HID 类。
- [C-2-2] 必须支持检测 USB HID 用法表和语音指令用法请求中指定的以下 HID 数据字段,并支持将其映射到
KeyEvent
常量,如下所示:- 用法页 (0xC) 用法 ID (0x0CD):
KEYCODE_MEDIA_PLAY_PAUSE
- 用法页 (0xC) 用法 ID (0x0E9):
KEYCODE_VOLUME_UP
- 用法页 (0xC) 用法 ID (0x0EA):
KEYCODE_VOLUME_DOWN
- 用法页 (0xC) 用法 ID (0x0CF):
KEYCODE_VOICE_ASSIST
- 用法页 (0xC) 用法 ID (0x0CD):
如果设备实现包含支持主机模式和存储访问框架 (SAF) 的 USB 端口,则:
- [C-3-1] 必须识别任何远程连接的 MTP(媒体传输协议)设备并通过
ACTION_GET_CONTENT
、ACTION_OPEN_DOCUMENT
和ACTION_CREATE_DOCUMENT
intent 使其内容可访问。
如果设备实现包含支持主机模式和 USB C 型的 USB 端口,则:
- [C-4-1] 必须实现双角色端口功能,如 USB C 型规范(第 4.5.1.3.3 节)所定义。
- [SR] 强烈建议支持 DisplayPort,应支持 USB SuperSpeed 数据传输速率,并且强烈建议支持 Power Delivery 以进行数据角色和电源角色交换。
- [SR] 强烈建议不要支持耳机插孔转换器配件模式(如 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 节中的音频延迟时间要求。
- [SR] 强烈建议支持近超声录音(如第 7.8.3 节中所述)。
如果设备实现省略了麦克风,则:
- [C-2-1] 不得报告
android.hardware.microphone
功能常量。 - [C-2-2] 必须至少按照第 7 节中的规定,将录音 API 实现为空操作。
7.8.2. 音频输出
如果设备实现包含扬声器,或包含用于连接音频输出外围设备的音频/多媒体输出端口(例如 4 导体 3.5 毫米音频耳机插孔或使用 USB 音频类的 USB 主机模式端口),则:
- [C-1-1] 必须报告
android.hardware.audio.output
功能常量。 - [C-1-2] 必须满足第 5.5 节中的音频播放要求。
- [C-1-3] 必须满足第 5.6 节中的音频延迟时间要求。
- [SR] 强烈建议支持近超声播放(如第 7.8.3 节中所述)。
如果设备实现不包含扬声器或音频输出端口,则:
- [C-2-1] 不得报告
android.hardware.audio.output
功能。 - [C-2-2] 必须至少将与音频输出相关的 API 实现为空操作。
在本节中,“输出端口”是指实体接口,例如 3.5 毫米音频耳机插孔、HDMI 端口,或使用 USB 音频类的 USB 主机模式端口。支持通过无线协议(例如蓝牙、Wi-Fi 或移动网络)输出音频不算作包含“输出端口”。
7.8.2.1. 模拟音频端口
为了兼容 Android 生态系统中使用 3.5 毫米音频插头的耳机和其他音频配件,如果设备实现包含一个或多个模拟音频端口,则:
- [C-SR] 强烈建议至少有一个音频端口为 4 导体 3.5 毫米音频耳机插孔。
如果设备实现具有 4 导体 3.5 毫米音频耳机插孔,则:
- [C-1-1] 必须支持将音频播放到带麦克风的立体声头戴式耳机和立体声耳机。
- [C-1-2] 必须支持采用 CTIA 引脚顺序的 TRRS 音频插头。
- [C-1-3] 必须支持检测音频插头上的麦克风导体和接地导体之间以下 3 个范围的等效阻抗,并支持将其映射到相应的键码:
-
70 欧姆或更低:
KEYCODE_HEADSETHOOK
-
210-290 欧姆:
KEYCODE_VOLUME_UP
-
360-680 欧姆:
KEYCODE_VOLUME_DOWN
-
70 欧姆或更低:
- [C-1-4] 必须在插入插头时触发
ACTION_HEADSET_PLUG
,但只能在插头上的所有触点都已接触到耳机插孔上各自的相关部分后才能触发。 - [C-1-5] 必须能够在 32 欧姆扬声器阻抗上驱动至少 150mV ± 10% 的输出电压。
- [C-1-6] 麦克风偏置电压必须介于 1.8 V 到 2.9 V 之间。
- [C-1-7] 必须检测音频插头上的麦克风导体和接地导体之间以下范围的等效阻抗,并且必须将其映射到相应的键码:
-
110-180 欧姆:
KEYCODE_VOICE_ASSIST
-
110-180 欧姆:
- [C-SR] 强烈建议支持具有 OMTP 引脚顺序的音频插头。
- [C-SR] 强烈建议支持使用带麦克风的立体声耳机进行录音。
如果设备实现具有 4 导体 3.5 毫米音频耳机插孔,支持麦克风,并且广播 android.intent.action.HEADSET_PLUG
(其中包含一个设置为 1 的额外参数“microphone”),则:
- [C-2-1] 必须支持检测插入的音频配件上是否有麦克风。
7.8.2.2. 数字音频端口
为了兼容 Android 生态系统中使用 USB-C 连接器并实现(USB 音频类)的耳机和其他音频配件,如 Android USB 耳机规范中定义。
请参阅第 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] (https://github.com/google/oboe/tree/master/apps/OboeTester)“自动干扰测试”测试。
测试需要直接用于 3.5 毫米耳机插孔和/或与 USB-C 至 3.5 毫米适配器配合使用的音频环回适配器。应测试所有音频输出端口。
OboeTester 目前支持 AAudio 路径,因此应使用 AAudio 测试以下组合是否有干扰:
性能模式 | 共享 | 输出采样率 | 输入通道 | 输出通道 |
---|---|---|---|---|
LOW_LATENCY | 独占 | 未指定 | 1 | 2 |
LOW_LATENCY | 独占 | 未指定 | 2 | 1 |
LOW_LATENCY | 共享 | 未指定 | 1 | 2 |
LOW_LATENCY | 共享 | 未指定 | 2 | 1 |
无 | 共享 | 48000 | 1 | 2 |
无 | 共享 | 48000 | 2 | 1 |
无 | 共享 | 44100 | 1 | 2 |
无 | 共享 | 44100 | 2 | 1 |
无 | 共享 | 16000 | 1 | 2 |
无 | 共享 | 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 应用获得用户聚焦时停用单目系统界面组件。
7.9.2. 虚拟实境模式 - 高性能
如果设备实现支持 VR 模式,则:
- [C-1-1] 必须有至少 2 个实体核心。
- [C-1-2] 必须声明
android.hardware.vr.high_performance
功能。 - [C-1-3] 必须支持持续性能模式。
- [C-1-4] 必须支持 OpenGL ES 3.2。
- [C-1-5] 必须支持
android.hardware.vulkan.level
0。 - 应支持
android.hardware.vulkan.level
1 或更高版本。 - [C-1-6] 必须实现
EGL_KHR_mutable_render_buffer
、EGL_ANDROID_front_buffer_auto_refresh
、EGL_ANDROID_get_native_client_buffer
、EGL_KHR_fence_sync
、EGL_KHR_wait_sync
、EGL_IMG_context_priority
、EGL_EXT_protected_content
和EGL_EXT_image_gl_colorspace
,并在可用 EGL 扩展列表中公开这些扩展。 - [C-1-8] 必须实现
GL_EXT_multisampled_render_to_texture2
、GL_OVR_multiview
、GL_OVR_multiview2
、GL_OVR_multiview_multisampled_render_to_texture
和GL_EXT_protected_textures
,并在可用 GL 扩展列表中公开这些扩展。 - [C-SR] 强烈建议实现
GL_EXT_external_buffer
和GL_EXT_EGL_image_array
,并在可用 GL 扩展列表中公开这些扩展。 - [C-SR] 强烈建议支持 Vulkan 1.1。
- [C-SR] 强烈建议实现
VK_ANDROID_external_memory_android_hardware_buffer
、VK_GOOGLE_display_timing
和VK_KHR_shared_presentable_image
,并在可用 Vulkan 扩展列表中公开。 - [C-SR] 强烈建议公开至少一个 Vulkan 队列系列,其中
flags
包含VK_QUEUE_GRAPHICS_BIT
和VK_QUEUE_COMPUTE_BIT
,且queueCount
至少为 2。 - [C-1-7] GPU 和屏幕必须能够同步访问共享的前端缓冲区,以便在两个呈现环境中以 60fps 的速率交替呈现 VR 内容,而没有可见的撕裂现象。
- [C-1-9] 必须支持
AHardwareBuffer
标志AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER
、AHARDWAREBUFFER_USAGE_SENSOR_DIRECT_DATA
和AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT
(如 NDK 中所述)。 - [C-1-10] 必须支持
AHardwareBuffer
和用法标志AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT
、AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE
及AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT
至少以下列格式之一进行任意组合:AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM
、AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM
、AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM
、AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT
。 - [C-SR] 强烈支持分配在 C-1-10 中指定的具有多个层的
AHardwareBuffer
,以及各种标志和格式。 - [C-1-11] 必须支持以至少 3840 x 2160 @ 30fps 的分辨率且压缩到平均 40 Mbps 的速度(相当于 4 个 1920 x1080 @ 30 fps-10 Mbps 实例或 2 个 1920 x 1080 @ 60 fps-20 Mbps 实例)进行 H.264 解码。
- [C-1-12] 必须支持 HEVC 和 VP9,必须能够以至少 1920 x 1080 @ 30 fps 的分辨率且压缩到平均 10 Mbps 的速度进行解码,并且应能够以 3840 x 2160 @ 30 fps-20 Mbps 的分辨率和速度进行解码(相当于 4 个 1920 x 1080 @ 30 fps-5 Mbps 实例)。
- [C-1-13] 必须支持
HardwarePropertiesManager.getDeviceTemperatures
API,并返回表层温度的准确值。 - [C-1-14] 必须包含嵌入式屏幕,且其分辨率必须至少为 1920 x 1080。
- [C-SR] 强烈建议屏幕分辨率至少为 2560 x 1440。
- [C-1-15] 屏幕在 VR 模式下的更新频率必须至少为 60 Hz。
- [C-1-17] 屏幕必须支持低持久性模式(持久性小于等于 5 毫秒),持久性指像素发光的时长。
- [C-1-18] 必须支持蓝牙 4.2 和蓝牙 LE 数据长度扩展(第 7.4.3 节)。
- [C-1-19] 对于以下所有默认传感器类型,必须支持并正确报告直接通道类型:
-
TYPE_ACCELEROMETER
-
TYPE_ACCELEROMETER_UNCALIBRATED
-
TYPE_GYROSCOPE
-
TYPE_GYROSCOPE_UNCALIBRATED
-
TYPE_MAGNETIC_FIELD
-
TYPE_MAGNETIC_FIELD_UNCALIBRATED
-
- [C-SR] 对于上面列出的所有直接通道类型,强烈建议支持
TYPE_HARDWARE_BUFFER
直接通道类型。 - [C-1-21] 对于
android.hardware.hifi_sensors
,必须满足与陀螺仪、加速度计和磁力计相关的要求(如第 7.3.9 节中所规定)。 - [C-SR] 强烈建议支持
android.hardware.sensor.hifi_sensors
功能。 - [C-1-22] 从运动到成像的端到端延时不得超过 28 毫秒。
- [C-SR] 强烈建议从运动到成像的端到端延时不超过 20 毫秒。
- [C-1-23] 第一帧率(即第一帧上从黑过渡到白之后的像素亮度与白色像素处于稳定状态的亮度之间的比率)必须至少为 85%。
- [C-SR] 强烈建议第一帧率至少为 90%。
- 可以为前台应用提供专属核心,并且可以支持
Process.getExclusiveCores
API,以便返回专供最靠前的前台应用使用的 CPU 核心数。
如果支持专用核心,则该核心:
- [C-2-1] 不得允许任何其他用户空间进程(应用使用的设备驱动程序除外)在其上运行,但在必要时可以允许一些内核进程在其上运行。
8. 性能和功耗
有些最低性能和功耗标准对用户体验至关重要,并且会影响开发者在开发应用时所做的基准假设。
8.1. 用户体验一致性
如果有特定的最低要求来确保应用和游戏保持一致的帧速率和响应时间,则可以为最终用户提供流畅的界面。根据设备类型,设备实现可以有针对界面延迟和任务切换的可衡量要求(如第 2 节中所述)。
8.2. 文件 I/O 访问性能
通过提供在应用专属数据存储空间(/data
分区)上实现一致的文件访问性能所需的常用基准,应用开发者可以设定有助于进行软件设计的适当预期。根据设备类型,设备实现可以包含针对以下读取和写入操作的特定要求(如第 2 节中所述):
- 顺序写入性能:通过使用 10MB 写入缓冲区写入一个 256MB 的文件来衡量。
- 随机写入性能:通过使用 4KB 写入缓冲区写入一个 256MB 的文件来衡量。
- 顺序读取性能:通过使用 10MB 写入缓冲区读取一个 256MB 的文件来衡量。
- 随机读取性能:通过使用 4KB 写入缓冲区读取一个 256MB 的文件来衡量。
8.3. 节能模式
如果设备实现中的某些功能可改进 AOSP 中的设备电源管理或可扩展 AOSP 中的功能,则:
- [C-1-1] 应用待机和低电耗节能模式的触发、维护、唤醒算法以及对全局系统设置的使用都不得违背 AOSP 实现。
- [C-1-2] 使用全局设置管理应用待机模式下每个存储分区中应用的作业、alarm 和网络节流都不得偏离 AOSP 实现。
- [C-1-3] 应用待机模式所用应用待机存储分区的数量不得偏离 AOSP 实现。
- [C-1-4] 必须实现应用待机存储分区和低电耗模式(如电源管理中所述)。
- [C-1-5] 必须在设备处于节能模式时使
PowerManager.isPowerSaveMode()
返回true
。 - [C-SR] 强烈建议提供一种方式,让用户能够启用和停用省电模式。
- [C-SR] 强烈建议提供一种方式,让用户能够查看免于进入节能模式(应用待机模式和低电耗模式)的所有应用。
除了节电模式之外,Android 设备实现还可以实现任意或全部 4 种休眠电源状态(如高级配置与电源接口 [ACPI] 中所定义)。
如果设备实现已实现 S4 电源状态(如 ACPI 中所定义),则:
- [C-1-1] 必须仅在用户明确执行使设备处于不活动状态的操作(例如合上属于设备本身一部分的盖子或关闭车辆或电视)之后及用户重新激活设备(例如打开盖子或开启车辆或电视)之前进入此状态。
如果设备实现已实现 S3 电源状态(如 ACPI 中所定义),则:
-
[C-2-1] 必须满足上述 C-1-1 中的要求,或者必须仅在第三方应用不需要系统资源(例如,屏幕、CPU)时进入 S3 状态。
相反,当第三方应用需要系统资源时,必须退出 S3 状态,如本 SDK 中所述。
例如,当第三方应用通过
FLAG_KEEP_SCREEN_ON
请求保持屏幕处于打开状态或通过PARTIAL_WAKE_LOCK
请求 CPU 保持运行时,设备不得进入 S3 状态,除非用户明确执行使设备处于不活动状态的操作(如 C-1-1 中所述)。相反,当第三方应用通过 JobScheduler 实现的任务被触发或 Firebase Cloud Messaging 将其传递到第三方应用时,设备必须退出 S3 状态,除非用户使设备处于不活动状态。这些示例并不详尽,并且 AOSP 会实现大量可触发此状态唤醒的唤醒信号。
8.4. 功耗计算
更准确地计算和报告功耗有助于应用开发者找出能够优化应用功耗模式的措施和工具。
设备实现:
- [SR] 强烈建议提供一个关于各组件功耗的配置文件,其中要定义每种硬件组件的耗电值,以及组件在一段时间内大概消耗的电量(如 Android 开源项目网站上所述)。
- [SR] 强烈建议以毫安小时 (mAh) 为单位报告所有功耗值。
- [SR] 强烈建议按每个进程的 UID 报告 CPU 功耗。Android 开源项目通过
uid_cputime
内核模块实现来满足此要求。 - [SR] 强烈建议能让应用开发者通过
adb shell dumpsys batterystats
shell 命令查看此功耗。 - 如果无法将硬件组件的功耗归于某个应用,则应将其归于硬件组件本身。
8.5. 性能一致
高性能应用在长时间运行时,性能可能会因后台运行的其他应用或由于温度限制导致的 CPU 节流而出现大幅波动。Android 包含可编程接口,以便在设备胜任的情况下,最靠前的前台应用能够请求系统优化资源的分配,来应对这种波动。
设备实现:
-
[C-0-1] 必须通过
PowerManager.isSustainedPerformanceModeSupported()
API 方法准确报告对持续性能模式的支持情况。 -
应支持持续性能模式。
如果设备报告支持持续性能模式,则:
- [C-1-1] 必须能够让最靠前的前台应用至少在 30 分钟内保持稳定的性能水平(当该应用请求时)。
- [C-1-2] 必须遵从
Window.setSustainedPerformanceMode()
API 和其他相关 API。
如果设备实现包含两个或更多个 CPU 核心,则:
- 应至少提供一个可预留给最靠前的前台应用使用的专用核心。
如果设备实现支持为最靠前的前台应用预留一个专用核心,则:
- [C-2-1] 必须通过
Process.getExclusiveCores()
API 方法报告可预留给最靠前的前台应用使用的专用核心的 ID 号。 - [C-2-2] 不得允许任何用户空间进程(应用使用的设备驱动程序除外)在专用核心上运行,但在必要时可以允许一些内核进程在其上运行。
如果设备实现不支持专用核心,则:
- [C-3-1] 必须通过
Process.getExclusiveCores()
API 方法返回一个空列表。
9. 安全模型兼容性
设备实现:
-
[C-0-1] 必须实现与 Android 平台安全模型(如 Android 开发者文档 > API 指南 > 安全和权限参考文档中定义)一致的安全模型。
-
[C-0-2] 必须支持安装自签名应用(无需从任何第三方/权威机构获得任何额外的权限/证书)。具体来说,兼容的设备必须支持下面几小节中介绍的安全机制。
9.1. 权限
设备实现:
-
[C-0-1] 必须支持 Android 权限模型(具体定义请参见 Android 开发者文档)。具体来说就是,必须强制执行定义的每项权限(如 SDK 文档中所述);不得省略、更改或忽略任何权限。
-
可以添加额外的权限,但前提是新权限的 ID 字符串不在
android.\*
命名空间内。 -
[C-0-2]
protectionLevel
为PROTECTION_FLAG_PRIVILEGED
的权限只能授予在系统映像的特权路径中预安装的应用,并且此类权限只能位于明确为各个应用列入许可名单的权限的子集内。AOSP 实现通过以下方式来满足此要求:从etc/permissions/
路径下的文件中读取为各个应用列入许可名单的权限、遵从此类权限,并将system/priv-app
路径用作特权路径。
保护级别为“危险”的权限属于运行时权限。targetSdkVersion
高于 22 的应用会在运行时请求这些权限。
设备实现:
- [C-0-3] 必须显示一个专用界面,以便用户决定是否授予请求的运行时权限;此外还必须提供一个供用户管理运行时权限的界面。
- [C-0-4] 对于这两个界面,必须有且只能有一个实现。
- [C-0-5] 不得向预安装的应用授予任何运行时权限,除非:
- 可以在应用使用运行时权限之前获得用户同意。
- 运行时权限与符合以下条件的某个 intent 模式相关联:已将预安装的应用设置为其默认处理程序。
- [C-0-6] 必须仅将
android.permission.RECOVER_KEYSTORE
权限授予已注册采取适当安全措施的恢复代理的系统应用。采取适当安全措施的恢复代理是指符合以下条件的设备内置软件代理:可与设备外远程存储空间同步,且配有安全硬件,提供的保护功能相当于或优于 Google Cloud Key Vault Service 中所述的保护功能,可防止暴力破解锁屏验证凭据。
设备实现:
-
[C-0-7] 当应用通过标准 Android API 或专有机制请求位置信息或身体活动数据时,必须遵循 Android 位置信息权限属性。此类数据包括但不限于:
- 设备的位置(如纬度和经度)。
- 可用于确定或估计设备位置的信息(例如 SSID、BSSID、小区 ID、蓝牙扫描,或设备连接到的网络的位置)。
- 用户的身体活动或身体活动的分类。
更具体地说,设备实现:
- [C-0-8] 必须征得用户同意,应用才能访问位置信息或身体活动数据。
- [C-0-9] 必须仅向具有足够权限(如 SDK 中所述)的应用授予运行时权限。例如,TelephonyManager#getServiceState 需要
android.permission.ACCESS_FINE_LOCATION
。
权限可标记为限制更改其行为。
-
[C-0-10] 具有
hardRestricted
标志的权限不得被授予应用,除非:- 应用 APK 文件在系统分区中。
- 用户将与
hardRestricted
权限关联的角色分配给应用。 - 安装程序将
hardRestricted
授予应用。 - 应用在早期 Android 版本中被授予
hardRestricted
。
-
[C-0-11] 拥有
softRestricted
权限的应用只能获得有限访问权限,不得获取完全访问权限,除非如 SDK 中所述被列入许可名单,其中为每个softRestricted
权限(例如WRITE_EXTERNAL_STORAGE
和READ_EXTERNAL_STORAGE
)定义了完全和有限访问权限。
如果设备实现包含预安装的应用,或者希望允许第三方应用访问使用情况统计信息,则:
- [SR] 强烈建议提供一种可供用户使用的机制,以便因应
android.settings.ACTION_USAGE_ACCESS_SETTINGS
intent 为声明了android.permission.PACKAGE_USAGE_STATS
权限的应用授予或撤消对使用情况统计信息的访问权限。
如果设备实现打算禁止所有应用(包括预安装的应用)访问使用情况统计信息,则:
- [C-1-1] 必须仍有负责处理
android.settings.ACTION_USAGE_ACCESS_SETTINGS
intent 模式的 activity,但必须将其实现为空操作,也就是具有和用户访问被拒时同等的行为。
9.2. UID 和进程隔离
设备实现:
- [C-0-1] 必须支持 Android 应用沙盒模型。在该模型中,每个应用都是在单独的进程中作为唯一 Unixstyle UID 运行。
- [C-0-2] 必须支持以同一 Linux 用户 ID 运行多个应用,但前提是这些应用已经过适当签名,并采用了适当的构建方式(具体定义请参见安全和权限参考文档)。
9.3. 文件系统权限
设备实现:
- [C-0-1] 必须支持 Android 文件访问权限模型(具体定义请参见安全和权限参考文档)。
9.4. 替代执行环境
设备实现必须能够使 Android 安全和权限模型保持一致性,即使它们包含存在以下情况的运行时环境也是如此:使用除了 Dalvik 可执行文件格式或原生代码以外的一些其他软件或技术来执行应用。也就是说:
-
[C-0-1] 替代运行时本身必须是 Android 应用,并且遵循标准的 Android 安全模型(如第 9 节中的其他部分所述)。
-
[C-0-2] 不得授权替代运行时访问受以下权限保护的资源:未在替代运行时的
AndroidManifest.xml
文件中通过 <uses-permission
> 机制请求的权限。 -
[C-0-3] 替代运行时不得允许应用使用受仅限系统应用享有的 Android 权限保护的功能。
-
[C-0-4] 替代运行时必须遵循 Android 沙盒模型,并且使用替代运行时的安装式应用不得重复使用设备上已安装的任何其他应用的沙盒,除非通过共享用户 ID 和签名证书这两种标准 Android 机制。
-
[C-0-5] 不得使用对应于其他 Android 应用的沙盒启动替代运行时,不得向替代运行时授予对这些沙盒的访问权限,替代运行时也不得向其他应用授予此类访问权限。
-
[C-0-6] 不得使替代运行时在启动时获得超级用户 (root) 或任何其他用户 ID 的任何权限,不得向替代运行时授予任何此类权限,替代运行时也不得向其他应用授予任何此类权限。
-
[C-0-7] 当替代运行时的
.apk
文件包含在设备实现的系统映像中时,它必须已签名,且签名时所用的密钥必须不同于对设备实现随附的其他应用签名时使用的密钥。 -
[C-0-8] 在安装应用时,替代运行时必须就应用使用的 Android 权限获得用户同意。
-
[C-0-9] 如果某个应用需要使用具有相应 Android 权限的设备资源(例如摄像头、GPS,等等),则替代运行时必须通知用户,让他们知道该应用将能够访问相应资源。
-
[C-0-10] 如果运行时环境不会以这种方式记录应用功能,则在安装任何使用该运行时的应用时,运行时环境都必须列出运行时自身拥有的所有权限。
-
替代运行时应通过
PackageManager
将应用安装到单独的 Android 沙盒(Linux 用户 ID 等)中。 -
替代运行时可以提供一个供所有使用替代运行时的应用共享的 Android 沙盒。
9.5. 多用户支持
Android 支持多用户功能,并支持完全用户隔离。
- 如果设备实现使用可移动媒介作为主要的外部存储设备,则可以但不应启用多用户功能。
如果设备实现包含多用户功能,则:
- [C-1-1] 必须满足与多用户支持相关的以下要求。
- [C-1-2] 必须为每位用户实现与 Android 平台安全模型(具体定义请参见 API 指南中的安全和权限参考文档)一致的安全模型。
- [C-1-3] 对于每个用户实例,都必须在共享应用存储空间(也称为
/sdcard
)中有单独的隔离目录。 - [C-1-4] 必须确保归指定用户所有且以其名义运行的应用无法列出、读取或写入到归任何其他用户所有的文件中,即使双方的数据都存储在同一个卷或文件系统中也是如此。
- [C-1-5] 如果设备实现针对外部存储 API 使用可移除媒介,必须使用仅存储在只有系统可访问的不可移除媒介上的密钥对 SD 卡中的内容加密(如果启用了多用户功能)。这样会使主机 PC 无法读取相应媒介,所以设备实现将需要切换到 MTP 或类似系统,才能为主机 PC 提供访问当前用户的数据的权限。
9.6. 付费短信警告
Android 支持针对任何外发付费短信向用户发出警告。付费短信是指向已在运营商处注册且可能需要用户付费的服务发送的短信。
如果设备实现声明支持 android.hardware.telephony
,则:
- [C-1-1] 在向通过设备的
/data/misc/sms/codes.xml
文件中定义的正则表达式识别出的号码发送短信之前,必须警告用户。上游 Android 开源项目提供了一个满足此要求的实现。
9.7. 安全功能
设备实现必须确保符合内核及平台中的安全功能要求(如下所述)。
Android 沙盒包含使用安全增强型 Linux (SELinux) 强制访问控制 (MAC) 系统、seccomp 沙盒功能以及 Linux 内核中其他安全功能的功能。设备实现:
- [C-0-1] 必须与现有应用保持兼容,即使 SELinux 或任何其他安全功能是在 Android 框架以下实现的。
- [C-0-2] 当在 Android 框架以下实现的安全功能检测到并成功阻止安全违规行为时,不得显示可见界面;但当发生未被阻止的安全违规行为且该行为导致漏洞被成功利用时,则可以显示可见界面。
- [C-0-3] 必须确保用户或应用开发者无法对 SELinux 或任何其他在 Android 框架以下实现的安全功能进行配置。
- [C-0-4] 不得允许可通过 API(例如 Device Administration API)影响其他应用的应用配置会破坏兼容性的政策。
- [C-0-5] 必须将媒体框架拆分为多个进程,以便能够更精细地为每个进程授予访问权限(如 Android 开源项目网站上所述)。
- [C-0-6] 必须实现一种允许使用多线程程序中的可配置政策对系统调用进行过滤的内核应用沙盒机制。上游 Android 开源项目通过启用采用 threadgroup 同步 (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 或更高级别的设备上在正常用户副本访问 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
)。 - [SR] 强烈建议使仅在初始化期间会被写入的内核数据在初始化之后被标记为只读(例如
__ro_after_init
)。 -
[C-SR] 强烈建议对内核代码和内存的布局进行随机化处理,并避免会影响此项随机化处理的曝光(例如通过
/chosen/kaslr-seed Device Tree node
或EFI_RNG_PROTOCOL
并采用引导加载程序熵执行CONFIG_RANDOMIZE_BASE
)。 -
[C-SR] 强烈建议在内核中启用控制流完整性 (CFI),以针对代码重用攻击(例如
CONFIG_CFI_CLANG
和CONFIG_SHADOW_CALL_STACK
)提供额外保护。 - [C-SR] 强烈建议不要在已启用控制流完整性 (CFI)、阴影调用堆栈 (SCS) 或整数溢出排错功能 (IntSan) 的组件上停用这些功能。
- [C-SR] 强烈建议为任何其他对安全性要求较高的用户空间组件同时启用 CFI、SCS 和 IntSan(如 CFI 和 IntSan 中所述)。
如果设备实现使用 Linux 内核,则:
- [C-1-1] 必须实现 SELinux。
- [C-1-2] 必须将 SELinux 设置为全局强制模式。
- [C-1-3] 必须将所有域配置为强制模式。不允许使用宽容模式域,包括特定于设备/供应商的域。
- [C-1-4] 对于 AOSP SELinux 域以及特定于设备/供应商的域,不得修改、省略或替换上游 Android 开源项目 (AOSP) 中提供的 system/sepolicy 文件夹中存在的 neverallow 规则,并且政策必须在所有 neverallow 规则都存在的情况下编译。
- [C-1-5] 必须在按应用划分的 SELinux 沙盒中运行以 API 级别 28 或更高级别为目标的第三方应用,并对每个应用的专属数据目录设定应用级 SELinux 限制。
- 应保留上游 Android 开源项目的 system/sepolicy 文件夹中提供的默认 SELinux 政策,并且应仅针对自己的设备特定配置向此政策进一步添加内容。
如果设备实现已搭载早期 Android 版本,且无法通过系统软件更新来满足 [C-1-1] 和 [C-1-5] 要求,可以不遵守这些要求。
如果设备实现使用 Linux 以外的内核,则:
- [C-2-1] 必须使用与 SELinux 相当的强制访问控制系统。
Android 包含多项对设备安全性至关重要的深度防御功能。
9.8. 隐私权
9.8.1. 使用情况历史记录
Android 会存储用户所做选择的历史记录,并会通过 UsageStatsManager 管理此类记录。
设备实现:
- [C-0-1] 必须保证此类用户历史记录具有合理的保留期限。
- [SR] 强烈建议在 AOSP 实现中保留默认配置的 14 天保留期限。
Android 使用 StatsLog
标识符存储系统事件,并通过 StatsManager
和 IncidentManager
System API 管理此类历史记录。
设备实现:
- [C-0-2] 必须只包含系统 API 类
IncidentManager
创建的事件报告中标有DEST_AUTOMATIC
的字段。 - [C-0-3] 不得使用系统事件标识符记录
StatsLog
SDK 文档中所述事件外的任何其他事件。如果记录了其他系统事件,则可以使用 100,000 到 200,000 之间的其他原子标识符。
9.8.2. 录制
设备实现:
- [C-0-1] 不得预加载或分发开箱即用的软件组件,以免这些组件未经用户的同意或未发出持续显示的明确通知,便从设备上发出用户的私密信息(例如按键操作、屏幕上显示的文本、bug 报告)。
-
[C-0-2] 每当通过
MediaProjection
或专有 API 启用屏幕投屏或屏幕录制时,都必须显示并获得用户的明确同意,包括与 AOSP 实质相同的信息。不得让用户能够禁止未来显示用户同意屏幕。 -
[C-0-3] 启用屏幕投射或屏幕录制时,必须持续向用户显示通知。AOSP 通过在状态栏中持续显示通知图标来满足此要求。
如果设备实现在系统中包含用于捕获屏幕上显示的内容和/或录制设备上播放的音频串流的功能,而不是通过系统 API ContentCaptureService
或第 9.8.6 节内容捕获中所述的其他专有方式,则:
- [C-1-1] 每当此功能处于启用状态并主动捕获内容/录音时,必须持续向用户显示通知。
如果设备实现包含一个能够录制环境音频和/或录制设备上播放的音频(以便推断关于用户所在环境的实用信息)且开箱即启用的组件,则:
- [C-2-1] 除非用户明确同意,否则不得将录制的原始音频或以下任何格式的音频存储在设备上的永久性存储空间内,也不得将其发送到设备以外的位置:可以转换回原始音频或转换为与原始音频近似的副本的格式。
9.8.3. 连接
如果设备实现具有支持 USB 外围设备模式的 USB 端口,则:
- [C-1-1] 在允许通过 USB 端口访问共享存储空间的内容之前,必须先显示一个征求用户同意的界面。
9.8.4. 网络流量
设备实现:
- [C-0-1] 必须为系统信任的证书授权机构 (CA) 存储区预安装根证书,并且该根证书与上游 Android 开源项目中提供的根证书相同。
- [C-0-2] 必须搭载空的用户根 CA 存储区。
- [C-0-3] 当添加了用户根 CA 时,必须向用户显示警告,以指明网络流量可能会受到监控。
如果设备流量通过 VPN 路由,则设备实现:
- [C-1-1] 必须向用户显示警告,以指明以下两者之一:
- 该网络流量可能会受到监控。
- 该网络流量通过提供 VPN 的特定 VPN 应用进行路由。
如果设备实现具有一种通过代理服务器或 VPN 网关路由网络数据流量且开箱即默认启用的机制(例如预加载已被授予 android.permission.CONTROL_VPN
权限的 VPN 服务),则:
- [C-2-1] 必须在启用该机制之前征求用户同意,除非相应 VPN 由设备政策控制器通过
DevicePolicyManager.setAlwaysOnVpnPackage()
启用,在这种情况下,用户不需要单独表示同意,只需收到通知即可。
如果设备实现具有一种方式,可让用户开启第三方 VPN 应用的“始终开启的 VPN”功能,则:
- [C-3-1] 对于不支持“始终开启的 VPN”服务(在
AndroidManifest.xml
文件中将SERVICE_META_DATA_SUPPORTS_ALWAYS_ON
属性设置为false
)的应用,必须停用此方式。
9.8.5. 设备标识符
设备实现:
- [C-0-1] 必须防止应用访问设备序列号以及 IMEI/MEID、SIM 卡序列号和国际移动用户识别码 (IMSI)(如果适用),除非满足以下要求之一:
- 是通过设备制造商验证的签名运营商应用。
- 已被授予
READ_PRIVILEGED_PHONE_STATE
权限。 - 具有如 UICC Carrier Privileges 中定义的运营商特权。
- 是已被授予
READ_PHONE_STATE
权限的设备所有者或资料所有者。 - (仅适用于 SIM 卡序列号/ICCID)当地法规要求应用检测订阅者身份的变化。
9.8.6. 内容捕获
Android 通过系统 API ContentCaptureService
或其他专有方式支持设备实现机制,以捕获应用和用户之间的以下交互。
- 屏幕上呈现的文字和图形,包括但不限于通过
AssistStructure
API 的通知和辅助数据。 - 媒体数据,如设备录制或播放的音频或视频。
- 输入事件(如键、鼠标、手势、语音、视频和无障碍功能)。
- 应用通过
Content Capture
API 或具有类似功能的专有 API 提供给系统的任何其他事件。
如果设备实现捕获上述数据,则:
- [C-0-1] 必须加密设备中存储的所有此类数据。可以使用基于 Android 文件的加密或列为 API 版本 26+(如加密 SDK 中所述)的任何加密执行这种加密。
- [C-0-2] 不得使用 Android 备份方法或任何其他备份方法备份原始或加密数据。
- [C-0-3] 只能使用隐私保护机制来发送所有此类数据和设备的日志。隐私保护机制是指“仅允许汇总分析并防止将记录的事件或派生的结果与个别用户匹配的机制”,以防止任何用户级数据被内省(如使用
RAPPOR
等差分隐私技术实现)。 - [C-0-4] 不得将此类数据与设备上的任何用户身份(如
Account
)相关联,在每次关联数据时获得用户的明确同意除外。 - [C-0-5] 不得与其他应用共享此类数据,每次共享时获得用户的明确同意除外。
- [C-0-6] 必须提供一种方式,让用户能够清除
ContentCaptureService
或专有方式收集的数据(如果数据以任何形式存储在设备上)。
如果设备实现包含实现系统 API ContentCaptureService
的服务,或任何捕获上述数据的专有服务,则:
- [C-1-1] 不得允许用户将内容捕获服务替换为用户可安装应用或服务,而只能允许预安装的服务捕获此类数据。
- [C-1-2] 不得允许除预安装内容捕获服务机制外的任何应用能够捕获此类数据。
- [C-1-3] 必须提供一种方式,让用户能够停用内容捕获服务。
- [C-1-4] 不得遗漏一种方式,让用户能够管理内容捕获服务保留的 Android 权限并遵循 Android 权限模型(如第 9.1 节 - 权限中所述)。
-
[C-SR] 强烈建议将内容捕获服务组件保持独立,例如不从其他系统组件绑定该服务或共享进程 ID,以下除外:
- 电话、联系人、系统界面和媒体
9.8.7. 剪贴板访问权限
设备实现:
- [C-0-1] 不得返回剪贴板上剪辑的数据(例如通过
ClipboardManager
API),除非应用是默认 IME 或目前具有焦点的应用。
9.8.8. 位置
设备实现:
- [C-0-1] 未经用户明确同意或用户发起,不得打开/关闭设备位置设置和 Wi-Fi/蓝牙扫描设置。
- [C-0-2] 必须提供一种方式,让用户能够访问与位置有关的信息,包括用于确定位置的最近位置请求、应用级别权限和 Wi-Fi/蓝牙扫描用法。
- [C-0-3] 必须确保使用 Emergency Location Bypass API [LocationRequest.setLocationSettingsIgnored()] 的应用是用户发起的紧急会话(例如拨打 911 或向 911 发短信)。
- [C-0-4] 必须保留 Emergency Location Bypass API 在不更改设置的情况下绕过设备位置设置的功能。
- [C-0-5] 必须计划一则通知,在后台应用使用 [
ACCESS_BACKGROUND_LOCATION
] 权限访问其位置之后提醒用户。
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] 必须通过实现文件级加密 (FBE) 来满足上述数据存储加密要求。
9.9.3. 文件级加密
加密的设备:
- [C-1-1] 启动时不得要求用户提供凭据,并且在广播
ACTION_LOCKED_BOOT_COMPLETED
消息后允许直接启动感知型应用访问设备加密 (DE) 存储空间。 - [C-1-2] 只有在用户已通过提供凭据(例如密码、PIN 码、图案或指纹)解锁设备并且系统已广播
ACTION_USER_UNLOCKED
消息后,才能允许访问凭据加密 (CE) 存储空间。 - [C-1-3] 如果用户未提供凭据或已注册的托管密钥,则不得提供解锁受 CE 保护的存储空间的任何方法。
- [C-1-4] 必须使用验证启动,并确保 DE 密钥以加密形式绑定到设备的硬件信任根。
- [C-1-5] 必须使用 AES-256-XTS 或 Adiantum 对文件内容进行加密。AES-256-XTS 是指具有 256 位加密密钥长度、在 XTS 模式下操作的高级加密标准;密钥的全长是 512 位。Adiantum 是指 Adiantum-XChaCha12-AES,如 https://github.com/google/adiantum 中指定。
- [C-1-6] 必须使用 AES-256-CBC-CTS 或 Adiantum 对文件名进行加密。
-
[C-1-12] 如果设备有高级加密标准 (AES) 指令,则必须使用 AES-256-XTS 对文件内容进行加密,使用 AES-256-CBC-CTS 对文件名进行加密(而非使用 Adiantum)。AES 指令是基于 ARM 的设备上的 ARMv8 加密扩展,或基于 x86 的设备上的 AES-NI。如果设备没有 AES 指令,则可以使用 Adiantum。
-
用于保护 CE 和 DE 存储区域的密钥:
-
[C-1-7] 必须以加密形式绑定到由硬件支持的密钥库。
- [C-1-8] CE 密钥必须绑定到用户的锁定屏幕凭据。
- [C-1-9] 如果用户未指定锁定屏幕凭据,则 CE 密钥必须绑定到默认密码。
- [C-1-10] 必须是唯一的,也就是说,任何用户的 CE 或 DE 密钥都不能与其他用户的 CE 或 DE 密钥一致。
- [C-1-11] 必须使用强制支持的加密方式、密钥长度和模式。
-
[C-SR] 强烈建议对文件系统元数据(例如文件大小、所有权、模式和扩展属性 (xattrs))进行加密,并且密钥以加密形式绑定到设备的硬件信任根。
-
应将预安装的必要应用(例如闹钟、电话和 Messenger)设置为直接启动感知型应用。
上游 Android 开源项目提供了该功能的首选实现(基于 Linux 内核“fscrypt”加密功能)。
9.10. 设备完整性
以下要求旨在确保设备完整性状态的透明性。设备实现:
-
[C-0-1] 必须通过系统 API 方法
PersistentDataBlockManager.getFlashLockState()
正确报告其引导加载程序所处的状态是否允许刷写系统映像。FLASH_LOCK_UNKNOWN
状态专用于从不存在这种新系统 API 方法的较低 Android 版本进行升级的设备实现。 -
[C-0-2] 必须支持启动时验证以确保设备完整性。
如果设备实现已在不支持启动时验证的情况下搭载早期 Android 版本,且无法通过系统软件更新来添加对此功能的支持,则可以不遵守该要求。
启动时验证是一项旨在保证设备软件完整性的功能。如果设备实现支持该功能,则:
- [C-1-1] 必须声明平台功能标志
android.software.verified_boot
。 - [C-1-2] 必须对每个启动序列执行验证。
- [C-1-3] 必须从作为信任根的不可变硬件密钥开始验证,一直验证到系统分区。
- [C-1-4] 必须实现每个验证阶段,以便在执行下一阶段中的代码之前,先检查下一阶段中所有字节的完整性和真实性。
- [C-1-5] 必须使用与 NIST 针对哈希算法 (SHA-256) 和公钥大小 (RSA-2048) 给出的最新建议一样强大的验证算法。
- [C-1-6] 当系统验证失败时,不得允许完成启动,除非用户同意仍然尝试启动,在这种情况下,不得使用任何未经验证的存储块中的数据。
- [C-1-7] 不得允许修改设备上经过验证的分区,除非用户已明确解锁引导加载程序。
- [C-SR] 如果设备中有多个离散芯片(例如无线装置、专门的图像处理器),强烈建议其中每个芯片的启动进程在启动时验证每个阶段。
- [C-1-8] 必须使用防篡改的存储空间:用于在引导加载程序处于解锁状态时存储。防篡改的存储空间意味着:如果存储空间在 Android 内被篡改,引导加载程序可以检测到。
- [C-1-9] 必须在允许从引导加载程序锁定模式转换为引导加载程序解锁模式之前提示用户(如果他们在使用设备),并要求用户进行物理确认。
- [C-1-10] 必须针对 Android 使用的分区(例如启动、系统分区)实现回滚保护,并使用防篡改存储空间存储用于确定允许使用的最低操作系统版本的元数据。
- [C-SR] 强烈建议通过根目录在分区下的信任链(受启动时验证保护)验证所有特权应用 APK 文件。
- [C-SR] 强烈建议先对特权应用从其 APK 文件之外加载的所有可执行工件(例如动态加载的代码或编译的代码)进行验证,然后再执行这些工件或根本不执行(强烈建议采取后一种做法)。
- 应针对具有持久性固件(例如调制解调器、摄像头)的任何组件实现回滚保护,并且应使用防篡改存储空间来存储用于确定允许使用的最低版本的元数据。
如果设备实现已在不支持 C-1-8 至 C-1-10 的情况下搭载早期 Android 版本,且无法通过系统软件更新满足上述要求,则可以不遵守这些要求。
上游 Android 开源项目在 external/avb/
库中提供了此功能的首选实现,该实现可以集成到用于加载 Android 的引导加载程序中。
设备实现:
- [C-R] 建议支持 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 密钥库系统允许应用开发者将加密密钥存储在容器中,并通过 KeyChain API 或 Keystore API 在加密操作中使用它们。设备实现:
- [C-0-1] 必须至少允许导入或生成 8192 个密钥。
- [C-0-2] 锁定屏幕身份验证机制必须对尝试次数加以限制,并采用指数退避算法。尝试的失败次数超过 150 次后,每次尝试的延迟必须至少为 24 小时。
- 不应限制可以生成的密钥数
如果设备实现支持安全锁定屏幕,则:
- [C-1-1] 必须通过隔离的执行环境备份密钥库实现。
- [C-1-2] 必须具有 RSA、AES、ECDSA 和 HMAC 加密算法以及 MD5、SHA1 和 SHA-2 系列哈希函数的实现,以便建立一个与在内核上及更上层运行的代码安全隔离的区域,并在该区域中正确支持 Android 密钥库系统支持的算法。安全隔离必须能够阻止内核或用户空间代码可能会借以获取隔离环境内部状态的所有潜在机制,包括 DMA。上游 Android 开源项目 (AOSP) 通过使用 Trusty 实现来满足此要求,但也可以使用其他基于 ARM TrustZone 的解决方案,或使用基于 Hypervisor 的适当隔离方法的安全实现(需要经过第三方审核)。
- [C-1-3] 必须在隔离的执行环境中执行锁定屏幕身份验证,并且只有在成功通过验证后,才允许使用与身份验证绑定的密钥。锁定屏幕凭据的存储方式必须只允许隔离的执行环境执行锁屏身份验证。上游 Android 开源项目提供了可用于满足此要求的 Gatekeeper 硬件抽象层 (HAL) 和 Trusty。
- [C-1-4] 如果认证签名密钥有安全硬件保护,并且签名是在安全硬件中进行,必须支持密钥认证。认证签名密钥必须在足够多的设备之间共享,以防止此类密钥被用作设备标识符。若要满足此要求,可以采用的一种方法是共享相同的认证密钥,除非生成了至少 10 万个单元的给定 SKU。如果生成了超过 10 万个单元的 SKU,可以针对每 10 万个单元使用一个不同的密钥。
请注意,如果设备实现已搭载较低 Android 版本,则此类设备无需满足具有由隔离的执行环境支持的密钥库并支持密钥认证这一要求,除非它声明了 android.hardware.fingerprint
功能(该功能需要受隔离的执行环境支持的密钥库)。
- [C-1-5] 必须允许用户为从解锁状态到锁定状态的过渡时间选择休眠超时,允许的最短超时时间为 15 秒。
9.11.1. 安全锁定屏幕和身份验证
AOSP 实现遵循分层的身份验证模式,其中基于知识的主要身份验证可由安全系数较高的辅助生物识别技术或安全系数较低的第三模态提供支持。
设备实现:
- [C-SR] 强烈建议仅将以下身份验证方法之一设置为主要身份验证方法:
- 数字 PIN 码
- 字母数字密码
- 3x3 点网格上的滑动图案
请注意,上述身份验证方法在本文档中称为建议的主要身份验证方法。
如果设备实现会添加或修改建议的主要身份验证方法,并将新的身份验证方法用作安全的屏幕锁定方式,则新的身份验证方法:
- [C-2-1] 必须是要求进行用户身份验证才能使用密钥中所述的用户身份验证方法。
- [C-2-2] 必须解锁所有密钥,以便在用户解锁安全锁定屏幕时供第三方开发者应用使用。例如,必须通过相关 API(例如
createConfirmDeviceCredentialIntent
和setUserAuthenticationRequired
)使所有密钥都可供第三方开发者应用使用。
如果设备实现会添加或修改用于解锁锁定屏幕且基于已知密钥的身份验证方法,并将新的身份验证方法视为安全的屏幕锁定方式,则:
- [C-3-1] 允许的最短输入内容长度的熵必须大于 10 位。
- [C-3-2] 所有可能的输入内容的最大熵必须大于 18 位。
- [C-3-3] 新的身份验证方法不得替换 AOSP 中实现和提供的任何建议的主要身份验证方法(即 PIN 码、图案或密码)。
- [C-3-4] 当设备政策控制器 (DPC) 应用已通过
DevicePolicyManager.setPasswordQuality()
方法(具有比PASSWORD_QUALITY_SOMETHING
限制性更强的质量常量)设置密码质量政策时,新的身份验证方法必须处于停用状态。 - [C-3-5] 新的身份验证方法至少每隔 72 小时不得回退到建议的主要身份验证方法(如 PIN 码、图案或密码)或明确地向用户披露:某些数据不会备份以便保留数据的隐私。
如果设备实现会添加或修改建议的主要身份验证方法以解锁锁定屏幕,并将基于生物识别的新身份验证方法视为安全的屏幕锁定方式,则新的方法:
- [C-4-1] 必须满足第 7.3.10 节便利的所有要求。
- [C-4-2] 必须具有回退机制,以使用建议的主要身份验证方法之一(基于已知密钥)。
- [C-4-3] 当设备政策控制器 (DPC) 应用已通过调用具有相关的任何生物识别标志(即
KEYGUARD_DISABLE_BIOMETRICS
、KEYGUARD_DISABLE_FINGERPRINT
、KEYGUARD_DISABLE_FACE
或KEYGUARD_DISABLE_IRIS
)的DevicePolicyManager.setKeyguardDisabledFeatures()
方法设置键盘锁功能政策时,它们必须处于停用状态,并且仅允许使用建议的主要身份验证方法解锁屏幕。
如果生物识别身份验证方法不符合第 7.3.10 节中所述的强的要求,则:
- [C-5-1] 当设备政策控制器 (DPC) 应用已通过
DevicePolicyManager.setPasswordQuality()
方法(具有比PASSWORD_QUALITY_BIOMETRIC_WEAK
限制性更强的质量常量)设置密码质量政策时,这些方法必须处于停用状态。 - [C-5-2] 必须在 4 小时的待机超时期限之后进行一次建议的主要身份验证(例如 PIN 码、图案、密码)。待机超时期限将在每次成功确认设备凭据后重置。
- [C-5-3] 这些方法不得被视为安全的锁屏方法,且必须满足本节下文中以 C-8 开头的要求。
如果设备实现会添加或修改用于解锁锁定屏幕的身份验证方法,且新的身份验证方法基于物理令牌或位置,则:
- [C-6-1] 必须具有回退机制,以使用建议的主要身份验证方法之一(基于已知密钥,且满足被视为安全锁定屏幕的要求)。
- [C-6-2] 当设备政策控制器 (DPC) 应用已通过
DevicePolicyManager.setKeyguardDisabledFeatures(KEYGUARD_DISABLE_TRUST_AGENTS)
方法或DevicePolicyManager.setPasswordQuality()
方法(具有比PASSWORD_QUALITY_UNSPECIFIED
限制性更强的质量常量)设置政策时,新的身份验证方法必须处于停用状态,且仅允许使用建议的主要身份验证方法之一解锁屏幕。 - [C-6-3] 必须至少每隔 4 小时要求用户通过建议的主要身份验证方法之一(例如 PIN 码、图案、密码)验证身份。
- [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 或 Automotive 设备)上完整实现该功能。 - [C-7-4] 必须对
TrustAgentService.addEscrowToken()
添加的所有存储令牌进行加密。 - [C-7-5] 不得将加密密钥或第三方托管令牌存储在使用该密钥的设备上。例如,可以使用存储在手机上的密钥解锁 TV 上的用户账号。
- [C-7-6] 在启用第三方托管令牌以解密数据存储之前,必须先将会对安全性造成的影响通知用户。
- [C-7-7] 必须具有回退机制,以使用建议的主要身份验证方法之一。
- [C-7-8] 除非需要考虑用户安全(驾驶员分心),否则必须至少每隔 72 小时要求用户通过建议的主要身份验证方法之一(例如 PIN 码、图案、密码)验证身份。
- [C-7-9] 除非需要考虑用户安全(驾驶员分心),否则必须在 4 小时待机超时期限后要求用户通过建议的主要身份验证方法之一(例如 PIN 码、图案、密码)验证身份。待机超时期限将在每次成功确认设备凭据后重置。
- [C-7-10] 不得被视为安全的锁屏方法,且必须遵循下文 C-8 中所列的限制条件。
- [C-7-11] 不得允许主要个人设备(如手持设备)上的 TrustAgents 解锁设备,而只能使用它们将已解锁的设备保持在已解锁状态最长达 4 小时。AOSP 中的 TrustManagerService 的默认实现满足此要求。
- [C-7-12] 必须使用加密安全(如 UKEY2)信道将存储设备中的第三方托管令牌传递至目标设备。
如果设备实现会添加或修改用于解锁锁定屏幕(并非上述安全锁屏方式中的一种)的身份验证方法,并使用新的身份验证方法解锁键盘锁,则:
- [C-8-1] 当设备政策控制器 (DPC) 应用已通过
DevicePolicyManager.setPasswordQuality()
方法(具有比PASSWORD_QUALITY_UNSPECIFIED
限制性更强的质量常量)设置密码质量政策时,新的方法必须处于停用状态。 - [C-8-2] 不得重置
DevicePolicyManager.setPasswordExpirationTimeout()
设置的密码有效期计时器。 - [C-8-3] 不得公开供第三方应用用于确定锁定状态的 API。
9.11.2. StrongBox
Android 密钥库系统允许应用开发者将加密密钥存储在专用的安全处理器以及上述隔离的执行环境中。这种专用安全处理器称为“StrongBox”。下面的 C-1-3 至 C-1-11 要求规定了设备要符合 StrongBox 资格所必须满足的要求。
具有专用安全处理器的设备实现:
- [C-SR] 强烈建议支持 StrongBox。StrongBox 在未来版本中很可能会成为一项要求。
如果设备实现支持 StrongBox,则:
-
[C-1-1] 必须声明 FEATURE_STRONGBOX_KEYSTORE。
-
[C-1-2] 必须提供专用的安全硬件,以支持密钥存储区和安全的用户身份验证。专用安全硬件也可用于其他目的。
-
[C-1-3] 必须具有不与应用处理器 (AP) 共享任何缓存、DRAM、协处理器或其他核心资源的独立 CPU。
-
[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] 强烈建议使包含的硬件通过安全目标、安全评估等级 (EAL) 5(由 AVA_VAN.5 增强)的评估。EAL 5 认证在未来版本中很可能会成为一项要求。
-
[C-SR] 强烈建议提供防内部人员攻击 (IAR) 功能,这意味着有权访问固件签名密钥的内部人员无法生成导致 StrongBox 泄露密钥的固件,因此无法绕过功能安全要求或以其他方式访问敏感的用户数据。IAR 的建议实现方法是仅在通过 IAuthSecret HAL 提供主要用户密码时才允许固件更新。
9.12. 数据删除
所有设备实现:
- [C-0-1] 必须为用户提供一种用于执行“恢复出厂设置”的机制。
- [C-0-2] 必须删除用户数据文件系统上的所有数据。
- [C-0-3] 必须采用符合相关行业标准(例如 NIST SP800-88)的方式删除数据。
- [C-0-4] 当主要用户的设备政策控制器应用调用
DevicePolicyManager.wipeData()
API 时,必须触发上述“恢复出厂设置”流程。 - 可以提供仅会执行逻辑数据清空操作的快速数据擦除功能。
9.13. 安全启动模式
Android 提供了安全启动模式,可让用户启动到仅允许运行预安装的系统应用而停用所有第三方应用的模式。这种模式称为“安全启动模式”,它可以让用户卸载可能有害的第三方应用。
设备实现:
- [SR] 强烈建议实现安全启动模式。
如果设备实现已实现安全启动模式,则:
-
[C-1-1] 必须为用户提供一个进入安全启动模式的选项,并确保在进入该模式时不会被设备上安装的第三方应用中断,除非第三方应用是设备政策控制器,并且已将
UserManager.DISALLOW_SAFE_BOOT
标志设置为 true。 -
[C-1-2] 必须让用户能够在安全模式下卸载任何第三方应用。
-
应为用户提供一个用于从启动菜单进入安全启动模式的选项(采用的工作流程不同于正常启动时的工作流程)。
9.14. Automotive 车载系统隔离
Android Automotive 设备应使用车载 HAL 与关键车载子系统交换数据,以便通过车载网络(如 CAN 总线)收发消息。
可以通过以下方式保护数据交换的安全性:在 Android 框架层以下实现安全功能,以防止与这些子系统进行恶意交互或意外交互。
9.15. 订阅方案
“订阅方案”是指移动运营商通过 SubscriptionManager.setSubscriptionPlans()
提供的结算关系方案详情。
所有设备实现:
- [C-0-1] 必须仅将订阅套餐返回给最初提供它们的移动运营商应用。
- [C-0-2] 不得远程备份或上传订阅方案。
- [C-0-3] 必须只允许当前提供有效订阅方案的移动运营商应用进行替换,例如
SubscriptionManager.setSubscriptionOverrideCongested()
。
10. 软件兼容性测试
设备实现必须通过本节中所述的所有测试。不过请注意,任何软件测试包都不是详尽无遗的。因此,强烈建议设备实现者尽可能避免对可从 Android 开源项目获得的 Android 参考实现和首选实现进行更改。这样有助于最大限度地降低引入 bug 的风险,从而避免造成需要进行返工和潜在设备更新的不兼容问题。
10.1. 兼容性测试套件
设备实现:
-
[C-0-1] 必须通过 Android 开源项目提供的 Android 兼容性测试套件 (CTS) 的测试(使用设备上最终交付的软件)。
-
[C-0-2] 对于 CTS 中不明确的情况,以及参考源代码中部分内容的任何重新实现,都必须确保兼容性。
CTS 能够在实际设备上运行。与所有软件一样,CTS 自身也可能包含 bug。CTS 的版本发布独立于本兼容性定义,我们可能会针对 Android 10 发布多个 CTS 修订版本。
设备实现:
-
[C-0-3] 必须通过设备软件发布时可用的最新 CTS 版本的测试。
-
应尽可能多地使用 Android 开源树中的参考实现。
10.2. CTS 验证程序
CTS 验证程序包含在兼容性测试套件中,以便人工操作员运行该验证程序来测试无法由自动化系统测试的功能(例如,测试摄像头和传感器能否正常工作)。
设备实现:
- [C-0-1] 必须正确执行 CTS 验证程序中的所有适用用例。
CTS 验证程序中包含针对多种硬件(其中包括一些选配硬件)的测试。
设备实现:
- [C-0-2] 必须通过针对其具备的硬件的所有测试;例如,如果某部设备具备加速度计,则必须正确执行 CTS 验证程序中的加速度计测试用例。
对于本兼容性定义文档中注明为选配的功能,可跳过或省略相应的测试用例。
- [C-0-2] 如上所述,每部设备和每个 build 都必须正确运行 CTS 验证程序。不过,由于很多 build 非常相似,因此设备实现者可能不会对只有细微差别的 build 明确运行 CTS 验证程序。具体来说,如果设备实现与某个已通过 CTS 验证程序测试的实现只是在所包含的语言区域、品牌信息等方面存在差别,则可以省略 CTS 验证程序测试。
11. 可更新软件
-
[C-0-1] 设备实现必须包含可用于替换整个系统软件的机制。该机制不需要执行“实时”升级 - 也就是说,可能需要重新启动设备。可以使用任何方法,但前提是相应方法可以替换设备上预安装的整个软件。例如,以下任何方法都可以满足此要求:
- “无线下载 (OTA)”(通过重新启动进行离线更新)。
- 从主机 PC 上通过 USB 进行“网络共享”更新。
- 通过重新启动进行“离线”更新,以及通过可移动存储设备上的文件进行更新。
-
[C-0-2] 使用的更新机制必须支持在不擦除用户数据的情况下进行更新。也就是说,更新机制必须保留应用专属数据和应用共享数据。请注意,上游 Android 软件包含满足此要求的更新机制。
-
[C-0-3] 必须对整个更新进行签名,并且设备上更新机制必须根据设备上存储的公钥验证更新和签名。
- [C-SR] 强烈建议签名机制使用 SHA-256 对更新进行哈希处理,并使用 ECDSA NIST P-256 根据公钥验证哈希。
如果设备实现支持 802.11 或蓝牙 PAN(个人局域网)配置文件等不按流量计费的数据网络连接,则:
- [C-1-1] 必须支持 OTA 下载(通过重新启动进行离线更新)。
对于搭载 Android 6.0 及更高版本的设备实现,更新机制应支持在 OTA 之后验证系统映像是否为与预期结果完全相同的二进制文件。上游 Android 开源项目中基于块的 OTA 实现(从 Android 5.1 开始添加了此实现)可满足此要求。
此外,设备实现还应支持 A/B 系统更新。AOSP 使用启动控件 HAL 实现了此功能。
在设备实现发布后,如果在其合理的产品生命周期内发现其中存在错误,并且经与 Android 兼容性团队磋商后确定该错误会影响第三方应用的兼容性,则:
- [C-2-1] 设备实现者必须通过可按上述机制应用的可用软件更新来更正该错误。
Android 包含一些可让设备所有者应用(如果存在)控制系统更新安装的功能。如果设备的系统更新子系统报告 android.software.device_admin,则:
- [C-3-1] 必须实现 SystemUpdatePolicy 类中所述的行为。
12. 文档更新日志
有关对此版本中的兼容性定义所做变更的摘要,请参阅:
有关对各节所做更改的摘要,请参阅:
12.1. 更新日志查看提示
更改采用以下标记方式:
-
CDD
对兼容性要求所做的重大更改。 -
文档
与美观性或 build 相关的更改。
为了最便捷地查看相关更改,请将 pretty=full
和 no-merges
网址参数附加到更新日志网址。
13. 与我们联系
您可以加入 android-compatibility 论坛,发帖咨询或提出您认为本文档未涵盖的任何问题。