Android 4.0 兼容性定义文档

修订版 4
上次更新时间:2013 年 4 月 21 日

版权所有 © 2012, Google Inc. 保留所有权利。
compatibility@android.com

目录

1. 简介
2. 资源
3. 软件
4. 应用打包兼容性
5. 多媒体兼容性
6. 开发者工具兼容性
7. 硬件兼容性
8. 性能兼容性
9. 安全模型兼容性
10. 软件兼容性测试
11. 可更新的软件
12. 联系我们
附录 A - 蓝牙测试程序

1. 简介

本文档列举了设备与 Android 4.0 兼容必须满足的要求。

“必须”、“不得”、“必需”、“应”、“不应”、“应该”、“不应该”、“建议”、“可以”和“可选”的使用均符合 RFC2119 [资源,1] 中定义的 IETF 标准。

在本文档中,“设备实现者”或“实现者”是指开发运行 Android 4.0 的硬件/软件解决方案的个人或组织。“设备实现”或“实现”是指如此开发的硬件/软件解决方案。

要被视为与 Android 4.0 兼容,设备实现**必须**满足本兼容性定义中提出的要求,包括通过引用并入的任何文档。

如果本定义或第 10 节中描述的软件测试中存在沉默、歧义或不完整之处,则设备实现者有责任确保与现有实现的兼容性。

因此,Android 开放源代码项目 [资源,3] 既是 Android 的参考实现,也是首选实现。强烈建议设备实现者尽可能基于 Android 开放源代码项目提供的“上游”源代码来构建其实现。虽然某些组件在理论上可以替换为其他实现,但强烈建议不要这样做,因为通过软件测试的难度会大大增加。设备实现者有责任确保与标准 Android 实现的完全行为兼容性,包括但不限于兼容性测试套件。最后,请注意,本文档明确禁止某些组件替换和修改。

2. 资源

  1. IETF RFC2119 要求级别:http://www.ietf.org/rfc/rfc2119.txt
  2. Android 兼容性计划概览:https://aosp.org.cn/docs/compatibility/index.html
  3. Android 开放源代码项目:https://aosp.org.cn/
  4. API 定义和文档:https://developer.android.com.cn/reference/packages.html
  5. Android 权限参考:https://developer.android.com.cn/reference/android/Manifest.permission.html
  6. android.os.Build 参考:https://developer.android.com.cn/reference/android/os/Build.html
  7. Android 4.0 允许的版本字符串:https://aosp.org.cn/docs/compatibility/4.0/versions.html
  8. Renderscript:https://developer.android.com.cn/guide/topics/graphics/renderscript.html
  9. 硬件加速:https://developer.android.com.cn/guide/topics/graphics/hardware-accel.html
  10. android.webkit.WebView 类:https://developer.android.com.cn/reference/android/webkit/WebView.html
  11. HTML5:http://www.whatwg.org/specs/web-apps/current-work/multipage/
  12. HTML5 离线功能:http://dev.w3.org/html5/spec/Overview.html#offline
  13. HTML5 视频标记:http://dev.w3.org/html5/spec/Overview.html#video
  14. HTML5/W3C 地理位置 API:http://www.w3.org/TR/geolocation-API/
  15. HTML5/W3C webdatabase API:http://www.w3.org/TR/webdatabase/
  16. HTML5/W3C IndexedDB API:http://www.w3.org/TR/IndexedDB/
  17. Dalvik 虚拟机规范:可在 Android 源代码的 dalvik/docs 中找到
  18. AppWidget:https://developer.android.com.cn/guide/practices/ui_guidelines/widget_design.html
  19. 通知:https://developer.android.com.cn/guide/topics/ui/notifiers/notifications.html
  20. 应用资源:http://code.google.com/android/reference/available-resources.html
  21. 状态栏图标样式指南:https://developer.android.com.cn/guide/practices/ui_guideline /icon_design.html#statusbarstructure
  22. 搜索管理器:https://developer.android.com.cn/reference/android/app/SearchManager.html
  23. Toast:https://developer.android.com.cn/reference/android/widget/Toast.html
  24. 主题:https://developer.android.com.cn/guide/topics/ui/themes.html
  25. R.style 类:https://developer.android.com.cn/reference/android/R.style.html
  26. 动态壁纸:https://android-developers.googleblog.com/2010/02/live-wallpapers.html
  27. Android 设备管理:https://developer.android.com.cn/guide/topics/admin/device-admin.html
  28. android.app.admin.DevicePolicyManager 类:https://developer.android.com.cn/reference/android/app/admin/DevicePolicyManager.html
  29. Android 无障碍服务 API:https://developer.android.com.cn/reference/android/accessibilityservice/package-summary.html
  30. Android 无障碍功能 API:https://developer.android.com.cn/reference/android/view/accessibility/package-summary.html
  31. Eyes Free 项目:http://code.google.com/p/eyes-free
  32. 文本转语音 API:https://developer.android.com.cn/reference/android/speech/tts/package-summary.html
  33. 参考工具文档(适用于 adb、aapt、ddms):https://developer.android.com.cn/guide/developing/tools/index.html
  34. Android apk 文件描述:https://developer.android.com.cn/guide/topics/fundamentals.html
  35. 清单文件:https://developer.android.com.cn/guide/topics/manifest/manifest-intro.html
  36. Monkey 测试工具:https://developer.android.com.cn/studio/test/other-testing-tools/monkey
  37. Android android.content.pm.PackageManager 类和硬件功能列表:https://developer.android.com.cn/reference/android/content/pm/PackageManager.html
  38. 支持多种屏幕:https://developer.android.com.cn/guide/practices/screens_support.html
  39. android.util.DisplayMetrics:https://developer.android.com.cn/reference/android/util/DisplayMetrics.html
  40. android.content.res.Configuration:https://developer.android.com.cn/reference/android/content/res/Configuration.html
  41. android.hardware.SensorEvent:https://developer.android.com.cn/reference/android/hardware/SensorEvent.html
  42. 蓝牙 API:https://developer.android.com.cn/reference/android/bluetooth/package-summary.html
  43. NDEF 推送协议:https://aosp.org.cn/docs/compatibility/ndef-push-protocol.pdf
  44. MIFARE MF1S503X:http://www.nxp.com/documents/data_sheet/MF1S503x.pdf
  45. MIFARE MF1S703X:http://www.nxp.com/documents/data_sheet/MF1S703x.pdf
  46. MIFARE MF0ICU1:http://www.nxp.com/documents/data_sheet/MF0ICU1.pdf
  47. MIFARE MF0ICU2:http://www.nxp.com/documents/short_data_sheet/MF0ICU2_SDS.pdf
  48. MIFARE AN130511:http://www.nxp.com/documents/application_note/AN130511.pdf
  49. MIFARE AN130411:http://www.nxp.com/documents/application_note/AN130411.pdf
  50. 相机方向 API:https://developer.android.com.cn/reference/android/hardware/Camera.html#setDisplayOrientation(int)
  51. android.hardware.Camera:https://developer.android.com.cn/reference/android/hardware/Camera.html
  52. Android 开放配件:https://developer.android.com.cn/guide/topics/usb/accessory.html
  53. USB Host API:https://developer.android.com.cn/guide/topics/usb/host.html
  54. Android 安全性和权限参考:https://developer.android.com.cn/guide/topics/security/security.html
  55. Apps for Android:http://code.google.com/p/apps-for-android
  56. android.app.DownloadManager 类:https://developer.android.com.cn/reference/android/app/DownloadManager.html
  57. Android File Transfer:http://www.android.com/filetransfer
  58. Android 媒体格式:https://developer.android.com.cn/guide/appendix/media-formats.html
  59. HTTP Live Streaming 草案协议:http://tools.ietf.org/html/draft-pantos-http-live-streaming-03
  60. Motion Event API:https://developer.android.com.cn/reference/android/view/MotionEvent.html
  61. 触摸输入配置:https://aosp.org.cn/tech/input/touch-devices.html

许多资源直接或间接来源于 Android 4.0 SDK,并且在功能上与该 SDK 文档中的信息相同。如果本兼容性定义或兼容性测试套件与 SDK 文档不一致,则以 SDK 文档为准。以上参考资料中提供的任何技术细节均被视为本兼容性定义的一部分,并包含在内。

3. 软件

3.1. 托管 API 兼容性

托管(基于 Dalvik)执行环境是 Android 应用的主要载体。Android 应用程序编程接口 (API) 是向在托管 VM 环境中运行的应用公开的一组 Android 平台接口。设备实现**必须**提供 Android 4.0 SDK [资源,4] 公开的任何已记录 API 的完整实现,包括所有已记录的行为。

设备实现**不得**省略任何托管 API,不得更改 API 接口或签名,不得偏离已记录的行为,也不得包含空操作,除非本兼容性定义明确允许。

本兼容性定义允许设备实现省略 Android 包含 API 的某些类型的硬件。在这种情况下,API **必须**仍然存在并以合理的方式运行。请参阅第 7 节,了解此场景的具体要求。

3.2. 软 API 兼容性

除了第 3.1 节中的托管 API 之外,Android 还包含一个重要的运行时“软”API,其形式包括 Intent、权限以及 Android 应用的类似方面,这些方面无法在应用编译时强制执行。

3.2.1. 权限

设备实现者**必须**支持并强制执行权限参考页 [资源,5] 中记录的所有权限常量。请注意,第 10 节列出了与 Android 安全模型相关的其他要求。

3.2.2. 构建参数

Android API 在 android.os.Build 类 [资源,6] 上包含许多常量,旨在描述当前设备。为了在设备实现之间提供一致且有意义的值,下表包含对这些值的格式的额外限制,设备实现**必须**遵守这些限制。

