修订版 1
上次更新时间:2013 年 11 月 27 日
版权所有 © 2013,Google Inc。保留所有权利。
compatibility@android.com
目录
2. 资源
3. 软件
3.2. 软 API 兼容性
3.3. 原生 API 兼容性
3.4. Web 兼容性
3.5. API 行为兼容性
3.6. API 命名空间
3.7. 虚拟机兼容性
3.8. 界面兼容性
3.8.2. widget
3.8.3. 通知
3.8.4. 搜索
3.8.5. 消息框
3.8.6. 主题
3.8.7. 动态壁纸
3.8.8. 最近使用的应用的显示
3.8.9. 输入管理
3.8.10. 锁定屏幕媒体遥控器
3.8.11. Dream
3.8.12. 位置信息
3.8.13. Unicode
3.10 无障碍功能
3.11 文字转语音
5. 多媒体兼容性
6. 开发者工具和选项兼容性
7. 硬件兼容性
7.1.2. 显示指标
7.1.3. 屏幕方向
7.1.4. 2D 和 3D 图形加速
7.1.5. 旧应用兼容模式
7.1.6. 屏幕类型
7.1.7. 屏幕技术
7.1.8. 外接显示屏
7.3. 传感器
7.4. 数据连接
7.5. 摄像头
7.6. 内存和存储空间
7.7. USB
9. 安全模型兼容性
9.2. UID 和进程隔离
9.3. 文件系统权限
9.4. 替代执行环境
9.5. 多用户支持
9.6. 付费短信警告
9.7. 内核安全功能
9.8. 隐私权
9.9. 全盘加密
11. 可更新软件
12. 文档更新日志
13. 与我们联系
1. 简介
本文档列出了设备必须满足哪些要求,才能与 Android 4.4 兼容。
本文档按照 RFC2119 [资源 1] 中定义的 IETF 标准使用“必须”“不得”“必需”“会”“不会”“应”“不应”“建议”“可以”和“非强制”字样。
在本文档中,“设备实现者”或“实现者”指的是运行 Android 4.4 的硬件/软件解决方案的开发人员或组织。“设备实现”或“实现”指的是所开发的硬件/软件解决方案。
设备实现必须满足本兼容性定义文档(包括以参考资料的形式纳入的所有文档)中列出的要求,才会被视为与 Android 4.4 兼容。
本定义或第 10 节中所述的软件测试如有未提及、含糊不清或不完整之处,设备实现者需负责确保与现有实现兼容。
因此,Android 开源项目 [资源 3] 既是参考 Android 实现,也是首选 Android 实现。强烈建议设备实现者尽可能使其实现基于 Android 开源项目提供的“上游”源代码。虽然从理论上来说某些组件可以替换为替代实现,但强烈建议不要这样做,否则通过软件测试的难度会大大增加。实现者需负责确保行为与标准 Android 实现(包括兼容性测试套件及其他内容)完全兼容。最后请注意,本文档明确禁止替换和修改某些组件。
2. 资源
- IETF RFC2119 要求级别:http://www.ietf.org/rfc/rfc2119.txt
- Android 兼容性计划概述:http://source.android.com/docs/compatibility/index.html
- Android 开源项目:http://source.android.com/
- API 定义和文档:http://developer.android.com/reference/packages.html
- Android 权限参考:http://developer.android.com/reference/android/Manifest.permission.html
- android.os.Build 参考文档:http://developer.android.com/reference/android/os/Build.html
- 允许的 Android 4.4 版本字符串:http://source.android.com/docs/compatibility/4.4/versions.html
- RenderScript:http://developer.android.com/guide/topics/graphics/renderscript.html
- 硬件加速:http://developer.android.com/guide/topics/graphics/hardware-accel.html
- android.webkit.WebView 类:http://developer.android.com/reference/android/webkit/WebView.html
- HTML5:http://www.whatwg.org/specs/web-apps/current-work/multipage/
- HTML5 离线功能:http://dev.w3.org/html5/spec/Overview.html#offline
- HTML5 视频标记:http://dev.w3.org/html5/spec/Overview.html#video
- HTML5/W3C Geolocation API:http://www.w3.org/TR/geolocation-API/
- HTML5/W3C Webstorage API:http://www.w3.org/TR/webstorage/
- HTML5/W3C IndexedDB API:http://www.w3.org/TR/IndexedDB/
- Dalvik 虚拟机规范:可在 Android 源代码中的 dalvik/docs 下找到
- AppWidget:http://developer.android.com/guide/practices/ui_guidelines/widget_design.html
- 通知:http://developer.android.com/guide/topics/ui/notifiers/notifications.html
- 应用资源:http://code.google.com/android/reference/available-resources.html
- 状态栏图标样式指南:http://developer.android.com/guide/practices/ui_guidelines/icon_design_status_bar.html
- 搜索管理器:http://developer.android.com/reference/android/app/SearchManager.html
- 消息框:http://developer.android.com/reference/android/widget/Toast.html
- 主题:http://developer.android.com/guide/topics/ui/themes.html
- R.style 类:http://developer.android.com/reference/android/R.style.html
- 动态壁纸:https://android-developers.googleblog.com/2010/02/live-wallpapers.html
- Android 设备管理:http://developer.android.com/guide/topics/admin/device-admin.html
- DevicePolicyManager 参考:http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html
- Android 无障碍服务 API:http://developer.android.com/reference/android/accessibilityservice/package-summary.html
- Android 无障碍功能 API:http://developer.android.com/reference/android/view/accessibility/package-summary.html
- Eyes Free 项目:http://code.google.com/p/eyes-free
- 文字转语音 API:http://developer.android.com/reference/android/speech/tts/package-summary.html
- 参考工具文档(适用于 adb、aapt、ddms 和 systrace):http://developer.android.com/guide/developing/tools/index.html
- Android APK 文件说明:http://developer.android.com/guide/topics/fundamentals.html
- 清单文件:http://developer.android.com/guide/topics/manifest/manifest-intro.html
- Monkey 测试工具:https://developer.android.com/studio/test/other-testing-tools/monkey
- Android android.content.pm.PackageManager 类和硬件功能列表:http://developer.android.com/reference/android/content/pm/PackageManager.html
- 支持多种屏幕:http://developer.android.com/guide/practices/screens_support.html
- android.util.DisplayMetrics:http://developer.android.com/reference/android/util/DisplayMetrics.html
- android.content.res.Configuration:http://developer.android.com/reference/android/content/res/Configuration.html
- android.hardware.SensorEvent:http://developer.android.com/reference/android/hardware/SensorEvent.html
- 蓝牙 API:http://developer.android.com/reference/android/bluetooth/package-summary.html
- NDEF 推送协议:http://source.android.com/docs/compatibility/ndef-push-protocol.pdf
- MIFARE MF1S503X:http://www.nxp.com/documents/data_sheet/MF1S503x.pdf
- MIFARE MF1S703X:http://www.nxp.com/documents/data_sheet/MF1S703x.pdf
- MIFARE MF0ICU1:http://www.nxp.com/documents/data_sheet/MF0ICU1.pdf
- MIFARE MF0ICU2:http://www.nxp.com/documents/short_data_sheet/MF0ICU2_SDS.pdf
- MIFARE AN130511:http://www.nxp.com/documents/application_note/AN130511.pdf
- MIFARE AN130411:http://www.nxp.com/documents/application_note/AN130411.pdf
- 摄像头方向 API:http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int)
- 摄像头:http://developer.android.com/reference/android/hardware/Camera.html
- Android 开放配件:http://developer.android.com/guide/topics/usb/accessory.html
- USB 主机 API:http://developer.android.com/guide/topics/usb/host.html
- Android 安全和权限参考:http://developer.android.com/guide/topics/security/permissions.html
- Android 应用:http://code.google.com/p/apps-for-android
- Android DownloadManager:http://developer.android.com/reference/android/app/DownloadManager.html
- Android 文件传输:http://www.android.com/filetransfer
- Android 媒体格式:http://developer.android.com/guide/appendix/media-formats.html
- HTTP Live Streaming 草案协议:http://tools.ietf.org/html/draft-pantos-http-live-streaming-03
- NFC 连接切换:http://www.nfc-forum.org/specs/spec_list/#conn_handover
- 使用 NFC 进行安全简单的蓝牙配对:http://www.nfc-forum.org/resources/AppDocs/NFCForum_AD_BTSSP_1_0.pdf
- Wi-Fi 多播 API:http://developer.android.com/reference/android/net/wifi/WifiManager.MulticastLock.html
- 操作辅助:http://developer.android.com/reference/android/content/Intent.html#ACTION_ASSIST
- USB 充电规范:http://www.usb.org/developers/devclass_docs/USB_Battery_Charging_1.2.pdf
- Android Beam:http://developer.android.com/guide/topics/nfc/nfc.html
- Android USB 音频:http://developer.android.com/reference/android/hardware/usb/UsbConstants.html#USB_CLASS_AUDIO
- Android NFC 共享设置:http://developer.android.com/reference/android/provider/Settings.html#ACTION_NFCSHARING_SETTINGS
- Wi-Fi 直连(Wi-Fi 点对点):http://developer.android.com/reference/android/net/wifi/p2p/WifiP2pManager.html
- 锁定屏幕和主屏幕 widget:http://developer.android.com/reference/android/appwidget/AppWidgetProviderInfo.html
- UserManager 参考:http://developer.android.com/reference/android/os/UserManager.html
- 外部存储空间参考:https://source.android.com/docs/core/storage
- 外部存储空间 API:http://developer.android.com/reference/android/os/Environment.html
- 短信短号码:http://en.wikipedia.org/wiki/Short_code
- 媒体遥控器客户端:http://developer.android.com/reference/android/media/RemoteControlClient.html
- 显示屏管理器:http://developer.android.com/reference/android/hardware/display/DisplayManager.html
- Dreams:http://developer.android.com/reference/android/service/dreams/DreamService.html
- Android 应用开发相关设置:http://developer.android.com/reference/android/provider/Settings.html#ACTION_APPLICATION_DEVELOPMENT_SETTINGS
- 摄像头:http://developer.android.com/reference/android/hardware/Camera.Parameters.html
- EGL Extension-EGL_ANDROID_RECORDABLE:http://www.khronos.org/registry/egl/extensions/ANDROID/EGL_ANDROID_recordable.txt
- 动作事件 API:http://developer.android.com/reference/android/view/MotionEvent.html
- 触摸输入配置:http://source.android.com/docs/core/interaction/input/touch-devices.html
- Unicode 6.1.0:http://www.unicode.org/versions/Unicode6.1.0/
- WebView 兼容性:http://www.chromium.org/
- Android 设备所有者应用:http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#isDeviceOwnerApp(java.lang.String)
- WifiManager API:http://developer.android.com/reference/android/net/wifi/WifiManager.html
- RTC 硬件编码要求:http://www.webmproject.org/hardware/rtc-coding-requirements/
- Settings.Secure LOCATION_MODE:http://developer.android.com/reference/android/provider/Settings.Secure.html#LOCATION_MODE
- 内容解析器:http://developer.android.com/reference/android/content/ContentResolver.html
- SettingInjectorService:http://developer.android.com/reference/android/location/SettingInjectorService.html
- 基于主机的卡模拟:http://developer.android.com/guide/topics/connectivity/nfc/hce.html
- 电话提供程序:http://developer.android.com/reference/android/provider/Telephony.html
以上很多资源都是直接或间接源自 Android SDK,并且与该 SDK 的文档中的信息作用相同。如果本兼容性定义或兼容性测试套件与 SDK 文档有任何不一致的情况,均以 SDK 文档为准。上面包含的参考资料内提供的所有技术详细信息都被视为本兼容性定义的一部分。
3. 软件
3.1. 受管理 API 兼容性
受管理(基于 Dalvik)执行环境是 Android 应用所需的主要容器。Android 应用编程接口 (API) 是一组 Android 平台接口,可供在受管理虚拟机环境中运行的应用使用。设备实现必须提供 Android SDK 所提供的所有已载述 API 的完整实现(包括所有已载述的行为)[资源 4]。
除非本兼容性定义文档中明确许可,否则设备实现不得省略任何受管理 API,不得更改 API 接口或签名,不得违背已载述的行为,也不得包含空操作。
本兼容性定义文档允许设备实现省略某些类型的硬件,但前提是 Android 包含适用于它们的 API。如果省略此类硬件,这些 API 仍必须存在并采取合理的行为方式。如需了解针对这种情况的具体要求,请参阅第 7 节。
3.2. 软 API 兼容性
除了第 3.1 节中的受管理 API 之外,Android 还包含一个非常重要的运行时专用“软”API,该 API 采用诸如以下形式:intent、权限,以及 Android 应用中在应用编译期间无法被强制执行的其他类似方面。
3.2.1. 权限
设备实现者必须支持并强制采用“权限”参考页面 [资源 5] 中载述的所有权限常量。请注意,第 9 节列出了与 Android 安全模型相关的其他要求。
3.2.2. build 参数
Android API 在 android.os.Build
类 [资源 6] 中包含一些用于描述当前设备的常量。为了在各种设备实现之间提供一致且有意义的值,下表中列出了针对这些值的格式的一些额外限制,设备实现必须遵从这些限制。
参数 | 注释 |
VERSION.RELEASE | 当前正在执行的 Android 系统的版本,采用人类可读懂的格式。此字段的值必须是 [资源 7] 中定义的字符串之一。 |
VERSION.SDK | 当前正在执行的 Android 系统的版本,采用第三方应用代码可访问的格式。对于 Android 4.4,此字段的值必须为整数 19。 |
VERSION.SDK_INT | 当前正在执行的 Android 系统的版本,采用第三方应用代码可访问的格式。对于 Android 4.4,此字段的值必须为整数 19。 |
VERSION.INCREMENTAL | 由设备实现者选择的值,用于指定当前正在执行的 Android 系统的具体 build,采用人类可读懂的格式。此值不得重复用于提供给最终用户的不同 build。此字段的一个典型用途是指明生成 build 所用的 build 号或源代码控制更改标识符。此字段不得为 null,也不得为空字符串 (""),除此之外,对此字段的具体格式没有任何其他要求。 |
BOARD | 由设备实现者选择的值,用于标识设备所使用的具体内部硬件,采用人类可读懂的格式。此字段的一个可能用途是指明设备主板的具体修订版本。
此字段的值必须可编码为 7 位 ASCII 值,并与正则表达式 "^[a-zA-Z0-9.,_-]+$" 匹配。 |
BRAND | 该值用于指明与设备关联的品牌名称,即最终用户所熟知的设备品牌名称。必须采用人类可读懂的格式,并且应表示设备的制造商或设备在营销时所冠的公司品牌。此字段的值必须可编码为 7 位 ASCII 值,并与正则表达式 "^[a-zA-Z0-9.,_-]+$" 匹配。
|
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)/$(DEVICE):$(VERSION.RELEASE)/$(ID)/$(VERSION.INCREMENTAL):$(TYPE)/$(TAGS) 例如: acme/myproduct/mydevice:4.4/KRT16/3359:userdebug/test-keys 指纹不得包含空白字符。如果上述模板中包含的其他字段内有空白字符,则在 build 指纹中必须将空白字符替换为其他字符,例如下划线 ("_") 字符。 此字段的值必须可编码为 7 位的 ASCII 值。 |
HARDWARE | 硬件的名称(来自内核命令行或 /proc)。应采用人类可读懂的格式。此字段的值必须可编码为 7 位 ASCII 值,并与正则表达式 "^[a-zA-Z0-9.,_-]+$" 匹配。 |
HOST | 该字符串用于独一无二地标识构建相应 build 时使用的主机,采用人类可读懂的格式。此字段不得为 null,也不得为空字符串 (""),除此之外,对此字段的具体格式没有任何其他要求。 |
ID | 由设备实现者选择的标识符,用于指代特定版本,采用人类可读懂的格式。此字段可与 android.os.Build.VERSION.INCREMENTAL 相同,但应是对最终用户来说有充分意义的值,以便他们区分各软件 build。此字段的值必须可编码为 7 位 ASCII 值,并与正则表达式 "^[a-zA-Z0-9.,_-]+$" 匹配。
|
MANUFACTURER | 产品的原始设备制造商 (OEM) 的商号。此字段不得为 null,也不得为空字符串 (""),除此之外,对此字段的具体格式没有任何其他要求。 |
MODEL | 由设备实现者选择的值,其中包含最终用户所熟知的设备名称。此名称应与设备在营销时以及出售给最终用户时使用的名称相同。此字段不得为 null,也不得为空字符串 (""),除此之外,对此字段的具体格式没有任何其他要求。 |
PRODUCT | 由设备实现者选择的值,其中包含具体产品 (SKU) 的开发名称或代号,在同一品牌中必须是唯一的。必须采用人类可读懂的格式,但不一定可供最终用户查看。此字段的值必须可编码为 7 位 ASCII 值,并与正则表达式 "^[a-zA-Z0-9.,_-]+$" 匹配。
|
SERIAL | 硬件序列号,必须提供。此字段的值必须可编码为 7 位 ASCII 值,并与正则表达式 "^([a-zA-Z0-9]{6,20})$" 匹配。 |
TAGS | 由设备实现者选择的一系列标记(用于进一步区分 build),各个标记之间以英文逗号分隔。例如“unsigned,debug”。此字段的值必须可编码为 7 位 ASCII 值,并与正则表达式 "^[a-zA-Z0-9.,_-]+$" 匹配。 |
TIME | 该值用于表示生成相应 build 时的时间戳。 |
TYPE | 由设备实现者选择的值,用于指定相应 build 的运行时配置。此字段的值应是与以下三种典型 Android 运行时配置对应的值之一:“user”“userdebug”或“eng”。此字段的值必须可编码为 7 位 ASCII 值,并与正则表达式 "^[a-zA-Z0-9.,_-]+$" 匹配。 |
USER | 生成相应 build 的用户(或自动用户)的名称或 ID。此字段不得为 null,也不得为空字符串 (""),除此之外,对此字段的具体格式没有任何其他要求。 |
3.2.3. intent 兼容性
设备实现必须支持 Android 的松散耦合 intent 系统,如下文所述。“支持”意味着设备实现者必须提供一个 Android activity 或 Service,用于为每个指定的 intent 模式指定匹配的 intent 过滤器,并为这些模式绑定并实现正确的行为。
3.2.3.1. 核心应用 intent
Android 上游项目定义了一些核心应用,例如通讯录、日历、图库、音乐播放器等。设备实现者可以将这些应用替换为替代版本。
不过,任何此类替代版本都必须支持上游项目提供的相同 intent 模式。例如,如果设备包含替代音乐播放器,它仍必须支持第三方应用发出的用于挑选歌曲的 intent 模式。
以下应用被视为核心 Android 系统应用:
- 桌面时钟
- 浏览器
- 日历
- 通讯录
- 图库
- GlobalSearch
- 启动器
- 音乐
- 设置
核心 Android 系统应用包含多种被视为“公开”组件的 activity 或 Service 组件。也就是说,属性“android:exported”可以不存在,也可以具有值“true”。
对于在一个核心 Android 系统应用中定义的每个 activity 或 Service,如果未通过将属性“android:exported”的值设为“false”来将该应用标记为“非公开”,则设备实现必须包含一个相同类型的组件,来实现与该核心 Android 系统应用相同的 intent 过滤器模式。
换言之,设备实现可以更换核心 Android 系统应用;不过,如果进行此类更换,设备实现必须支持由被更换的每个核心 Android 系统应用所定义的所有 intent 模式。
3.2.3.2. intent 替换
由于 Android 是一个可扩展的平台,因此设备实现必须允许将第 3.2.3.1 节中提到的每种 intent 模式替换为第三方应用。上游 Android 开源实现默认允许这么做;设备实现者不得为系统应用使用这些 intent 模式的情况附加特殊特权,也不得阻止第三方应用绑定到这些模式并取得对这些模式的控制权。具体而言,此项规定包括但不限于停用“选择器”界面(用户可通过该界面在多个均可处理相同 intent 模式的应用之间进行选择)。
不过,如果默认 activity 为数据 URI 提供更具体的过滤器,设备实现可以为特定 URI 模式(例如 http://play.google.com)提供默认 activity。例如,用于指定数据 URI“http://www.android.com”的 intent 过滤器比用于指定“http://”的浏览器过滤器更具体。设备实现必须提供一个界面来供用户修改 intent 的默认 activity。
3.2.3.3. intent 命名空间
设备实现不得包含任何符合以下条件的 Android 组件:支持任何使用 ACTION、使用 CATEGORY 或使用 android.* 或 com.android.* 命名空间中的其他键字符串的新 intent 模式或广播 intent 模式。设备实现者不得添加任何符合以下条件的 Android 组件:支持任何使用 ACTION、使用 CATEGORY 或使用属于其他组织的软件包空间中的其他键字符串的新 intent 模式或广播 intent 模式。设备实现者不得更改或扩展第 3.2.3.1 节列出的核心应用使用的任何 intent 模式。设备实现可以包含所用命名空间明显与其所属组织关联的 intent 模式。
此项规定类似于第 3.6 节中针对 Java 语言类的规定。
3.2.3.4. 广播 intent
第三方应用依赖平台广播某些 intent 来获悉硬件或软件环境中发生的变化。 与 Android 兼容的设备必须广播公共广播 intent 来响应相应的系统事件。如需关于广播 intent 的介绍,请参阅 SDK 文档。
3.2.3.5. 默认应用设置
Android 4.4 增加了允许用户选择默认主屏幕应用和短信应用的设置。设备实现必须为每种应用提供类似的用户设置菜单,并且这些菜单必须与 SDK 文档中所述的 intent 过滤器模式和 API 方法兼容 [资源 91]。
3.3. 原生 API 兼容性
3.3.1 应用二进制接口
在 Dalvik 中运行的受管理代码可以调用应用 .apk 文件中提供的原生代码,作为针对相应设备硬件架构编译的 ELF .so 文件。由于原生代码高度依赖于底层处理器技术,因此 Android 在 Android NDK 的文件 docs/CPU-ARCH-ABIS.html
中定义了一些应用二进制接口 (ABI)。如果设备实现与一个或多个已定义的 ABI 兼容,则应实现与 Android NDK 的兼容性,如下所述。
如果设备实现支持某个 Android ABI,则:
- 必须支持在受管理环境中运行的代码,以使用标准 Java 原生接口 (JNI) 语义调用原生代码
- 必须与以下列表中每个必需的库保持源代码兼容(即标头兼容)和二进制兼容(适用于 ABI)
- 必须通过
android.os.Build.CPU_ABI
和android.os.Build.CPU_ABI2
参数准确报告设备支持的原生应用二进制接口 (ABI)。 - 必须通过
android.os.Build.CPU_ABI2
仅报告最新版 Android NDK 的文件docs/CPU-ARCH-ABIS.html
中载述的 ABI - 必须通过
android.os.Build.CPU_ABI
仅报告下列其中一个 ABI - armeabi-v7a
- x86
- mips
- 应使用上游 Android 开源项目中的源代码和头文件进行构建
以下原生代码 API 必须可供包含原生代码的应用使用:
- libc(C 库)
- libm(数学库)
- 对 C++ 的最基本支持
- JNI 接口
- liblog(Android 日志记录)
- libz(Zlib 压缩)
- libdl(动态链接器)
- libGLESv1_CM.so (OpenGL ES 1.0)
- libGLESv2.so (OpenGL ES 2.0)
- libGLESv3.so (OpenGL ES 3.0)
- libEGL.so(原生 OpenGL surface 管理)
- libjnigraphics.so
- libOpenSLES.so(OpenSL ES 1.0.1 音频支持)
- libOpenMAXAL.so(OpenMAX AL 1.0.1 支持)
- libandroid.so(原生 Android activity 支持)
- 对 OpenGL 的支持(如下所述)
请注意,未来版本的 Android NDK 可能会支持更多 ABI。如果设备实现与现有的某个预定义 ABI 不兼容,则不得报告支持任何 ABI。
请注意,设备实现必须包含 libGLESv3.so,并且它必须通过符号链接指向 libGLESv2.so。在声明支持 OpenGL ES 3.0 的设备实现上,libGLESv2.so 除了要导出 OpenGL ES 2.0 函数符号之外,还必须导出 OpenGL ES 3.0 函数符号。
实现原生代码兼容性是一项颇具挑战性的任务。因此,应重申一下,强烈建议设备实现者使用上面列出的库的上游实现,以帮助确保兼容性。
3.4. Web 兼容性
3.4.1. WebView 兼容性
Android 开源实现使用 Chromium 项目中的代码来实现 android.webkit.WebView
[资源 10]。由于无法为 Web 呈现系统开发综合测试套件,因此设备实现者必须在 WebView 实现中使用 Chromium 的特定上游 build。具体而言:
- 设备
android.webkit.WebView
实现必须基于 Android 4.4 的上游 Android 开源项目中的 Chromium build。 该 build 包含一组针对 WebView 的特定功能和安全修复程序。[资源 83] - WebView 报告的用户代理字符串必须采用以下格式:
Mozilla/5.0 (Linux; Android $(VERSION); $(LOCALE); $(MODEL) Build/$(BUILD)) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 $(CHROMIUM_VER) Mobile Safari/537.36
- $(VERSION) 字符串的值必须与
android.os.Build.VERSION.RELEASE
的值相同。 - $(LOCALE) 字符串的值是可选值,应遵循国家/地区代码和语言的 ISO 规范,并且应引用设备当前配置的语言区域如果省略了该值,还必须要移除尾随分号。
- $(MODEL) 字符串的值必须与
android.os.Build.MODEL
的值相同。 - $(BUILD) 字符串的值必须与
android.os.Build.ID
的值相同。 - $(CHROMIUM_VER) 字符串的值必须是上游 Android 开源项目中的 Chromium 的版本。
- 设备实现可以在用户代理字符串中省略
Mobile
- $(VERSION) 字符串的值必须与
WebView 组件应支持尽可能多的 HTML5 功能 [资源 11]。
3.4.2. 浏览器兼容性
设备实现必须包含独立的浏览器应用,以供用户进行一般的 Web 浏览。独立的浏览器可以基于 WebKit 之外的浏览器技术。不过,即使使用的是替代浏览器应用,向第三方应用提供的 android.webkit.WebView
组件也必须基于 WebKit,如第 3.4.1 节中所述。
实现可以在独立的浏览器应用中附带自定义用户代理字符串。
独立的浏览器应用(无论是基于上游 WebKit 浏览器应用,还是基于第三方替代应用)应支持尽可能多的 HTML5 功能 [资源 11]。 至少,设备实现必须支持以下与 HTML5 关联的每个 API:
此外,设备实现必须支持 HTML5/W3C webstorage API [资源 15],并且应支持 HTML5/W3C IndexedDB API [资源 16]。请注意,随着 Web 开发标准制定机构逐渐转变为青睐 IndexedDB 胜过 webstorage,IndexedDB 预计会成为未来版本的 Android 中必需的组件。
3.5. API 行为兼容性
每种 API(受管理 API、软 API、原生 API 和 Web API)的行为都必须与上游 Android 开源项目 [资源 3] 的首选实现一致。兼容性的一些具体方面如下:
- 设备不得更改标准 intent 的行为或语义
- 设备不得更改特定类型的系统组件(例如 Service、activity、ContentProvider 等)的生命周期或生命周期语义
- 设备不得更改标准权限的语义
上述列表并不是详尽无遗的。兼容性测试套件 (CTS) 用于测试平台重要部分的行为兼容性,而不是测试整个平台的行为兼容性。实现者需负责确保与 Android 开源项目保持行为兼容。为此,设备实现者应尽可能使用通过 Android 开源项目获得的源代码,而不是重新实现系统的重要部分。
3.6. API 命名空间
Android 遵循 Java 编程语言定义的软件包和类命名空间惯例。为了确保与第三方应用兼容,设备实现者不得对以下软件包命名空间进行任何禁止执行的修改(见下文):
- java.*
- javax.*
- sun.*
- android.*
- com.android.*
禁止执行的修改包括:
- 设备实现不得通过更改任何方法或类签名或者通过移除类或类字段的方式,修改 Android 平台上公开提供的 API。
- 设备实现者可以修改 API 的底层实现,但此类修改不得影响任何公开提供的 API 的规定行为和 Java 语言签名。
- 设备实现者不得将任何公开提供的元素(例如类或接口,或者现有类或接口的字段或方法)添加到上述 API。
“公开提供的元素”是指不带“@hide”标记(上游 Android 源代码中会用到该标记)的任何构造。换言之,设备实现者不得在上述命名空间中提供新的 API 或更改现有的 API。设备实现者可以执行仅限于内部的修改,但不得向开发者通告或以其他方式公开这些修改。
设备实现者可以添加自定义 API,但任何此类 API 均不得位于归其他组织所有或指代其他组织的命名空间内。例如,设备实现者不得向 com.google.* 或类似命名空间添加 API;只有 Google 可以向此类命名空间添加 API。同样,Google 也不得向其他公司的命名空间添加 API。此外,如果设备实现包含标准 Android 命名空间之外的自定义 API,则必须将这些 API 打包到 Android 共享库中,以便只有明确使用它们的应用(通过 <uses-library>
机制)会受到此类 API 内存使用量增加的影响。
如果设备实现者提议改善上述某个软件包命名空间(例如向现有 API 添加实用的新功能,或添加新的 API),实现者应访问 source.android.com,并按照该网站上的信息开始贡献更改和代码。
请注意,上述限制对应于 Java 编程语言中命名 API 的标准惯例;本节只是为了强调这些惯例,并通过将其纳入本兼容性定义来使其具有约束力。
3.7. 虚拟机兼容性
设备实现必须支持完整的 Dalvik 可执行文件 (DEX) 字节码规范和 Dalvik 虚拟机语义 [资源 17]。
设备实现必须配置 Dalvik,以便根据上游 Android 平台来分配内存,如下表所示。(如需了解屏幕尺寸和屏幕密度的定义,请参阅第 7.1.1 节。)
请注意,下面指定的内存值被视为最小值,设备实现可以为每个应用分配更多内存。
屏幕尺寸 | 屏幕密度 | 应用内存 |
小 / 标准 / 大 | ldpi / mdpi | 16MB |
小 / 标准 / 大 | tvdpi / hdpi | 32MB |
小 / 标准 / 大 | xhdpi | 64MB |
小 / 标准 / 大 | 400dpi | 96MB |
小 / 标准 / 大 | xxhdpi | 128MB |
小 / 标准 / 大 | xxxhdpi | 256MB |
特大 | mdpi | 32MB |
特大 | tvdpi / hdpi | 64MB |
特大 | xhdpi | 128MB |
特大 | 400dpi | 192MB |
特大 | xxhdpi | 256MB |
特大 | xxxhdpi | 512MB |
3.8. 界面兼容性
3.8.1. 启动器(主屏幕)
Android 包含一个启动器应用(主屏幕),并且支持使用第三方应用替换设备启动器(主屏幕)。如果设备实现允许使用第三方应用替换设备主屏幕,则必须声明平台功能 android.software.home_screen
。
3.8.2. widget
Android 定义了一种组件类型以及对应的 API 和生命周期,以便应用向最终用户提供“AppWidget”[资源 18]。如果设备实现支持在主屏幕上嵌入 widget,则必须满足以下要求,并声明支持平台功能 android.software.app_widgets
。
- 设备启动器必须包含对 AppWidget 的内置支持,并提供用于直接在启动器中添加、配置、查看和移除 AppWidget 的界面功能。
- 设备实现必须能够呈现标准网格大小为 4 x 4 的 widget。 如需了解详细信息,请参阅 Android SDK 文档中的“应用 widget 设计准则”[资源 18]。
- 如果设备实现支持锁定屏幕,则必须支持锁定屏幕上的应用 widget。
3.8.3. 通知
Android 包含一些可供开发者向用户发送通知的 API,以便开发者使用设备的硬件和软件功能通知用户值得注意的事件 [资源 19]。
一些 API 允许应用使用硬件功能(具体来说是使用声音、振动和指示灯)来发出通知或吸引用户注意。设备实现必须尽可能使用设备实现硬件来支持使用硬件功能的通知(如 SDK 文档中所述)。例如,如果设备实现包含振动器,则必须正确实现振动 API。如果设备实现缺少硬件,则必须将对应的 API 实现为空操作。请注意,第 7 节中对此行为进行了进一步的详细说明。
此外,实现必须正确呈现 API [资源 20] 或状态栏/系统栏图标样式指南 [资源 21] 中提供的所有资源(图标、声音文件等)。 设备实现者可以针对通知提供替代用户体验,而不使用参考 Android 开源实现所提供的体验;不过,此类替代通知系统必须支持现有的通知资源(如上所述)。
Android 支持内容丰富的通知,例如用于提供持续通知的互动式视图。设备实现必须正确显示和执行内容丰富的通知(如 Android API 中所述)。
3.8.4. 搜索
Android 包含一些可让开发者在其应用中纳入搜索功能以及将其应用数据提供给全局系统搜索功能使用的 API [资源 22]。一般来说,此功能会包括一个系统级界面,以便用户输入查询、在用户输入内容时显示建议,以及显示搜索结果。这些 Android API 可让开发者重复使用此界面,以在其应用内提供搜索功能,还可让开发者向通用的全局搜索界面提供搜索结果。
设备实现必须包含单个共享的系统级搜索界面,并且该界面能够在用户输入内容时实时提供建议。 设备实现必须实现一些 API,以供开发者重复使用此界面,从而在其应用内提供搜索功能。设备实现必须实现一些 API,以便在搜索框以全局搜索模式运行时,可让第三方应用向搜索框中添加建议。如果没有安装任何可利用此功能的第三方应用,则默认行为应为显示 Web 搜索引擎的搜索结果和建议。
3.8.5. 消息框
应用可以使用“消息框”API(定义见 [资源 23])向最终用户显示简短的非模态字符串,这些字符串会在短暂显示后消失。设备实现必须以某种可见性非常高的方式向最终用户显示来自应用的消息框。
3.8.6. 主题
Android 提供“主题”这一机制,以供应用在整个 activity 或应用中应用样式。
Android 包含一个“Holo”主题系列(一组定义的样式),如果应用开发者想要与 Android SDK 定义的 Holo 主题外观和风格保持一致,则可以使用它们 [资源 24]。设备实现不得更改提供给应用的任何 Holo 主题属性 [资源 25]。
Android 还包含一个“Device Default”主题系列(一组定义的样式),如果应用开发者想要与设备实现者定义的设备主题外观和风格保持一致,则可以使用它们。设备实现可以修改提供给应用的 DeviceDefault 主题属性 [资源 25]。
从 4.4 版开始,Android 支持带有半透明系统栏的新变体主题,该主题允许应用开发者将其应用内容填充到状态栏和导航栏后面的区域。为了在采用此配置时实现一致的开发者体验,请务必在不同的设备实现之间保持一致的状态栏图标样式。因此,Android 设备实现必须针对系统状态图标(例如信号强度和电池电量)以及系统发出的通知使用白色,除非相应图标表示有问题状态 [资源 25]。
3.8.7. 动态壁纸
Android 定义了一种组件以及对应的 API 和生命周期,以便应用向最终用户提供一个或多个“动态壁纸”[资源 26]。动态壁纸是具备有限输入功能且作为壁纸显示在其他应用之后的动画、图案或类似图片。
如果硬件能够在不限制功能且不会对其他应用造成负面影响的情况下,以合理的帧速率运行所有动态壁纸,则会被视为能够可靠地运行动态壁纸。如果硬件中的限制会导致壁纸和/或应用崩溃、无法正常运行、占用过多 CPU/消耗过多电池电量,或者运行时的帧速率低得令人无法接受,相应硬件会被视为无法运行动态壁纸。例如,有些动态壁纸可能会利用 Open GL 1.0 或 2.0 上下文来呈现其内容。动态壁纸将无法在不支持多个 OpenGL 上下文的硬件上可靠地运行,因为使用 OpenGL 上下文的动态壁纸可能会与其他同样使用 OpenGL 上下文的应用发生冲突。
如果设备实现能够可靠地运行动态壁纸(如上所述),则应实现动态壁纸。如果设备实现被判定为无法可靠地运行动态壁纸(如上所述),则不得实现动态壁纸。
3.8.8. 最近使用的应用的显示
上游 Android 源代码包含一个界面,以便使用缩略图(对应于用户上次离开应用时应用的图形状态)来显示用户最近使用的应用。设备实现可以更改或消除此界面;不过,我们计划在未来版本的 Android 中更广泛地利用此功能。强烈建议设备实现使用上游 Android 界面(或类似的基于缩略图的界面)来显示用户最近使用的应用,否则可能会与未来版本的 Android 不兼容。
3.8.9. 输入管理
Android 支持输入管理功能,并且支持第三方输入法。
如果设备实现允许用户在设备上使用第三方输入法,则必须声明平台功能 android.software.input_methods
,并支持 IME API(具体定义请参见 Android SDK 文档)。
如果设备实现声明了 android.software.input_methods
功能,则必须提供一种可供用户使用的机制,以便用户添加和配置第三方输入法。设备实现必须显示设置界面以响应 android.settings.INPUT_METHOD_SETTINGS
intent。
3.8.10. 锁定屏幕媒体遥控器
Android 支持 Remote Control API,媒体应用可利用该 API 与远程视图(例如设备锁定屏幕)中显示的播放控件相集成 [资源 74]。如果设备实现支持设备中的锁定屏幕,并且允许用户在主屏幕上添加 widget,则必须支持在设备锁定屏幕 [资源 69] 中嵌入遥控器。
3.8.11. Dreams
Android 支持称为 Dream [资源 76] 的互动式屏保。 有了 Dreams,用户能够在充电的设备处于空闲状态或插入桌面基座时与应用互动。设备实现必须支持 Dreams,并为用户提供用于配置 Dreams 的设置选项。
3.8.12. 位置信息
必须在“设置”部分的“位置信息”菜单中显示位置信息模式 [资源 87]。通过 Android 4.4 中引入的 SettingInjectorService
提供的位置信息服务必须显示在同一个“位置信息”菜单中 [资源 89]。
3.8.13. Unicode
Android 4.4 支持彩色表情符号。Android 设备实现必须为用户提供用于输入 Unicode 6.1 [资源 82] 中定义的表情符号的输入法,并且必须能够以彩色字形呈现这些表情符号。
3.9. 设备管理
Android 包含可让注重安全的应用在系统级执行设备管理功能的功能,例如通过 Android Device Administration API [资源 27] 强制执行密码政策或执行远程清除。设备实现必须提供 DevicePolicyManager
类的实现 [资源 28]。如果设备实现支持锁定屏幕,则必须支持 Android SDK 文档中定义的所有设备管理政策 [资源 27]。
设备实现可以具有用于执行设备管理功能的预安装应用,但不得将此应用开箱设置为默认设备所有者应用 [资源 84]。
3.10. 无障碍功能
Android 提供了一个无障碍服务层,以便残障用户更轻松地在设备上进行导航。此外,Android 还提供了一些平台 API,以便无障碍服务实现能够接收针对用户和系统事件的回调并生成替代反馈机制,例如文字转语音、触感反馈,以及轨迹球/方向键导航 [资源 29]。设备实现必须提供与默认 Android 实现一致的 Android 无障碍功能框架实现。具体而言,设备实现必须满足以下要求。
- 设备实现必须通过
android.accessibilityservice
API [资源 30] 支持第三方无障碍服务实现。 - 设备实现必须生成
AccessibilityEvents
,并以与默认 Android 实现一致的方式将这些事件传送至所有已注册的AccessibilityService
实现。 - 设备实现必须提供一种可供用户使用的机制,以便用户启用和停用无障碍服务;并且必须显示此界面以响应
android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS
intent。
此外,设备实现还应在设备上提供无障碍服务实现,并且应提供一种可让用户在设备设置期间启用无障碍服务的机制。Eyes Free 项目 [资源 31] 提供了无障碍服务的开源实现。
3.11. 文字转语音
Android 包含一些可让应用使用文字转语音 (TTS) 服务的 API,并允许服务提供商提供 TTS 服务实现 [资源 32]。 设备实现必须满足以下与 Android TTS 框架相关的要求:
- 设备实现必须支持 Android TTS 框架 API,并且应包含支持设备上可用语言的 TTS 引擎。请注意,上游 Android 开源软件包含功能完善的 TTS 引擎实现。
- 设备实现必须支持安装第三方 TTS 引擎。
- 设备实现必须提供一个可供用户使用的界面,以便用户选择在系统级使用的 TTS 引擎。
4. 应用打包兼容性
设备实现必须安装并运行官方 Android SDK 中包含的“aapt”工具生成的 Android“.apk”文件 [资源 33]。
设备实现不得通过会导致相应文件无法在其他兼容设备上正确安装和运行的方式,扩展 .apk [资源 34]、Android 清单 [资源 35]、Dalvik 字节码 [资源 17] 或 renderscript 字节码格式。设备实现者应使用 Dalvik 的参考上游实现,以及该参考实现的软件包管理系统。
5. 多媒体兼容性
设备实现必须包含至少一种音频输出形式,例如扬声器、耳机插孔、外部扬声器连接等。
5.1. 媒体编解码器
设备实现必须支持 Android SDK 文档中指定的核心媒体格式 [资源 58],但本文档中明确允许的情况除外。具体而言,设备实现必须支持下表中定义的媒体格式、编码器、解码器、文件类型和容器格式。在 Android 开源项目的首选 Android 实现中,所有这些编解码器都是作为软件实现提供的。
请注意,Google 和开放手机联盟 (Open Handset Alliance) 均未做过任何关于这些编解码器中没有使用第三方专利的声明。 打算在硬件或软件产品中使用此源代码的用户请注意,实现此代码(包括在开源软件或共享软件中实现此代码)可能需要获得相关专利持有者的专利许可。
请注意,这些表中并未列出大多数视频编解码器的具体比特率要求,因为当前的设备硬件不一定支持相关标准指定的必须达到的比特率。设备实现应支持硬件上可行的最高比特率,但不超过规范规定的上限。
类型 | 格式 / 编解码器 | 编码器 | 解码器 | 详细信息 | 文件类型 / 容器格式 |
---|---|---|---|---|---|
音频 | MPEG-4 AAC Profile (AAC LC) | 对于包含麦克风硬件并定义了 android.hardware.microphone 的设备实现而言,是必需的。 |
必需 | 支持单声道/立体声/5.0/5.1* 内容,标准采样率为 8-48 kHz。 |
|
MPEG-4 HE AAC 配置文件 (AAC+) | 对于包含麦克风硬件并定义了 android.hardware.microphone 的设备实现而言,是必需的 | 必需 | 支持单声道/立体声/5.0/5.1* 内容,标准采样率为 16-48 kHz。 | ||
MPEG-4 HE AAC v2 配置文件(增强型 AAC+) | 必需 | 支持单声道/立体声/5.0/5.1* 内容,标准采样率为 16-48 kHz。 | |||
MPEG-4 音频对象类型 ER AAC ELD(增强型低延迟 AAC) | 对于包含麦克风硬件并定义了 android.hardware.microphone 的设备实现而言,是必需的 | 必需 | 支持单声道/立体声内容,标准采样率为 16-48 kHz。 | ||
AMR-NB | 对于包含麦克风硬件并定义了 android.hardware.microphone 的设备实现而言,是必需的。 |
必需 | 4.75-12.2 kbps,采样率为 8 kHz | 3GPP (.3gp) | |
AMR-WB | 对于包含麦克风硬件并定义了 android.hardware.microphone 的设备实现而言,是必需的。 |
必需 | 有 9 个比特率(介于 6.60-23.85 kbit/s 之间)可供选择,采样率为 16 kHz | 3GPP (.3gp) | |
FLAC | 必需 (Android 3.1+) |
单声道/立体声(非多声道)。采样率最高可达 48 kHz(但对于输出为 44.1 kHz 的设备,建议最高不超过 44.1 kHz,因为 48-44.1 kHz 的降采样器不包含低通滤波器)。建议使用 16 位;对于 24 位,不会应用任何抖动。 | 仅支持 FLAC (.flac) | ||
MP3 | 必需 | 单声道/立体声 8-320 Kbps 恒定 (CBR) 或可变比特率 (VBR) | MP3 (.mp3) | ||
MIDI | 必需 | MIDI 类型 0 和 1。DLS 版本 1 和 2。XMF 和 Mobile XMF。支持铃声格式 RTTTL/RTX、OTA 和 iMelody |
|
||
Vorbis | 必需 |
|
|||
PCM/WAVE | 必需 | 必需 | 8 位和 16 位线性 PCM**(比特率最高可达到硬件允许的上限)。设备必须支持频率为 8000、16000 和 44100 Hz 的原始 PCM 录制采样率 | WAVE (.wav) | |
图片 | JPEG | 必需 | 必需 | 基准式 + 渐进式 | JPEG (.jpg) |
GIF | 必需 | GIF (.gif) | |||
PNG | 必需 | 必需 | PNG (.png) | ||
BMP | 必需 | BMP (.bmp) | |||
WEBP | 必需 | 必需 | WebP (.webp) | ||
视频 | H.263 | 对于包含摄像头硬件并定义了 android.hardware.camera 或 android.hardware.camera.front 的设备实现而言,是必需的。 |
必需 |
|
|
H.264 AVC | 对于包含摄像头硬件并定义了 android.hardware.camera 或 android.hardware.camera.front 的设备实现而言,是必需的。 |
必需 | 基准配置文件 (BP) |
|
|
MPEG-4 SP | 必需 | 3GPP (.3gp) | |||
VP8**** | 必需 (Android 4.3+) |
必需 (Android 2.3.3+) |
WebM (.webm) 和 Matroska(.mkv,Android 4.0+)*** | ||
VP9 | 必需 (Android 4.4+) |
WebM (.webm) 和 Matroska(.mkv,Android 4.0+)*** |
- *注意:仅 5.0/5.1 内容的缩混是必需的;录制或呈现 2 个以上的声道是非强制性的。
- **注意:执行 16 位线性 PCM 捕获是强制性要求。执行 8 位线性 PCM 捕获不是强制性要求。
- ***注意:设备实现应支持写入 Matroska WebM 文件。
- ****注意:为了使网络视频串流和视频会议服务的质量达到可接受的水平,设备实现应使用满足 [资源 86] 中的要求的硬件 VP8 编解码器。
5.2. 视频编码
如果 Android 设备实现包含后置摄像头并声明了 android.hardware.camera
,则应支持以下 H.264 视频编码配置。
标清(低画质) | 标清(高画质) | 高清(如果硬件支持) | |
---|---|---|---|
视频分辨率 | 176 x 144 像素 | 480 x 360 像素 | 1280 x 720 像素 |
视频帧速率 | 12 fps | 30 fps | 30 fps |
视频比特率 | 56 Kbps | 500 Kbps 或更高 | 2 Mbps 或更高 |
音频编解码器 | AAC-LC | AAC-LC | AAC-LC |
声道 | 1(单声道) | 2(立体声) | 2(立体声) |
音频比特率 | 24 Kbps | 128 Kbps | 192 Kbps |
如果 Android 设备实现包含后置摄像头并声明了 android.hardware.camera
,则应支持以下 VP8 视频编码配置文件
标清(低画质) | 标清(高画质) | 高清 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.3. 视频解码
Android 设备实现应支持以下 VP8、VP9 和 H.264 视频解码配置。对于 VP8、VP9 和 H.264 编解码器,设备实现还应支持在同一视频串流内进行动态视频分辨率切换。
标清(低画质) | 标清(高画质) | 高清 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 | 8 Mbps | 20 Mbps |
5.4. 录音
如果应用已使用 android.media.AudioRecord
API 开始录制音频串流,包含麦克风硬件并声明了 android.hardware.microphone
的设备实现必须对以下每种行为分别进行音频采样并录音:
- 设备应表现出大致平坦的幅频特性:具体来说就是 ±3 dB,100-4000 Hz
- 应对音频输入敏感度进行相应设置,以确保频率为 1000 Hz 的 90 dB 声压级 (SPL) 音源会产生 RMS 为 2500 的 16 位样本。
- 如果麦克风上的 SPL 为 90 dB,PCM 振幅级应能够线性跟踪输入 SPL 在至少 30 dB(-18 dB 到 +12 dB)范围内的变化。
- 如果输入的声音为 90 dB SPL,当频率为 1 kHz 时,总谐波畸变率应低于 1%。
除了上述录制规范外,当应用已经开始使用 android.media.MediaRecorder.AudioSource.VOICE_RECOGNITION
音频来源录制音频串流时:
- 必须停用降噪处理(如果有)。
- 必须停用自动增益控制(如果有)。
从 Android 4.4 开始,android.media.MediaRecorder.AudioSource
类中新增了一个音频源:REMOTE_SUBMIX
。设备必须正确实现 REMOTE_SUBMIX
音频源,以便应用使用 android.media.AudioRecord
API 录制来自此音频源的音频串流时,可以捕获除以下内容之外的所有音频串流的混音:
STREAM_RING
STREAM_ALARM
STREAM_NOTIFICATION
请注意:虽然从 Android 4.3 开始,上文中所述的一些要求规定为“应”满足的要求,但我们计划在针对未来版本的兼容性定义中将其改为“必须”满足的要求。换言之,这些要求在 Android 4.4 中是非强制性要求,但在未来版本中将成为必须满足的要求。强烈建议搭载 Android 的现有设备和新设备满足这些要求,否则在升级到未来版本时,这些设备将无法与 Android 兼容。
如果平台支持针对语音识别进行调整的噪音抑制技术,则必须能通过 android.media.audiofx.NoiseSuppressor
API 来控制效果。此外,噪声抑制器效果描述符的“uuid”字段必须独一无二地标识噪声抑制技术的每个实现。
5.5. 音频延迟
音频延迟是指音频信号通过系统时的时间延迟。 许多类别的应用都依赖于非常短的延迟来实现实时音效。
在本节中:
- “输出延迟”是指,从应用写入经过 PCM 编码的数据对应的帧到外部监听器听到或变频器监测到相应声音之间的时间间隔
- “冷输出延迟”是指,在收到相应请求之前音频输出系统处于空闲状态且已关闭时,第一帧的输出延迟
- “连续输出延迟”是指,在设备已经开始播放音频时,后续帧的输出延迟
- “输入延迟”是指,从外部声音传入设备到应用读取经过 PCM 编码的数据对应的帧之间的时间间隔
- “冷输入延迟”是指,在收到相应请求之前音频输入系统处于空闲状态且已关闭时,丢失输入的时长与第一帧的输入延迟之和
- “连续输入延迟”是指,在设备已经开始捕获音频时,后续帧的输入延迟
- “OpenSL ES PCM 缓冲区队列 API”是 Android NDK 中的一组与 PCM 相关的 OpenSL ES API;请参阅 NDK_root
/docs/opensles/index.html
根据第 5 节中的规定,所有兼容的设备实现都必须包含至少一种音频输出形式。 设备实现应满足或超出以下输出延迟要求:
- 冷输出延迟不超过 100 毫秒
- 连续输出延迟不超过 45 毫秒
如果在使用 OpenSL ES PCM 缓冲区队列 API 进行任何初始校准后,设备实现满足本节中的要求,则对于至少一个受支持音频输出设备的连续输出延迟和冷输出延迟,可以报告支持低延迟音频,具体方法是通过 android.content.pm.PackageManager
类报告“android.hardware.audio.low-latency”功能。[资源 37] 反之,如果设备实现不满足这些要求,则不得报告支持低延迟音频。
根据第 7.2.5 节中的规定,设备实现可以省略麦克风硬件。
如果设备实现包含麦克风硬件并声明了 android.hardware.microphone
,则应满足以下输入音频延迟要求:
- 冷输入延迟不超过 100 毫秒
- 连续输入延迟不超过 50 毫秒
5.6. 网络协议
设备必须支持 Android SDK 文档中指定的适用于音频和视频播放的媒体网络协议 [资源 58]。具体而言,设备必须支持以下媒体网络协议:
- RTSP(RTP、SDP)
- HTTP(S) 顺序流式传输
- HTTP(S) Live Streaming 草案协议(第 3 版)[资源 59]
6. 开发者工具和选项兼容性
6.1. 开发者工具
设备实现必须支持 Android SDK 中提供的 Android 开发者工具。具体而言,与 Android 兼容的设备必须与以下各项兼容:
- Android 调试桥(简称 adb)[资源 33]
设备实现必须支持 Android SDK 中载述的所有adb
函数。设备端adb
守护程序必须默认处于停用状态,并且必须有一种可供用户使用的机制,以便用户开启 Android 调试桥。 - Android 支持安全 adb。安全 adb 能够在经过身份验证的已知主机上启用 adb。 设备实现必须支持安全 adb。
- Dalvik 调试监控服务(简称 ddms)[资源 33]
设备实现必须支持 Android SDK 中载述的所有ddms
功能。由于ddms
使用adb
,因此对ddms
的支持应默认处于停用状态,但只要用户如上所述启用了 Android 调试桥,设备实现就必须提供这种支持。 - Monkey [资源 36]
设备实现必须包含 Monkey 框架,并使其可供应用使用。 - SysTrace [资源 33]
设备实现必须支持 Android SDK 中载述的 Systrace 工具。Systrace 必须默认处于停用状态,并且设备实现必须有一种可供用户使用的机制,以便用户开启 Systrace。
大多数基于 Linux 的系统和 Apple Macintosh 系统都使用标准的 Android SDK 工具识别 Android 设备,而无需其他支持;不过,Microsoft Windows 系统通常需要驱动程序,才能识别新的 Android 设备。(例如,新的供应商 ID 需要适用于 Windows 系统的自定义 USB 驱动程序,有时新的设备 ID 也需要此类驱动程序。)如果标准 Android SDK 中提供的 adb
工具无法识别某个设备实现,设备实现者必须提供相关的 Windows 驱动程序,以便开发者使用 adb
协议连接到设备。对于 32 位和 64 位版本的 Windows XP、Windows Vista、Windows 7 和 Windows 8,必须提供这些驱动程序。
6.2. 开发者选项
Android 支持开发者配置与应用开发相关的设置。 设备实现必须遵从 android.settings.APPLICATION_DEVELOPMENT_SETTINGS intent,以显示与应用开发相关的设置 [资源 77]。上游 Android 实现会默认隐藏“开发者选项”菜单,并允许用户调出该菜单(方法是在“设置”>“关于设备”>“build 号”菜单项上连按七 [7] 次)。设备实现必须提供一致的开发者选项体验。具体而言,设备实现必须默认隐藏开发者选项,而且必须提供一种机制来启用与上游 Android 实现一致的开发者选项。
6.2.1. 实验性功能
Android 4.4 引入了 ART,这是一种实验性 Android 运行时,用户可以在“开发者选项”菜单中启动该 ART 以进行预览。设备实现应包含 ART (libart.so) 并支持从“开发者选项”菜单进行双重启动,但必须将 Dalvik (libdvm.so) 保留为默认运行时。
7. 硬件兼容性
如果设备包含特定的硬件组件,而该组件具有针对第三方开发者的相应 API,则该设备实现必须实现该 API(如 Android SDK 文档中所述)。如果 SDK 中的某个 API 需要与某个被规定为可选组件的硬件组件交互,但设备实现不具备该组件,则:
- 仍必须提供该组件的 API 的完整类定义(如 SDK 所述)
- 该 API 的行为必须以某种合理的方式实现为空操作
- 在 SDK 文档允许的情况下,API 方法必须返回 null 值
- 在 SDK 文档不允许返回 null 值的情况下,API 方法必须返回类的空操作实现
- API 方法不得抛出 SDK 文档中未载述的异常
这些要求的一个典型适用情况示例就是电话 API:即使在非手机设备上,这些 API 也必须实现为合理的空操作。
设备实现必须通过 android.content.pm.PackageManager
类中的 getSystemAvailableFeatures()
和 hasSystemFeature(String)
方法准确报告硬件配置信息。[资源 37]
7.1. 显示和图形
Android 包含一些能够适当地为设备自动调整应用资源和界面布局的方式,以确保第三方应用能够在各种硬件配置上良好地运行 [资源 38]。设备必须正确实现本节中详细说明的这些 API 和行为。
本节中的要求提到的单位定义如下:
- “物理对角线尺寸”是指,屏幕亮显部分的两个对角之间的距离(以英寸为单位)。
- “dpi”(即“每英寸的点数”)是指,1 英寸的线性水平或垂直跨度内包含的像素数。如果列出了 dpi 值,则水平 dpi 和垂直 dpi 都必须在该范围内。
- “宽高比”是指,屏幕的长度与宽度之比。例如,480x854 像素的显示屏的宽高比是 854 / 480 = 1.779,或约为“16:9”。
- “密度无关像素”(简称“dp”)是指,按 160 dpi 屏幕标准化的虚拟像素单位,计算公式为:
pixels = dps * (density / 160)
。
7.1.1. 屏幕配置
屏幕尺寸
Android 界面框架支持多种不同的屏幕尺寸,并且允许应用通过 android.content.res.Configuration.screenLayout
使用 SCREENLAYOUT_SIZE_MASK
查询设备屏幕尺寸(也称为“屏幕布局”)。设备实现必须报告 Android SDK 文档中定义且由上游 Android 平台确定的正确屏幕尺寸 [资源 38]。具体而言,设备实现必须根据以下密度无关逻辑像素 (dp) 屏幕尺寸报告正确的屏幕尺寸。
- 设备的屏幕尺寸必须至少为 426 dp x 320 dp(“小”)
- 如果设备报告的屏幕尺寸为“标准”,则屏幕尺寸必须至少为 480 dp x 320 dp
- 如果设备报告的屏幕尺寸为“大”,则屏幕尺寸必须至少为 640 dp x 480 dp
- 如果设备报告的屏幕尺寸为“特大”,则屏幕尺寸必须至少为 960 dp x 720 dp
此外,设备屏幕的物理对角线尺寸必须至少为 2.5 英寸。
在任何时间,设备都不得更改其报告的屏幕尺寸。
应用可以视需要通过 AndroidManifest.xml 文件中的 <supports-screens>
属性,指明所支持的屏幕尺寸。设备实现必须正确执行应用对于“小”“标准”“大”和“特大”屏幕的指定支持(如 Android SDK 文档中所述)。
屏幕宽高比
宽高比的值必须介于 1.3333 (4:3) 到 1.86(约为 16:9)之间
屏幕密度
Android 界面框架定义了一组标准逻辑密度,以便应用开发者确定要采用的应用资源。设备实现必须通过 android.util.DisplayMetrics
API 报告以下某个逻辑 Android 框架密度,并且必须以该标准密度执行应用。
- 120 dpi,称为“ldpi”
- 160 dpi,称为“mdpi”
- 213 dpi,称为“tvdpi”
- 240 dpi,称为“hdpi”
- 320 dpi,称为“xhdpi”
- 400 dpi,称为“400dpi”
- 480 dpi,称为“xxhdpi”
- 640 dpi,称为“xxxhdpi”
7.1.2. 显示指标
设备实现必须为 android.util.DisplayMetrics
[资源 39] 中定义的所有显示指标报告正确的值。
7.1.3. 屏幕方向
设备必须支持按应用动态设置屏幕方向(竖屏或横屏)。也就是说,如果应用请求使用特定屏幕方向,设备必须遵从该请求。设备实现可以选择纵向或横向作为默认方向。
无论何时通过 android.content.res.Configuration.orientation、android.view.Display.getOrientation() 或其他 API 查询设备当前方向,设备都必须报告正确的值。
更改方向时,设备不得更改报告的屏幕尺寸或密度。
设备必须报告支持的屏幕方向(android.hardware.screen.portrait
和/或 android.hardware.screen.landscape
),并且必须报告至少一个支持的方向。例如,屏幕固定为横向的设备(例如电视或笔记本电脑)必须仅报告 android.hardware.screen.landscape
。
7.1.4. 2D 和 3D 图形加速
设备实现必须同时支持 OpenGL ES 1.0 和 2.0,Android SDK 文档中对此进行了详细阐述。设备实现应在能够支持 OpenGL ES 3.0 的设备上支持 OpenGL ES 3.0。 设备实现还必须支持 Android RenderScript(Android SDK 文档对此进行了详细说明)[资源 8]。
设备实现还必须将自身正确地标识为支持 OpenGL ES 1.0、OpenGL ES 2.0 或 OpenGL ES 3.0。即:
- 受管理 API(例如通过
GLES10.getString()
方法)必须报告支持 OpenGL ES 1.0 和 OpenGL ES 2.0 - 原生 C/C++ OpenGL API(即通过 libGLES_v1CM.so、libGLES_v2.so 或 libEGL.so 向应用提供的 API)必须报告支持 OpenGL ES 1.0 和 OpenGL ES 2.0。
- 如果设备实现声明支持 OpenGL ES 3.0,则必须支持 OpenGL ES 3.0 受管理 API,并且支持原生 C/C++ API。在声明支持 OpenGL ES 3.0 的设备实现上,libGLESv2.so 除了要导出 OpenGL ES 2.0 函数符号之外,还必须导出 OpenGL ES 3.0 函数符号。
设备实现可以实现任何所需的 OpenGL ES 扩展。 不过,设备实现必须通过 OpenGL ES 受管理 API 和原生 API 报告所支持的所有扩展字符串;反之而言,不得报告不支持的扩展字符串。
请注意,Android 支持应用视需要指定它们需要使用特定 OpenGL 纹理压缩格式。这些格式通常为供应商专用格式。Android 不要求设备实现必须实现任何特定纹理压缩格式。不过,设备实现应通过 OpenGL API 中的 getString()
方法准确报告所支持的所有纹理压缩格式。
Android 包含一种机制,可让应用通过使用清单标记 android:hardwareAccelerated
或通过直接调用 API 的方式,声明应用希望在应用、activity、窗口或视图级别为 2D 图形启用硬件加速 [资源 9]。
在 Android 4.4 中,设备实现必须默认启用硬件加速;如果开发者通过设置 android:hardwareAccelerated="false"
请求停用硬件加速,或直接通过 Android View API 停用硬件加速,则设备实现必须停用硬件加速。
此外,设备实现表现出的行为必须与 Android SDK 文档中关于硬件加速的说明一致 [资源 9]。
Android 包含一个 TextureView
对象,以便开发者直接将经过硬件加速的 OpenGL ES 纹理作为呈现目标集成到界面层次结构中。设备实现必须支持 TextureView
API,并且表现出的行为必须与上游 Android 实现一致。
Android 支持 EGL_ANDROID_RECORDABLE
,这是一项 EGLConfig 属性,用于指明 EGLConfig 是否支持呈现到可将图像录制到视频的 ANativeWindow。
设备实现必须支持 EGL_ANDROID_RECORDABLE
扩展 [资源 79]。
7.1.5. 旧应用兼容模式
Android 指定了一种“兼容模式”,在该模式下,框架能够以与“标准”屏幕尺寸等效的模式(宽度为 320dp)运行,这是为了服务于不是针对旧版 Android(在实现屏幕尺寸独立性之前发布的旧版 Android)开发的旧应用。设备实现必须支持上游 Android 开放源代码所实现的旧应用兼容模式。也就是说,设备实现不得更改启用兼容模式的触发条件或阈值,也不得更改兼容模式本身的行为。
7.1.6. 屏幕类型
设备实现屏幕分为两种类型:
- 固定像素显示屏实现:屏幕是仅支持单个像素宽度和高度的单个面板。通常情况下,屏幕会以物理方式与设备集成。例如:手机、平板电脑等。
- 可变像素显示屏实现:设备实现没有嵌入式屏幕且包含视频输出端口(例如用于连接显示屏的 VGA、HDMI 或无线端口),或者具有可以更改像素尺寸的嵌入式屏幕。例如:电视、机顶盒等。
固定像素设备实现
固定像素设备实现可以使用任何像素尺寸的屏幕,但前提是它们满足本兼容性定义文档中规定的要求。
固定像素实现可以包含视频输出端口,以便与外接显示屏搭配使用。不过,只要该显示屏会用于运行应用,设备必须满足以下要求:
- 设备必须报告与固定像素显示屏相同的屏幕配置和显示指标(第 7.1.1 节和第 7.1.2 节对此进行了详细说明)。
- 设备报告的逻辑密度必须与固定像素显示屏的逻辑密度相同。
- 设备报告的屏幕尺寸必须与固定像素显示屏的屏幕尺寸相同或非常接近。
例如,对角线尺寸为 7 英寸且分辨率为 1024x600 像素的平板电脑会被视为采用固定像素的大型 mdpi 显示屏实现。如果设备实现包含以 720p 或 1080p 显示的视频输出端口,则必须扩展输出,以便仅在较大的 mdpi 窗口中执行应用,而不考虑使用的是固定像素显示屏还是视频输出端口。
可变像素设备实现
可变像素设备实现必须至少支持以下之一:1280x720、1920x1080 或 3840x2160(即 720p、1080p 或 4K)。具有可变像素显示屏的设备实现不得支持任何其他屏幕配置或模式。具有可变像素屏幕的设备实现可以在运行时或启动时更改屏幕配置或模式。例如,机顶盒用户可以将 720p 显示屏更换成 1080p 显示屏,并且设备实现可以相应地进行调整。
此外,可变像素设备实现必须针对这些像素尺寸报告以下配置分组:
- 1280x720(也称为 720p):“大”屏幕尺寸,“tvdpi”(213 dpi)密度
- 1920x1080(也称为 1080p):“大”屏幕尺寸,“xhdpi”(320 dpi)密度
- 3840x2160(也称为 4K):“大”屏幕尺寸、“xxxhdpi”(640 dpi) 密度
为清楚起见,特此说明:具有可变像素尺寸的设备实现在 Android 4.4 中仅限采用 720p、1080p 或 4K,并且必须配置为报告上述屏幕尺寸和密度分组。
7.1.7. 屏幕技术
Android 平台包含一些可让应用在显示屏上呈现丰富图形的 API。除非本文档中明确许可,否则设备必须支持所有这些 API(具体定义请参见 Android SDK)。具体而言:
- 设备必须支持能够呈现 16 位彩色图形的显示屏,并且应支持能够呈现 24 位彩色图形的显示屏。
- 设备必须支持能够呈现动画的显示屏。
- 所用显示技术的像素宽高比 (PAR) 必须介于 0.9 到 1.1 之间。也就是说,像素宽高比必须接近方形 (1.0),并且公差在 10% 的范围内。
7.1.8. 外接显示屏
Android 支持用于实现媒体共享功能的辅助显示屏,以及用于访问外接显示屏的开发者 API。如果设备通过有线、无线或嵌入式附加显示屏连接方式支持外接显示屏,设备实现必须按照 Android SDK 文档中所述实现显示屏管理器 API [资源 75]。
如果设备实现支持安全视频输出且能够支持安全 surface,则必须声明支持 Display.FLAG_SECURE
。具体而言,如果设备实现声明支持 Display.FLAG_SECURE
,则必须支持 HDCP 2.x 或更高版本(对于 Miracast 无线显示屏)或 HDCP 1.2 或更高版本(对于有线显示屏)。上游 Android 开源实现支持满足此要求的无线 (Miracast) 显示屏和有线 (HDMI) 显示屏。
7.2. 输入设备
7.2.1. 键盘
设备实现:
- 必须支持输入管理框架(可让第三方开发者创建输入管理引擎,即软键盘),http://developer.android.com 中对此进行了详细说明
- 必须提供至少一个软键盘实现(无论是否存在硬键盘)
- 可以包含额外的软键盘实现
- 可以包含硬件键盘
- 不得包含与
android.content.res.Configuration.keyboard
[资源 40] 中指定的任何格式(即,QWERTY 或 12 键)都不匹配的硬件键盘
7.2.2. 非触摸导航
设备实现:
- 可以省略非触摸导航选项(即可以省略轨迹球、方向键或滚轮)
- 必须针对
android.content.res.Configuration.navigation
报告正确的值 [资源 40] - 必须提供与输入管理引擎兼容、用于选择和编辑文字且合理的替代界面机制。上游 Android 开源实现包含一种适合在缺少非触摸导航输入法的设备上使用的选择机制。
7.2.3. 导航键
“主屏幕”“最近用过”和“返回”功能对于 Android 导航范式至关重要。设备实现必须在运行应用时随时为用户提供这些功能。可以通过专用实体按钮(例如机械或电容式触控按钮)实现这些功能,也可以使用位于屏幕上单独部分的专用软件按键、手势、触摸板等来实现。Android 支持这两种实现方式。所有这些功能在处于可见状态时,都必须可通过单次操作(例如点按、双击或手势)访问。
“返回”和“最近用过”功能应具有可见的按钮或图标,除非在全屏模式下与其他导航功能一起隐藏起来。“主屏幕”功能必须具有可见的按钮或图标,除非在全屏模式下与其他导航功能一起隐藏起来。
从 Android 4.0 开始,由于操作栏的出现,“菜单”功能被废弃了。
设备实现不应为“菜单”功能实现专用的实体按钮。如果实现了实体“菜单”按钮,并且设备运行 targetSdkVersion
> 10 的应用,则设备实现:
- 对于搭载 Android 4.4 的设备,当操作栏处于可见状态且在用户操作后弹出的操作溢出菜单不为空时,必须在操作栏上显示操作溢出按钮。
- 对于搭载更低版本但要升级到 Android 4.4 的现有设备,当操作栏处于可见状态且在用户操作后弹出的操作溢出菜单不为空时,应在操作栏上显示操作溢出按钮。
- 对于在操作栏中选择溢出按钮后弹出的操作溢出菜单,不得修改其位置。
- 对于在选择实体菜单按钮后弹出的操作溢出菜单,可以在屏幕上将其呈现到修改后的位置。
为了实现向后兼容,设备实现必须在 targetSdkVersion
小于 10 时使“菜单”功能可供应用使用,无论是通过实体按钮、软件按键还是手势。应显示此“菜单”功能,除非该功能与其他导航功能一起隐藏起来。
Android 支持辅助操作 [资源 63]。 设备实现必须在运行应用时随时向用户提供辅助操作。辅助操作应实现为长按“主屏幕”按钮或在软件“主屏幕”键上向上滑动的手势。 此功能可以通过其他实体按钮、软件按键或手势来实现,但在其他导航键处于可见状态时,此功能必须可通过单次操作(例如点按、双击或手势)访问。
设备实现可以使用屏幕上的单独部分来显示导航键,但如果这样做,必须满足以下要求:
- 设备实现导航键必须位于屏幕上的单独部分,不能供应用使用,并且不得遮住或以其他方式影响屏幕上可供应用使用的部分。
- 对于满足第 7.1.1 节中规定的要求的应用,设备实现必须将显示屏的一部分提供给它们使用。
- 如果应用没有指定系统界面模式或指定了
SYSTEM_UI_FLAG_VISIBLE
,设备实现必须显示导航键。 - 如果应用指定了
SYSTEM_UI_FLAG_LOW_PROFILE
,设备实现必须以不显眼的“低调”(例如暗色调)模式显示导航键。 - 如果应用指定了
SYSTEM_UI_FLAG_HIDE_NAVIGATION
,设备实现必须隐藏导航键。
7.2.4. 触摸屏输入
设备实现应具有某种指针输入系统(类似于鼠标的输入系统或触摸式输入系统)。不过,如果设备实现不支持指针输入系统,则不得报告 android.hardware.touchscreen
或 android.hardware.faketouch
功能常量。如果设备实现包含指针输入系统,则:
- 应支持完全独立跟踪的指针(如果设备输入系统支持多个指针)
- 必须报告
android.content.res.Configuration.touchscreen
的值 [资源 40],并且该值要与设备上的具体触摸屏的类型相对应
Android 支持多种触摸屏、触摸板和模拟触摸输入设备。
基于触摸屏的设备实现会与显示屏相关联 [资源 81],从而让用户感觉像是在直接操控屏幕上的内容。由于用户会直接触摸屏幕,因此系统不需要使用任何额外的方式来指明所操控的对象。
相比之下,模拟触摸界面则提供能够模拟部分触摸屏功能的用户输入系统。
例如,驱动屏幕光标的鼠标或遥控器能够模拟触摸操作,但需要用户先指向或聚焦到目标,然后再点击。鼠标、触控板、基于陀螺仪的空中鼠标、陀螺仪指针、操纵杆和多点触控板等多种输入设备都可以支持模拟触摸互动。Android 4.0 包含功能常量 android.hardware.faketouch
,该常量对应于高保真非触摸(即指控式)输入设备,例如可以充分模拟触摸式输入的鼠标或触控板(包括基本手势支持),并且该常量可指明设备支持所模拟的触摸屏功能子集。如果设备实现声明了模拟触摸功能,则必须满足第 7.2.5 节中的模拟触摸要求。
设备实现必须报告与所用输入方式的类型对应的正确功能。如果设备实现包含触摸屏(单点触控或更好的触摸屏),则必须报告平台功能常量 android.hardware.touchscreen
。
如果设备实现报告平台功能常量 android.hardware.touchscreen
,还必须要报告平台功能常量 android.hardware.faketouch
。如果设备实现不包含触摸屏(仅依靠指控设备),则不得报告任何触摸屏功能,并且仅在满足第 7.2.5 节中的模拟触摸要求时,才能报告 android.hardware.faketouch
。
7.2.5. 模拟触摸输入
如果设备实现声明支持 android.hardware.faketouch
,则
- 必须报告指针在屏幕中的绝对 X 和 Y 位置,并在屏幕中显示可见指针 [资源 80]
- 必须通过操作代码报告触摸事件 [资源 80],指示当指针在屏幕上
down
或up
时发生的状态变化 [资源 80] - 必须支持在屏幕中的对象上
down
和up
指针,以便用户模拟点按屏幕中的对象 - 必须支持于时间阈值内在屏幕中的对象上的同一位置
down
指针,up
指针,down
后再up
指针,以便用户模拟点按两次屏幕中的对象 [资源 80] - 必须支持在屏幕中的任意一点
down
指针,将指针移动到屏幕上的其他任意一点,然后再up
指针,以便用户模拟触摸拖动操作 - 必须支持
down
指针后允许用户快速将对象移动到屏幕中的其他位置,然后在屏幕中up
指针,以便用户快速滑动屏幕中的对象
如果设备声明支持 android.hardware.faketouch.multitouch.distinct
,则必须满足上述关于模拟触摸的要求,并且必须支持对两种或更多种独立的指针输入方式分别进行跟踪。
7.2.6. 麦克风
设备实现可以省略麦克风。不过,如果设备实现省略了麦克风,则不得报告 android.hardware.microphone
功能常量,并且必须按照第 7 节的规定将录音 API 实现为空操作。
反之,如果设备实现包含麦克风,则:
7.3. 传感器
Android 包含用于访问多种传感器的 API。设备实现通常可以省略这些传感器,如后续小节中所述。如果设备包含某种类型的传感器,而这种传感器具有针对第三方开发者的相应 API,则设备实现必须实现该 API(如 Android SDK 文档中所述)。例如,设备实现:
- 必须根据
android.content.pm.PackageManager
类准确报告是否存在传感器。[资源 37] - 必须通过
SensorManager.getSensorList()
和类似方法返回准确的受支持传感器列表 - 对于所有其他传感器 API,必须采取合理的行为(例如,在应用尝试注册监听器时视情况返回 true 或 false,在不存在相应的传感器时不调用传感器监听器,等等)
- 对于 Android SDK 文档中定义的每种传感器类型,必须采用相关的国际单位制(即指标)值报告所有传感器测量结果 [资源 41]
上述列表并不是详尽无遗的;请以 Android SDK 中载述的行为为准。
有些传感器类型为复合型,也就是说,它们可以从一个或多个其他传感器提供的数据推导出来。(例如方向传感器和线性加速度传感器。)设备实现应实现这些传感器类型,但前提是设备实现包含必要的实体传感器。
Android 中包含“流式”传感器这一概念,这种传感器会持续返回数据,而不是仅在数据发生变化时才会返回数据。 对于 Android SDK 文档指定为流式传感器的任何 API,设备实现都必须持续提供定期数据样本。请注意,设备实现必须确保传感器数据流不得阻止设备 CPU 进入挂起状态或从挂起状态唤醒。
7.3.1. 加速度计
设备实现应包含 3 轴加速度计。如果设备实现包含 3 轴加速度计,则:
- 应能够以至少 120 Hz 的频率传送事件。请注意:虽然对于 Android 4.4 来说,上述加速度计频率规定为“应”达到的频率,但我们计划在未来版本的兼容性定义中将其改为“必须”达到的频率。换言之,这些标准在 Android 中是非强制性标准,但在未来版本中将成为必须遵从的标准。强烈建议搭载 Android 的现有设备和新设备满足 Android 中的这些要求,以便能够升级到未来的平台版本
- 必须遵从 Android API 中详述的 Android 传感器坐标系(请参阅 [资源 41])
- 在任何三维矢量上,都必须能够测量从自由下落到高达两倍重力加速度 (2g) 或更高重力加速度的运动过程
- 精度必须至少为 8 位
- 标准偏差不得超过 0.05 m/s^2
7.3.2. 磁力计
设备实现应包含 3 轴磁力计(即罗盘)。 如果设备包含 3 轴磁力计,则:
- 必须能够以 10 Hz 或更高的频率传送事件
- 必须遵从 Android API 中详述的 Android 传感器坐标系(请参阅 [资源 41])。
- 必须能够对足以覆盖地磁场的磁场强度进行采样
- 精度必须至少为 8 位
- 标准偏差不得超过 0.5 μT
7.3.3. GPS
设备实现应包含 GPS 接收器。如果设备实现包含 GPS 接收器,则应包含某种形式的“辅助 GPS”技术,以最大限度地缩短 GPS 锁定时间。
7.3.4. 陀螺仪
设备实现应包含陀螺仪(即角度变化传感器)。除非还包含 3 轴加速度计,否则设备不应包含陀螺仪传感器。如果设备实现包含陀螺仪,则:
- 必须进行温度补偿。
- 必须能够测量高达 5.5*Pi 弧度/秒(即大约每秒 1,000 度)的方向变化
- 应能够以 200 Hz 或更高的频率传送事件。请注意,虽然对于 Android 4.4 来说,上述陀螺仪频率规定为“应”达到的频率,但我们计划在针对未来版本的兼容性定义中将其改为“必须”达到的频率。换言之,这些标准在 Android 中是非强制性标准,但在未来版本中将成为必须遵从的标准。强烈建议搭载 Android 的现有设备和新设备满足这些要求,以便能够升级到未来的平台版本。
- 精度必须至少为 12 位
- 每 Hz 方差不得超过 1e-7 rad^2/s^2(每 Hz 方差,或 rad^2/s)。 方差可随采样率而变化,但不得超过该值。 也就是说,如果以 1 Hz 的采样率测量陀螺仪的方差,则方差不应超过 1e-7 rad^2/s^2。
- 必须有尽可能接近硬件事件发生时间的时间戳。必须移除恒定延迟。
7.3.5. 气压计
设备实现可以包含气压计(即环境气压传感器)。如果设备实现包含气压计,则:
- 必须能够以 5 Hz 或更高的频率传送事件
- 必须具有足以估算海拔高度的精度
- 必须进行温度补偿
7.3.6. 温度计
设备实现可以包含环境温度计(即温度传感器)。如果存在,则必须将其定义为 SENSOR_TYPE_AMBIENT_TEMPERATURE
,并且它测量的必须是环境(室内)温度(以摄氏度为单位)。
设备实现可以(但不应)包含 CPU 温度传感器。
如果存在,则必须将其定义为 SENSOR_TYPE_TEMPERATURE
,并且它测量的必须是设备 CPU 的温度,而不得测量任何其他温度。请注意,SENSOR_TYPE_TEMPERATURE
传感器类型在 Android 4.0 中已被废弃。
7.3.7. 光度计
设备实现可以包含光度计(即环境光传感器)。
7.3.8. 近程传感器
设备实现可以包含近程传感器。如果设备实现包含近程传感器,则必须按与屏幕相同的方向测量物体的接近度。也就是说,近程传感器必须朝向适当方向,以便检测靠近屏幕的物体,因为此类传感器的主要用途是检测用户正在使用的手机。如果设备实现包含朝向任何其他方向的近程传感器,则不得通过此 API 访问此类传感器。如果设备实现包含近程传感器,则其精度必须至少为 1 位。
7.4. 数据连接
7.4.1. 电话
在 Android API 和本文档中,“电话”专指与通过 GSM 或 CDMA 网络进行语音通话和发送短信相关的硬件。虽然这些语音通话可能采用也可能不采用分封交换技术,但都是为了使 Android 被视为独立于任何可通过同一网络实现的数据连接。换言之,Android“电话”功能和 API 专指语音通话和短信;例如,无法拨打电话或收发短信的设备实现不得报告“android.hardware.telephony”功能或任何子功能,无论它们是否使用移动网络进行数据连接。
Android 可以用在不包含电话硬件的设备上。 也就是说,Android 与非电话设备兼容。 不过,如果设备实现包含 GSM 或 CDMA 电话,则必须全面支持针对该技术的 API。如果设备实现不包含电话硬件,则必须将所有相关 API 实现为空操作。
7.4.2. IEEE 802.11 (Wi-Fi)
Android 设备实现应支持一种或多种形式的 802.11(b/g/a/n 等)如果设备实现支持 802.11,则必须实现对应的 Android API。
设备实现必须按照 SDK 文档中所述实现多播 API [资源 62]。如果设备实现支持 Wi-Fi,则必须支持多播 DNS (mDNS)。 在操作过程中的任何时间(包括屏幕未处于活动状态时),设备实现都不得过滤 mDNS 数据包 (224.0.0.251)。
7.4.2.1. Wi-Fi 直连
设备实现应支持 Wi-Fi 直连(Wi-Fi 点对点)。 如果设备实现支持 Wi-Fi 直连,则必须实现 SDK 文档中所述的对应 Android API [资源 68]。如果设备实现支持 Wi-Fi 直连,则:
- 必须支持常规的 Wi-Fi 操作
- 应支持并发的 Wi-Fi 操作和 Wi-Fi 直连操作
7.4.2.2. Wi-Fi 通道直接链路设置
设备实现应支持 Android SDK 文档中所述的 Wi-Fi 通道直接链路设置 (TDLS) [Resources, 85]。如果设备实现支持 TDLS,并且 TDLS 已由 WiFiManager API 启用,则设备:
- 只在能够使用且有好处时才应使用 TDLS。
- 应进行一些试探,如果使用 TDLS 时的性能可能低于通过 Wi-Fi 接入点连接时的性能,则不应使用 TDLS。
7.4.3. 蓝牙
设备实现应包含蓝牙收发器。如果设备实现包含蓝牙收发器,则必须支持基于 RFCOMM 的蓝牙 API(如 SDK 文档中所述),并声明硬件功能 android.hardware.bluetooth [资源 42]。 设备实现应实现适合设备的相关蓝牙配置文件,例如 A2DP、AVRCP、OBEX 等。
如果设备实现支持蓝牙 GATT(通用属性配置文件),则必须支持与 Bluetooth Smart 或 Smart Ready 设备进行通信(如 SDK 文档中所述),并声明硬件功能 android.hardware.bluetooth [资源 42]。
7.4.4. 近距离无线通信
设备实现应包含用于近距离无线通信 (NFC) 的收发器和相关硬件。如果设备实现包含 NFC 硬件,则:
- 必须通过
android.content.pm.PackageManager.hasSystemFeature()
方法报告 android.hardware.nfc 功能。 [资源 37] - 必须能够通过以下 NFC 标准读取和写入 NDEF 消息:
- 必须能够通过以下 NFC 标准充当 NFC Forum 读取器/写入器(具体定义请参见 NFC Forum 技术规范 NFCForum-TS-DigitalProtocol-1.0):
- NfcA (ISO14443-3A)
- NfcB (ISO14443-3B)
- NfcF (JIS 6319-4)
- IsoDep (ISO 14443-4)
- NFC Forum 标签类型 1、2、3、4(由 NFC Forum 定义)
- 必须能够通过以下 NFC 标准充当 NFC Forum 读取器/写入器(具体定义请参见 NFC Forum 技术规范 NFCForum-TS-DigitalProtocol-1.0):
- 应能够通过以下 NFC 标准读取和写入 NDEF 消息。请注意:虽然以下 NFC 标准规定为“应”满足的标准,但我们计划在针对未来版本的兼容性定义中将其改为“必须”满足的标准。换言之,这些标准在此版本中是非强制性标准,但在未来版本中将成为必须遵从的标准。强烈建议搭载此 Android 版本的现有设备和新设备现在就满足这些要求,以便能够升级到未来的平台版本。
- NfcV (ISO 15693)
- 必须能够通过以下点对点连接标准和协议传送和接收数据:
- ISO 18092
- LLCP 1.0(由 NFC Forum 定义)
- SDP 1.0(由 NFC Forum 定义)
- NDEF 推送协议 [资源 43]
- SNEP 1.0(由 NFC Forum 定义)
- 必须支持 Android Beam [资源 65]:
- 必须实现 SNEP 默认服务器。必须使用 android.nfc.ACTION_NDEF_DISCOVERED intent 将默认 SNEP 服务器收到的有效 NDEF 消息发送给应用。在设置中停用 Android Beam 不得导致停止发送收到的 NDEF 消息。
- 设备实现必须支持 android.settings.NFCSHARING_SETTINGS intent,以显示 NFC 共享设置 [资源 67]。
- 必须实现 NPP 服务器。必须按照处理默认 SNEP 服务器收到的消息时采用的方式,处理 NPP 服务器收到的消息。
- 必须实现 SNEP 客户端,并且在 Android Beam 处于启用状态时,必须尝试将出站点对点 NDEF 消息发送到默认 SNEP 服务器。如果未找到默认 SNEP 服务器,则该客户端必须尝试将消息发送到 NPP 服务器。
- 必须允许前台 activity 使用 android.nfc.NfcAdapter.setNdefPushMessage、android.nfc.NfcAdapter.setNdefPushMessageCallback 和 android.nfc.NfcAdapter.enableForegroundNdefPush 设置出站点对点 NDEF 消息。
- 在发送出站点对点 NDEF 消息之前,应使用手势或屏幕确认(例如“触摸传输”)。
- 应默认启用 Android Beam
- 如果设备支持蓝牙对象推送配置文件,则必须支持从 NFC 连接切换到蓝牙。 使用 android.nfc.NfcAdapter.setBeamPushUris 时,设备实现必须支持将连接切换到蓝牙,方法是实现 NFC Forum 提供的“连接切换 1.2 版”[资源 60] 和“使用 NFC 进行安全简单的蓝牙配对 1.0 版”[资源 61] 规范。此类实现必须实现服务名称为“urn:nfc:sn:handover”的切换 LLCP 服务,以通过 NFC 交换切换请求/部分记录,并且必须使用蓝牙对象推送配置进行实际的蓝牙数据传输。为了与旧版兼容(与 Android 4.1 设备保持兼容),此类实现应仍接受 SNEP GET 请求,以便通过 NFC 交换切换请求/部分记录。不过,实现本身不应发送关于执行连接切换的 SNEP GET 请求。
- 在 NFC 发现模式下,必须轮询所有支持的技术。
- 当设备处于唤醒状态、屏幕处于活动状态,并且锁定屏幕未锁定时,应采用 NFC 发现模式。
(请注意,上面提到的 JIS、ISO 和 NFC Forum 规范没有公开提供的链接。)
Android 4.4 引入了对 NFC 主机卡模拟 (HCE) 模式的支持。如果设备实现包含支持 HCE 和应用 ID (AID) 路由的 NFC 控制器,则:
- 必须报告
android.hardware.nfc.hce
功能常量 - 必须支持 Android SDK 中定义的 NFC HCE API [资源 90]
此外,设备实现还可以为以下 MIFARE 技术提供读取器/写入器支持。
- MIFARE Classic(NXP MF1S503x [资源 44]、MF1S703x [资源 45])
- MIFARE Ultralight(NXP MF0ICU1 [资源 46]、MF0ICU2 [资源 47])
- NDEF on MIFARE Classic(NXP AN130511 [资源 48]、AN130411 [资源 49])
请注意,Android 包含针对这些 MIFARE 类型的 API。如果设备实现支持具有读取器/写入器角色的 MIFARE,则:
- 必须实现 Android SDK 中载述的对应 Android API
- 必须通过
android.content.pm.PackageManager.hasSystemFeature()
方法报告 com.nxp.mifare 功能。 [资源 37] 请注意,这不是标准的 Android 功能,因此不会在PackageManager
类中显示为常量。 - 不得实现对应的 Android API,也不得报告 com.nxp.mifare 功能,除非还实现了本节中所述的一般 NFC 支持
如果设备实现不包含 NFC 硬件,则不得通过 android.content.pm.PackageManager.hasSystemFeature()
方法声明 android.hardware.nfc 功能 [资源 37],并且必须将 Android NFC API 实现为空操作。
由于 android.nfc.NdefMessage
类和 android.nfc.NdefRecord
类表示独立于协议的数据表示格式,因此设备实现必须实现这些 API,即使它们不支持 NFC 或未声明 android.hardware.nfc 功能也是如此。
7.4.5. 最低网络功能
设备实现必须支持一种或多种形式的数据网络连接。具体而言,设备实现必须支持至少一种能够达到 200Kbit/sec 或更高速率的数据标准。满足此要求的技术包括 EDGE、HSPA、EV-DO、802.11g、以太网等。
如果采用的物理网络标准(例如以太网)是主要数据连接,设备实现还应支持至少一种常用的无线数据标准,例如 802.11 (Wi-Fi)。
设备可以实现多种形式的数据连接。
7.4.6. 同步设置
设备实现必须默认启用主自动同步设置,以便方法 getMasterSyncAutomatically()
返回“true”[资源 88]。
7.5. 摄像头
设备实现应包含后置摄像头,并且可以包含前置摄像头。后置摄像头指位于设备上背向显示屏一侧的摄像头,也就是说,与传统摄像头一样,它拍摄的是背向设备显示屏一侧的景物。前置摄像头指与设备上的显示屏位于同一侧的摄像头,也就是通常用于拍摄用户自己的摄像头,例如用于视频会议及类似应用的摄像头。
7.5.1. 后置摄像头
设备实现应包含后置摄像头。如果设备实现包含后置摄像头,则:
- 分辨率必须至少为 200 万像素
- 应在摄像头驱动程序中实现硬件自动对焦或软件自动对焦(对应用软件透明)
- 可以具有固定焦距硬件或 EDOF(扩展景深)硬件
- 可以包含闪光灯。如果摄像头包含闪光灯,当已在摄像头预览 surface 上注册 android.hardware.Camera.PreviewCallback 实例时,闪光灯不得亮起,除非应用已通过启用
Camera.Parameters
对象的FLASH_MODE_AUTO
或FLASH_MODE_ON
属性明确启用闪光灯。请注意,此项限制不适用于设备的内置系统摄像头应用,而是仅适用于使用Camera.PreviewCallback
的第三方应用。
7.5.2. 前置摄像头
设备实现可以包含前置摄像头。如果设备实现包含前置摄像头,则:
- 分辨率必须至少为 VGA(即 640x480 像素)
- 不得将前置摄像头用作摄像头 API 的默认摄像头。也就是说,Android 中的摄像头 API 对前置摄像头提供特定的支持,设备实现不得将该 API 配置为将前置摄像头视为默认后置摄像头,即使它是设备上的唯一摄像头也是如此。
- 可以包含可供后置摄像头使用的功能,例如自动对焦、闪光灯等(如第 7.5.1 节中所述)。
- 必须在 CameraPreview 中水平反映(即镜像)应用显示的串流,如下所述:
- 如果用户能够旋转设备实现(例如通过加速度计自动旋转或通过用户输入手动旋转),必须相对于设备的当前方向水平镜像摄像头预览。
- 如果当前应用已通过调用
android.hardware.Camera.setDisplayOrientation()
[资源 50] 方法明确请求旋转摄像头显示,则必须相对于应用指定的方向水平镜像摄像头预览。 - 否则,必须沿着设备的默认水平轴镜像预览。
- 必须按照镜像摄像头预览图像串流时采用的方式,镜像由 postview 显示的图像。(如果设备实现不支持 postview,此要求显然不适用。)
- 不得镜像最终拍摄的返回到应用回调或提交到媒体存储空间的静态图像或视频串流
7.5.3. 摄像头 API 行为
设备实现必须为前置摄像头和后置摄像头的摄像头相关 API 实现以下行为:
- 如果应用从未调用过
android.hardware.Camera.Parameters.setPreviewFormat(int)
,则设备必须使用android.hardware.PixelFormat.YCbCr_420_SP
获取提供给应用回调的预览数据。 - 如果应用注册了
android.hardware.Camera.PreviewCallback
实例,并且系统在预览格式为 YCbCr_420_SP 时调用onPreviewFrame()
方法,则传递到onPreviewFrame()
的byte[]
中的数据必须进一步采用 NV21 编码格式。也就是说,NV21 必须是默认格式。 - 设备实现必须支持使用 YV12 格式(用
android.graphics.ImageFormat.YV12
常量表示)进行前置摄像头和后置摄像头的摄像头预览。(硬件视频编码器和摄像头可以使用任何原生像素格式,但设备实现必须支持转换为 YV12。)
无论设备是否包含硬件自动对焦或其他功能,设备实现都必须实现 Android SDK 文档中包含的完整摄像头 API [资源 51]。例如,没有自动对焦功能的摄像头仍可以调用任何已注册的 android.hardware.Camera.AutoFocusCallback
实例(即使这与非自动对焦摄像头无关)。请注意,这适用于前置摄像头;例如,虽然大多数前置摄像头都不支持自动对焦,但仍必须如所述那样“伪造”API 回调。
如果底层硬件支持相应功能,设备实现必须识别并遵从 android.hardware.Camera.Parameters
类中定义为常量的每个参数名称。如果设备硬件不支持某项功能,则 API 的行为方式必须与所载述的行为方式一致。反之,设备实现不得遵从或识别传递给 android.hardware.Camera.setParameters()
方法的字符串常量,在 android.hardware.Camera.Parameters
中载述为常量的字符串常量除外。也就是说,设备实现必须支持所有标准摄像头参数(如果硬件允许),并且不得支持自定义摄像头参数类型。
例如,如果设备实现支持使用高动态范围 (HDR) 成像技术拍照,则必须支持摄像头参数 Camera.SCENE_MODE_HDR
[资源 78]。
每当摄像头拍摄了新照片且相应的照片条目已添加到媒体库时,都必须广播 Camera.ACTION_NEW_PICTURE
intent。
每当摄像头录制了新视频且相应的视频条目已添加到媒体库时,设备实现都必须广播 Camera.ACTION_NEW_VIDEO
intent。
7.5.4. 摄像头方向
前置摄像头和后置摄像头(如果存在)都必须朝向正确方向,以便摄像头的长度方向与屏幕的长度方向一致。也就是说,当设备处于横向时,摄像头必须横向拍摄。无论设备的自然方向为何,此规则都适用;也就是说,它既适用于以横屏为主的设备,也适用于以竖屏为主的设备。
7.6. 内存和存储空间
7.6.1. 最小内存和存储空间
设备实现必须有至少 340MB 的内存供内核和用户空间使用。这 340MB 不包括不在内核控制范围之内的所有专供硬件组件(例如无线装置、视频等)使用的内存。
如果设备实现可供内核和用户空间使用的内存小于 512MB,则必须针对 ActivityManager.isLowRamDevice()
返回值“true”。
设备实现必须有至少 1GB 的非易失性存储空间可用于存储应用专属数据。也就是说,/data
分区必须至少为 1GB。强烈建议搭载 Android 的设备实现至少有 2GB 的非易失性存储空间可用于存储应用专属数据,以便能够升级到未来的平台版本。
Android API 包含一个内容下载管理器,应用可以使用它下载数据文件 [资源 56]。内容下载管理器的设备实现必须能够将至少为 100MB 的各个文件下载到默认的“缓存”位置。
7.6.2. 共享的外部存储空间
设备实现必须为应用提供共享存储空间。提供的共享存储空间不得小于 1 GB。
设备实现必须配有默认装载且可直接使用的共享存储空间。如果共享存储空间未装载在 Linux 路径 /sdcard
下,则设备必须包含从 /sdcard
指向实际装载点的 Linux 符号链接。
设备实现必须按照文档中所述,对该共享存储空间强制授予 android.permission.WRITE_EXTERNAL_STORAGE
权限。必须允许任何获得该权限的应用对共享存储空间执行写入操作。
设备实现可以具有相应的硬件来安装可供用户使用的可移动存储设备,例如安全数字卡。或者,设备实现可以将内部(不可移动的)存储空间分配为应用的共享存储空间。上游 Android 开源项目中包含一个将内部设备存储空间用于共享外部存储 API 的实现;设备实现应使用此配置和软件实现。
无论使用什么形式的共享存储空间,设备实现都必须提供某种访问机制,以便从主机计算机访问共享存储空间中的内容,例如使用 USB 大容量存储设备 (UMS) 或媒体传输协议 (MTP)。设备实现可以使用 USB 大容量存储设备,但应使用媒体传输协议。如果设备实现支持媒体传输协议,则:
- 设备实现应与参考 Android MTP 主机、Android 文件传输 [资源 57] 兼容。
- 设备实现应报告 USB 设备类
0x00
。 - 设备实现应报告 USB 接口名称“MTP”。
如果设备实现缺少 USB 端口,则必须授权主机计算机通过某些其他方式(例如网络文件系统)访问共享存储空间中的内容。
下面列举了两个常见示例。如果设备实现包含 SD 卡插槽以满足共享存储空间要求,则设备在向用户出售时必须包含至少为 1GB 的 FAT 格式的 SD 卡,并且必须默认装载该卡。
或者,如果设备实现使用内部固定存储空间来满足此要求,则该存储空间必须至少为 1GB,并且必须装载在 /sdcard
上(如果装载在其他位置,则 /sdcard
必须是指向实际位置的符号链接)。
如果设备实现包含多个共享存储空间路径(例如 SD 卡插槽和共享内部存储空间),则不得允许 Android 应用写入到辅助外部存储空间,写入到辅助外部存储空间上其软件包的专用目录除外,但应通过 Android 的媒体扫描仪服务和 android.provider.MediaStore 透明地公开上述两个存储空间路径中的内容。
7.7. USB
设备实现应包含 USB 客户端端口,而且应包含 USB 主机端口。
如果设备实现包含 USB 客户端端口,则:
- 该端口必须可通过标准 USB-A 端口连接到 USB 主机
- 该端口应使用设备端的 Micro USB 外形规格。强烈建议搭载 Android 的现有设备和新设备满足 Android 中的这些要求,以便能够升级到未来的平台版本
- 该端口应位于边缘的居中位置。设备实现应将该端口置于设备底部(根据自然方向),或为所有应用(包括主屏幕)启用软件屏幕旋转功能,以便设备在按照该端口位于底部的方位放置时,显示屏能够正确呈现内容。强烈建议搭载 Android 的现有设备和新设备满足 Android 中的这些要求,以便能够升级到未来的平台版本。
- 如果设备具有其他端口(例如非 USB 充电接口),这些端口应与 Micro USB 端口位于同一边缘
- 它必须允许连接到设备的主机使用 USB 大容量存储设备或媒体传输协议访问共享存储卷中的内容
- 它必须实现 Android SDK 文档中载述的 Android Open Accessory API 和规范,并且必须声明支持硬件功能
android.hardware.usb.accessory
[资源 52] - 它必须实现 Android SDK 文档中载述的 USB 音频类 [资源 66]
- 它应实现对 USB 电池充电规范 [资源 64] 的支持。强烈建议搭载 Android 的现有设备和新设备满足这些要求,以便能够升级到未来的平台版本
- USB 标准设备描述符中 iSerialNumber 的值必须等于 android.os.Build.SERIAL 的值。
如果设备实现包含 USB 主机端口,则:
- 它可以使用非标准端口的外形规格;但这样做的话,必须附带一条或多条数据线,以便将该端口转接到标准 USB-A 端口
- 它必须实现 Android SDK 中载述的 Android USB 主机 API,并且必须声明支持硬件功能
android.hardware.usb.host
[资源 53]
设备实现必须实现 Android 调试桥。如果设备实现省略了 USB 客户端端口,则必须通过局域网(例如以太网或 802.11)实现 Android 调试桥
8. 性能兼容性
设备实现必须满足下表中定义的 Android 兼容设备关键性能指标:
指标 | 性能阈值 | 注释 |
应用启动时间 | 以下应用应在指定时间内完成启动。
|
启动时间是指完成应用默认 activity 加载所用的总时间,包括启动 Linux 进程、将 Android 软件包加载到 Dalvik 虚拟机以及调用 onCreate 所用的时间。 |
并发应用 | 在启动了多个应用的情况下,如果重新启动已启动且已在运行的应用,所用时间不得超过原来的启动时间。 |
9. 安全模型兼容性
设备实现必须实现与 Android 平台安全模型(具体定义请参见 Android 开发者文档 > API 指南 > 安全和权限参考文档 [资源 54])一致的安全模型。设备实现必须支持安装自签名应用,而且无需从任何第三方/权威机构获得任何额外的权限/证书。具体来说,兼容的设备必须支持下面几个小节中介绍的安全机制。
9.1. 权限
设备实现必须支持 Android 开发者文档中定义的 Android 权限模型 [资源 54]。具体来说,实现必须如 SDK 文档中所述,强制授予所定义的每项权限;不得省略、更改或忽略任何权限。 只要新的权限 ID 字符串不是位于 android.* 命名空间内,实现便可以添加额外的权限。
9.2. UID 和进程隔离
设备实现必须支持 Android 应用沙盒模型。在该模型中,每个应用都是在单独的进程中作为独一无二的 Unix 式 UID 运行。设备实现必须支持以同一 Linux 用户 ID 运行多个应用,但前提是这些应用已经过适当签名和构建(具体定义请参见安全和权限参考文档 [资源 54])。
9.3. 文件系统权限
设备实现必须支持 Android 文件访问权限模型(具体定义请参见安全和权限参考文档 [资源 54])。
9.4. 替代执行环境
设备实现可以包括,使用 Dalvik 虚拟机或原生代码以外的一些其他软件或技术来执行应用的运行时环境。不过,此类替代执行环境不得损害 Android 安全模型或已安装的 Android 应用的安全性(如本节中所述)。
替代运行时本身必须是 Android 应用,并且遵循标准的 Android 安全模型(如第 9 节中的其他部分所述)。
不得授权替代运行时访问受以下权限保护的资源:未在替代运行时的 AndroidManifest.xml 文件中通过 <uses-permission>
机制请求的权限。
替代运行时不得允许应用使用受系统应用专用 Android 权限保护的功能。
替代运行时必须遵循 Android 沙盒模型。具体而言:
- 替代运行时应通过 PackageManager 将应用安装到单独的 Android 沙盒(即 Linux 用户 ID 等)。
- 替代运行时可以提供单个可供所有使用替代运行时的应用共享的 Android 沙盒
- 替代运行时和使用替代运行时的已安装应用不得重复使用设备上已安装的任何其他应用的沙盒,除非使用共享用户 ID 和签名证书这两种标准 Android 机制
- 不得使用对应于其他 Android 应用的沙盒启动替代运行时,不得向替代运行时授予对这些沙盒的访问权限,替代运行时也不得向其他应用授予此类访问权限
不得使替代运行时在启动时获得超级用户 (root) 或任何其他用户 ID 的任何权限,不得向替代运行时授予任何此类权限,替代运行时也不得向其他应用授予任何此类权限。
替代运行时的 .apk 文件可以包含在设备实现的系统映像中,但这些文件必须已签名,并且签名时所用的密钥必须不同于对设备实现包含的其他应用签名时使用的密钥。
安装应用时,替代运行时必须就应用使用的 Android 权限获得用户同意。也就是说,如果某个应用需要使用具有相应 Android 权限的设备资源(例如摄像头、GPS,等等),则替代运行时必须通知用户,让他们知道该应用将能够访问相应资源。如果运行时环境不会以这种方式记录应用功能,则在安装任何使用该运行时的应用时,运行时环境都必须列出运行时自身拥有的所有权限。
9.5. 多用户支持
Android 包含多用户支持,并且支持完全用户隔离 [资源 70]。
设备实现必须满足以下与多用户支持相关的要求 [资源 71]:
- 由于目前未定义支持多用户的设备上的电话 API 行为,因此声明 android.hardware.telephony 的设备实现不得启用多用户支持。
- 设备实现必须为每位用户实现与 Android 平台安全模型(具体定义请参见 API 指南中的安全和权限参考文档 [资源 54])一致的安全模型。
- Android 支持受限配置文件,此类配置文件可让设备所有者管理设备上的其他用户以及他们可以使用的功能。借助受限配置文件,设备所有者可以快速设置供其他用户使用的单独环境,同时还能在可于这些环境中运行的应用内管理更精细的限制。如果设备实现包含多用户支持,则必须支持受限配置文件。上游 Android 开源项目中包含满足此要求的实现。
Android 设备上的每个用户实例都必须具有单独且隔离开来的外部存储目录。设备实现可以将多位用户的数据存储在同一个卷或文件系统中。 不过,设备实现必须确保归指定用户所有且以其名义运行的应用无法列出、读取或写入归任何其他用户所有的数据。 请注意,如果使用可移动媒介(例如 SD 卡插槽),用户将可以通过主机 PC 访问其他用户的数据。因此,如果设备实现将可移动媒介用于外部存储 API,则必须使用仅存储在只有系统可以访问的不可移动媒介上的密钥对 SD 卡中的内容进行加密(如果启用了多用户功能)。因为这样会使主机 PC 无法读取相应介质,所以设备实现将需要切换到 MTP 或类似系统,才能授权主机 PC 访问当前用户的数据。因此,如果设备实现使用可移动媒介 [资源 72] 作为主要的外部存储设备,则可以但不应启用多用户功能。
9.6. 付费短信警告
Android 支持针对任何外发付费短信 [资源 73] 向用户发出警告。付费短信是指向已在运营商处注册且可能需要用户付费的服务发送的短信。
如果设备实现声明支持 android.hardware.telephony
,则在向通过设备的 /data/misc/sms/codes.xml
文件中定义的正则表达式识别出的号码发送短信之前,必须警告用户。
上游 Android 开源项目提供了一个满足此要求的实现。
9.7. 内核安全功能
Android 沙盒包含使用安全增强型 Linux (SELinux) 强制访问控制 (MAC) 系统以及 Linux 内核中其他安全功能的功能。SELinux 或任何其他在 Android 框架以下实现的安全功能:
- 必须与现有应用保持兼容。
- 不得提供可见的界面,即使检测到违规行为也是如此
- 不应可由用户或开发者配置
如果将任何用于配置政策的 API(例如 Device Administration API)提供给可能会影响其他应用的应用使用,则相应 API 不得允许使用会破坏兼容性的配置。
设备必须实现 SELinux 并满足以下要求,这些要求通过上游 Android 开源项目中的参考实现来满足。
- 它必须支持允许按网域设置 SELinux 模式的 SELinux 政策,其中:
- 在上游 Android 开源实现中处于强制模式(例如,installd、netd 和 vold)的网域必须处于强制模式
- 第三方应用的网域应保持宽容模式,以确保持续兼容
- 应从设备上的
/sepolicy
文件加载政策 - 必须支持动态更新 SELinux 政策文件,而且无需进行任何系统映像更新
- 必须记录所有违反政策的情况,而且不会中断应用或影响系统行为
设备实现应保留上游 Android 开源项目中提供的默认 SELinux 政策,除非已对其 SELinux 政策添加内容进行首次审核。设备实现必须与上游 Android 开源项目兼容。
9.8. 隐私权
如果设备在系统中实现了用于捕获屏幕上显示的内容和/或录制设备上播放的音频串流的功能,则每当该功能处于启用状态并且正在捕获/录制内容时,设备必须持续通知用户。
9.9. 全盘加密
如果设备具有锁屏功能,则必须支持全盘加密。
10. 软件兼容性测试
设备实现必须通过本节中所述的所有测试。
不过请注意,任何软件测试包都不是详尽无遗的。因此,强烈建议设备实现者尽可能避免对可从 Android 开源项目获得的 Android 参考实现和首选实现进行更改。 这样有助于最大限度地降低引入 bug 的风险,从而避免造成需要进行返工和潜在设备更新的不兼容问题。
10.1. 兼容性测试套件
设备实现必须通过 Android 开源项目提供的 Android 兼容性测试套件 (CTS) [资源 2] 的测试(使用设备上最终交付的软件)。此外,设备实现者应尽可能多地使用 Android 开放源代码树中的参考实现,并且对于 CTS 中不明确的情况,以及参考源代码中部分内容的任何重新实现,都必须确保兼容性。
CTS 能够在实际设备上运行。与所有软件一样,CTS 自身也可能包含 bug。CTS 的版本发布独立于本兼容性定义文档,我们可能会针对 Android 4.4 发布多个 CTS 修订版本。设备实现必须通过设备软件发布时可用的最新 CTS 版本的测试。
10.2. CTS 验证程序
设备实现必须正确执行 CTS 验证程序中的所有适用用例。CTS 验证程序包含在兼容性测试套件中,以便人工操作员运行该验证程序来测试无法由自动化系统测试的功能,例如测试摄像头和传感器能否正常工作。
CTS 验证程序中包含针对多种硬件(其中包括一些选配硬件)的测试。设备实现必须通过针对其具备的硬件的所有测试;例如,如果某款设备具备加速度计,则必须正确执行 CTS 验证程序中的加速度计测试用例。对于本兼容性定义文档中注明为选配的功能,可跳过或省略相应的测试用例。
如上所述,每款设备和每个 build 都必须正确运行 CTS 验证程序。不过,由于很多 build 非常相似,因此设备实现者可能不会对只有细微差别的 build 明确运行 CTS 验证程序。具体来说,如果设备实现与某个已通过 CTS 验证程序测试的实现只是在所包含的语言区域、品牌信息等方面存在差别,则可以省略 CTS 验证程序测试。
10.3. 参考应用
设备实现者必须使用以下开源应用测试实现兼容性:
- Android 应用 [资源 55]
- Replica Island(可在 Google Play 商店中下载)
实现必须能够正确启动并运行上述每种应用,才会被视为兼容。
11. 可更新软件
设备实现必须包含可用于替换整个系统软件的机制。该机制不需要执行“实时”升级 - 也就是说,可能需要重新启动设备。
可以使用任何方法,但前提是相应方法可以替换设备上的整个预安装软件。例如,以下任何方法都可以满足此要求:
- 无线下载 (OTA)(通过重新启动进行离线更新)
- 从主机 PC 上通过 USB 进行“网络共享”更新
- 通过重新启动进行“离线”更新,以及通过可移动存储设备中的文件进行更新
使用的更新机制必须支持在不擦除用户数据的情况下进行更新。 也就是说,更新机制必须保留应用专属数据和应用共享数据。请注意,上游 Android 软件包含满足此要求的更新机制。
在设备实现发布后,如果在其合理的产品生命周期内发现其中存在错误,并且经与 Android 兼容性团队磋商后确定该错误会影响第三方应用的兼容性,则设备实现者必须通过可按上述机制应用的可用软件更新来更正该错误。
12. 文档更新日志
下表汇总了此版本中对兼容性定义进行的更新。
章节 | 变更摘要 |
---|---|
3.2.2. build 参数 | 修改了 BRAND、DEVICE 和 PRODUCT 的说明。SERIAL 现在是必需字段。 |
3.2.3.5. 默认应用设置 | 新增加的一节,其中包含与新增的默认应用相关设置有关的要求 |
3.3.1 应用二进制接口 | 阐明了 android.os.Build.CPU_ABI 和 android.os.Build.CPU_ABI2 参数可以使用的值。 |
3.4.1. WebView 兼容性 | 将 Chromium 添加为必需的 WebView 实现。 |
3.7. 虚拟机兼容性 | 添加了 xxhdpi 和 400dpi 屏幕密度方面的要求。 |
3.8.6. 主题 | 进行了一些更新,以反映支持使用半透明系统栏。 |
3.8.12. 位置信息 | 新增加的一节,其中规定必须集中显示位置信息设置。 |
3.8.13. Unicode | 新增加的一节,其中包含支持表情符号方面的要求。 |
3.9. 设备管理 | 强调了预安装的管理应用不能是默认的设备所有者应用。 |
5.1. 媒体编解码器 | 添加了 VP9 解码器方面的要求。添加了硬件 VP8 编解码器方面的推荐规范。 |
5.3. 视频解码 | 添加了 VP9。添加了关于动态分辨率切换方面的建议。 |
5.4. 录音 | 将 REMOTE_SUBMIX 添加为新的必需音频源。规定了必须使用 android.media.audiofx.NoiseSuppressor API。 |
6.2.1 实验性功能 | 新增加的一节,其中介绍了 ART 运行时,并规定必须将 Dalvik 用作默认运行时。 |
7.1.1. 屏幕配置 | 将宽高比 1.85 改成了 1.86。添加了屏幕密度 400dpi。 |
7.1.6. 屏幕类型 | 添加了分辨率配置 640 dpi (4K)。 |
7.2.3. 导航键 | 将“最近用过”功能添加为必需的功能;降低了“菜单”功能的优先级。 |
7.3.6. 温度计 | 将 SENSOR_TYPE_AMBIENT_TEMPERATURE 添加为推荐使用的温度计。 |
7.4.2.2. Wi-Fi 通道直接链路设置 | 新增加的一节,其中包含 Wi-Fi 通道直接链路设置 (TDLS) 支持方面的内容。 |
7.4.4. 近距离无线通信 | 将主机卡模拟 (HCE) 添加为一项要求。将 SNEP GET 改成了逻辑链路控制协议 (LLCP),并将蓝牙对象推送配置添加为一项要求。 |
7.4.6. 同步设置 | 新增加的一节,其中规定必须默认启用自动同步数据功能。 |
7.6.1. 最小内存和存储空间 | 针对内存小于 512MB 的设备添加了 ActivityManager.isLowRamDevice() 设置要求。存储空间要求分别从 512MB 和 1GB 增加到了 1GB 和 2GB。 |
7.6.2. 共享的“外部”存储空间 | 进行了一些编辑方面的更正,例如更改了章节名称,并且将第 9.5 节中的部分内容移到了这一节中。强调了应用可以写入到辅助外部存储空间上其软件包的专用目录。 |
7.7. USB | 添加了以下要求:所有设备都必须报告 USB 序列号。 |
9.5. 多用户支持 | 将不是针对多用户功能的内容移到了第 7.6.2 节。 |
9.7. 内核安全功能 | 改写了内容,以强调:必须将 SELinux 切换到强制模式,并且不得在界面中呈现 SELinux 输出。 |
9.8. 隐私权 | 新增加的一节,其中规定音频和视频录制必须触发持续向用户发送通知的功能。 |
9.9. 全盘加密 | 新增加的一节,其中规定支持锁屏的设备必须支持全盘加密。 |
12. 文档更新日志 | 新增加的一节,其中按照章节汇总了 CDD 中的更新。 |
13. 与我们联系
如需澄清说明以及提出您认为本文档未涵盖的任何问题,请通过 compatibility@android.com 与文档作者联系。