参数 注释
android.os.Build.VERSION.RELEASE 当前正在执行的 Android 系统的版本,采用人类可读的格式。此字段**必须**具有 [资源,7] 中定义的字符串值之一。
android.os.Build.VERSION.SDK 当前正在执行的 Android 系统的版本,采用第三方应用程序代码可访问的格式。对于 Android 4.0.1 - 4.0.2,此字段**必须**具有整数值 14。对于 Android 4.0.3 或更高版本,此字段**必须**具有整数值 15。
android.os.Build.VERSION.SDK_INT 当前正在执行的 Android 系统的版本,采用第三方应用程序代码可访问的格式。对于 Android 4.0.1 - 4.0.2,此字段**必须**具有整数值 14。对于 Android 4.0.3 或更高版本,此字段**必须**具有整数值 15。
android.os.Build.VERSION.INCREMENTAL 设备实现者选择的值,用于指定当前正在执行的 Android 系统的特定版本,采用人类可读的格式。对于提供给最终用户的不同版本,**不得**重复使用此值。此字段的典型用途是指示用于生成版本的版本号或源代码控制更改标识符。对此字段的具体格式没有要求,但它**不得**为 null 或空字符串 ("")。
android.os.Build.BOARD 设备实现者选择的值,用于标识设备使用的特定内部硬件,采用人类可读的格式。此字段的可能用途是指示为设备供电的电路板的特定修订版。此字段的值**必须**编码为 7 位 ASCII,并与正则表达式 "^[a-zA-Z0-9.,_-]+$" 匹配。
android.os.Build.BRAND 设备实现者选择的值,用于标识生产设备的公司、组织、个人等的名称,采用人类可读的格式。此字段的可能用途是指示销售设备的 OEM 和/或运营商。此字段的值**必须**编码为 7 位 ASCII,并与正则表达式 "^[a-zA-Z0-9.,_-]+$" 匹配。
android.os.Build.CPU_ABI 本机代码的指令集(CPU 类型 + ABI 约定)的名称。请参阅第 3.3 节:本机 API 兼容性
android.os.Build.CPU_ABI2 第二个指令集(CPU 类型 + ABI 约定)的名称。请参阅第 3.3 节:本机 API 兼容性
android.os.Build.DEVICE 设备实现者选择的值,用于标识设备主体的特定配置或修订版(有时称为“工业设计”)。此字段的值**必须**编码为 7 位 ASCII,并与正则表达式 "^[a-zA-Z0-9.,_-]+$" 匹配。
android.os.Build.FINGERPRINT 唯一标识此版本的字符串。它**应**具有合理的人类可读性。它**必须**遵循此模板
$(BRAND)/$(PRODUCT)/$(DEVICE):$(VERSION.RELEASE)/$(ID)/$(VERSION.INCREMENTAL):$(TYPE)/$(TAGS)
例如
acme/mydevice/generic:4.0/IRK77/3359:userdebug/test-keys
指纹**不得**包含空格字符。如果上面模板中包含的其他字段包含空格字符,则**必须**在构建指纹中将其替换为另一个字符,例如下划线 ("_") 字符。此字段的值**必须**编码为 7 位 ASCII。
android.os.Build.HARDWARE 硬件名称(来自内核命令行或 /proc)。它**应**具有合理的人类可读性。此字段的值**必须**编码为 7 位 ASCII,并与正则表达式 "^[a-zA-Z0-9.,_-]+$" 匹配。
android.os.Build.HOST 唯一标识构建所基于的主机的字符串,采用人类可读的格式。对此字段的具体格式没有要求,但它**不得**为 null 或空字符串 ("")。
android.os.Build.ID 设备实现者选择的标识符,用于指代特定版本,采用人类可读的格式。此字段可以与 android.os.Build.VERSION.INCREMENTAL 相同,但**应**是一个对最终用户而言足够有意义的值,以便区分软件版本。此字段的值**必须**编码为 7 位 ASCII,并与正则表达式 "^[a-zA-Z0-9.,_-]+$" 匹配。
android.os.Build.MANUFACTURER 产品的原始设备制造商 (OEM) 的商品名称。对此字段的具体格式没有要求,但它**不得**为 null 或空字符串 ("")。
android.os.Build.MODEL 设备实现者选择的值,其中包含最终用户已知的设备名称。这**应该**是设备向最终用户销售和营销时所使用的名称。对此字段的具体格式没有要求,但它**不得**为 null 或空字符串 ("")。
android.os.Build.PRODUCT 设备实现者选择的值,其中包含产品的开发名称或代号 (SKU)。**必须**是人类可读的,但不一定供最终用户查看。此字段的值**必须**编码为 7 位 ASCII,并与正则表达式 "^[a-zA-Z0-9.,_-]+$" 匹配。
android.os.Build.SERIAL 硬件序列号(如果可用)。此字段的值**必须**编码为 7 位 ASCII,并与正则表达式 "^([a-zA-Z0-9]{0,20})$" 匹配。
android.os.Build.TAGS 设备实现者选择的标记的逗号分隔列表,用于进一步区分版本。例如,“unsigned,debug”。此字段的值**必须**编码为 7 位 ASCII,并与正则表达式 "^[a-zA-Z0-9.,_-]+$" 匹配。
android.os.Build.TIME 表示构建发生时间的时间戳的值。
android.os.Build.TYPE 设备实现者选择的值,用于指定构建的运行时配置。此字段**应**具有与三种典型的 Android 运行时配置相对应的值之一:“user”、“userdebug”或“eng”。此字段的值**必须**编码为 7 位 ASCII,并与正则表达式 "^[a-zA-Z0-9.,_-]+$" 匹配。
android.os.Build.USER 生成构建的用户(或自动化用户)的名称或用户 ID。对此字段的具体格式没有要求,但它**不得**为 null 或空字符串 ("")。

3.2.3. Intent 兼容性

设备实现**必须**遵守 Android 的松耦合 Intent 系统,如下节所述。“遵守”是指设备实现者**必须**提供一个 Android Activity 或 Service,该 Activity 或 Service 指定匹配的 Intent 过滤器,并绑定到每个指定的 Intent 模式并为其实现正确的行为。

3.2.3.1. 核心应用 Intent

Android 上游项目定义了许多核心应用,例如联系人、日历、照片库、音乐播放器等。设备实现者**可以**使用备用版本替换这些应用。

但是,任何此类备用版本**必须**遵守上游项目提供的相同 Intent 模式。例如,如果设备包含备用音乐播放器,则它仍然必须遵守第三方应用程序发出的用于选择歌曲的 Intent 模式。

以下应用程序被视为核心 Android 系统应用程序

  • 桌面时钟
  • 浏览器
  • 日历
  • 联系人
  • 图库
  • 全局搜索
  • 启动器
  • 音乐
  • 设置

核心 Android 系统应用程序包括各种 Activity 或 Service 组件,这些组件被视为“公共”组件。也就是说,属性“android:exported”可能不存在,或者可能具有值“true”。

对于核心 Android 系统应用之一中定义的每个 Activity 或 Service(未通过值为“false”的 android:exported 属性标记为非公共),设备实现**必须**包含与核心 Android 系统应用类型相同的组件,该组件实现与核心 Android 系统应用相同的 Intent 过滤器模式。

换句话说,设备实现**可以**替换核心 Android 系统应用;但是,如果这样做,设备实现**必须**支持每个被替换的核心 Android 系统应用定义的**所有** Intent 模式。

3.2.3.2. Intent 替换

由于 Android 是一个可扩展平台,设备实现**必须**允许第三方应用程序替换第 3.2.3.2 节中引用的每个 Intent 模式。上游 Android 开放源代码实现默认允许这样做;设备实现者**不得**将特殊权限附加到系统应用程序对这些 Intent 模式的使用,或阻止第三方应用程序绑定到这些模式并获取这些模式的控制权。此禁令明确包括但不限于禁用“选择器”用户界面,该界面允许用户在所有处理相同 Intent 模式的多个应用程序之间进行选择。

3.2.3.3. Intent 命名空间

设备实现**不得**包含任何 Android 组件,这些组件使用 android.* 或 com.android.* 命名空间中的 ACTION、CATEGORY 或其他键字符串来遵守任何新的 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.3. 原生 API 兼容性

3.3.1 应用二进制接口

在 Dalvik 中运行的托管代码可以调用以应用程序 .apk 文件形式提供的本机代码,该文件是为适当的设备硬件架构编译的 ELF .so 文件。由于本机代码高度依赖于底层处理器技术,因此 Android 在 Android NDK 的 docs/CPU-ARCH-ABIS.txt 文件中定义了许多应用程序二进制接口 (ABI)。如果设备实现与一个或多个已定义的 ABI 兼容,则它**应该**实现与 Android NDK 的兼容性,如下所示。

如果设备实现包含对 Android ABI 的支持,则它

  • **必须**包含对在托管环境中运行的代码的支持,以便使用标准 Java 本机接口 (JNI) 语义调用本机代码。
  • **必须**与下面列表中的每个必需库在源代码(即标头兼容)和二进制代码(对于 ABI)方面兼容
  • **必须**通过 android.os.Build.CPU_ABI API 准确报告设备支持的本机应用程序二进制接口 (ABI)
  • **必须**仅报告最新版本的 Android NDK(位于 docs/CPU-ARCH-ABIS.txt 文件中)中记录的那些 ABI
  • **应该**使用上游 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)
  • libEGL.so(本机 OpenGL 曲面管理)
  • 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 的支持。

本机代码兼容性具有挑战性。因此,应该重申,**强烈**建议设备实现者使用上面列出的库的上游实现,以帮助确保兼容性。

3.4. Web 兼容性

3.4.1. WebView 兼容性

Android 开源实现使用 WebKit 渲染引擎来实现 android.webkit.WebView。由于为 Web 渲染系统开发全面的测试套件是不可行的,设备实现者必须在 WebView 实现中使用 WebKit 的特定上游版本。具体而言

  • 设备实现的 android.webkit.WebView 实现必须基于 Android 4.0 的上游 Android 开源树中的 534.30 WebKit 版本。此版本包含 WebView 的一组特定功能和安全修复程序。设备实现者可以对 WebKit 实现进行自定义;但是,任何此类自定义都不得更改 WebView 的行为,包括渲染行为。
  • WebView 报告的用户代理字符串必须采用以下格式
    Mozilla/5.0 (Linux; U; Android $(VERSION); $(LOCALE); $(MODEL) Build/$(BUILD)) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
    • $(VERSION) 字符串的值必须与 android.os.Build.VERSION.RELEASE 的值相同
    • $(LOCALE) 字符串的值应遵循国家/地区代码和语言的 ISO 惯例,并且应引用设备当前配置的语言环境
    • $(MODEL) 字符串的值必须与 android.os.Build.MODEL 的值相同
    • $(BUILD) 字符串的值必须与 android.os.Build.ID 的值相同

WebView 组件应尽可能多地支持 HTML5 [资源 11]。至少,设备实现必须在 WebView 中支持与 HTML5 相关的以下每个 API

此外,设备实现必须支持 HTML5/W3C webstorage API [资源 15],并且应支持 HTML5/W3C IndexedDB API [资源 16]。请注意,由于 Web 开发标准机构正在过渡到偏向 IndexedDB 而不是 webstorage,因此 IndexedDB 预计将在未来版本的 Android 中成为必需组件。

HTML5 API(如所有 JavaScript API)在 WebView 中必须默认禁用,除非开发人员通过常用的 Android API 显式启用它们。

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 类型(托管、软、原生和 Web)的行为必须与上游 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 添加任何公开的元素(例如类或接口,或现有类或接口的字段或方法)。

“公开的元素”是指任何未使用上游 Android 源代码中使用的“@hide”标记修饰的构造。换句话说,设备实现者不得在上述命名空间中公开新的 API 或更改现有 API。设备实现者可以进行仅限内部的修改,但这些修改不得向开发人员宣传或以其他方式公开。

设备实现者可以添加自定义 API,但任何此类 API 都不得位于另一个组织拥有或引用的命名空间中。例如,设备实现者不得向 com.google.* 或类似命名空间添加 API;只有 Google 可以这样做。同样,Google 不得向其他公司的命名空间添加 API。此外,如果设备实现包含标准 Android 命名空间之外的自定义 API,则这些 API 必须打包在 Android 共享库中,以便只有显式使用它们的应用程序(通过 <uses-library> 机制)才会受到此类 API 增加的内存使用量的影响。

如果设备实现者建议改进上述包命名空间之一(例如通过向现有 API 添加有用的新功能,或添加新的 API),则实现者应访问 source.android.com 并根据该站点上的信息开始贡献更改和代码的过程。

请注意,以上限制与 Java 编程语言中命名 API 的标准约定相对应;本节旨在加强这些约定,并通过将其纳入此兼容性定义使其具有约束力。

3.7. 虚拟机兼容性

设备实现必须支持完整的 Dalvik Executable (DEX) 字节码规范和 Dalvik 虚拟机语义 [资源 17]。

设备实现必须按照上游 Android 平台配置 Dalvik 以分配内存,并按照下表指定。(有关屏幕尺寸和屏幕密度的定义,请参阅 第 7.1.1 节。)

请注意,下面指定的内存值被认为是最小值,设备实现可以为每个应用程序分配更多内存。

屏幕尺寸 屏幕密度 应用程序内存
小 / 普通 / 大 ldpi / mdpi 16MB
小 / 普通 / 大 tvdpi / hdpi 32MB
小 / 普通 / 大 xhdpi 64MB
xlarge mdpi 32MB
xlarge tvdpi / hdpi 64MB
xlarge xhdpi 128MB

3.8. 用户界面兼容性

3.8.1. Widget

Android 定义了一种组件类型以及相应的 API 和生命周期,允许应用程序向最终用户公开“AppWidget”[资源 18]。Android 开源参考版本包含一个启动器应用程序,其中包含允许用户从主屏幕添加、查看和删除 AppWidget 的用户界面功能。

设备实现可以替换参考启动器(即主屏幕)。备用启动器应包括对 AppWidget 的内置支持,并公开用户界面功能,以便在启动器内直接添加、配置、查看和删除 AppWidget。备用启动器可以省略这些用户界面元素;但是,如果省略了这些元素,则设备实现必须提供一个可从启动器访问的单独应用程序,允许用户添加、配置、查看和删除 AppWidget。

设备实现必须能够渲染标准网格尺寸为 4 x 4 的小部件。(有关详细信息,请参阅 Android SDK 文档中的 App Widget 设计指南 [资源 18]。

3.8.2. 通知

Android 包含允许开发人员使用设备的硬件和软件功能来通知用户重要事件的 API [资源 19]。

一些 API 允许应用程序使用硬件(特别是声音、振动和光线)执行通知或引起注意。设备实现必须支持使用硬件功能的通知,如 SDK 文档中所述,并在设备实现硬件允许的范围内。例如,如果设备实现包含振动器,则必须正确实现振动 API。如果设备实现缺少硬件,则相应的 API 必须实现为无操作。请注意,此行为在 第 7 节中进一步详细说明。

此外,实现必须正确渲染 API [资源 20] 或状态/系统栏图标样式指南 [资源 21] 中提供的所有资源(图标、声音文件等)。设备实现者可以为通知提供与参考 Android 开源实现提供的用户体验不同的用户体验;但是,此类备用通知系统必须支持现有的通知资源,如上所述。

Android 4.0 包括对富通知的支持,例如用于正在进行的通知的交互式视图。设备实现必须正确显示和执行富通知,如 Android API 文档中所述。

Android 包含 API [资源 22],允许开发人员将搜索集成到他们的应用程序中,并将他们应用程序的数据公开到全局系统搜索中。一般来说,此功能包括一个单一的、系统范围的用户界面,允许用户输入查询,在用户键入时显示建议,并显示结果。Android API 允许开发人员重用此界面以在其自己的应用程序中提供搜索,并允许开发人员向公共全局搜索用户界面提供结果。

设备实现必须包含一个单一的、共享的、系统范围的搜索用户界面,该界面能够实时响应用户输入提供建议。设备实现必须实现允许开发人员重用此用户界面以在其自己的应用程序中提供搜索的 API。设备实现必须实现允许第三方应用程序在全局搜索模式下运行时向搜索框添加建议的 API。如果没有安装任何利用此功能的第三方应用程序,则默认行为应是显示 Web 搜索引擎结果和建议。

3.8.4. Toast

应用程序可以使用“Toast”API(在 [资源 23] 中定义)向最终用户显示简短的非模态字符串,这些字符串会在短暂时间后消失。设备实现必须以某种高可见性的方式向最终用户显示来自应用程序的 Toast。

3.8.5. 主题

Android 提供“主题”作为应用程序跨整个 Activity 或应用程序应用样式的机制。Android 3.0 引入了一个新的“Holo”或“全息”主题,作为一组定义的样式,供应用程序开发人员在想要匹配 Android SDK [资源 24] 定义的 Holo 主题外观和感觉时使用。设备实现不得更改向应用程序公开的任何 Holo 主题属性 [资源 25]。

Android 4.0 引入了一个新的“设备默认”主题,作为一组定义的样式,供应用程序开发人员在想要匹配设备实现者定义的设备主题的外观和感觉时使用。设备实现可以修改向应用程序公开的 DeviceDefault 主题属性 [资源 25]。

3.8.6. 动态壁纸

Android 定义了一种组件类型以及相应的 API 和生命周期,允许应用程序向最终用户公开一个或多个“动态壁纸”[资源 26]。动态壁纸是动画、图案或类似的图像,具有有限的输入功能,作为壁纸显示在其他应用程序后面。

如果硬件能够以合理的帧速率运行所有动态壁纸,且功能不受限制,并且对其他应用程序没有不利影响,则认为该硬件能够可靠地运行动态壁纸。如果硬件的限制导致壁纸和/或应用程序崩溃、故障、消耗过多的 CPU 或电池电量或以低得无法接受的帧速率运行,则认为该硬件无法运行动态壁纸。例如,某些动态壁纸可能使用 Open GL 1.0 或 2.0 上下文来渲染其内容。动态壁纸将无法在不支持多个 OpenGL 上下文的硬件上可靠运行,因为动态壁纸对 OpenGL 上下文的使用可能会与也使用 OpenGL 上下文的其他应用程序冲突。

能够如上所述可靠运行动态壁纸的设备实现应实现动态壁纸。确定为无法如上所述可靠运行动态壁纸的设备实现不得实现动态壁纸。

3.8.7. 最近使用的应用显示

上游 Android 4.0 源代码包含一个用户界面,用于显示最近使用的应用程序,并使用用户上次离开应用程序时的应用程序图形状态的缩略图图像。设备实现可以更改或消除此用户界面;但是,计划在未来版本的 Android 中更广泛地使用此功能。强烈建议设备实现使用上游 Android 4.0 用户界面(或类似的基于缩略图的界面)来显示最近使用的应用程序,否则它们可能与未来版本的 Android 不兼容。

3.8.8. 输入管理设置

Android 4.0 包括对输入法引擎的支持。Android 4.0 API 允许自定义应用程序 IME 指定用户可调整的设置。设备实现必须包括一种方法,供用户在显示提供此类用户设置的 IME 时始终访问 IME 设置。

3.9 设备管理

Android 4.0 包括允许安全感知应用程序在系统级别执行设备管理功能的功能,例如通过 Android 设备管理 API [资源 27] 强制执行密码策略或执行远程擦除。设备实现必须提供 DevicePolicyManager 类 [资源 28] 的实现,并且应支持 Android SDK 文档 [资源 27] 中定义的全部设备管理策略。

如果设备实现不支持全部设备管理策略,则不得允许启用设备管理应用程序。具体而言,如果设备不支持所有设备管理策略,则设备实现必须响应 android.app.admin.DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN intent,但必须显示一条消息,通知用户设备不支持设备管理。

3.10 无障碍功能

Android 4.0 提供了一个辅助功能层,帮助残疾用户更轻松地导航他们的设备。此外,Android 4.0 提供了平台 API,使辅助功能服务实现能够接收用户和系统事件的回调,并生成备用反馈机制,例如文本到语音转换、触觉反馈和轨迹球/D-pad 导航 [资源 29]。设备实现必须提供与默认 Android 实现一致的 Android 辅助功能框架的实现。具体而言,设备实现必须满足以下要求。

  • 设备实现必须通过 android.accessibilityservice API [资源 30] 支持第三方辅助功能服务实现。
  • 设备实现必须生成 AccessibilityEvent 并以与默认 Android 实现一致的方式将这些事件传递给所有注册的 AccessibilityService 实现。
  • 设备实现必须提供用户可访问的机制来启用和禁用辅助功能服务,并且必须响应 android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS intent 显示此界面。

此外,设备实现应在设备上提供辅助功能服务的实现,并且应提供一种机制,供用户在设备设置期间启用辅助功能服务。Eyes Free 项目 [资源 31] 提供了一个辅助功能服务的开源实现。

3.11 文本转语音

Android 4.0 包括允许应用程序使用文本到语音转换 (TTS) 服务的 API,并允许服务提供商提供 TTS 服务的实现 [资源 32]。设备实现必须满足与 Android TTS 框架相关的以下要求

  • 设备实现必须支持 Android TTS 框架 API,并且应包含支持设备上可用语言的 TTS 引擎。请注意,上游 Android 开源软件包含功能齐全的 TTS 引擎实现。
  • 设备实现必须支持安装第三方 TTS 引擎。
  • 设备实现必须提供用户可访问的界面,允许用户选择在系统级别使用的 TTS 引擎。

4. 应用打包兼容性

设备实现必须安装和运行由官方 Android SDK [资源 33] 中包含的“aapt”工具生成的 Android “.apk”文件。

设备实现不得扩展 .apk [资源 34]、Android Manifest [资源 35]、Dalvik 字节码 [资源 17] 或 renderscript 字节码格式,以防止这些文件在其他兼容设备上正确安装和运行。设备实现者应使用 Dalvik 的参考上游实现和参考实现的包管理系统。

5. 多媒体兼容性

设备实现必须至少包含一种形式的音频输出,例如扬声器、耳机插孔、外接扬声器连接等。

5.1. 媒体编解码器

设备实现必须支持 Android SDK 文档 [资源 58] 中指定的核心媒体格式,除非本文档明确允许。具体而言,设备实现必须支持下表定义的媒体格式、编码器、解码器、文件类型和容器格式。所有这些编解码器都在 Android 开源项目的首选 Android 实现中作为软件实现提供。

请注意,Google 和开放手机联盟均未声明这些编解码器不受第三方专利的限制。有意在硬件或软件产品中使用此源代码的人员应注意,此代码的实现(包括在开源软件或共享软件中)可能需要从相关专利持有人处获得专利许可。

请注意,这些表格未列出大多数视频编解码器的特定比特率要求,因为当前的设备硬件不一定支持与相关标准指定的必需比特率完全匹配的比特率。相反,设备实现应支持硬件上实际可行的最高比特率,直至规范定义的限制。

类型 格式/编解码器 编码器 解码器 详细信息 文件类型/容器格式
音频 AAC LC/LTP 必需
对于包含麦克风硬件并定义 android.hardware.microphone 的设备实现是必需的。
必需 单声道/立体声内容,标准比特率高达 160 kbps,采样率从 8 到 48kHz 的任意组合
  • 3GPP (.3gp)
  • MPEG-4 (.mp4, .m4a)
  • ADTS 原始 AAC (.aac,在 Android 3.1+ 中解码,在 Android 4.0+ 中编码,不支持 ADIF)
  • MPEG-TS (.ts,不可搜索,Android 3.0+)
HE-AACv1 (AAC+)   必需
HE-AACv2 (增强型 AAC+)   必需
AMR-NB 必需
对于包含麦克风硬件并定义 android.hardware.microphone 的设备实现是必需的。
必需 4.75 至 12.2 kbps,以 8kHz 采样 3GPP (.3gp)
AMR-WB 必需
对于包含麦克风硬件并定义 android.hardware.microphone 的设备实现是必需的。
必需 9 个速率,从 6.60 kbit/s 到 23.85 kbit/s,以 16kHz 采样 3GPP (.3gp)
FLAC   必需
(Android 3.1+)
单声道/立体声(无多声道)。采样率高达 48 kHz(但在具有 44.1 kHz 输出的设备上建议高达 44.1 kHz,因为 48 到 44.1 kHz 降采样器不包含低通滤波器)。建议 16 位;不为 24 位应用抖动。 仅限 FLAC (.flac)
MP3   必需 单声道/立体声 8-320Kbps 恒定 (CBR) 或可变比特率 (VBR) MP3 (.mp3)
MIDI   必需 MIDI 类型 0 和 1。DLS 版本 1 和 2。XMF 和 Mobile XMF。支持铃声格式 RTTTL/RTX、OTA 和 iMelody
  • 类型 0 和 1 (.mid, .xmf, .mxmf)
  • RTTTL/RTX (.rtttl, .rtx)
  • OTA (.ota)
  • iMelody (.imy)
Vorbis   必需  
  • Ogg (.ogg)
  • Matroska (.mkv)
PCM/WAVE   必需 8 位和 16 位线性 PCM(速率高达硬件限制) WAVE (.wav)
图像 JPEG 必需 必需 基本+渐进 JPEG (.jpg)
GIF   必需   GIF (.gif)
PNG 必需 必需   PNG (.png)
BMP   必需   BMP (.bmp)
WEBP 必需 必需   WebP (.webp)
视频 H.263 必需
对于包含摄像头硬件并定义 android.hardware.cameraandroid.hardware.camera.front 的设备实现是必需的。
必需  
  • 3GPP (.3gp)
  • MPEG-4 (.mp4)
H.264 AVC 必需
对于包含摄像头硬件并定义 android.hardware.cameraandroid.hardware.camera.front 的设备实现是必需的。
必需 Baseline Profile (BP)
  • 3GPP (.3gp)
  • MPEG-4 (.mp4)
  • MPEG-TS (.ts,仅 AAC 音频,不可搜索,Android 3.0+)
MPEG-4 SP   必需   3GPP (.3gp)
VP8   必需
(Android 2.3.3+)
  WebM (.webm) 和 Matroska (.mkv, Android 4.0+)

5.2 视频编码

包含后置摄像头并声明 android.hardware.camera 的 Android 设备实现应支持以下视频编码配置文件。

  SD(低质量) SD(高质量) HD(如果硬件支持)
视频编解码器 H.264 Baseline Profile H.264 Baseline Profile H.264 Baseline Profile
视频分辨率 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

5.3. 音频录制

当应用程序使用 android.media.AudioRecord API 开始录制音频流时,包含麦克风硬件并声明 android.hardware.microphone 的设备实现必须以以下每种行为采样和录制音频

  • 设备应表现出大致平坦的幅度与频率特性;具体而言,在 100 Hz 至 4000 Hz 范围内为 ±3 dB
  • 音频输入灵敏度应设置为在 1000 Hz 下的 90 dB 声功率级 (SPL) 源产生 16 位采样的 RMS 为 2500。
  • PCM 幅度级别应在线性跟踪输入 SPL 变化,范围至少为 30 dB,从 -18 dB 到 +12 dB re 麦克风处的 90 dB SPL。
  • 在 100 Hz 至 4000 Hz 范围内,在 90 dB SPL 输入电平下,总谐波失真应小于 1%。

除了上述录制规范外,当应用程序已开始使用 android.media.MediaRecorder.AudioSource.VOICE_RECOGNITION 音频源录制音频流时

  • 如果存在降噪处理,则必须禁用。
  • 如果存在自动增益控制,则必须禁用。

注意:虽然上面概述的某些要求对于 Android 4.0 被表述为“应”,但未来版本的兼容性定义计划将这些要求更改为“必须”。也就是说,这些要求在 Android 4.0 中是可选的,但在未来版本中将是必需的。运行 Android 4.0 的现有和新设备强烈建议在 Android 4.0 中满足这些要求,否则它们在升级到未来版本时将无法获得 Android 兼容性。

5.4. 音频延迟

音频延迟大致定义为应用程序请求音频播放或录制操作与设备实现实际开始操作之间的时间间隔。许多类别的应用程序依赖于短延迟,以实现实时效果,例如音效或 VOIP 通信。包含麦克风硬件并声明 android.hardware.microphone 的设备实现应满足本节中概述的所有音频延迟要求。有关设备实现可以省略麦克风硬件的条件的详细信息,请参阅 第 7 节

在本节中,为了解释目的

  • “冷输出延迟”定义为应用程序请求音频播放与声音开始播放之间的时间间隔,此时音频系统在请求之前一直处于空闲和断电状态
  • “热输出延迟”定义为应用程序请求音频播放与声音开始播放之间的时间间隔,此时音频系统最近使用过但目前处于空闲状态(即静音)
  • “连续输出延迟”定义为当设备当前正在播放音频时,应用程序发出要播放的样本与扬声器物理播放相应声音之间的时间间隔
  • “冷输入延迟”定义为应用程序请求音频录制与通过其回调将第一个样本传递给应用程序之间的时间间隔,此时音频系统和麦克风在请求之前一直处于空闲和断电状态
  • “连续输入延迟”定义为当环境声音发生时,以及当与该声音对应的样本通过其回调传递给录制应用程序之间的时间间隔,此时设备处于录制模式

使用上述定义,设备实现应表现出以下每种属性

  • 冷输出延迟为 100 毫秒或更短
  • 热输出延迟为 10 毫秒或更短
  • 连续输出延迟为 45 毫秒或更短
  • 冷输入延迟为 100 毫秒或更短
  • 连续输入延迟为 50 毫秒或更短

注意:虽然上面概述的要求对于 Android 4.0 被表述为“应”,但未来版本的兼容性定义计划将这些要求更改为“必须”。也就是说,这些要求在 Android 4.0 中是可选的,但在未来版本中将是必需的。运行 Android 4.0 的现有和新设备强烈建议在 Android 4.0 中满足这些要求,否则它们在升级到未来版本时将无法获得 Android 兼容性。

如果设备实现满足本节的要求,则它可以通过 android.content.pm.PackageManager 类报告对低延迟音频的支持,方法是报告功能“android.hardware.audio.low-latency”。[资源 37] 相反,如果设备实现不满足这些要求,则不得报告对低延迟音频的支持。

5.5. 网络协议

设备必须支持 Android SDK 文档 [资源 58] 中指定的音频和视频播放的媒体网络协议。具体而言,设备必须支持以下媒体网络协议

  • RTSP (RTP, SDP)
  • HTTP(S) 渐进式流媒体
  • HTTP(S) Live Streaming 草案协议,版本 3 [资源 59]

6. 开发者工具兼容性

设备实现必须支持 Android SDK 中提供的 Android 开发人员工具。具体而言,与 Android 兼容的设备必须与以下工具兼容

  • Android 调试桥 (adb) [资源 33]
    设备实现必须支持 Android SDK 文档中记录的所有 adb 功能。设备端 adb 守护程序必须默认处于非活动状态,并且必须有用户可访问的机制来打开 Android 调试桥。
  • Dalvik 调试监视器服务 (ddms) [资源 33]
    设备实现必须支持 Android SDK 文档中记录的所有 ddms 功能。由于 ddms 使用 adb,因此对 ddms 的支持应默认处于非活动状态,但只要用户已激活 Android 调试桥(如上所述),就必须支持。
  • Monkey [资源 36]
    设备实现**必须**包含 Monkey 框架,并使其可供应用程序使用。

大多数基于 Linux 的系统和 Apple Macintosh 系统使用标准的 Android SDK 工具即可识别 Android 设备,无需额外支持;但是,Microsoft Windows 系统通常需要用于新型 Android 设备的驱动程序。(例如,新的供应商 ID,有时还有新的设备 ID,需要用于 Windows 系统的自定义 USB 驱动程序。)如果设备实现未被标准 Android SDK 中提供的 adb 工具识别,则设备实现者**必须**提供 Windows 驱动程序,以允许开发人员使用 adb 协议连接到设备。这些驱动程序**必须**为 32 位和 64 位版本的 Windows XP、Windows Vista 和 Windows 7 提供。

7. 硬件兼容性

如果设备包含特定的硬件组件,并且该组件具有针对第三方开发人员的相应 API,则设备实现**必须**按照 Android SDK 文档中的描述实现该 API。如果 SDK 中的 API 与声明为可选的硬件组件交互,并且设备实现不具备该组件

  • 组件 API 的完整类定义(如 SDK 文档所述)**仍然必须**存在
  • API 的行为**必须**以某种合理的方式实现为空操作
  • 在 SDK 文档允许的情况下,API 方法**必须**返回 null 值
  • 在 SDK 文档不允许使用 null 值的情况下,API 方法**必须**返回类的空操作实现
  • API 方法**不得**抛出 SDK 文档中未记录的异常

这些要求适用的典型场景示例是电话 API:即使在非电话设备上,这些 API 也**必须**实现为合理的空操作。

设备实现**必须**通过 android.content.pm.PackageManager 类上的 getSystemAvailableFeatures()hasSystemFeature(String) 方法准确报告准确的硬件配置信息。 [Resources, 37]

7.1. 显示和图形

Android 4.0 包含自动调整应用程序资源和 UI 布局以适应设备的工具,以确保第三方应用程序在各种硬件配置上良好运行 [Resources, 38]。设备**必须**正确实现这些 API 和行为,如本节详细说明。

本节要求引用的单位定义如下

  • “物理对角线尺寸”是显示器发光部分两个相对角之间的英寸距离。
  • “dpi”(意为“每英寸点数”)是 1 英寸线性水平或垂直跨度所包含的像素数。在列出 dpi 值的情况下,水平和垂直 dpi 都必须在范围内。
  • “纵横比”是屏幕较长尺寸与较短尺寸之比。例如,480x854 像素的显示屏将为 854 / 480 = 1.779,或大约“16:9”。
  • “密度无关像素”或 (“dp”) 是标准化为 160 dpi 屏幕的虚拟像素单位,计算公式为:pixels = dps * (density / 160)

7.1.1. 屏幕配置

屏幕尺寸

Android UI 框架支持各种不同的屏幕尺寸,并允许应用程序通过 android.content.res.Configuration.screenLayoutSCREENLAYOUT_SIZE_MASK 查询设备屏幕尺寸(也称为“屏幕布局”)。设备实现**必须**按照 Android SDK 文档 [Resources, 38] 中定义并由上游 Android 平台确定的方式报告正确的屏幕尺寸。具体而言,设备实现**必须**根据以下逻辑密度无关像素 (dp) 屏幕尺寸报告正确的屏幕尺寸。

  • 设备**必须**具有至少 426 dp x 320 dp(“小”)的屏幕尺寸
  • 报告屏幕尺寸为“正常”的设备**必须**具有至少 470 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.85 (16:9) 之间。

屏幕密度

Android UI 框架定义了一组标准逻辑密度,以帮助应用程序开发人员定位应用程序资源。设备实现**必须**通过 android.util.DisplayMetrics API 报告以下标准 Android 框架密度之一,并且**必须**以此标准密度执行应用程序。

  • 120 dpi,称为“ldpi”
  • 160 dpi,称为“mdpi”
  • 213 dpi,称为“tvdpi”
  • 240 dpi,称为“hdpi”
  • 320 dpi,称为“xhdpi”
设备实现**应该**定义在数值上最接近屏幕物理密度的标准 Android 框架密度,除非该逻辑密度将报告的屏幕尺寸推低至低于最小支持尺寸。如果数值上最接近物理密度的标准 Android 框架密度导致屏幕尺寸小于最小支持的兼容屏幕尺寸(320 dp 宽度),则设备实现**应该**报告下一个最低的标准 Android 框架密度。

7.1.2. 显示指标

设备实现**必须**报告 android.util.DisplayMetrics [Resources, 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 文档中所述。设备实现**还必须**支持 Android RenderScript,如 Android SDK 文档 [Resources, 8] 中所述。

设备实现**还必须**正确地将自身标识为支持 OpenGL ES 1.0 和 2.0。也就是说

  • 托管 API(例如通过 GLES10.getString() 方法)**必须**报告对 OpenGL ES 1.0 和 2.0 的支持
  • 本机 C/C++ OpenGL API(即,通过 libGLES_v1CM.so、libGLES_v2.so 或 libEGL.so 提供给应用程序的 API)**必须**报告对 OpenGL ES 1.0 和 2.0 的支持。

设备实现**可以**实现任何所需的 OpenGL ES 扩展。但是,设备实现**必须**通过 OpenGL ES 托管 API 和本机 API 报告它们确实支持的所有扩展字符串,反之,**不得**报告它们不支持的扩展字符串。

请注意,Android 4.0 包含对应用程序选择性地指定它们需要特定的 OpenGL 纹理压缩格式的支持。这些格式通常是供应商特定的。Android 4.0 不要求设备实现实现任何特定的纹理压缩格式。但是,它们**应该**通过 OpenGL API 中的 getString() 方法准确报告它们确实支持的任何纹理压缩格式。

Android 3.0 引入了一种机制,允许应用程序通过使用清单标记 android:hardwareAccelerated 或直接 API 调用 [Resources, 9] 声明它们想要在应用程序、Activity、Window 或 View 级别启用 2D 图形硬件加速。

在 Android 4.0 中,设备实现**必须**默认启用硬件加速,并且如果开发者通过设置 android:hardwareAccelerated="false" 或直接通过 Android View API 禁用硬件加速,则**必须**禁用硬件加速。

此外,设备实现**必须**表现出与 Android SDK 文档中关于硬件加速 [Resources, 9] 一致的行为。

Android 4.0 包含一个 TextureView 对象,允许开发人员将硬件加速的 OpenGL ES 纹理直接集成为 UI 层次结构中的渲染目标。设备实现**必须**支持 TextureView API,并且**必须**表现出与上游 Android 实现一致的行为。

7.1.5. 旧版应用兼容模式

Android 4.0 指定了一种“兼容模式”,在该模式下,框架以“正常”屏幕尺寸等效模式(320dp 宽度)运行,以使未针对早于屏幕尺寸独立性的旧版本 Android 开发的旧版应用程序受益。设备实现**必须**包含对上游 Android 开源代码实现的旧版应用程序兼容模式的支持。也就是说,设备实现**不得**更改激活兼容模式的触发器或阈值,并且**不得**更改兼容模式本身的行为。

7.1.6. 屏幕类型

设备实现屏幕分为两种类型之一

  • 固定像素显示实现:屏幕是单个面板,仅支持单个像素宽度和高度。通常,屏幕与设备物理集成。示例包括手机、平板电脑等。
  • 可变像素显示实现:设备实现要么没有嵌入式屏幕,并且包含用于显示的视频输出端口(如 VGA 或 HDMI),要么具有可以更改像素尺寸的嵌入式屏幕。示例包括电视、机顶盒等。

固定像素设备实现

固定像素设备实现**可以**使用任何像素尺寸的屏幕,前提是它们满足本兼容性定义中定义的要求。

固定像素实现**可以**包含用于外部显示的视频输出端口。但是,如果该显示器曾经用于运行应用程序,则设备**必须**满足以下要求

  • 设备**必须**报告与固定像素显示相同的屏幕配置和显示指标,如第 7.1.1 节和 7.1.2 节详细说明。
  • 设备**必须**报告与固定像素显示相同的逻辑密度。
  • 设备**必须**报告与固定像素显示相同或非常接近的屏幕尺寸。

例如,对角线尺寸为 7 英寸、分辨率为 1024x600 像素的平板电脑被视为固定像素大型 mdpi 显示实现。如果它包含以 720p 或 1080p 显示的视频输出端口,则设备实现**必须**缩放输出,以便应用程序仅在大型 mdpi 窗口中执行,而不管固定像素显示器或视频输出端口是否正在使用。

可变像素设备实现

可变像素设备实现**必须**支持 1280x720 或 1920x1080 中的一个或两个(即 720p 或 1080p)。具有可变像素显示器的设备实现**不得**支持任何其他屏幕配置或模式。具有可变像素屏幕的设备实现**可以**在运行时或启动时更改屏幕配置或模式。例如,机顶盒用户可以用 1080p 显示器替换 720p 显示器,并且设备实现可以相应地进行调整。

此外,可变像素设备实现**必须**为这些像素尺寸报告以下配置桶

  • 1280x720(也称为 720p):“大”屏幕尺寸,“tvdpi”(213 dpi)密度
  • 1920x1080(也称为 1080p):“大”屏幕尺寸,“xhdpi”(320 dpi)密度

为了清楚起见,在 Android 4.0 中,具有可变像素尺寸的设备实现仅限于 720p 或 1080p,并且**必须**配置为报告如上所述的屏幕尺寸和密度桶。

7.1.7. 屏幕技术

Android 平台包含允许应用程序将丰富的图形渲染到显示器的 API。设备**必须**支持 Android SDK 定义的所有这些 API,除非本文档中明确允许。具体而言

  • 设备**必须**支持能够渲染 16 位彩色图形的显示器,并且**应该**支持能够渲染 24 位彩色图形的显示器。
  • 设备**必须**支持能够渲染动画的显示器。
  • 使用的显示技术**必须**具有介于 0.9 和 1.1 之间的像素纵横比 (PAR)。也就是说,像素纵横比**必须**接近正方形 (1.0),公差为 10%。

7.2. 输入设备

7.2.1. 键盘

设备实现

  • **必须**包含对输入管理框架的支持(该框架允许第三方开发人员创建输入法引擎 - 即软键盘),详情请访问 https://developer.android.com.cn
  • **必须**提供至少一个软键盘实现(无论是否存在硬键盘)
  • **可以**包含其他软键盘实现
  • **可以**包含硬件键盘
  • **不得**包含与 android.content.res.Configuration.keyboard [Resources, 40] 中指定的格式之一(即 QWERTY 或 12 键)不匹配的硬件键盘

7.2.2. 非触摸式导航

设备实现

  • **可以**省略非触摸导航选项(即,可以省略轨迹球、d-pad 或滚轮)
  • **必须**报告 android.content.res.Configuration.navigation [Resources, 40] 的正确值
  • **必须**为文本的选择和编辑提供合理的替代用户界面机制,该机制与输入法引擎兼容。上游 Android 开源软件包含一种适用于缺少非触摸导航输入的设备的选择机制。

7.2.3. 导航键

Home、Menu 和 Back 功能对于 Android 导航范例至关重要。设备实现**必须**在运行应用程序时始终使用户可以使用这些功能。这些功能**可以**通过专用物理按钮(例如机械或电容式触摸按钮)实现,或者**可以**使用专用软件键、手势、触摸面板等实现。Android 4.0 支持这两种实现方式。

设备实现**可以**使用屏幕的独特部分来显示导航键,但如果这样做,**必须**满足以下要求

  • 设备实现导航键**必须**使用屏幕的独特部分,应用程序不可用,并且**不得**遮挡或以其他方式干扰应用程序可用的屏幕部分。
  • 设备实现**必须**向应用程序提供满足 第 7.1.1 节 中定义的显示器部分要求。
  • 当应用程序未指定系统 UI 模式或指定 SYSTEM_UI_FLAG_VISIBLE 时,设备实现**必须**显示导航键。
  • 当应用程序指定 SYSTEM_UI_FLAG_LOW_PROFILE 时,设备实现**必须**以不显眼的“低调”(例如,变暗)模式呈现导航键。
  • 当应用程序指定 SYSTEM_UI_FLAG_HIDE_NAVIGATION 时,设备实现**必须**隐藏导航键。
  • 当 targetSdkVersion <= 10 时,设备实现**必须**向应用程序呈现 Menu 键,当 targetSdkVersion > 10 时,**不应**呈现 Menu 键。

7.2.4. 触摸屏输入

设备实现

  • **必须**具有某种类型的指针输入系统(鼠标式或触摸式)
  • **可以**具有任何模式的触摸屏(例如电容式或电阻式)
  • **应该**支持完全独立跟踪的指针,如果触摸屏支持多个指针
  • **必须**报告 android.content.res.Configuration.touchscreen [Resources, 40] 的值,该值对应于设备上特定触摸屏的类型

Android 4.0 包括对各种触摸屏、触摸板和假触摸输入设备的支持。基于触摸屏的设备实现与显示器 [Resources, 61] 相关联,以便用户对直接操作屏幕上的项目留下印象。由于用户直接触摸屏幕,因此系统不需要任何额外的辅助功能来指示正在操作的对象。相比之下,假触摸界面提供了一种用户输入系统,该系统近似于触摸屏功能的子集。例如,驱动屏幕光标的鼠标或遥控器近似于触摸,但要求用户首先指向或聚焦,然后单击。诸如鼠标、触摸板、基于陀螺仪的空中鼠标、陀螺仪指针、操纵杆和多点触控触摸板之类的众多输入设备可以支持假触摸交互。Android 4.0 包括功能常量 android.hardware.faketouch,该常量对应于高保真非触摸(即基于指针)输入设备,例如鼠标或触摸板,它可以充分模拟基于触摸的输入(包括基本手势支持),并指示设备支持触摸屏功能的模拟子集。声明假触摸功能的设备实现**必须**满足 第 7.2.5 节 中的假触摸要求。

设备实现**必须**报告与所用输入类型对应的正确功能。包含触摸屏(单点触摸或更好)的设备实现**还必须**报告平台功能常量 android.hardware.faketouch。不包含触摸屏(并且仅依赖指针设备)的设备实现**不得**报告任何触摸屏功能,并且如果它们满足 第 7.2.5 节 中的假触摸要求,则**必须**仅报告 android.hardware.faketouch

7.2.5. 伪触摸输入

声明支持 android.hardware.faketouch 的设备实现

  • **必须**报告指针位置的绝对 X 和 Y 屏幕位置,并在屏幕上显示可视指针 [Resources, 60]
  • **必须**报告触摸事件,其动作代码 [Resources, 60] 指定指针在屏幕上 downup 时发生的状态更改 [Resources, 60]
  • **必须**支持屏幕上对象的指针 downup,这允许用户模拟点击屏幕上的对象
  • **必须**支持指针 down、指针 up、指针 down,然后在屏幕上对象上的同一位置在时间阈值内指针 up,这允许用户模拟双击屏幕上的对象 [Resources, 60]
  • **必须**支持屏幕上任意点的指针 down、指针移动到屏幕上的任何其他任意点,然后是指针 up,这允许用户模拟触摸拖动
  • **必须**支持指针 down,然后允许用户快速将对象移动到屏幕上的不同位置,然后在屏幕上指针 up,这允许用户在屏幕上快速滑动对象

声明支持 android.hardware.faketouch.multitouch.distinct 的设备**必须**满足上述假触摸的要求,并且**还必须**支持对两个或多个独立指针输入的独特跟踪。

7.2.6. 麦克风

设备实现**可以**省略麦克风。但是,如果设备实现省略了麦克风,则**不得**报告 android.hardware.microphone 功能常量,并且**必须**按照 第 7 节 的规定,将音频录制 API 实现为空操作。相反,拥有麦克风的设备实现

  • **必须**报告 android.hardware.microphone 功能常量
  • **应该**满足 第 5.3 节 中的音频质量要求
  • **应该**满足 第 5.4 节 中的音频延迟要求

7.3. 传感器

Android 4.0 包含用于访问各种传感器类型的 API。设备实现通常**可以**省略这些传感器,如下面的小节中规定。如果设备包含具有针对第三方开发人员的相应 API 的特定传感器类型,则设备实现**必须**按照 Android SDK 文档中的描述实现该 API。例如,设备实现

  • **必须**根据 android.content.pm.PackageManager 类准确报告传感器的存在或不存在。 [Resources, 37]
  • **必须**通过 SensorManager.getSensorList() 和类似方法返回支持的传感器的准确列表
  • **必须**对所有其他传感器 API 表现出合理的行为(例如,当应用程序尝试注册侦听器时返回 true 或 false,当相应的传感器不存在时,不调用传感器侦听器等)
  • **必须**使用 Android SDK 文档 [Resources, 41] 中定义的每种传感器类型的相关国际单位制(即公制)值报告所有传感器测量值

上述列表并非详尽无遗;Android SDK 的文档化行为应被视为权威。

某些传感器类型是合成的,这意味着它们可以从一个或多个其他传感器提供的数据中派生出来。(示例包括方向传感器和线性加速度传感器。)设备实现**应该**在包含必备物理传感器时实现这些传感器类型。

Android 4.0 API 引入了“流式”传感器的概念,即连续返回数据而不是仅在数据更改时返回数据的传感器。对于 Android 4.0 SDK 文档指示为流式传感器的任何 API,设备实现**必须**持续提供周期性数据样本。

7.3.1. 加速度计

设备实现**应该**包含 3 轴加速度计。如果设备实现确实包含 3 轴加速度计,则

  • **必须**能够以 50 Hz 或更高的频率传递事件
  • **必须**遵守 Android API 中详述的 Android 传感器坐标系(参见 [Resources, 41])
  • **必须**能够测量从自由落体到任何三维向量上两倍重力 (2g) 或更大的范围
  • **必须**具有 8 位或更高的精度
  • **必须**具有不大于 0.05 m/s^2 的标准偏差

7.3.2. 磁力计

设备实现**应该**包含 3 轴磁力计(即,指南针)。如果设备确实包含 3 轴磁力计,则

  • **必须**能够以 10 Hz 或更高的频率传递事件
  • **必须**遵守 Android API 中详述的 Android 传感器坐标系(参见 [Resources, 41])。
  • **必须**能够采样足以覆盖地磁场的磁场强度范围
  • **必须**具有 8 位或更高的精度
  • **必须**具有不大于 0.5 µT 的标准偏差

7.3.3. GPS

设备实现**应该**包含 GPS 接收器。如果设备实现确实包含 GPS 接收器,则它**应该**包含某种形式的“辅助 GPS”技术,以最大限度地缩短 GPS 定位时间。

7.3.4. 陀螺仪

设备实现**应该**包含陀螺仪(即,角变化传感器)。除非也包含 3 轴加速度计,否则设备**不应**包含陀螺仪传感器。如果设备实现包含陀螺仪,则

  • **必须**进行温度补偿
  • **必须**能够测量高达 5.5*Pi 弧度/秒(即,大约每秒 1,000 度)的方向变化
  • **必须**能够以 100 Hz 或更高的频率传递事件
  • **必须**具有 12 位或更高的精度
  • **必须**具有不大于 1e-7 rad^2 / s^2 每 Hz 的方差(每 Hz 方差,或 rad^2 / s)。方差可以随采样率变化,但必须受此值约束。换句话说,如果您以 1 Hz 采样率测量陀螺仪的方差,则它不应大于 1e-7 rad^2/s^2。
  • **必须**使时间戳尽可能接近硬件事件发生的时间。**必须**消除恒定延迟。

7.3.5. 气压计

设备实现**可以**包含气压计(即,环境气压传感器)。如果设备实现包含气压计,则

  • **必须**能够以 5 Hz 或更高的频率传递事件
  • **必须**具有足够的精度以实现估计海拔高度

7.3.7. 温度计

设备实现**可以**但**不应该**包含温度计(即,温度传感器)。如果设备实现确实包含温度计,则它**必须**测量设备 CPU 的温度。它**不得**测量任何其他温度。(请注意,此传感器类型在 Android 4.0 API 中已弃用。)

7.3.7. 光度计

设备实现**可以**包含光度计(即,环境光传感器)。

7.3.8. 接近传感器

设备实现**可以**包含接近传感器。如果设备实现确实包含接近传感器,则它**必须**测量与屏幕相同方向的物体的接近程度。也就是说,接近传感器**必须**定向为检测靠近屏幕的物体,因为此传感器类型的主要意图是检测用户正在使用的手机。如果设备实现包含任何其他方向的接近传感器,则**不得**通过此 API 访问它。如果设备实现具有接近传感器,则它**必须**具有 1 位或更高的精度。

7.4. 数据连接

7.4.1. 电话

Android 4.0 API 和本文档使用的“电话”专门指与通过 GSM 或 CDMA 网络拨打语音电话和发送 SMS 消息相关的硬件。虽然这些语音呼叫可能是也可能不是分组交换的,但出于 Android 4.0 的目的,它们被认为独立于可以使用同一网络实现的任何数据连接。换句话说,Android “电话”功能和 API 专门指语音呼叫和 SMS;例如,无法拨打电话或发送/接收 SMS 消息的设备实现**不得**报告“android.hardware.telephony”功能或任何子功能,无论它们是否使用蜂窝网络进行数据连接。

Android 4.0 **可以**在不包含电话硬件的设备上使用。也就是说,Android 4.0 与非电话设备兼容。但是,如果设备实现确实包含 GSM 或 CDMA 电话,则它**必须**实现对该技术的 API 的完全支持。不包含电话硬件的设备实现**必须**将完整 API 实现为空操作。

7.4.2. IEEE 802.11 (WiFi)

Android 4.0 设备实现**应该**包含对一种或多种形式的 802.11 (b/g/a/n 等) 的支持。如果设备实现确实包含对 802.11 的支持,则它**必须**实现相应的 Android API。

7.4.3. 蓝牙

设备实现**应该**包含蓝牙收发器。确实包含蓝牙收发器的设备实现**必须**启用 SDK 文档 [Resources, 42] 中描述的基于 RFCOMM 的蓝牙 API。设备实现**应该**根据设备实现相关的蓝牙配置文件,例如 A2DP、AVRCP、OBEX 等。

兼容性测试套件包含涵盖 Android RFCOMM 蓝牙 API 基本操作的案例。但是,由于蓝牙是设备之间的通信协议,因此无法通过在单个设备上运行的单元测试进行全面测试。因此,设备实现**还必须**通过附录 A 中描述的人工驱动蓝牙测试程序。

7.4.4. 近场通信

设备实现**应该**包含用于近场通信 (NFC) 的收发器和相关硬件。如果设备实现确实包含 NFC 硬件,那么它

  • **必须**从 android.content.pm.PackageManager.hasSystemFeature() 方法报告 android.hardware.nfc 功能。 [Resources, 37]
  • **必须**能够通过以下 NFC 标准读取和写入 NDEF 消息
    • **必须**能够通过以下 NFC 标准充当 NFC 论坛读取器/写入器(由 NFC 论坛技术规范 NFCForum-TS-DigitalProtocol-1.0 定义)
      • NfcA (ISO14443-3A)
      • NfcB (ISO14443-3B)
      • NfcF (JIS 6319-4)
      • IsoDep (ISO 14443-4)
      • NFC 论坛标签类型 1、2、3、4(由 NFC 论坛定义)
  • **应该**能够通过以下 NFC 标准读取和写入 NDEF 消息。请注意,虽然以下 NFC 标准在 Android 4.0 中被声明为“应该”,但未来版本的兼容性定义计划将这些标准更改为“必须”。也就是说,这些标准在 Android 4.0 中是可选的,但**在未来版本中将是必需的**。运行 Android 4.0 的现有和新设备**强烈建议在 Android 4.0 中满足这些要求**,以便它们能够升级到未来的平台版本。
    • NfcV (ISO 15693)
  • **必须**能够通过以下对等标准和协议传输和接收数据
    • ISO 18092
    • LLCP 1.0(由 NFC 论坛定义)
    • SDP 1.0(由 NFC 论坛定义)
    • NDEF 推送协议 [Resources, 43]
    • SNEP 1.0(由 NFC 论坛定义)
  • **必须**包含对 Android Beam 的支持
    • **必须**实现 SNEP 默认服务器。SNEP 默认服务器接收到的有效 NDEF 消息**必须**使用 android.nfc.ACTION_NDEF_DISCOVERED intent 分派给应用程序。在设置中禁用 Android Beam **不得**禁用传入 NDEF 消息的分派。
    • 必须实现 NPP 服务器。NPP 服务器接收的消息必须以与 SNEP 默认服务器相同的方式处理。
    • 必须实现 SNEP 客户端,并在启用 Android Beam 时尝试向默认 SNEP 服务器发送出站 P2P NDEF 消息。如果未找到默认 SNEP 服务器,则客户端必须尝试向 NPP 服务器发送消息。
    • 必须允许前台 Activity 使用 android.nfc.NfcAdapter.setNdefPushMessage、android.nfc.NfcAdapter.setNdefPushMessageCallback 和 android.nfc.NfcAdapter.enableForegroundNdefPush 设置出站 P2P NDEF 消息。
    • 应该在使用 Android Beam 发送出站 P2P NDEF 消息之前,使用手势或屏幕确认,例如“触摸以共享”。
    • 应该默认启用 Android Beam
  • 在 NFC 发现模式下,必须轮询所有受支持的技术。
  • 当设备唤醒、屏幕处于活动状态且锁屏已解锁时,应该处于 NFC 发现模式。

(请注意,上述 JIS、ISO 和 NFC 论坛规范没有公开可用的链接。)

此外,设备实现可以包含对以下 MIFARE 技术的读/写器支持。

请注意,Android 4.0 包括针对这些 MIFARE 类型的 API。如果设备实现支持读/写器角色中的 MIFARE,则它

  • 必须实现 Android SDK 文档中记录的相应 Android API
  • 必须从 android.content.pm.PackageManager.hasSystemFeature() 方法报告功能 com.nxp.mifare。 [Resources, 37] 请注意,这不是标准的 Android 功能,因此不会显示为 PackageManager 类上的常量。
  • 除非设备实现还实现了本节中描述的通用 NFC 支持,否则不得实现相应的 Android API,也不得报告 com.nxp.mifare 功能

如果设备实现不包含 NFC 硬件,则不得从 android.content.pm.PackageManager.hasSystemFeature() 方法 [Resources, 37] 声明 android.hardware.nfc 功能,并且必须将 Android 4.0 NFC API 实现为无操作。

由于类 android.nfc.NdefMessageandroid.nfc.NdefRecord 表示与协议无关的数据表示格式,因此即使设备实现不包含对 NFC 的支持或声明 android.hardware.nfc 功能,也必须实现这些 API。

7.4.5. 最低网络能力

设备实现必须包含对一种或多种数据网络形式的支持。具体而言,设备实现必须包含对至少一种能够达到 200Kbit/秒或更高速度的数据标准的支持。满足此要求的技术示例包括 EDGE、HSPA、EV-DO、802.11g、以太网等。

以物理网络标准(如以太网)作为主要数据连接的设备实现,还应该包含对至少一种常用无线数据标准(如 802.11 (WiFi))的支持。

设备可以实现多种形式的数据连接。

7.5. 相机

设备实现应该包含后置摄像头,并且可以包含前置摄像头。后置摄像头是位于设备显示屏对面的设备侧面的摄像头;也就是说,它像传统相机一样拍摄设备远侧的场景。前置摄像头是位于设备显示屏同一侧的摄像头;也就是说,通常用于拍摄用户图像的摄像头,例如用于视频会议和类似应用。

7.5.1. 后置摄像头

设备实现应该包含后置摄像头。如果设备实现包含后置摄像头,则它

  • 必须具有至少 200 万像素的分辨率
  • 应该具有硬件自动对焦,或在摄像头驱动程序中实现的软件自动对焦(对应用软件透明)
  • 可以具有固定焦距或 EDOF(扩展景深)硬件
  • 可以包含闪光灯。如果摄像头包含闪光灯,则当在摄像头预览表面上注册了 android.hardware.Camera.PreviewCallback 实例时,闪光灯不得亮起,除非应用通过启用 Camera.Parameters 对象的 FLASH_MODE_AUTOFLASH_MODE_ON 属性显式启用了闪光灯。请注意,此约束不适用于设备的内置系统摄像头应用,而仅适用于使用 Camera.PreviewCallback 的第三方应用。

7.5.2. 前置摄像头

设备实现可以包含前置摄像头。如果设备实现包含前置摄像头,则它

  • 必须具有至少 VGA(即 640x480 像素)的分辨率
  • 不得将前置摄像头用作 Camera API 的默认摄像头。也就是说,Android 4.0 中的摄像头 API 具有对前置摄像头的特定支持,并且设备实现不得将 API 配置为将前置摄像头视为默认后置摄像头,即使它是设备上唯一的摄像头也是如此。
  • 可以包含后置摄像头可用的功能(例如自动对焦、闪光灯等),如第 7.5.1 节中所述。
  • 必须水平反射(即镜像)应用在 CameraPreview 中显示的流,如下所示
    • 如果设备实现能够由用户旋转(例如通过加速计自动旋转或通过用户输入手动旋转),则摄像头预览必须相对于设备的当前方向水平镜像。
    • 如果当前应用已通过调用 android.hardware.Camera.setDisplayOrientation() [Resources, 50] 方法显式请求旋转摄像头显示,则摄像头预览必须相对于应用指定的方向水平镜像。
    • 否则,预览必须沿设备的默认水平轴镜像。
  • 必须以与摄像头预览图像流相同的方式镜像后视图像。(如果设备实现不支持后视,则此要求显然不适用。)
  • 不得镜像返回给应用回调或提交到媒体存储的最终捕获的静止图像或视频流

7.5.3. 相机 API 行为

设备实现必须为摄像头相关 API 实现以下行为,适用于前置和后置摄像头

  1. 如果应用从未调用 android.hardware.Camera.Parameters.setPreviewFormat(int),则设备必须对提供给应用回调的预览数据使用 android.hardware.PixelFormat.YCbCr_420_SP
  2. 如果应用注册了 android.hardware.Camera.PreviewCallback 实例,并且当预览格式为 YCbCr_420_SP 时系统调用 onPreviewFrame() 方法,则传入 onPreviewFrame()byte[] 中的数据必须进一步采用 NV21 编码格式。也就是说,NV21 必须是默认格式。
  3. 设备实现必须支持 YV12 格式(由 android.graphics.ImageFormat.YV12 常量表示)用于前置和后置摄像头的摄像头预览。(硬件视频解码器和摄像头可以使用任何原生像素格式,但设备实现必须支持转换为 YV12。)

设备实现必须实现 Android 4.0 SDK 文档 [Resources, 51]) 中包含的完整 Camera API,无论设备是否包含硬件自动对焦或其他功能。例如,缺少自动对焦功能的摄像头仍然必须调用任何已注册的 android.hardware.Camera.AutoFocusCallback 实例(即使这与非自动对焦摄像头无关)。请注意,这适用于前置摄像头;例如,即使大多数前置摄像头不支持自动对焦,API 回调仍然必须如所述“伪造”。

如果底层硬件支持该功能,则设备实现必须识别并遵守定义为 android.hardware.Camera.Parameters 类上的常量的每个参数名称。如果设备硬件不支持某项功能,则 API 必须按文档所述运行。相反,设备实现不得遵守或识别传递给 android.hardware.Camera.setParameters() 方法的字符串常量,但文档中记录为 android.hardware.Camera.Parameters 上的常量的字符串常量除外。也就是说,如果硬件允许,设备实现必须支持所有标准摄像头参数,并且不得支持自定义摄像头参数类型。

每当摄像头拍摄新照片并且照片条目已添加到媒体存储时,设备实现都必须广播 Camera.ACTION_NEW_PICTURE Intent。

每当摄像头录制新视频并且照片条目已添加到媒体存储时,设备实现都必须广播 Camera.ACTION_NEW_VIDEO Intent。

7.5.4. 相机方向

如果存在前置和后置摄像头,则它们都必须定向,使摄像头的长边与屏幕的长边对齐。也就是说,当设备处于横向方向时,摄像头必须以横向方向捕获图像。这适用于设备的自然方向,即适用于横向为主的设备以及纵向为主的设备。

7.6. 内存和存储

7.6.1. 最低内存和存储空间

设备实现必须至少有 340MB 的内存可供内核和用户空间使用。这 340MB 必须是内核无法控制的专用于无线电、视频等硬件组件的任何内存之外的内存。

设备实现必须至少有 350MB 的非易失性存储空间可用于应用私有数据。也就是说,/data 分区必须至少为 350MB。

Android API 包含一个下载管理器,应用可以使用该管理器下载数据文件 [Resources, 56]。下载管理器的设备实现必须能够将至少 100MB 大小的单个文件下载到默认“缓存”位置。

7.6.2. 应用共享存储

设备实现必须为应用提供共享存储。提供的共享存储必须至少为 1GB 大小。

设备实现必须配置为默认“开箱即用”方式安装共享存储。如果共享存储未安装在 Linux 路径 /sdcard 上,则设备必须包含从 /sdcard 到实际挂载点的 Linux 符号链接。

设备实现必须按文档记录的方式强制执行此共享存储上的 android.permission.WRITE_EXTERNAL_STORAGE 权限。否则,获得该权限的任何应用都必须可以写入共享存储。

设备实现可以具有用户可访问的可移动存储硬件,例如安全数字卡。或者,设备实现可以将内部(不可移动)存储分配为应用的共享存储。

无论使用哪种形式的共享存储,设备实现都必须提供某种机制,以便从主机计算机访问共享存储的内容,例如 USB 大容量存储 (UMS) 或媒体传输协议 (MTP)。设备实现可以使用 USB 大容量存储,但应该使用媒体传输协议。如果设备实现支持媒体传输协议

  • 设备实现应该与参考 Android MTP 主机 Android File Transfer [Resources, 57] 兼容。
  • 设备实现应该报告 USB 设备类为 0x00
  • 设备实现应该报告 USB 接口名称为“MTP”。

如果设备实现缺少 USB 端口,则必须通过其他方式(例如网络文件系统)向主机计算机提供对共享存储内容的访问。

考虑两个常见示例进行说明。如果设备实现包括 SD 卡插槽以满足共享存储要求,则必须在销售给用户时设备中包含 1GB 或更大容量的 FAT 格式 SD 卡,并且必须默认安装。或者,如果设备实现使用内部固定存储来满足此要求,则该存储必须为 1GB 或更大容量,并安装在 /sdcard 上(或者,如果安装在其他位置,则 /sdcard 必须是指向物理位置的符号链接。)

包含多个共享存储路径(例如 SD 卡插槽和共享内部存储)的设备实现,应该修改核心应用(如媒体扫描程序和 ContentProvider),以透明地支持放置在两个位置的文件。

7.7. USB

设备实现应该包含 USB 客户端端口,并且应该包含 USB 主机端口。

如果设备实现包含 USB 客户端端口

  • 该端口必须可连接到带有标准 USB-A 端口的 USB 主机
  • 该端口在设备侧应该使用 micro USB 外形尺寸
  • 它必须允许连接到设备的主机使用 USB 大容量存储或媒体传输协议访问共享存储卷的内容
  • 它必须实现 Android SDK 文档中记录的 Android Open Accessory API 和规范,并且必须声明对硬件功能 android.hardware.usb.accessory [Resources, 51] 的支持

如果设备实现包含 USB 主机端口

  • 它可以使用非标准端口外形尺寸,但如果是这样,则必须随附将端口适配为标准 USB-A 的电缆
  • 它必须实现 Android SDK 文档中记录的 Android USB 主机 API,并且必须声明对硬件功能 android.hardware.usb.host [Resources, 52] 的支持

设备实现必须实现 Android 调试桥。如果设备实现省略了 USB 客户端端口,则必须通过局域网(如以太网或 802.11)实现 Android 调试桥

8. 性能兼容性

设备实现必须满足下表中定义的 Android 4.0 兼容设备的密钥性能指标

指标 性能阈值 注释
应用启动时间 以下应用应在指定时间内启动。
  • 浏览器:小于 1300 毫秒
  • 联系人:小于 700 毫秒
  • 设置:小于 700 毫秒
启动时间是指完成加载应用的默认 Activity 的总时间,包括启动 Linux 进程、将 Android 包加载到 Dalvik VM 以及调用 onCreate 所需的时间。
同步应用 当启动多个应用后,重新启动已运行的应用所需的时间必须少于原始启动时间。  

9. 安全模型兼容性

设备实现必须实现与 Android 平台安全模型一致的安全模型,如 Android 开发者文档中 API 的“安全和权限”参考文档 [Resources, 54] 中所定义。设备实现必须支持安装自签名应用,而无需从任何第三方/机构请求任何其他权限/证书。具体而言,兼容设备必须支持以下小节中描述的安全机制。

9.1. 权限

设备实现必须支持 Android 权限模型,如 Android 开发者文档 [Resources, 54] 中所定义。具体而言,实现必须强制执行 SDK 文档中描述的每个权限;不得省略、更改或忽略任何权限。实现可以添加其他权限,前提是新的权限 ID 字符串不在 android.* 命名空间中。

9.2. UID 和进程隔离

设备实现必须支持 Android 应用沙盒模型,其中每个应用都作为唯一的 Unix 样式 UID 并在单独的进程中运行。设备实现必须支持以相同的 Linux 用户 ID 运行多个应用,前提是这些应用已正确签名和构建,如“安全和权限”参考 [Resources, 54] 中所定义。

9.3. 文件系统权限

设备实现必须支持 Android 文件访问权限模型,如“安全和权限”参考 [Resources, 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 等)的设备资源,则备用运行时必须告知用户该应用将能够访问该资源。如果运行时环境不以这种方式记录应用功能,则运行时环境必须在安装任何使用该运行时的应用时列出运行时本身拥有的所有权限。

10. 软件兼容性测试

设备实现必须通过本节中描述的所有测试。

但是,请注意,没有软件测试包是完全全面的。因此,强烈建议设备实现者尽可能少地更改 Android 开放源代码项目提供的 Android 4.0 的参考实现和首选实现。这将最大限度地降低引入错误导致不兼容的风险,从而需要返工和潜在的设备更新。

10.1. 兼容性测试套件

设备实现必须使用设备上的最终交付软件,通过 Android 开放源代码项目提供的 Android 兼容性测试套件 (CTS) [Resources, 2]。此外,设备实现者应该尽可能多地使用 Android 开放源代码树中的参考实现,并且必须确保在 CTS 中存在歧义以及对参考源代码的任何重新实现的情况下保持兼容性。

CTS 旨在在实际设备上运行。与任何软件一样,CTS 本身可能包含错误。CTS 的版本将独立于此兼容性定义进行版本控制,并且可能会为 Android 4.0 发布多个 CTS 修订版。设备实现必须通过设备软件完成时可用的最新 CTS 版本。

10.2. CTS 验证程序

设备实现必须正确执行 CTS Verifier 中的所有适用案例。CTS Verifier 包含在兼容性测试套件中,旨在由人工操作员运行,以测试无法通过自动化系统测试的功能,例如摄像头和传感器的正确功能。

CTS Verifier 具有针对多种硬件的测试,包括一些可选硬件。设备实现必须通过针对其拥有的硬件的所有测试;例如,如果设备拥有加速度计,则必须正确执行 CTS Verifier 中的加速度计测试案例。对于此兼容性定义文档中注明为可选的功能的测试案例,可以跳过或省略。

如上所述,每个设备和每个版本都必须正确运行 CTS Verifier。但是,由于许多版本非常相似,因此设备实现者无需在仅在细微方面(例如包含的语言环境、品牌等)不同的版本上显式运行 CTS Verifier。具体而言,仅在已通过 CTS Verfier 的实现方面存在差异的设备实现(仅在包含的语言环境、品牌等集方面存在差异)可以省略 CTS Verifier 测试。

10.3. 参考应用

设备实现者必须使用以下开源应用测试实现兼容性

  • “Apps for Android”应用 [Resources, 55]。
  • Replica Island(在 Android Market 中提供)

以上每个应用都必须在实现上正确启动和运行,该实现才能被视为兼容。

11. 可更新的软件

设备实现必须包含用于替换整个系统软件的机制。该机制不需要执行“实时”升级 - 也就是说,可能需要重启设备。

可以使用任何方法,前提是它可以替换设备上预安装的整个软件。例如,以下任何方法都将满足此要求

  • 通过重启进行离线更新的无线下载 (OTA)
  • 通过 USB 从主机 PC 进行“系绳”更新
  • 通过重启和从可移动存储上的文件更新进行“离线”更新

使用的更新机制必须支持在不擦除用户数据的情况下进行更新。也就是说,更新机制必须保留应用私有数据和应用共享数据。请注意,上游 Android 软件包含满足此要求的更新机制。

如果在设备实现发布后但在其合理的产品生命周期内发现错误,并且该错误经与 Android 兼容性团队协商后确定会影响第三方应用的兼容性,则设备实现者必须通过软件更新来纠正该错误,该软件更新可以通过刚刚描述的机制应用。

12. 联系我们

您可以联系文档作者 compatibility@android.com 以获取澄清,并提出您认为文档未涵盖的任何问题。

附录 A - 蓝牙测试程序

兼容性测试套件包含涵盖 Android RFCOMM Bluetooth API 基本操作的案例。但是,由于蓝牙是设备之间的通信协议,因此无法通过在单个设备上运行的单元测试进行全面测试。因此,设备实现还必须通过下面描述的人工操作蓝牙测试程序。

测试程序基于 Android 开放源代码项目树中包含的 BluetoothChat 示例应用。该程序需要两台设备

  • 运行要测试的软件版本的候选设备实现
  • 已知的兼容设备实现,以及被测设备实现的型号 - 即“已知良好”的设备实现

以下测试程序将这些设备分别称为“候选”设备和“已知良好”设备。

设置和安装

  1. 通过 Android 源代码树中的“make samples”构建 BluetoothChat.apk。
  2. 在已知良好设备上安装 BluetoothChat.apk。
  3. 在候选设备上安装 BluetoothChat.apk。

通过应用测试蓝牙控制

  1. 在蓝牙已禁用的情况下,在候选设备上启动 BluetoothChat。
  2. 验证候选设备是否打开蓝牙,或者提示用户打开蓝牙的对话框。

测试配对和通信

  1. 在两台设备上启动 Bluetooth Chat 应用。
  2. 从 BluetoothChat 中(使用菜单)使已知良好设备可被发现。
  3. 在候选设备上,从 BluetoothChat 中(使用菜单)扫描蓝牙设备,并与已知良好设备配对。
  4. 从每台设备发送 10 条或更多消息,并验证另一台设备是否正确接收到这些消息。
  5. Home 关闭两台设备上的 BluetoothChat 应用。
  6. 使用设备“设置”应用取消每台设备与另一台设备的配对。

测试反向配对和通信

  1. 在两台设备上启动 Bluetooth Chat 应用。
  2. 从 BluetoothChat 中(使用菜单)使候选设备可被发现。
  3. 在已知良好设备上,从 BluetoothChat 中(使用菜单)扫描蓝牙设备,并与候选设备配对。
  4. 从每台设备发送 10 条或更多消息,并验证另一台设备是否正确接收到这些消息。
  5. 通过反复按“返回”按钮返回启动器,关闭两台设备上的 Bluetooth Chat 应用。

测试重新启动

  1. 在两台设备上重新启动 Bluetooth Chat 应用。
  2. 从每台设备发送 10 条或更多消息,并验证另一台设备是否正确接收到这些消息。

注意:以上测试的一些案例通过使用 Home 结束测试部分,而另一些则使用 Back。这些测试不是冗余的,也不是可选的:目的是验证 Bluetooth API 和堆栈在 Activity 被显式终止(通过用户按 Back,调用 finish())和隐式发送到后台(通过用户按 Home)时是否都能正常工作。每个测试序列都必须按描述执行。