版权所有 © 2010,谷歌公司。保留所有权利。
compatibility@android.com
目录
2.资源
3. 软件
4. 应用打包兼容性
5. 多媒体兼容性
6. 开发工具兼容性
7. 硬件兼容性
八、性能兼容性
9. 安全模型兼容性
10. 软件兼容性测试
11. 可更新软件
12. 联系我们
附录 A - 蓝牙测试程序
一、简介
本文档列举了手机要兼容 Android 2.3 必须满足的要求。
“必须”、“不得”、“要求”、“应”、“不应”、“应该”、“不应该”、“推荐”、“可以”和“可选”的使用符合 IETF 标准在 RFC2119 [资源,1 ] 中定义。
在本文档中,“设备实施者”或“实施者”是指开发运行 Android 2.3 的硬件/软件解决方案的个人或组织。 “设备实现”或“实现”是这样开发的硬件/软件解决方案。
要被视为与 Android 2.3 兼容,设备实现必须满足此兼容性定义中提出的要求,包括通过引用合并的任何文档。
如果此定义或第 10 节中描述的软件测试是沉默的、模棱两可的或不完整的,则设备实施者有责任确保与现有实施的兼容性。出于这个原因,Android 开源项目 [参考资料,3 ] 是 Android 的参考和首选实现。强烈鼓励设备实施者尽可能以 Android 开源项目提供的“上游”源代码为基础进行实施。虽然假设某些组件可以替换为替代实现,但强烈不鼓励这种做法,因为通过软件测试将变得更加困难。实施者有责任确保与标准 Android 实施的完全行为兼容性,包括并超出兼容性测试套件。最后,请注意本文档明确禁止某些组件替换和修改。
请注意,此兼容性定义的发布是为了与 Android 的 2.3.3 更新相对应,即 API 级别 10。此定义废弃并取代了 2.3.3 之前的 Android 2.3 版本的兼容性定义。 (也就是说,版本 2.3.1 和 2.3.2 已过时。)未来运行 Android 2.3 的 Android 兼容设备必须配备 2.3.3 或更高版本。
2.资源
- IETF RFC2119 要求级别: http ://www.ietf.org/rfc/rfc2119.txt
- Android 兼容性程序概述:http: //source.android.com/compatibility/index.html
- 安卓开源项目: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 2.3 允许的版本字符串:http: //source.android.com/compatibility/2.3/versions.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 地理定位 API: http ://www.w3.org/TR/geolocation-API/
- HTML5/W3C 网络数据库 API: http ://www.w3.org/TR/webdatabase/
- HTML5/W3C IndexedDB API: http ://www.w3.org/TR/IndexedDB/
- Dalvik 虚拟机规范:在 Android 源代码中可用,位于 dalvik/docs
- AppWidgets: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_guideline /icon_design.html#statusbarstructure
- 搜索管理器:http: //developer.android.com/reference/android/app/SearchManager.html
- 敬酒:http: //developer.android.com/reference/android/widget/Toast.html
- 动态壁纸: https ://android-developers.googleblog.com/2010/02/live-wallpapers.html
- 参考工具文档(adb、aapt、ddms):http: //developer.android.com/guide/developing/tools/index.html
- 安卓apk文件说明:http: //developer.android.com/guide/topics/fundamentals.html
- 清单文件:http: //developer.android.com/guide/topics/manifest/manifest-intro.html
- 猴子测试工具: https ://developer.android.com/studio/test/other-testing-tools/monkey
- Android 硬件功能列表: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
- 传感器坐标空间: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/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)
- android.hardware.Camera:http://developer.android.com/reference/android/hardware/Camera.html
- Android 安全和权限参考:http: //developer.android.com/guide/topics/security/security.html
- 适用于 Android 的应用程序: http ://code.google.com/p/apps-for-android
其中许多资源直接或间接源自 Android 2.3 SDK,并且在功能上与该 SDK 文档中的信息相同。在任何情况下,如果此兼容性定义或兼容性测试套件与 SDK 文档不一致,则 SDK 文档被视为权威。上述参考文献中提供的任何技术细节都被视为包含在本兼容性定义中。
3. 软件
Android 平台包括一组托管 API、一组本机 API 和一组所谓的“软”API,例如 Intent 系统和 Web 应用程序 API。本节详细介绍了兼容性不可或缺的硬 API 和软 API,以及某些其他相关的技术和用户界面行为。设备实现必须符合本节中的所有要求。
3.1.托管 API 兼容性
托管(基于 Dalvik)执行环境是 Android 应用程序的主要载体。 Android 应用程序编程接口 (API) 是暴露给在托管 VM 环境中运行的应用程序的一组 Android 平台接口。设备实现必须提供由 Android 2.3 SDK [参考资料,4 ] 公开的任何已记录 API 的完整实现,包括所有已记录的行为。
设备实现不得省略任何托管 API、更改 API 接口或签名、偏离记录的行为或包含空操作,除非本兼容性定义明确允许。
此兼容性定义允许设备实现省略某些类型的硬件,其中 Android 包含 API。在这种情况下,API 必须仍然存在并以合理的方式运行。有关此场景的特定要求,请参阅第 7 节。
3.2.软 API 兼容性
除了第 3.1 节中的托管 API 之外,Android 还包括一个重要的仅限运行时的“软”API,其形式为 Intents、权限和 Android 应用程序的类似方面,这些方面不能在应用程序编译时强制执行。本节详细介绍了与 Android 2.3 兼容所需的“软”API 和系统行为。设备实现必须满足本节中提出的所有要求。
3.2.1.权限
设备实现者必须支持并强制执行权限参考页 [参考资料,5 ] 中记录的所有权限常量。请注意,第 10 节列出了与 Android 安全模型相关的其他要求。
3.2.2.构建参数
Android API 在android.os.Build
类 [ Resources, 6 ] 中包含许多常量,这些常量旨在描述当前设备。为了在设备实现中提供一致的、有意义的值,下表包括对设备实现必须遵守的这些值的格式的额外限制。
范围 | 注释 |
android.os.Build.VERSION.RELEASE | 当前执行的 Android 系统的版本,采用人类可读的格式。该字段必须具有 [ Resources, 7 ] 中定义的字符串值之一。 |
android.os.Build.VERSION.SDK | 当前执行的 Android 系统的版本,采用第三方应用程序代码可访问的格式。对于 Android 2.3,此字段必须具有整数值 9。 |
android.os.Build.VERSION.INCREMENTAL | 由设备实现者选择的值,以人类可读的格式指定当前正在执行的 Android 系统的特定版本。此值不得重复用于最终用户可用的不同构建。此字段的典型用途是指示使用哪个内部版本号或源代码控制更改标识符来生成内部版本。该字段的具体格式没有要求,只是不能为空或空字符串(“”)。 |
android.os.Build.BOARD | 设备实施者选择的值,以人类可读的格式标识设备使用的特定内部硬件。该字段的一个可能用途是指示为设备供电的电路板的特定版本。该字段的值必须可编码为 7 位 ASCII,并匹配正则表达式"^[a-zA-Z0-9.,_-]+$" 。 |
android.os.Build.BRAND 品牌 | 设备实施者选择的值,以人类可读的格式标识生产设备的公司、组织、个人等的名称。此字段的一个可能用途是指示销售该设备的 OEM 和/或运营商。该字段的值必须可编码为 7 位 ASCII,并匹配正则表达式"^[a-zA-Z0-9.,_-]+$" 。 |
android.os.Build.DEVICE | 由设备实施者选择的值,用于标识设备主体(有时称为“工业设计”)的特定配置或版本。该字段的值必须可编码为 7 位 ASCII,并匹配正则表达式"^[a-zA-Z0-9.,_-]+$" 。 |
android.os.Build.指纹 | 唯一标识此构建的字符串。它应该是合理的人类可读的。它必须遵循这个模板:$(BRAND)/$(PRODUCT)/$(DEVICE):$(VERSION.RELEASE)/$(ID)/$(VERSION.INCREMENTAL):$(TYPE)/$(TAGS) 例如: acme/mydevice/generic/generic:2.3/ERC77/3359:userdebug/test-keys 指纹不得包含空白字符。如果上述模板中包含的其他字段具有空白字符,则必须在构建指纹中将其替换为其他字符,例如下划线 (“_”) 字符。该字段的值必须可编码为 7 位 ASCII。 |
android.os.Build.HOST | 一个字符串,以人类可读的格式唯一标识构建所在的主机。该字段的具体格式没有要求,只是不能为空或空字符串(“”)。 |
android.os.Build.ID | 设备实施者选择的标识符,以人类可读格式引用特定版本。该字段可以与 android.os.Build.VERSION.INCREMENTAL 相同,但应该是一个足以让最终用户区分软件版本的值。该字段的值必须可编码为 7 位 ASCII,并匹配正则表达式"^[a-zA-Z0-9.,_-]+$" 。 |
android.os.Build.MODEL | 由设备实施者选择的值,其中包含最终用户已知的设备名称。这应该与设备营销和销售给最终用户时使用的名称相同。该字段的具体格式没有要求,只是不能为空或空字符串(“”)。 |
android.os.Build.PRODUCT | 设备实施者选择的一个值,其中包含设备的开发名称或代码名称。必须是人类可读的,但不一定供最终用户查看。该字段的值必须可编码为 7 位 ASCII,并匹配正则表达式"^[a-zA-Z0-9.,_-]+$" 。 |
android.os.Build.TAGS | 设备实施者选择的以逗号分隔的标签列表,进一步区分构建。例如,“未签名,调试”。该字段的值必须可编码为 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。该字段的具体格式没有要求,只是不能为空或空字符串(“”)。 |
3.2.3.意图兼容性
Android 使用 Intents 来实现应用程序之间的松散耦合集成。本节描述了与设备实现必须遵守的 Intent 模式相关的要求。 “荣誉”意味着设备实现者必须提供一个 Android 活动或服务,指定一个匹配的 Intent 过滤器并绑定到每个指定的 Intent 模式并为每个指定的 Intent 模式实现正确的行为。
3.2.3.1.核心应用意图
Android 上游项目定义了一些核心应用程序,例如电话拨号器、日历、通讯录、音乐播放器等。设备实施者可以用替代版本替换这些应用程序。
但是,任何此类替代版本都必须遵循上游项目提供的相同 Intent 模式。例如,如果设备包含替代音乐播放器,它仍然必须遵循第三方应用程序发出的 Intent 模式来选择歌曲。
以下应用程序被视为核心 Android 系统应用程序:
- 台钟
- 浏览器
- 日历
- 计算器
- 联系人
- 电子邮件
- 画廊
- 全球搜索
- 启动器
- 音乐
- 设置
核心 Android 系统应用程序包括各种被认为是“公共”的 Activity 或 Service 组件。也就是说,属性“android:exported”可能不存在,或者可能具有值“true”。
对于核心 Android 系统应用之一中定义的每个活动或服务,如果未通过值为“false”的 android:exported 属性标记为非公共,设备实现必须包含实现相同 Intent 过滤器的相同类型的组件patterns 作为核心的 Android 系统应用程序。
换句话说,设备实现可以取代核心 Android 系统应用程序;但是,如果是这样,设备实现必须支持由每个被替换的核心 Android 系统应用程序定义的所有 Intent 模式。
3.2.3.2.意图覆盖
由于 Android 是一个可扩展的平台,设备实现者必须允许第 3.2.3.1 节中引用的每个 Intent 模式被第三方应用程序覆盖。上游 Android 开源项目默认允许这样做;设备实现者不得将特殊权限附加到系统应用程序对这些 Intent 模式的使用,或阻止第三方应用程序绑定到这些模式并承担对这些模式的控制。该禁令具体包括但不限于禁用“选择器”用户界面,该界面允许用户在处理相同 Intent 模式的多个应用程序之间进行选择。
3.2.3.3.意图命名空间
设备实现者不得在 android.* 命名空间中包含任何使用 ACTION、CATEGORY 或其他键字符串来支持任何新 Intent 或 Broadcast Intent 模式的 Android 组件。设备实现者不得在属于另一个组织的包空间中包含任何使用 ACTION、CATEGORY 或其他键字符串来支持任何新 Intent 或 Broadcast Intent 模式的 Android 组件。设备实施者不得更改或扩展第 3.2.3.1 节中列出的核心应用程序使用的任何 Intent 模式。
此禁止类似于第 3.6 节中为 Java 语言类指定的禁止。
3.2.3.4.广播意图
第三方应用依赖平台广播某些Intent,通知自身硬件或软件环境的变化。 Android 兼容设备必须广播公共广播 Intent 以响应适当的系统事件。 SDK 文档中描述了广播意图。
3.3.本机 API 兼容性
在 Dalvik 中运行的托管代码可以调用应用程序 .apk 文件中提供的本机代码,作为针对相应设备硬件架构编译的 ELF .so 文件。由于本机代码高度依赖于底层处理器技术,因此 Android 在 Android NDK 中定义了许多应用程序二进制接口 (ABI),位于文件docs/CPU-ARCH-ABIS.txt
中。如果设备实现与一个或多个定义的 ABI 兼容,它应该实现与 Android NDK 的兼容性,如下所示。
如果设备实现包括对 Android ABI 的支持,它:
- 必须包括对在托管环境中运行的代码的支持,以使用标准 Java 本机接口 (JNI) 语义调用本机代码。
- 必须与下面列表中的每个必需库源代码兼容(即标头兼容)和二进制兼容(对于 ABI)
- 必须通过
android.os.Build.CPU_ABI
API 准确报告设备支持的本机应用程序二进制接口 (ABI) - 必须仅在文件
docs/CPU-ARCH-ABIS.txt
中报告最新版本的 Android NDK 中记录的那些 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(开放声音库音频支持)
- libandroid.so(本机 Android 活动支持)
- 支持 OpenGL,如下所述
请注意,Android NDK 的未来版本可能会引入对其他 ABI 的支持。如果设备实现与现有的预定义 ABI 不兼容,则它绝不能报告对任何 ABI 的支持。
本机代码兼容性具有挑战性。出于这个原因,应该重申,非常强烈地鼓励设备实现者使用上面列出的库的上游实现来帮助确保兼容性。
3.4.网络兼容性
许多开发人员和应用程序的用户界面依赖于android.webkit.WebView
类 [ Resources, 8 ] 的行为,因此 WebView 实现必须在 Android 实现之间兼容。同样,完整、现代的网络浏览器是 Android 用户体验的核心。设备实现必须包括与上游 Android 软件一致的android.webkit.WebView
版本,并且必须包括支持 HTML5 的现代浏览器,如下所述。
3.4.1. Web 视图兼容性
Android 开源实现使用 WebKit 渲染引擎来实现android.webkit.WebView
。因为为 Web 渲染系统开发一个全面的测试套件是不可行的,设备实现者必须在 WebView 实现中使用特定的 WebKit 上游构建。具体来说:
- 设备实现的
android.webkit.WebView
实现必须基于 Android 2.3 的上游 Android 开源树中的 533.1 WebKit 构建。此版本包括一组特定的 WebView 功能和安全修复程序。设备实现者可以包括对 WebKit 实现的自定义;但是,任何此类自定义不得改变 WebView 的行为,包括呈现行为。 - WebView 报告的用户代理字符串必须采用以下格式:
Mozilla/5.0 (Linux; U; Android $(VERSION); $(LOCALE); $(MODEL) Build/$(BUILD)) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
- $(VERSION) 字符串的值必须与
android.os.Build.VERSION.RELEASE
的值相同 - $(LOCALE) 字符串的值应该遵循国家代码和语言的 ISO 约定,并且应该引用设备当前配置的区域设置
- $(MODEL) 字符串的值必须与
android.os.Build.MODEL
的值相同 - $(BUILD) 字符串的值必须与
android.os.Build.ID
的值相同
- $(VERSION) 字符串的值必须与
WebView 组件应该尽可能多地支持 HTML5 [ Resources, 9 ]。至少,设备实现必须支持与 WebView 中的 HTML5 关联的这些 API 中的每一个:
- 应用程序缓存/离线操作 [资源,10 ]
- <video> 标签 [ Resources, 11 ]
- 地理定位 [资源, 12 ]
此外,设备实现必须支持 HTML5/W3C webstorage API [参考资料,13 ],并且应该支持 HTML5/W3C IndexedDB API [参考资料,14 ]。请注意,随着 Web 开发标准机构转向支持 IndexedDB 而不是 webstorage,IndexedDB 有望成为未来版本的 Android 中的必需组件。
与所有 JavaScript API 一样,HTML5 API 必须在 WebView 中默认禁用,除非开发人员通过常用的 Android API 明确启用它们。
3.4.2.浏览器兼容性
设备实现必须包括一个独立的浏览器应用程序,供一般用户浏览网页。独立浏览器可以基于 WebKit 以外的浏览器技术。但是,即使使用备用浏览器应用程序,提供给第三方应用程序的android.webkit.WebView
组件也必须基于 WebKit,如第 3.4.1 节所述。
实现可以在独立的浏览器应用程序中提供自定义用户代理字符串。
独立的浏览器应用程序(无论是基于上游 WebKit 浏览器应用程序还是第三方替代品)应该尽可能多地支持 HTML5 [参考资料,9 ]。至少,设备实现必须支持以下与 HTML5 相关的每个 API:
- 应用程序缓存/离线操作 [资源,10 ]
- <video> 标签 [ Resources, 11 ]
- 地理定位 [资源, 12 ]
此外,设备实现必须支持 HTML5/W3C webstorage API [参考资料,13 ],并且应该支持 HTML5/W3C IndexedDB API [参考资料,14 ]。请注意,随着 Web 开发标准机构转向支持 IndexedDB 而不是 webstorage,IndexedDB 有望成为未来版本的 Android 中的必需组件。
3.5. API 行为兼容性
每种 API 类型(托管、软件、本机和 Web)的行为必须与上游 Android 开源项目 [参考资料,3 ] 的首选实现一致。一些特定的兼容性领域是:
- 设备不得更改标准 Intent 的行为或语义
- 设备不得改变特定类型系统组件(例如服务、活动、内容提供者等)的生命周期或生命周期语义
- 设备不得更改标准权限的语义
上面的列表并不全面。兼容性测试套件 (CTS) 测试平台的重要部分的行为兼容性,但不是全部。实施者有责任确保与 Android 开源项目的行为兼容性。出于这个原因,设备实施者应该尽可能使用通过 Android 开源项目提供的源代码,而不是重新实施系统的重要部分。
3.6. API 命名空间
Android 遵循 Java 编程语言定义的包和类命名空间约定。为确保与第三方应用程序的兼容性,设备实施者不得对这些包命名空间进行任何禁止的修改(见下文):
- java.*
- javax.*
- 太阳。*
- 安卓。*
- com.android.*
禁止的修改包括:
- 设备实现不得通过更改任何方法或类签名,或者通过删除类或类字段来修改 Android 平台上公开公开的 API。
- 设备实现者可以修改 API 的底层实现,但此类修改不得影响任何公开 API 的声明行为和 Java 语言签名。
- 设备实现者不得向上述 API 添加任何公开公开的元素(例如类或接口,或现有类或接口的字段或方法)。
“公开暴露的元素”是任何未使用上游 Android 源代码中使用的“@hide”标记修饰的构造。换句话说,设备实现者不得公开新的 API 或更改上述命名空间中的现有 API。设备实施者可以进行仅限内部的修改,但这些修改不得公布或以其他方式暴露给开发人员。
设备实施者可以添加自定义 API,但任何此类 API 不得位于其他组织拥有或引用的命名空间中。例如,设备实施者不得将 API 添加到 com.google.* 或类似的命名空间;只有谷歌可以这样做。同样,Google 不得将 API 添加到其他公司的命名空间。此外,如果设备实现包含标准 Android 命名空间之外的自定义 API,则这些 API 必须打包在 Android 共享库中,以便只有明确使用它们(通过<uses-library>
机制)的应用才会受到内存使用量增加的影响此类 API。
如果设备实施者提议改进上述包命名空间之一(例如通过向现有 API 添加有用的新功能,或添加新 API),实施者应该访问 source.android.com 并开始贡献更改的过程和代码,根据该站点上的信息。
请注意,上述限制对应于 Java 编程语言中命名 API 的标准约定;本节的目的只是为了加强这些约定,并通过将它们包含在此兼容性定义中来使其具有约束力。
3.7.虚拟机兼容性
设备实现必须支持完整的 Dalvik 可执行 (DEX) 字节码规范和 Dalvik 虚拟机语义 [参考资料,15 ]。
具有分类为中密度或低密度屏幕的设备实现必须配置 Dalvik 为每个应用程序分配至少 16MB 的内存。具有分类为高密度或超高密度屏幕的设备实现必须配置 Dalvik 为每个应用程序分配至少 24MB 的内存。请注意,设备实现可能会分配比这些数字更多的内存。
3.8.用户界面兼容性
Android 平台包含一些开发人员 API,允许开发人员挂接到系统用户界面。设备实现必须将这些标准 UI API 合并到他们开发的自定义用户界面中,如下所述。
3.8.1.小部件
Android 定义了一种组件类型和相应的 API 和生命周期,允许应用程序向最终用户公开“AppWidget”[参考资料,16 ]。 Android 开源参考版本包括一个 Launcher 应用程序,该应用程序包含允许用户从主屏幕添加、查看和删除 AppWidgets 的用户界面元素。
设备实施者可以替代参考启动器(即主屏幕)。替代启动器应该包括对 AppWidgets 的内置支持,并公开用户界面元素以直接在启动器中添加、配置、查看和删除 AppWidgets。替代启动器可以省略这些用户界面元素;然而,如果它们被省略,设备实现者必须提供一个单独的应用程序,可以从启动器访问,允许用户添加、配置、查看和删除 AppWidgets。
3.8.2.通知
Android 包含允许开发人员通知用户重要事件的 API [参考资料,17 ]。设备实施者必须为如此定义的每一类通知提供支持;特别是:声音、振动、灯光和状态栏。
此外,实现必须正确呈现 API [ Resources, 18 ] 或状态栏图标样式指南 [ Resources, 19 ] 中提供的所有资源(图标、声音文件等)。设备实施者可以为通知提供替代用户体验,而不是参考 Android 开源实施所提供的体验;然而,这样的替代通知系统必须支持现有的通知资源,如上所述。
3.8.3.搜索
Android 包含 API [ Resources, 20 ],允许开发人员将搜索合并到他们的应用程序中,并将他们的应用程序数据公开到全局系统搜索中。 Generally speaking, this functionality consists of a single, system-wide user interface that allows users to enter queries, displays suggestions as users type, and displays results. The Android APIs allow developers to reuse this interface to provide search within their own apps, and allow developers to supply results to the common global search user interface.
Device implementations MUST include a single, shared, system-wide search user interface capable of real-time suggestions in response to user input. Device implementations MUST implement the APIs that allow developers to reuse this user interface to provide search within their own applications. Device implementations MUST implement the APIs that allow third-party applications to add suggestions to the search box when it is run in global search mode. If no third-party applications are installed that make use of this functionality, the default behavior SHOULD be to display web search engine results and suggestions.
Device implementations MAY ship alternate search user interfaces, but SHOULD include a hard or soft dedicated search button, that can be used at any time within any app to invoke the search framework, with the behavior provided for in the API documentation.
3.8.4. Toasts
Applications can use the "Toast" API (defined in [ Resources, 21 ]) to display short non-modal strings to the end user, that disappear after a brief period of time. Device implementations MUST display Toasts from applications to end users in some high-visibility manner.
3.8.5. Live Wallpapers
Android defines a component type and corresponding API and lifecycle that allows applications to expose one or more "Live Wallpapers" to the end user [ Resources, 22 ]. Live Wallpapers are animations, patterns, or similar images with limited input capabilities that display as a wallpaper, behind other applications.
Hardware is considered capable of reliably running live wallpapers if it can run all live wallpapers, with no limitations on functionality, at a reasonable framerate with no adverse affects on other applications. If limitations in the hardware cause wallpapers and/or applications to crash, malfunction, consume excessive CPU or battery power, or run at unacceptably low frame rates, the hardware is considered incapable of running live wallpaper. As an example, some live wallpapers may use an Open GL 1.0 or 2.0 context to render their content. Live wallpaper will not run reliably on hardware that does not support multiple OpenGL contexts because the live wallpaper use of an OpenGL context may conflict with other applications that also use an OpenGL context.
Device implementations capable of running live wallpapers reliably as described above SHOULD implement live wallpapers. Device implementations determined to not run live wallpapers reliably as described above MUST NOT implement live wallpapers.
4. Application Packaging Compatibility
Device implementations MUST install and run Android ".apk" files as generated by the "aapt" tool included in the official Android SDK [ Resources, 23 ].
Devices implementations MUST NOT extend either the .apk [ Resources, 24 ], Android Manifest [ Resources, 25 ], or Dalvik bytecode [ Resources, 15 ] formats in such a way that would prevent those files from installing and running correctly on other compatible devices. Device implementers SHOULD use the reference upstream implementation of Dalvik, and the reference implementation's package management system.
5. Multimedia Compatibility
Device implementations MUST fully implement all multimedia APIs. Device implementations MUST include support for all multimedia codecs described below, and SHOULD meet the sound processing guidelines described below. Device implementations MUST include at least one form of audio output, such as speakers, headphone jack, external speaker connection, etc.
5.1. Media Codecs
Device implementations MUST support the multimedia codecs as detailed in the following sections. All of these codecs are provided as software implementations in the preferred Android implementation from the Android Open-Source Project.
Please note that neither Google nor the Open Handset Alliance make any representation that these codecs are unencumbered by third-party patents. Those intending to use this source code in hardware or software products are advised that implementations of this code, including in open source software or shareware, may require patent licenses from the relevant patent holders.
The tables below do not list specific bitrate requirements for most video codecs. The reason for this is that in practice, current device hardware does not necessarily support bitrates that map exactly to the required bitrates specified by the relevant standards. Instead, device implementations SHOULD support the highest bitrate practical on the hardware, up to the limits defined by the specifications.
5.1.1. Media Decoders
Device implementations MUST include an implementation of a decoder for each codec and format described in the table below. Note that decoders for each of these media types are provided by the upstream Android Open-Source Project.
Audio | ||
Name | Details | File/Container Format |
AAC LC/LTP | Mono/Stereo content in any combination of standard bit rates up to 160 kbps and sampling rates between 8 to 48kHz | 3GPP (.3gp) and MPEG-4 (.mp4, .m4a). No support for raw AAC (.aac) |
HE-AACv1 (AAC+) | ||
HE-AACv2 (enhanced AAC+) | ||
AMR-NB | 4.75 to 12.2 kbps sampled @ 8kHz | 3GPP (.3gp) |
AMR-WB | 9 rates from 6.60 kbit/s to 23.85 kbit/s sampled @ 16kHz | 3GPP (.3gp) |
MP3 | Mono/Stereo 8-320Kbps constant (CBR) or variable bit-rate (VBR) | MP3 (.mp3) |
MIDI | MIDI Type 0 and 1. DLS Version 1 and 2. XMF and Mobile XMF. Support for ringtone formats RTTTL/RTX, OTA, and iMelody | Type 0 and 1 (.mid, .xmf, .mxmf). Also RTTTL/RTX (.rtttl, .rtx), OTA (.ota), and iMelody (.imy) |
Ogg Vorbis | Ogg (.ogg) | |
PCM | 8- and 16-bit linear PCM (rates up to limit of hardware) | WAVE (.wav) |
Image | ||
JPEG | base+progressive | |
GIF | ||
PNG | ||
BMP | ||
Video | ||
H.263 | 3GPP (.3gp) files | |
H.264 | 3GPP (.3gp) and MPEG-4 (.mp4) files | |
MPEG4 Simple Profile | 3GPP (.3gp) file |
5.1.2. Media Encoders
Device implementations SHOULD include encoders for as many of the media formats listed in Section 5.1.1. as possible. However, some encoders do not make sense for devices that lack certain optional hardware; for instance, an encoder for the H.263 video does not make sense, if the device lacks any cameras. Device implementations MUST therefore implement media encoders according to the conditions described in the table below.
See Section 7 for details on the conditions under which hardware may be omitted by device implementations.
Audio | ||||
Name | Details | File/Container Format | Conditions | |
AMR-NB | 4.75 to 12.2 kbps sampled @ 8kHz | 3GPP (.3gp) | Device implementations that include microphone hardware and define android.hardware.microphone MUST include encoders for these audio formats. | |
AMR-WB | 9 rates from 6.60 kbit/s to 23.85 kbit/s sampled @ 16kHz | 3GPP (.3gp) | ||
AAC LC/LTP | Mono/Stereo content in any combination of standard bit rates up to 160 kbps and sampling rates between 8 to 48kHz | 3GPP (.3gp) and MPEG-4 (.mp4, .m4a). | ||
Image | JPEG | base+progressive | All device implementations MUST include encoders for these image formats, as Android 2.3 includes APIs that applications can use to programmatically generate files of these types. | |
PNG | ||||
Video | H.263 | 3GPP (.3gp) files | Device implementations that include camera hardware and define either android.hardware.camera or android.hardware.camera.front MUST include encoders for these video formats. |
In addition to the encoders listed above, device implementations SHOULD include an H.264 encoder. Note that the Compatibility Definition for a future version is planned to change this requirement to "MUST". That is, H.264 encoding is optional in Android 2.3 but will be required by a future version. Existing and new devices that run Android 2.3 are very strongly encouraged to meet this requirement in Android 2.3 , or they will not be able to attain Android compatibility when upgraded to the future version.
5.2. Audio Recording
When an application has used the android.media.AudioRecord
API to start recording an audio stream, device implementations SHOULD sample and record audio with each of these behaviors:
- Noise reduction processing, if present, SHOULD be disabled.
- Automatic gain control, if present, SHOULD be disabled.
- The device SHOULD exhibit approximately flat amplitude versus frequency characteristics; specifically, ±3 dB, from 100 Hz to 4000 Hz
- Audio input sensitivity SHOULD be set such that a 90 dB sound power level (SPL) source at 1000 Hz yields RMS of 5000 for 16-bit samples.
- PCM amplitude levels SHOULD linearly track input SPL changes over at least a 30 dB range from -18 dB to +12 dB re 90 dB SPL at the microphone.
- Total harmonic distortion SHOULD be less than 1% from 100 Hz to 4000 Hz at 90 dB SPL input level.
Note: while the requirements outlined above are stated as "SHOULD" for Android 2.3, the Compatibility Definition for a future version is planned to change these to "MUST". That is, these requirements are optional in Android 2.3 but will be required by a future version. Existing and new devices that run Android 2.3 are very strongly encouraged to meet these requirements in Android 2.3 , or they will not be able to attain Android compatibility when upgraded to the future version.
5.3. Audio Latency
Audio latency is broadly defined as the interval between when an application requests an audio playback or record operation, and when the device implementation actually begins the operation. Many classes of applications rely on short latencies, to achieve real-time effects such sound effects or VOIP communication. Device implementations that include microphone hardware and declare android.hardware.microphone
SHOULD meet all audio latency requirements outlined in this section. See Section 7 for details on the conditions under which microphone hardware may be omitted by device implementations.
For the purposes of this section:
- "cold output latency" is defined to be the interval between when an application requests audio playback and when sound begins playing, when the audio system has been idle and powered down prior to the request
- "warm output latency" is defined to be the interval between when an application requests audio playback and when sound begins playing, when the audio system has been recently used but is currently idle (that is, silent)
- "continuous output latency" is defined to be the interval between when an application issues a sample to be played and when the speaker physically plays the corresponding sound, while the device is currently playing back audio
- "cold input latency" is defined to be the interval between when an application requests audio recording and when the first sample is delivered to the application via its callback, when the audio system and microphone has been idle and powered down prior to the request
- "continuous input latency" is defined to be when an ambient sound occurs and when the sample corresponding to that sound is delivered to a recording application via its callback, while the device is in recording mode
Using the above definitions, device implementations SHOULD exhibit each of these properties:
- cold output latency of 100 milliseconds or less
- warm output latency of 10 milliseconds or less
- continuous output latency of 45 milliseconds or less
- cold input latency of 100 milliseconds or less
- continuous input latency of 50 milliseconds or less
Note: while the requirements outlined above are stated as "SHOULD" for Android 2.3, the Compatibility Definition for a future version is planned to change these to "MUST". That is, these requirements are optional in Android 2.3 but will be required by a future version. Existing and new devices that run Android 2.3 are very strongly encouraged to meet these requirements in Android 2.3 , or they will not be able to attain Android compatibility when upgraded to the future version.
If a device implementation meets the requirements of this section, it MAY report support for low-latency audio, by reporting the feature "android.hardware.audio.low-latency" via the android.content.pm.PackageManager
class. [ Resources, 27 ] Conversely, if the device implementation does not meet these requirements it MUST NOT report support for low-latency audio.
6. Developer Tool Compatibility
Device implementations MUST support the Android Developer Tools provided in the Android SDK. Specifically, Android-compatible devices MUST be compatible with:
- Android Debug Bridge (known as adb) [ Resources, 23 ]
Device implementations MUST support alladb
functions as documented in the Android SDK. The device-sideadb
daemon SHOULD be inactive by default, but there MUST be a user-accessible mechanism to turn on the Android Debug Bridge. - Dalvik Debug Monitor Service (known as ddms) [ Resources, 23 ]
Device implementations MUST support allddms
features as documented in the Android SDK. Asddms
usesadb
, support forddms
SHOULD be inactive by default, but MUST be supported whenever the user has activated the Android Debug Bridge, as above. - Monkey [ Resources, 26 ]
Device implementations MUST include the Monkey framework, and make it available for applications to use.
Most Linux-based systems and Apple Macintosh systems recognize Android devices using the standard Android SDK tools, without additional support; however Microsoft Windows systems typically require a driver for new Android devices. (For instance, new vendor IDs and sometimes new device IDs require custom USB drivers for Windows systems.) If a device implementation is unrecognized by the adb
tool as provided in the standard Android SDK, device implementers MUST provide Windows drivers allowing developers to connect to the device using the adb
protocol. These drivers MUST be provided for Windows XP, Windows Vista, and Windows 7, in both 32-bit and 64-bit versions.
7. Hardware Compatibility
Android is intended to enable device implementers to create innovative form factors and configurations. At the same time Android developers write innovative applications that rely on the various hardware and features available through the Android APIs. The requirements in this section strike a balance between innovations available to device implementers, and the needs of developers to ensure their apps are only available to devices where they will run properly.
If a device includes a particular hardware component that has a corresponding API for third-party developers, the device implementation MUST implement that API as described in the Android SDK documentation. If an API in the SDK interacts with a hardware component that is stated to be optional and the device implementation does not possess that component:
- complete class definitions (as documented by the SDK) for the component's APIs MUST still be present
- the API's behaviors MUST be implemented as no-ops in some reasonable fashion
- API methods MUST return null values where permitted by the SDK documentation
- API methods MUST return no-op implementations of classes where null values are not permitted by the SDK documentation
- API methods MUST NOT throw exceptions not documented by the SDK documentation
A typical example of a scenario where these requirements apply is the telephony API: even on non-phone devices, these APIs must be implemented as reasonable no-ops.
Device implementations MUST accurately report accurate hardware configuration information via the getSystemAvailableFeatures()
and hasSystemFeature(String)
methods on the android.content.pm.PackageManager
class. [ Resources, 27 ]
7.1. Display and Graphics
Android 2.3 includes facilities that automatically adjust application assets and UI layouts appropriately for the device, to ensure that third-party applications run well on a variety of hardware configurations [ Resources, 28 ]. Devices MUST properly implement these APIs and behaviors, as detailed in this section.
7.1.1. Screen Configurations
Device implementations MAY use screens of any pixel dimensions, provided that they meet the following requirements:
- screens MUST be at least 2.5 inches in physical diagonal size
- density MUST be at least 100 dpi
- the aspect ratio MUST be between 1.333 (4:3) and 1.779 (16:9)
- the display technology used consists of square pixels
Device implementations with a screen meeting the requirements above are considered compatible, and no additional action is necessary. The Android framework implementation automatically computes display characteristics such as screen size bucket and density bucket. In the majority of cases, the framework decisions are the correct ones. If the default framework computations are used, no additional action is necessary. Device implementers wishing to change the defaults, or use a screen that does not meet the requirements above MUST contact the Android Compatibility Team for guidance, as provided for in Section 12.
The units used by the requirements above are defined as follows:
- "Physical diagonal size" is the distance in inches between two opposing corners of the illuminated portion of the display.
- "dpi" (meaning "dots per inch") is the number of pixels encompassed by a linear horizontal or vertical span of 1". Where dpi values are listed, both horizontal and vertical dpi must fall within the range.
- "Aspect ratio" is the ratio of the longer dimension of the screen to the shorter dimension. For example, a display of 480x854 pixels would be 854 / 480 = 1.779, or roughly "16:9".
Device implementations MUST use only displays with a single static configuration. That is, device implementations MUST NOT enable multiple screen configurations. For instance, since a typical television supports multiple resolutions such as 1080p, 720p, and so on, this configuration is not compatible with Android 2.3. (However, support for such configurations is under investigation and planned for a future version of Android.)
7.1.2. Display Metrics
Device implementations MUST report correct values for all display metrics defined in android.util.DisplayMetrics
[ Resources, 29 ].
7.1.3. Declared Screen Support
Applications optionally indicate which screen sizes they support via the <supports-screens>
attribute in the AndroidManifest.xml file. Device implementations MUST correctly honor applications' stated support for small, medium, and large screens, as described in the Android SDK documentation.
7.1.4. Screen Orientation
Compatible devices MUST support dynamic orientation by applications to either portrait or landscape screen orientation. That is, the device must respect the application's request for a specific screen orientation. Device implementations MAY select either portrait or landscape orientation as the default. Devices that cannot be physically rotated MAY meet this requirement by "letterboxing" applications that request portrait mode, using only a portion of the available display.
Devices MUST report the correct value for the device's current orientation, whenever queried via the android.content.res.Configuration.orientation, android.view.Display.getOrientation(), or other APIs.
7.1.5. 3D Graphics Acceleration
Device implementations MUST support OpenGL ES 1.0, as required by the Android 2.3 APIs. For devices that lack 3D acceleration hardware, a software implementation of OpenGL ES 1.0 is provided by the upstream Android Open-Source Project. Device implementations SHOULD support OpenGL ES 2.0.
Implementations MAY omit Open GL ES 2.0 support; however if support is omitted, device implementations MUST NOT report as supporting OpenGL ES 2.0. Specifically, if a device implementations lacks OpenGL ES 2.0 support:
- the managed APIs (such as via the
GLES10.getString()
method) MUST NOT report support for OpenGL ES 2.0 - the native C/C++ OpenGL APIs (that is, those available to apps via libGLES_v1CM.so, libGLES_v2.so, or libEGL.so) MUST NOT report support for OpenGL ES 2.0.
Conversely, if a device implementation does support OpenGL ES 2.0, it MUST accurately report that support via the routes just listed.
Note that Android 2.3 includes support for applications to optionally specify that they require specific OpenGL texture compression formats. These formats are typically vendor-specific. Device implementations are not required by Android 2.3 to implement any specific texture compression format. However, they SHOULD accurately report any texture compression formats that they do support, via the getString()
method in the OpenGL API.
7.2. Input Devices
Android 2.3 supports a number of modalities for user input. Device implementations MUST support user input devices as provided for in this section.
7.2.1. Keyboard
Device implementations:
- MUST include support for the Input Management Framework (which allows third party developers to create Input Management Engines -- ie soft keyboard) as detailed at developer.android.com
- MUST provide at least one soft keyboard implementation (regardless of whether a hard keyboard is present)
- MAY include additional soft keyboard implementations
- MAY include a hardware keyboard
- MUST NOT include a hardware keyboard that does not match one of the formats specified in
android.content.res.Configuration.keyboard
[ Resources, 30 ] (that is, QWERTY, or 12-key)
7.2.2. Non-touch Navigation
Device implementations:
- MAY omit a non-touch navigation option (that is, may omit a trackball, d-pad, or wheel)
- MUST report the correct value for
android.content.res.Configuration.navigation
[ Resources, 30 ] - MUST provide a reasonable alternative user interface mechanism for the selection and editing of text, compatible with Input Management Engines. The upstream Android Open-Source code includes a selection mechanism suitable for use with devices that lack non-touch navigation inputs.
7.2.3. Navigation keys
The Home, Menu and Back functions are essential to the Android navigation paradigm. Device implementations MUST make these functions available to the user at all times, regardless of application state. These functions SHOULD be implemented via dedicated buttons. They MAY be implemented using software, gestures, touch panel, etc., but if so they MUST be always accessible and not obscure or interfere with the available application display area.
Device implementers SHOULD also provide a dedicated search key. Device implementers MAY also provide send and end keys for phone calls.
7.2.4. Touchscreen input
Device implementations:
- MUST have a touchscreen
- MAY have either capacitive or resistive touchscreen
- MUST report the value of
android.content.res.Configuration
[ Resources, 30 ] reflecting corresponding to the type of the specific touchscreen on the device - SHOULD support fully independently tracked pointers, if the touchscreen supports multiple pointers
7.3. Sensors
Android 2.3 includes APIs for accessing a variety of sensor types. Devices implementations generally MAY omit these sensors, as provided for in the following subsections. If a device includes a particular sensor type that has a corresponding API for third-party developers, the device implementation MUST implement that API as described in the Android SDK documentation. For example, device implementations:
- MUST accurately report the presence or absence of sensors per the
android.content.pm.PackageManager
class. [ Resources, 27 ] - MUST return an accurate list of supported sensors via the
SensorManager.getSensorList()
and similar methods - MUST behave reasonably for all other sensor APIs (for example, by returning true or false as appropriate when applications attempt to register listeners, not calling sensor listeners when the corresponding sensors are not present; etc.)
The list above is not comprehensive; the documented behavior of the Android SDK is to be considered authoritative.
Some sensor types are synthetic, meaning they can be derived from data provided by one or more other sensors. (Examples include the orientation sensor, and the linear acceleration sensor.) Device implementations SHOULD implement these sensor types, when they include the prerequisite physical sensors.
The Android 2.3 APIs introduce a notion of a "streaming" sensor, which is one that returns data continuously, rather than only when the data changes. Device implementations MUST continuously provide periodic data samples for any API indicated by the Android 2.3 SDK documentation to be a streaming sensor.
7.3.1. Accelerometer
Device implementations SHOULD include a 3-axis accelerometer. If a device implementation does include a 3-axis accelerometer, it:
- MUST be able to deliver events at 50 Hz or greater
- MUST comply with the Android sensor coordinate system as detailed in the Android APIs (see [ Resources, 31 ])
- MUST be capable of measuring from freefall up to twice gravity (2g) or more on any three-dimensional vector
- MUST have 8-bits of accuracy or more
- MUST have a standard deviation no greater than 0.05 m/s^2
7.3.2. Magnetometer
Device implementations SHOULD include a 3-axis magnetometer (ie compass.) If a device does include a 3-axis magnetometer, it:
- MUST be able to deliver events at 10 Hz or greater
- MUST comply with the Android sensor coordinate system as detailed in the Android APIs (see [ Resources, 31 ]).
- MUST be capable of sampling a range of field strengths adequate to cover the geomagnetic field
- MUST have 8-bits of accuracy or more
- MUST have a standard deviation no greater than 0.5 µT
7.3.3. GPS
Device implementations SHOULD include a GPS receiver. If a device implementation does include a GPS receiver, it SHOULD include some form of "assisted GPS" technique to minimize GPS lock-on time.
7.3.4. Gyroscope
Device implementations SHOULD include a gyroscope (ie angular change sensor.) Devices SHOULD NOT include a gyroscope sensor unless a 3-axis accelerometer is also included. If a device implementation includes a gyroscope, it:
- MUST be capable of measuring orientation changes up to 5.5*Pi radians/second (that is, approximately 1,000 degrees per second)
- MUST be able to deliver events at 100 Hz or greater
- MUST have 8-bits of accuracy or more
7.3.5. Barometer
Device implementations MAY include a barometer (ie ambient air pressure sensor.) If a device implementation includes a barometer, it:
- MUST be able to deliver events at 5 Hz or greater
- MUST have adequate precision to enable estimating altitude
7.3.7. Thermometer
Device implementations MAY but SHOULD NOT include a thermometer (ie temperature sensor.) If a device implementation does include a thermometer, it MUST measure the temperature of the device CPU. It MUST NOT measure any other temperature. (Note that this sensor type is deprecated in the Android 2.3 APIs.)
7.3.7. Photometer
Device implementations MAY include a photometer (ie ambient light sensor.)
7.3.8. Proximity Sensor
Device implementations MAY include a proximity sensor. If a device implementation does include a proximity sensor, it MUST measure the proximity of an object in the same direction as the screen. That is, the proximity sensor MUST be oriented to detect objects close to the screen, as the primary intent of this sensor type is to detect a phone in use by the user. If a device implementation includes a proximity sensor with any other orientation, it MUST NOT be accessible through this API. If a device implementation has a proximity sensor, it MUST be have 1-bit of accuracy or more.
7.4. Data Connectivity
Network connectivity and access to the Internet are vital features of Android. Meanwhile, device-to-device interaction adds significant value to Android devices and applications. Device implementations MUST meet the data connectivity requirements in this section.
7.4.1. Telephony
"Telephony" as used by the Android 2.3 APIs and this document refers specifically to hardware related to placing voice calls and sending SMS messages via a GSM or CDMA network. While these voice calls may or may not be packet-switched, they are for the purposes of Android 2.3 considered independent of any data connectivity that may be implemented using the same network. In other words, the Android "telephony" functionality and APIs refer specifically to voice calls and SMS; for instance, device implementations that cannot place calls or send/receive SMS messages MUST NOT report the "android.hardware.telephony" feature or any sub-features, regardless of whether they use a cellular network for data connectivity.
Android 2.3 MAY be used on devices that do not include telephony hardware. That is, Android 2.3 is compatible with devices that are not phones. However, if a device implementation does include GSM or CDMA telephony, it MUST implement full support for the API for that technology. Device implementations that do not include telephony hardware MUST implement the full APIs as no-ops.
7.4.2. IEEE 802.11 (WiFi)
Android 2.3 device implementations SHOULD include support for one or more forms of 802.11 (b/g/a/n, etc.) If a device implementation does include support for 802.11, it MUST implement the corresponding Android API.
7.4.3. Bluetooth
Device implementations SHOULD include a Bluetooth transceiver. Device implementations that do include a Bluetooth transceiver MUST enable the RFCOMM-based Bluetooth API as described in the SDK documentation [ Resources, 32 ]. Device implementations SHOULD implement relevant Bluetooth profiles, such as A2DP, AVRCP, OBEX, etc. as appropriate for the device.
The Compatibility Test Suite includes cases that cover basic operation of the Android RFCOMM Bluetooth API. However, since Bluetooth is a communications protocol between devices, it cannot be fully tested by unit tests running on a single device. Consequently, device implementations MUST also pass the human-driven Bluetooth test procedure described in Appendix A.
7.4.4. Near-Field Communications
Device implementations SHOULD include a transceiver and related hardware for Near-Field Communications (NFC). If a device implementation does include NFC hardware, then it:
- MUST report the android.hardware.nfc feature from the
android.content.pm.PackageManager.hasSystemFeature()
method. [ Resources, 27 ] - MUST be capable of reading and writing NDEF messages via the following NFC standards:
- MUST be capable of acting as an NFC Forum reader/writer (as defined by the NFC Forum technical specification NFCForum-TS-DigitalProtocol-1.0) via the following NFC standards:
- NfcA (ISO14443-3A)
- NfcB (ISO14443-3B)
- NfcF (JIS 6319-4)
- NfcV (ISO 15693)
- IsoDep (ISO 14443-4)
- NFC Forum Tag Types 1, 2, 3, 4 (defined by the NFC Forum)
- MUST be capable of transmitting and receiving data via the following peer-to-peer standards and protocols:
- ISO 18092
- LLCP 1.0 (defined by the NFC Forum)
- SDP 1.0 (defined by the NFC Forum)
- NDEF Push Protocol [ Resources, 33 ]
- MUST scan for all supported technologies while in NFC discovery mode.
- SHOULD be in NFC discovery mode while the device is awake with the screen active.
(Note that publicly available links are not available for the JIS, ISO, and NFC Forum specifications cited above.)
Additionally, device implementations SHOULD support the following widely-deployed MIFARE technologies.
- MIFARE Classic (NXP MF1S503x [ Resources, 34 ], MF1S703x [ Resources, 35 ])
- MIFARE Ultralight (NXP MF0ICU1 [ Resources, 36 ], MF0ICU2 [ Resources, 37 ])
- NDEF on MIFARE Classic (NXP AN130511 [ Resources, 38 ], AN130411 [ Resources, 39 ])
Note that Android 2.3.3 includes APIs for these MIFARE types. If a device implementation supports MIFARE, it:
- MUST implement the corresponding Android APIs as documented by the Android SDK
- MUST report the feature com.nxp.mifare from the
android.content.pm.PackageManager.hasSystemFeature()
method. [ Resources, 27 ] Note that this is not a standard Android feature, and as such does not appear as a constant on thePackageManager
class. - MUST NOT implement the corresponding Android APIs nor report the com.nxp.mifare feature unless it also implements general NFC support as described in this section
If a device implementation does not include NFC hardware, it MUST NOT declare the android.hardware.nfc feature from the
android.content.pm.PackageManager.hasSystemFeature()
method [ Resources, 27 ], and MUST implement the Android 2.3 NFC API as a no-op.As the classes
android.nfc.NdefMessage
andandroid.nfc.NdefRecord
represent a protocol-independent data representation format, device implementations MUST implement these APIs even if they do not include support for NFC or declare the android.hardware.nfc feature.7.4.5. Minimum Network Capability
Device implementations MUST include support for one or more forms of data networking. Specifically, device implementations MUST include support for at least one data standard capable of 200Kbit/sec or greater. Examples of technologies that satisfy this requirement include EDGE, HSPA, EV-DO, 802.11g, Ethernet, etc.
Device implementations where a physical networking standard (such as Ethernet) is the primary data connection SHOULD also include support for at least one common wireless data standard, such as 802.11 (WiFi).
Devices MAY implement more than one form of data connectivity.
7.5. Cameras
Device implementations SHOULD include a rear-facing camera, and MAY include a front-facing camera. A rear-facing camera is a camera located on the side of the device opposite the display; that is, it images scenes on the far side of the device, like a traditional camera. A front-facing camera is a camera located on the same side of the device as the display; that is, a camera typically used to image the user, such as for video conferencing and similar applications.
7.5.1. Rear-Facing Camera
Device implementations SHOULD include a rear-facing camera. If a device implementation includes a rear-facing camera, it:
- MUST have a resolution of at least 2 megapixels
- SHOULD have either hardware auto-focus, or software auto-focus implemented in the camera driver (transparent to application software)
- MAY have fixed-focus or EDOF (extended depth of field) hardware
- MAY include a flash. If the Camera includes a flash, the flash lamp MUST NOT be lit while an android.hardware.Camera.PreviewCallback instance has been registered on a Camera preview surface, unless the application has explicitly enabled the flash by enabling the
FLASH_MODE_AUTO
orFLASH_MODE_ON
attributes of aCamera.Parameters
object. Note that this constraint does not apply to the device's built-in system camera application, but only to third-party applications usingCamera.PreviewCallback
.
7.5.2. Front-Facing Camera
Device implementations MAY include a front-facing camera. If a device implementation includes a front-facing camera, it:
- MUST have a resolution of at least VGA (that is, 640x480 pixels)
- MUST NOT use a front-facing camera as the default for the Camera API. That is, the camera API in Android 2.3 has specific support for front-facing cameras, and device implementations MUST NOT configure the API to to treat a front-facing camera as the default rear-facing camera, even if it is the only camera on the device.
- MAY include features (such as auto-focus, flash, etc.) available to rear-facing cameras as described in Section 7.5.1.
- MUST horizontally reflect (ie mirror) the stream displayed by an app in a CameraPreview, as follows:
- If the device implementation is capable of being rotated by user (such as automatically via an accelerometer or manually via user input), the camera preview MUST be mirrored horizontally relative to the device's current orientation.
- If the current application has explicitly requested that the Camera display be rotated via a call to the
android.hardware.Camera.setDisplayOrientation()
[ Resources, 40 ] method, the camera preview MUST be mirrored horizontally relative to the orientation specified by the application. - Otherwise, the preview MUST be mirrored along the device's default horizontal axis.
- MUST mirror the image data returned to any "postview" camera callback handlers, in the same manner as the camera preview image stream. (If the device implementation does not support postview callbacks, this requirement obviously does not apply.)
- MUST NOT mirror the final captured still image or video streams returned to application callbacks or committed to media storage
7.5.3. Camera API Behavior
Device implementations MUST implement the following behaviors for the camera-related APIs, for both front- and rear-facing cameras:
- If an application has never called android.hardware.Camera.Parameters.setPreviewFormat(int), then the device MUST use android.hardware.PixelFormat.YCbCr_420_SP for preview data provided to application callbacks.
- If an application registers an android.hardware.Camera.PreviewCallback instance and the system calls the onPreviewFrame() method when the preview format is YCbCr_420_SP, the data in the byte[] passed into onPreviewFrame() must further be in the NV21 encoding format. That is, NV21 MUST be the default.
- Device implementations SHOULD support the YV12 format (as denoted by the
android.graphics.ImageFormat.YV12
constant) for camera previews for both front- and rear-facing cameras. Note that the Compatibility Definition for a future version is planned to change this requirement to "MUST". That is, YV12 support is optional in Android 2.3 but will be required by a future version. Existing and new devices that run Android 2.3 are very strongly encouraged to meet this requirement in Android 2.3 , or they will not be able to attain Android compatibility when upgraded to the future version.
Device implementations MUST implement the full Camera API included in the Android 2.3 SDK documentation [ Resources, 41 ]), regardless of whether the device includes hardware autofocus or other capabilities. For instance, cameras that lack autofocus MUST still call any registered
android.hardware.Camera.AutoFocusCallback
instances (even though this has no relevance to a non-autofocus camera.) Note that this does apply to front-facing cameras; for instance, even though most front-facing cameras do not support autofocus, the API callbacks must still be "faked" as described.Device implementations MUST recognize and honor each parameter name defined as a constant on the
android.hardware.Camera.Parameters
class, if the underlying hardware supports the feature. If the device hardware does not support a feature, the API must behave as documented. Conversely, Device implementations MUST NOT honor or recognize string constants passed to theandroid.hardware.Camera.setParameters()
method other than those documented as constants on theandroid.hardware.Camera.Parameters
. That is, device implementations MUST support all standard Camera parameters if the hardware allows, and MUST NOT support custom Camera parameter types.7.5.4. Camera Orientation
Both front- and rear-facing cameras, if present, MUST be oriented so that the long dimension of the camera aligns with the screen's long dimension. That is, when the device is held in the landscape orientation, a cameras MUST capture images in the landscape orientation. This applies regardless of the device's natural orientation; that is, it applies to landscape-primary devices as well as portrait-primary devices.
7.6. Memory and Storage
The fundamental function of Android 2.3 is to run applications. Device implementations MUST the requirements of this section, to ensure adequate storage and memory for applications to run properly.
7.6.1. Minimum Memory and Storage
Device implementations MUST have at least 128MB of memory available to the kernel and userspace. The 128MB MUST be in addition to any memory dedicated to hardware components such as radio, memory, and so on that is not under the kernel's control.
Device implementations MUST have at least 150MB of non-volatile storage available for user data. That is, the
/data
partition MUST be at least 150MB.Beyond the requirements above, device implementations SHOULD have at least 1GB of non-volatile storage available for user data. Note that this higher requirement is planned to become a hard minimum in a future version of Android. Device implementations are strongly encouraged to meet these requirements now, or else they may not be eligible for compatibility for a future version of Android.
The Android APIs include a Download Manager that applications may use to download data files. The Download Manager implementation MUST be capable of downloading individual files 55MB in size, or larger. The Download Manager implementation SHOULD be capable of downloading files 100MB in size, or larger.
7.6.2. Application Shared Storage
Device implementations MUST offer shared storage for applications. The shared storage provided MUST be at least 1GB in size.
Device implementations MUST be configured with shared storage mounted by default, "out of the box". If the shared storage is not mounted on the Linux path
/sdcard
, then the device MUST include a Linux symbolic link from/sdcard
to the actual mount point.Device implementations MUST enforce as documented the
android.permission.WRITE_EXTERNAL_STORAGE
permission on this shared storage. Shared storage MUST otherwise be writable by any application that obtains that permission.Device implementations MAY have hardware for user-accessible removable storage, such as a Secure Digital card. Alternatively, device implementations MAY allocate internal (non-removable) storage as shared storage for apps.
Regardless of the form of shared storage used, device implementations MUST provide some mechanism to access the contents of shared storage from a host computer, such as USB mass storage or Media Transfer Protocol.
It is illustrative to consider two common examples. If a device implementation includes an SD card slot to satisfy the shared storage requirement, a FAT-formatted SD card 1GB in size or larger MUST be included with the device as sold to users, and MUST be mounted by default. Alternatively, if a device implementation uses internal fixed storage to satisfy this requirement, that storage MUST be 1GB in size or larger and mounted on
/sdcard
(or/sdcard
MUST be a symbolic link to the physical location if it is mounted elsewhere.)Device implementations that include multiple shared storage paths (such as both an SD card slot and shared internal storage) SHOULD modify the core applications such as the media scanner and ContentProvider to transparently support files placed in both locations.
7.7. USB
Device implementations:
- MUST implement a USB client, connectable to a USB host with a standard USB-A port
- MUST implement the Android Debug Bridge over USB (as described in Section 7)
- MUST implement the USB mass storage specification, to allow a host connected to the device to access the contents of the /sdcard volume
- SHOULD use the micro USB form factor on the device side
- MAY include a non-standard port on the device side, but if so MUST ship with a cable capable of connecting the custom pinout to standard USB-A port
8. Performance Compatibility
Compatible implementations must ensure not only that applications simply run correctly on the device, but that they do so with reasonable performance and overall good user experience. Device implementations MUST meet the key performance metrics of an Android 2.3 compatible device defined in the table below:
Metric Performance Threshold Comments Application Launch Time The following applications should launch within the specified time. - Browser: less than 1300ms
- MMS/SMS: less than 700ms
- AlarmClock: less than 650ms
The launch time is measured as the total time to complete loading the default activity for the application, including the time it takes to start the Linux process, load the Android package into the Dalvik VM, and call onCreate. Simultaneous Applications When multiple applications have been launched, re-launching an already-running application after it has been launched must take less than the original launch time. 9. Security Model Compatibility
Device implementations MUST implement a security model consistent with the Android platform security model as defined in Security and Permissions reference document in the APIs [ Resources, 42 ] in the Android developer documentation. Device implementations MUST support installation of self-signed applications without requiring any additional permissions/certificates from any third parties/authorities. Specifically, compatible devices MUST support the security mechanisms described in the follow sub-sections.
9.1. Permissions
Device implementations MUST support the Android permissions model as defined in the Android developer documentation [ Resources, 42 ]. Specifically, implementations MUST enforce each permission defined as described in the SDK documentation; no permissions may be omitted, altered, or ignored. Implementations MAY add additional permissions, provided the new permission ID strings are not in the android.* namespace.
9.2. UID and Process Isolation
Device implementations MUST support the Android application sandbox model, in which each application runs as a unique Unix-style UID and in a separate process. Device implementations MUST support running multiple applications as the same Linux user ID, provided that the applications are properly signed and constructed, as defined in the Security and Permissions reference [ Resources, 42 ].
9.3. Filesystem Permissions
Device implementations MUST support the Android file access permissions model as defined in as defined in the Security and Permissions reference [ Resources, 42 ].
9.4. Alternate Execution Environments
Device implementations MAY include runtime environments that execute applications using some other software or technology than the Dalvik virtual machine or native code. However, such alternate execution environments MUST NOT compromise the Android security model or the security of installed Android applications, as described in this section.
Alternate runtimes MUST themselves be Android applications, and abide by the standard Android security model, as described elsewhere in Section 9.
Alternate runtimes MUST NOT be granted access to resources protected by permissions not requested in the runtime's AndroidManifest.xml file via the
<uses-permission>
mechanism.Alternate runtimes MUST NOT permit applications to make use of features protected by Android permissions restricted to system applications.
Alternate runtimes MUST abide by the Android sandbox model. Specifically:
- Alternate runtimes SHOULD install apps via the PackageManager into separate Android sandboxes (that is, Linux user IDs, etc.)
- Alternate runtimes MAY provide a single Android sandbox shared by all applications using the alternate runtime.
- Alternate runtimes and installed applications using an alternate runtime MUST NOT reuse the sandbox of any other app installed on the device, except through the standard Android mechanisms of shared user ID and signing certificate
- Alternate runtimes MUST NOT launch with, grant, or be granted access to the sandboxes corresponding to other Android applications.
Alternate runtimes MUST NOT be launched with, be granted, or grant to other applications any privileges of the superuser (root), or of any other user ID.
The .apk files of alternate runtimes MAY be included in the system image of a device implementation, but MUST be signed with a key distinct from the key used to sign other applications included with the device implementation.
When installing applications, alternate runtimes MUST obtain user consent for the Android permissions used by the application. That is, if an application needs to make use of a device resource for which there is a corresponding Android permission (such as Camera, GPS, etc.), the alternate runtime MUST inform the user that the application will be able to access that resource. If the runtime environment does not record application capabilities in this manner, the runtime environment MUST list all permissions held by the runtime itself when installing any application using that runtime.
10. Software Compatibility Testing
The Android Open-Source Project includes various testing tools to verify that device implementations are compatible. Device implementations MUST pass all tests described in this section.
However, note that no software test package is fully comprehensive. For this reason, device implementers are very strongly encouraged to make the minimum number of changes as possible to the reference and preferred implementation of Android 2.3 available from the Android Open-Source Project. This will minimize the risk of introducing bugs that create incompatibilities requiring rework and potential device updates.
10.1. Compatibility Test Suite
Device implementations MUST pass the Android Compatibility Test Suite (CTS) [ Resources, 2 ] available from the Android Open Source Project, using the final shipping software on the device. Additionally, device implementers SHOULD use the reference implementation in the Android Open Source tree as much as possible, and MUST ensure compatibility in cases of ambiguity in CTS and for any reimplementations of parts of the reference source code.
The CTS is designed to be run on an actual device. Like any software, the CTS may itself contain bugs. The CTS will be versioned independently of this Compatibility Definition, and multiple revisions of the CTS may be released for Android 2.3. Device implementations MUST pass the latest CTS version available at the time the device software is completed.
MUST pass the most recent version of the Android Compatibility Test Suite (CTS) available at the time of the device implementation's software is completed. (The CTS is available as part of the Android Open Source Project [ Resources, 2 ].) The CTS tests many, but not all, of the components outlined in this document.
10.2. CTS Verifier
Device implementations MUST correctly execute all applicable cases in the CTS Verifier. The CTS Verifier is included with the Compatibility Test Suite, and is intended to be run by a human operator to test functionality that cannot be tested by an automated system, such as correct functioning of a camera and sensors.
The CTS Verifier has tests for many kinds of hardware, including some hardware that is optional. Device implementations MUST pass all tests for hardware which they possess; for instance, if a device possesses an accelerometer, it MUST correctly execute the Accelerometer test case in the CTS Verifier. Test cases for features noted as optional by this Compatibility Definition Document MAY be skipped or omitted.
Every device and every build MUST correctly run the CTS Verifier, as noted above. However, since many builds are very similar, device implementers are not expected to explicitly run the CTS Verifier on builds that differ only in trivial ways. Specifically, device implementations that differ from an implementation that has passed the CTS Verfier only by the set of included locales, branding, etc. MAY omit the CTS Verifier test.
10.3. Reference Applications
Device implementers MUST test implementation compatibility using the following open-source applications:
- The "Apps for Android" applications [ Resources, 43 ].
- Replica Island (available in Android Market; only required for device implementations that support with OpenGL ES 2.0)
Each app above MUST launch and behave correctly on the implementation, for the implementation to be considered compatible.
11. Updatable Software
Device implementations MUST include a mechanism to replace the entirety of the system software. The mechanism need not perform "live" upgrades -- that is, a device restart MAY be required.
Any method can be used, provided that it can replace the entirety of the software preinstalled on the device. For instance, any of the following approaches will satisfy this requirement:
- Over-the-air (OTA) downloads with offline update via reboot
- "Tethered" updates over USB from a host PC
- "Offline" updates via a reboot and update from a file on removable storage
The update mechanism used MUST support updates without wiping user data. Note that the upstream Android software includes an update mechanism that satisfies this requirement.
If an error is found in a device implementation after it has been released but within its reasonable product lifetime that is determined in consultation with the Android Compatibility Team to affect the compatibility of third-party applications, the device implementer MUST correct the error via a software update available that can be applied per the mechanism just described.
12. Contact Us
You can contact the document authors at compatibility@android.com for clarifications and to bring up any issues that you think the document does not cover.
Appendix A - Bluetooth Test Procedure
The Compatibility Test Suite includes cases that cover basic operation of the Android RFCOMM Bluetooth API. However, since Bluetooth is a communications protocol between devices, it cannot be fully tested by unit tests running on a single device. Consequently, device implementations MUST also pass the human-operated Bluetooth test procedure described below.
The test procedure is based on the BluetoothChat sample app included in the Android open-source project tree. The procedure requires two devices:
- a candidate device implementation running the software build to be tested
- a separate device implementation already known to be compatible, and of a model from the device implementation being tested -- that is, a "known good" device implementation
The test procedure below refers to these devices as the "candidate" and "known good" devices, respectively.
Setup and Installation
- Build BluetoothChat.apk via 'make samples' from an Android source code tree.
- Install BluetoothChat.apk on the known-good device.
- Install BluetoothChat.apk on the candidate device.
Test Bluetooth Control by Apps
- Launch BluetoothChat on the candidate device, while Bluetooth is disabled.
- Verify that the candidate device either turns on Bluetooth, or prompts the user with a dialog to turn on Bluetooth.
Test Pairing and Communication
- Launch the Bluetooth Chat app on both devices.
- Make the known-good device discoverable from within BluetoothChat (using the Menu).
- On the candidate device, scan for Bluetooth devices from within BluetoothChat (using the Menu) and pair with the known-good device.
- Send 10 or more messages from each device, and verify that the other device receives them correctly.
- Close the BluetoothChat app on both devices by pressing Home .
- Unpair each device from the other, using the device Settings app.
Test Pairing and Communication in the Reverse Direction
- Launch the Bluetooth Chat app on both devices.
- Make the candidate device discoverable from within BluetoothChat (using the Menu).
- On the known-good device, scan for Bluetooth devices from within BluetoothChat (using the Menu) and pair with the candidate device.
- Send 10 or messages from each device, and verify that the other device receives them correctly.
- Close the Bluetooth Chat app on both devices by pressing Back repeatedly to get to the Launcher.
Test Re-Launches
- Re-launch the Bluetooth Chat app on both devices.
- Send 10 or messages from each device, and verify that the other device receives them correctly.
Note: the above tests have some cases which end a test section by using Home, and some using Back. These tests are not redundant and are not optional: the objective is to verify that the Bluetooth API and stack works correctly both when Activities are explicitly terminated (via the user pressing Back, which calls finish()), and implicitly sent to background (via the user pressing Home.) Each test sequence MUST be performed as described.
,Copyright © 2010, Google Inc. All rights reserved.
compatibility@android.comTable of Contents
1. Introduction
2. Resources
3. Software3.1. Managed API Compatibility4. Application Packaging Compatibility
3.2. Soft API Compatibility
3.3. Native API Compatibility
3.4. Web Compatibility
3.5. API Behavioral Compatibility
3.6. API Namespaces
3.7. Virtual Machine Compatibility
3.8. User Interface Compatibility
5. Multimedia Compatibility5.1. Media Codecs6. Developer Tool Compatibility
5.1.1. Media Decoders
5.1.2. Media Encoders
5.2. Audio Recording
5.3. Audio Latency
7. Hardware Compatibility7.1. Display and Graphics8. Performance Compatibility7.1.1. Screen Configurations7.2. Input Devices
7.1.2. Display Metrics
7.1.3. Declared Screen Support
7.1.4. Screen Orientation
7.1.5. 3D Graphics Accleration
7.3. Sensors7.3.1. Accelerometer7.4. Data Connectivity
7.3.2. Magnetometer
7.3.3. GPS
7.3.4. Gyroscope
7.3.5. Barometer
7.3.6. Thermometer
7.3.7. Photometer
7.3.8. Proximity Sensor7.4.1. Telephony7.5. Cameras
7.4.2. IEEE 802.11 (WiFi)
7.4.3. Bluetooth
7.4.4. Near-Field Communications
7.4.5. Minimum Network Capability7.5.1. Rear-Facing Camera7.6. Memory and Storage
7.5.2. Front-Facing Camera
7.5.3. Camera API Behavior
7.5.4. Camera Orientation
7.7. USB
9. Security Model Compatibility9.1. Permissions10. Software Compatibility Testing
9.2. UID and Process Isolation
9.3. Filesystem Permissions
9.4. Alternate Execution Environments
11. Updatable Software
12. Contact Us
Appendix A - Bluetooth Test Procedure1. Introduction
This document enumerates the requirements that must be met in order for mobile phones to be compatible with Android 2.3.
The use of "must", "must not", "required", "shall", "shall not", "should", "should not", "recommended", "may" and "optional" is per the IETF standard defined in RFC2119 [ Resources, 1 ].
As used in this document, a "device implementer" or "implementer" is a person or organization developing a hardware/software solution running Android 2.3. A "device implementation" or "implementation" is the hardware/software solution so developed.
To be considered compatible with Android 2.3, device implementations MUST meet the requirements presented in this Compatibility Definition, including any documents incorporated via reference.
Where this definition or the software tests described in Section 10 is silent, ambiguous, or incomplete, it is the responsibility of the device implementer to ensure compatibility with existing implementations. For this reason, the Android Open Source Project [ Resources, 3 ] is both the reference and preferred implementation of Android. Device implementers are strongly encouraged to base their implementations to the greatest extent possible on the "upstream" source code available from the Android Open Source Project. While some components can hypothetically be replaced with alternate implementations this practice is strongly discouraged, as passing the software tests will become substantially more difficult. It is the implementer's responsibility to ensure full behavioral compatibility with the standard Android implementation, including and beyond the Compatibility Test Suite. Finally, note that certain component substitutions and modifications are explicitly forbidden by this document.
Please note that this Compatibility Definition is issued to correspond with the 2.3.3 update to Android, which is API level 10. This Definition obsoletes and replaces the Compatibility Definition for Android 2.3 versions prior to 2.3.3. (That is, versions 2.3.1 and 2.3.2 are obsolete.) Future Android-compatible devices running Android 2.3 MUST ship with version 2.3.3 or later.
2. Resources
- IETF RFC2119 Requirement Levels: http://www.ietf.org/rfc/rfc2119.txt
- Android Compatibility Program Overview: http://source.android.com/compatibility/index.html
- Android Open Source Project: http://source.android.com/
- API definitions and documentation: http://developer.android.com/reference/packages.html
- Android Permissions reference: http://developer.android.com/reference/android/Manifest.permission.html
- android.os.Build reference: http://developer.android.com/reference/android/os/Build.html
- Android 2.3 allowed version strings: http://source.android.com/compatibility/2.3/versions.html
- android.webkit.WebView class: http://developer.android.com/reference/android/webkit/WebView.html
- HTML5: http://www.whatwg.org/specs/web-apps/current-work/multipage/
- HTML5 offline capabilities: http://dev.w3.org/html5/spec/Overview.html#offline
- HTML5 video tag: http://dev.w3.org/html5/spec/Overview.html#video
- HTML5/W3C geolocation API: http://www.w3.org/TR/geolocation-API/
- HTML5/W3C webdatabase API: http://www.w3.org/TR/webdatabase/
- HTML5/W3C IndexedDB API: http://www.w3.org/TR/IndexedDB/
- Dalvik Virtual Machine specification: available in the Android source code, at dalvik/docs
- AppWidgets: http://developer.android.com/guide/practices/ui_guidelines/widget_design.html
- Notifications: http://developer.android.com/guide/topics/ui/notifiers/notifications.html
- Application Resources: http://code.google.com/android/reference/available-resources.html
- Status Bar icon style guide: http://developer.android.com/guide/practices/ui_guideline /icon_design.html#statusbarstructure
- Search Manager: http://developer.android.com/reference/android/app/SearchManager.html
- Toasts: http://developer.android.com/reference/android/widget/Toast.html
- Live Wallpapers: https://android-developers.googleblog.com/2010/02/live-wallpapers.html
- Reference tool documentation (for adb, aapt, ddms): http://developer.android.com/guide/developing/tools/index.html
- Android apk file description: http://developer.android.com/guide/topics/fundamentals.html
- Manifest files: http://developer.android.com/guide/topics/manifest/manifest-intro.html
- Monkey testing tool: https://developer.android.com/studio/test/other-testing-tools/monkey
- Android Hardware Features List: http://developer.android.com/reference/android/content/pm/PackageManager.html
- Supporting Multiple Screens: 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
- Sensor coordinate space: http://developer.android.com/reference/android/hardware/SensorEvent.html
- Bluetooth API: http://developer.android.com/reference/android/bluetooth/package-summary.html
- NDEF Push Protocol: http://source.android.com/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
- Camera orientation API: http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int)
- android.hardware.Camera: http://developer.android.com/reference/android/hardware/Camera.html
- Android Security and Permissions reference: http://developer.android.com/guide/topics/security/security.html
- Apps for Android: http://code.google.com/p/apps-for-android
Many of these resources are derived directly or indirectly from the Android 2.3 SDK, and will be functionally identical to the information in that SDK's documentation. In any cases where this Compatibility Definition or the Compatibility Test Suite disagrees with the SDK documentation, the SDK documentation is considered authoritative. Any technical details provided in the references included above are considered by inclusion to be part of this Compatibility Definition.
3. Software
The Android platform includes a set of managed APIs, a set of native APIs, and a body of so-called "soft" APIs such as the Intent system and web-application APIs. This section details the hard and soft APIs that are integral to compatibility, as well as certain other relevant technical and user interface behaviors. Device implementations MUST comply with all the requirements in this section.
3.1. Managed API Compatibility
The managed (Dalvik-based) execution environment is the primary vehicle for Android applications. The Android application programming interface (API) is the set of Android platform interfaces exposed to applications running in the managed VM environment. Device implementations MUST provide complete implementations, including all documented behaviors, of any documented API exposed by the Android 2.3 SDK [ Resources, 4 ].
Device implementations MUST NOT omit any managed APIs, alter API interfaces or signatures, deviate from the documented behavior, or include no-ops, except where specifically allowed by this Compatibility Definition.
This Compatibility Definition permits some types of hardware for which Android includes APIs to be omitted by device implementations. In such cases, the APIs MUST still be present and behave in a reasonable way. See Section 7 for specific requirements for this scenario.
3.2. Soft API Compatibility
In addition to the managed APIs from Section 3.1, Android also includes a significant runtime-only "soft" API, in the form of such things such as Intents, permissions, and similar aspects of Android applications that cannot be enforced at application compile time. This section details the "soft" APIs and system behaviors required for compatibility with Android 2.3. Device implementations MUST meet all the requirements presented in this section.
3.2.1. Permissions
Device implementers MUST support and enforce all permission constants as documented by the Permission reference page [ Resources, 5 ]. Note that Section 10 lists additional requirements related to the Android security model.
3.2.2. Build Parameters
The Android APIs include a number of constants on the
android.os.Build
class [ Resources, 6 ] that are intended to describe the current device. To provide consistent, meaningful values across device implementations, the table below includes additional restrictions on the formats of these values to which device implementations MUST conform.Parameter Comments android.os.Build.VERSION.RELEASE The version of the currently-executing Android system, in human-readable format. This field MUST have one of the string values defined in [ Resources, 7 ]. android.os.Build.VERSION.SDK The version of the currently-executing Android system, in a format accessible to third-party application code. For Android 2.3, this field MUST have the integer value 9. android.os.Build.VERSION.INCREMENTAL A value chosen by the device implementer designating the specific build of the currently-executing Android system, in human-readable format. This value MUST NOT be re-used for different builds made available to end users. A typical use of this field is to indicate which build number or source-control change identifier was used to generate the build. There are no requirements on the specific format of this field, except that it MUST NOT be null or the empty string (""). android.os.Build.BOARD A value chosen by the device implementer identifying the specific internal hardware used by the device, in human-readable format. A possible use of this field is to indicate the specific revision of the board powering the device. The value of this field MUST be encodable as 7-bit ASCII and match the regular expression "^[a-zA-Z0-9.,_-]+$"
.android.os.Build.BRAND A value chosen by the device implementer identifying the name of the company, organization, individual, etc. who produced the device, in human-readable format. A possible use of this field is to indicate the OEM and/or carrier who sold the device. The value of this field MUST be encodable as 7-bit ASCII and match the regular expression "^[a-zA-Z0-9.,_-]+$"
.android.os.Build.DEVICE A value chosen by the device implementer identifying the specific configuration or revision of the body (sometimes called "industrial design") of the device. The value of this field MUST be encodable as 7-bit ASCII and match the regular expression "^[a-zA-Z0-9.,_-]+$"
.android.os.Build.FINGERPRINT A string that uniquely identifies this build. It SHOULD be reasonably human-readable. It MUST follow this template:
$(BRAND)/$(PRODUCT)/$(DEVICE):$(VERSION.RELEASE)/$(ID)/$(VERSION.INCREMENTAL):$(TYPE)/$(TAGS)
For example:
acme/mydevice/generic/generic:2.3/ERC77/3359:userdebug/test-keys
The fingerprint MUST NOT include whitespace characters. If other fields included in the template above have whitespace characters, they MUST be replaced in the build fingerprint with another character, such as the underscore ("_") character. The value of this field MUST be encodable as 7-bit ASCII.android.os.Build.HOST A string that uniquely identifies the host the build was built on, in human readable format. There are no requirements on the specific format of this field, except that it MUST NOT be null or the empty string (""). android.os.Build.ID An identifier chosen by the device implementer to refer to a specific release, in human readable format. This field can be the same as android.os.Build.VERSION.INCREMENTAL, but SHOULD be a value sufficiently meaningful for end users to distinguish between software builds. The value of this field MUST be encodable as 7-bit ASCII and match the regular expression "^[a-zA-Z0-9.,_-]+$"
.android.os.Build.MODEL A value chosen by the device implementer containing the name of the device as known to the end user. This SHOULD be the same name under which the device is marketed and sold to end users. There are no requirements on the specific format of this field, except that it MUST NOT be null or the empty string (""). android.os.Build.PRODUCT A value chosen by the device implementer containing the development name or code name of the device. MUST be human-readable, but is not necessarily intended for view by end users. The value of this field MUST be encodable as 7-bit ASCII and match the regular expression "^[a-zA-Z0-9.,_-]+$"
.android.os.Build.TAGS A comma-separated list of tags chosen by the device implementer that further distinguish the build. For example, "unsigned,debug". The value of this field MUST be encodable as 7-bit ASCII and match the regular expression "^[a-zA-Z0-9.,_-]+$"
.android.os.Build.TIME A value representing the timestamp of when the build occurred. android.os.Build.TYPE A value chosen by the device implementer specifying the runtime configuration of the build. This field SHOULD have one of the values corresponding to the three typical Android runtime configurations: "user", "userdebug", or "eng". The value of this field MUST be encodable as 7-bit ASCII and match the regular expression "^[a-zA-Z0-9.,_-]+$"
.android.os.Build.USER A name or user ID of the user (or automated user) that generated the build. There are no requirements on the specific format of this field, except that it MUST NOT be null or the empty string (""). 3.2.3. Intent Compatibility
Android uses Intents to achieve loosely-coupled integration between applications. This section describes requirements related to the Intent patterns that MUST be honored by device implementations. By "honored", it is meant that the device implementer MUST provide an Android Activity or Service that specifies a matching Intent filter and binds to and implements correct behavior for each specified Intent pattern.
3.2.3.1. Core Application Intents
The Android upstream project defines a number of core applications, such as a phone dialer, calendar, contacts book, music player, and so on. Device implementers MAY replace these applications with alternative versions.
However, any such alternative versions MUST honor the same Intent patterns provided by the upstream project. For example, if a device contains an alternative music player, it must still honor the Intent pattern issued by third-party applications to pick a song.
The following applications are considered core Android system applications:
- Desk Clock
- Browser
- Calendar
- Calculator
- Contacts
- Gallery
- GlobalSearch
- Launcher
- Music
- Settings
The core Android system applications include various Activity, or Service components that are considered "public". That is, the attribute "android:exported" may be absent, or may have the value "true".
For every Activity or Service defined in one of the core Android system apps that is not marked as non-public via an android:exported attribute with the value "false", device implementations MUST include a component of the same type implementing the same Intent filter patterns as the core Android system app.
In other words, a device implementation MAY replace core Android system apps; however, if it does, the device implementation MUST support all Intent patterns defined by each core Android system app being replaced.
3.2.3.2. Intent Overrides
As Android is an extensible platform, device implementers MUST allow each Intent pattern referenced in Section 3.2.3.1 to be overridden by third-party applications. The upstream Android open source project allows this by default; device implementers MUST NOT attach special privileges to system applications' use of these Intent patterns, or prevent third-party applications from binding to and assuming control of these patterns. This prohibition specifically includes but is not limited to disabling the "Chooser" user interface which allows the user to select between multiple applications which all handle the same Intent pattern.
3.2.3.3. Intent Namespaces
Device implementers MUST NOT include any Android component that honors any new Intent or Broadcast Intent patterns using an ACTION, CATEGORY, or other key string in the android.* namespace. Device implementers MUST NOT include any Android components that honor any new Intent or Broadcast Intent patterns using an ACTION, CATEGORY, or other key string in a package space belonging to another organization. Device implementers MUST NOT alter or extend any of the Intent patterns used by the core apps listed in Section 3.2.3.1.
This prohibition is analogous to that specified for Java language classes in Section 3.6.
3.2.3.4. Broadcast Intents
Third-party applications rely on the platform to broadcast certain Intents to notify them of changes in the hardware or software environment. Android-compatible devices MUST broadcast the public broadcast Intents in response to appropriate system events. Broadcast Intents are described in the SDK documentation.
3.3. Native API Compatibility
Managed code running in Dalvik can call into native code provided in the application .apk file as an ELF .so file compiled for the appropriate device hardware architecture. As native code is highly dependent on the underlying processor technology, Android defines a number of Application Binary Interfaces (ABIs) in the Android NDK, in the file
docs/CPU-ARCH-ABIS.txt
. If a device implementation is compatible with one or more defined ABIs, it SHOULD implement compatibility with the Android NDK, as below.If a device implementation includes support for an Android ABI, it:
- MUST include support for code running in the managed environment to call into native code, using the standard Java Native Interface (JNI) semantics.
- MUST be source-compatible (ie header compatible) and binary-compatible (for the ABI) with each required library in the list below
- MUST accurately report the native Application Binary Interface (ABI) supported by the device, via the
android.os.Build.CPU_ABI
API - MUST report only those ABIs documented in the latest version of the Android NDK, in the file
docs/CPU-ARCH-ABIS.txt
- SHOULD be built using the source code and header files available in the upstream Android open-source project
The following native code APIs MUST be available to apps that include native code:
- libc (C library)
- libm (math library)
- Minimal support for C++
- JNI interface
- liblog (Android logging)
- libz (Zlib compression)
- libdl (dynamic linker)
- libGLESv1_CM.so (OpenGL ES 1.0)
- libGLESv2.so (OpenGL ES 2.0)
- libEGL.so (native OpenGL surface management)
- libjnigraphics.so
- libOpenSLES.so (Open Sound Library audio support)
- libandroid.so (native Android activity support)
- Support for OpenGL, as described below
Note that future releases of the Android NDK may introduce support for additional ABIs. If a device implementation is not compatible with an existing predefined ABI, it MUST NOT report support for any ABI at all.
Native code compatibility is challenging. For this reason, it should be repeated that device implementers are VERY strongly encouraged to use the upstream implementations of the libraries listed above to help ensure compatibility.
3.4. Web Compatibility
Many developers and applications rely on the behavior of the
android.webkit.WebView
class [ Resources, 8 ] for their user interfaces, so the WebView implementation must be compatible across Android implementations. Similarly, a complete, modern web broswer is central to the Android user experience. Device implementations MUST include a version ofandroid.webkit.WebView
consistent with the upstream Android software, and MUST include a modern HTML5-capable browser, as described below.3.4.1. WebView Compatibility
The Android Open Source implementation uses the WebKit rendering engine to implement the
android.webkit.WebView
. Because it is not feasible to develop a comprehensive test suite for a web rendering system, device implementers MUST use the specific upstream build of WebKit in the WebView implementation. Specifically:- Device implementations'
android.webkit.WebView
implementations MUST be based on the 533.1 WebKit build from the upstream Android Open Source tree for Android 2.3. This build includes a specific set of functionality and security fixes for the WebView. Device implementers MAY include customizations to the WebKit implementation; however, any such customizations MUST NOT alter the behavior of the WebView, including rendering behavior. - The user agent string reported by the WebView MUST be in this format:
Mozilla/5.0 (Linux; U; Android $(VERSION); $(LOCALE); $(MODEL) Build/$(BUILD)) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
- The value of the $(VERSION) string MUST be the same as the value for
android.os.Build.VERSION.RELEASE
- The value of the $(LOCALE) string SHOULD follow the ISO conventions for country code and language, and SHOULD refer to the current configured locale of the device
- The value of the $(MODEL) string MUST be the same as the value for
android.os.Build.MODEL
- The value of the $(BUILD) string MUST be the same as the value for
android.os.Build.ID
- The value of the $(VERSION) string MUST be the same as the value for
The WebView component SHOULD include support for as much of HTML5 [ Resources, 9 ] as possible. Minimally, device implementations MUST support each of these APIs associated with HTML5 in the WebView:
- application cache/offline operation [ Resources, 10 ]
- the <video> tag [ Resources, 11 ]
- geolocation [ Resources, 12 ]
Additionally, device implementations MUST support the HTML5/W3C webstorage API [ Resources, 13 ], and SHOULD support the HTML5/W3C IndexedDB API [ Resources, 14 ]. Note that as the web development standards bodies are transitioning to favor IndexedDB over webstorage, IndexedDB is expected to become a required component in a future version of Android.
HTML5 APIs, like all JavaScript APIs, MUST be disabled by default in a WebView, unless the developer explicitly enables them via the usual Android APIs.
3.4.2. Browser Compatibility
Device implementations MUST include a standalone Browser application for general user web browsing. The standalone Browser MAY be based on a browser technology other than WebKit. However, even if an alternate Browser application is used, the
android.webkit.WebView
component provided to third-party applications MUST be based on WebKit, as described in Section 3.4.1.Implementations MAY ship a custom user agent string in the standalone Browser application.
The standalone Browser application (whether based on the upstream WebKit Browser application or a third-party replacement) SHOULD include support for as much of HTML5 [ Resources, 9 ] as possible. Minimally, device implementations MUST support each of these APIs associated with HTML5:
- application cache/offline operation [ Resources, 10 ]
- the <video> tag [ Resources, 11 ]
- geolocation [ Resources, 12 ]
Additionally, device implementations MUST support the HTML5/W3C webstorage API [ Resources, 13 ], and SHOULD support the HTML5/W3C IndexedDB API [ Resources, 14 ]. Note that as the web development standards bodies are transitioning to favor IndexedDB over webstorage, IndexedDB is expected to become a required component in a future version of Android.
3.5. API Behavioral Compatibility
The behaviors of each of the API types (managed, soft, native, and web) must be consistent with the preferred implementation of the upstream Android open-source project [ Resources, 3 ]. Some specific areas of compatibility are:
- Devices MUST NOT change the behavior or semantics of a standard Intent
- Devices MUST NOT alter the lifecycle or lifecycle semantics of a particular type of system component (such as Service, Activity, ContentProvider, etc.)
- Devices MUST NOT change the semantics of a standard permission
The above list is not comprehensive. The Compatibility Test Suite (CTS) tests significant portions of the platform for behavioral compatibility, but not all. It is the responsibility of the implementer to ensure behavioral compatibility with the Android Open Source Project. For this reason, device implementers SHOULD use the source code available via the Android Open Source Project where possible, rather than re-implement significant parts of the system.
3.6. API Namespaces
Android follows the package and class namespace conventions defined by the Java programming language. To ensure compatibility with third-party applications, device implementers MUST NOT make any prohibited modifications (see below) to these package namespaces:
- java.*
- javax.*
- sun.*
- android.*
- com.android.*
Prohibited modifications include:
- Device implementations MUST NOT modify the publicly exposed APIs on the Android platform by changing any method or class signatures, or by removing classes or class fields.
- Device implementers MAY modify the underlying implementation of the APIs, but such modifications MUST NOT impact the stated behavior and Java-language signature of any publicly exposed APIs.
- Device implementers MUST NOT add any publicly exposed elements (such as classes or interfaces, or fields or methods to existing classes or interfaces) to the APIs above.
A "publicly exposed element" is any construct which is not decorated with the "@hide" marker as used in the upstream Android source code. In other words, device implementers MUST NOT expose new APIs or alter existing APIs in the namespaces noted above. Device implementers MAY make internal-only modifications, but those modifications MUST NOT be advertised or otherwise exposed to developers.
Device implementers MAY add custom APIs, but any such APIs MUST NOT be in a namespace owned by or referring to another organization. For instance, device implementers MUST NOT add APIs to the com.google.* or similar namespace; only Google may do so. Similarly, Google MUST NOT add APIs to other companies' namespaces. Additionally, if a device implementation includes custom APIs outside the standard Android namespace, those APIs MUST be packaged in an Android shared library so that only apps that explicitly use them (via the
<uses-library>
mechanism) are affected by the increased memory usage of such APIs.If a device implementer proposes to improve one of the package namespaces above (such as by adding useful new functionality to an existing API, or adding a new API), the implementer SHOULD visit source.android.com and begin the process for contributing changes and code, according to the information on that site.
Note that the restrictions above correspond to standard conventions for naming APIs in the Java programming language; this section simply aims to reinforce those conventions and make them binding through inclusion in this compatibility definition.
3.7. Virtual Machine Compatibility
Device implementations MUST support the full Dalvik Executable (DEX) bytecode specification and Dalvik Virtual Machine semantics [ Resources, 15 ].
Device implementations with screens classified as medium- or low-density MUST configure Dalvik to allocate at least 16MB of memory to each application. Device implementations with screens classified as high-density or extra-high-density MUST configure Dalvik to allocate at least 24MB of memory to each application. Note that device implementations MAY allocate more memory than these figures.
3.8. User Interface Compatibility
The Android platform includes some developer APIs that allow developers to hook into the system user interface. Device implementations MUST incorporate these standard UI APIs into custom user interfaces they develop, as explained below.
3.8.1. Widgets
Android defines a component type and corresponding API and lifecycle that allows applications to expose an "AppWidget" to the end user [ Resources, 16 ]. The Android Open Source reference release includes a Launcher application that includes user interface elements allowing the user to add, view, and remove AppWidgets from the home screen.
Device implementers MAY substitute an alternative to the reference Launcher (ie home screen). Alternative Launchers SHOULD include built-in support for AppWidgets, and expose user interface elements to add, configure, view, and remove AppWidgets directly within the Launcher. Alternative Launchers MAY omit these user interface elements; however, if they are omitted, the device implementer MUST provide a separate application accessible from the Launcher that allows users to add, configure, view, and remove AppWidgets.
3.8.2. Notifications
Android includes APIs that allow developers to notify users of notable events [ Resources, 17 ]. Device implementers MUST provide support for each class of notification so defined; specifically: sounds, vibration, light and status bar.
Additionally, the implementation MUST correctly render all resources (icons, sound files, etc.) provided for in the APIs [ Resources, 18 ], or in the Status Bar icon style guide [ Resources, 19 ]. Device implementers MAY provide an alternative user experience for notifications than that provided by the reference Android Open Source implementation; however, such alternative notification systems MUST support existing notification resources, as above.
3.8.3. Search
Android includes APIs [ Resources, 20 ] that allow developers to incorporate search into their applications, and expose their application's data into the global system search. Generally speaking, this functionality consists of a single, system-wide user interface that allows users to enter queries, displays suggestions as users type, and displays results. The Android APIs allow developers to reuse this interface to provide search within their own apps, and allow developers to supply results to the common global search user interface.
Device implementations MUST include a single, shared, system-wide search user interface capable of real-time suggestions in response to user input. Device implementations MUST implement the APIs that allow developers to reuse this user interface to provide search within their own applications. Device implementations MUST implement the APIs that allow third-party applications to add suggestions to the search box when it is run in global search mode. If no third-party applications are installed that make use of this functionality, the default behavior SHOULD be to display web search engine results and suggestions.
Device implementations MAY ship alternate search user interfaces, but SHOULD include a hard or soft dedicated search button, that can be used at any time within any app to invoke the search framework, with the behavior provided for in the API documentation.
3.8.4. Toasts
Applications can use the "Toast" API (defined in [ Resources, 21 ]) to display short non-modal strings to the end user, that disappear after a brief period of time. Device implementations MUST display Toasts from applications to end users in some high-visibility manner.
3.8.5. Live Wallpapers
Android defines a component type and corresponding API and lifecycle that allows applications to expose one or more "Live Wallpapers" to the end user [ Resources, 22 ]. Live Wallpapers are animations, patterns, or similar images with limited input capabilities that display as a wallpaper, behind other applications.
Hardware is considered capable of reliably running live wallpapers if it can run all live wallpapers, with no limitations on functionality, at a reasonable framerate with no adverse affects on other applications. If limitations in the hardware cause wallpapers and/or applications to crash, malfunction, consume excessive CPU or battery power, or run at unacceptably low frame rates, the hardware is considered incapable of running live wallpaper. As an example, some live wallpapers may use an Open GL 1.0 or 2.0 context to render their content. Live wallpaper will not run reliably on hardware that does not support multiple OpenGL contexts because the live wallpaper use of an OpenGL context may conflict with other applications that also use an OpenGL context.
Device implementations capable of running live wallpapers reliably as described above SHOULD implement live wallpapers. Device implementations determined to not run live wallpapers reliably as described above MUST NOT implement live wallpapers.
4. Application Packaging Compatibility
Device implementations MUST install and run Android ".apk" files as generated by the "aapt" tool included in the official Android SDK [ Resources, 23 ].
Devices implementations MUST NOT extend either the .apk [ Resources, 24 ], Android Manifest [ Resources, 25 ], or Dalvik bytecode [ Resources, 15 ] formats in such a way that would prevent those files from installing and running correctly on other compatible devices. Device implementers SHOULD use the reference upstream implementation of Dalvik, and the reference implementation's package management system.
5. Multimedia Compatibility
Device implementations MUST fully implement all multimedia APIs. Device implementations MUST include support for all multimedia codecs described below, and SHOULD meet the sound processing guidelines described below. Device implementations MUST include at least one form of audio output, such as speakers, headphone jack, external speaker connection, etc.
5.1. Media Codecs
Device implementations MUST support the multimedia codecs as detailed in the following sections. All of these codecs are provided as software implementations in the preferred Android implementation from the Android Open-Source Project.
Please note that neither Google nor the Open Handset Alliance make any representation that these codecs are unencumbered by third-party patents. Those intending to use this source code in hardware or software products are advised that implementations of this code, including in open source software or shareware, may require patent licenses from the relevant patent holders.
The tables below do not list specific bitrate requirements for most video codecs. The reason for this is that in practice, current device hardware does not necessarily support bitrates that map exactly to the required bitrates specified by the relevant standards. Instead, device implementations SHOULD support the highest bitrate practical on the hardware, up to the limits defined by the specifications.
5.1.1. Media Decoders
Device implementations MUST include an implementation of a decoder for each codec and format described in the table below. Note that decoders for each of these media types are provided by the upstream Android Open-Source Project.
Audio Name Details File/Container Format AAC LC/LTP Mono/Stereo content in any combination of standard bit rates up to 160 kbps and sampling rates between 8 to 48kHz 3GPP (.3gp) and MPEG-4 (.mp4, .m4a). No support for raw AAC (.aac) HE-AACv1 (AAC+) HE-AACv2 (enhanced AAC+) AMR-NB 4.75 to 12.2 kbps sampled @ 8kHz 3GPP (.3gp) AMR-WB 9 rates from 6.60 kbit/s to 23.85 kbit/s sampled @ 16kHz 3GPP (.3gp) MP3 Mono/Stereo 8-320Kbps constant (CBR) or variable bit-rate (VBR) MP3 (.mp3) MIDI MIDI Type 0 and 1. DLS Version 1 and 2. XMF and Mobile XMF. Support for ringtone formats RTTTL/RTX, OTA, and iMelody Type 0 and 1 (.mid, .xmf, .mxmf). Also RTTTL/RTX (.rtttl, .rtx), OTA (.ota), and iMelody (.imy) Ogg Vorbis Ogg (.ogg) PCM 8- and 16-bit linear PCM (rates up to limit of hardware) WAVE (.wav) Image JPEG base+progressive GIF PNG BMP Video H.263 3GPP (.3gp) files H.264 3GPP (.3gp) and MPEG-4 (.mp4) files MPEG4 Simple Profile 3GPP (.3gp) file 5.1.2. Media Encoders
Device implementations SHOULD include encoders for as many of the media formats listed in Section 5.1.1. as possible. However, some encoders do not make sense for devices that lack certain optional hardware; for instance, an encoder for the H.263 video does not make sense, if the device lacks any cameras. Device implementations MUST therefore implement media encoders according to the conditions described in the table below.
See Section 7 for details on the conditions under which hardware may be omitted by device implementations.
Audio Name Details File/Container Format Conditions AMR-NB 4.75 to 12.2 kbps sampled @ 8kHz 3GPP (.3gp) Device implementations that include microphone hardware and define android.hardware.microphone
MUST include encoders for these audio formats.AMR-WB 9 rates from 6.60 kbit/s to 23.85 kbit/s sampled @ 16kHz 3GPP (.3gp) AAC LC/LTP Mono/Stereo content in any combination of standard bit rates up to 160 kbps and sampling rates between 8 to 48kHz 3GPP (.3gp) and MPEG-4 (.mp4, .m4a). Image JPEG base+progressive All device implementations MUST include encoders for these image formats, as Android 2.3 includes APIs that applications can use to programmatically generate files of these types. PNG Video H.263 3GPP (.3gp) files Device implementations that include camera hardware and define either android.hardware.camera
orandroid.hardware.camera.front
MUST include encoders for these video formats.In addition to the encoders listed above, device implementations SHOULD include an H.264 encoder. Note that the Compatibility Definition for a future version is planned to change this requirement to "MUST". That is, H.264 encoding is optional in Android 2.3 but will be required by a future version. Existing and new devices that run Android 2.3 are very strongly encouraged to meet this requirement in Android 2.3 , or they will not be able to attain Android compatibility when upgraded to the future version.
5.2. Audio Recording
When an application has used the
android.media.AudioRecord
API to start recording an audio stream, device implementations SHOULD sample and record audio with each of these behaviors:- Noise reduction processing, if present, SHOULD be disabled.
- Automatic gain control, if present, SHOULD be disabled.
- The device SHOULD exhibit approximately flat amplitude versus frequency characteristics; specifically, ±3 dB, from 100 Hz to 4000 Hz
- Audio input sensitivity SHOULD be set such that a 90 dB sound power level (SPL) source at 1000 Hz yields RMS of 5000 for 16-bit samples.
- PCM amplitude levels SHOULD linearly track input SPL changes over at least a 30 dB range from -18 dB to +12 dB re 90 dB SPL at the microphone.
- Total harmonic distortion SHOULD be less than 1% from 100 Hz to 4000 Hz at 90 dB SPL input level.
Note: while the requirements outlined above are stated as "SHOULD" for Android 2.3, the Compatibility Definition for a future version is planned to change these to "MUST". That is, these requirements are optional in Android 2.3 but will be required by a future version. Existing and new devices that run Android 2.3 are very strongly encouraged to meet these requirements in Android 2.3 , or they will not be able to attain Android compatibility when upgraded to the future version.
5.3. Audio Latency
Audio latency is broadly defined as the interval between when an application requests an audio playback or record operation, and when the device implementation actually begins the operation. Many classes of applications rely on short latencies, to achieve real-time effects such sound effects or VOIP communication. Device implementations that include microphone hardware and declare
android.hardware.microphone
SHOULD meet all audio latency requirements outlined in this section. See Section 7 for details on the conditions under which microphone hardware may be omitted by device implementations.For the purposes of this section:
- "cold output latency" is defined to be the interval between when an application requests audio playback and when sound begins playing, when the audio system has been idle and powered down prior to the request
- "warm output latency" is defined to be the interval between when an application requests audio playback and when sound begins playing, when the audio system has been recently used but is currently idle (that is, silent)
- "continuous output latency" is defined to be the interval between when an application issues a sample to be played and when the speaker physically plays the corresponding sound, while the device is currently playing back audio
- "cold input latency" is defined to be the interval between when an application requests audio recording and when the first sample is delivered to the application via its callback, when the audio system and microphone has been idle and powered down prior to the request
- "continuous input latency" is defined to be when an ambient sound occurs and when the sample corresponding to that sound is delivered to a recording application via its callback, while the device is in recording mode
Using the above definitions, device implementations SHOULD exhibit each of these properties:
- cold output latency of 100 milliseconds or less
- warm output latency of 10 milliseconds or less
- continuous output latency of 45 milliseconds or less
- cold input latency of 100 milliseconds or less
- continuous input latency of 50 milliseconds or less
Note: while the requirements outlined above are stated as "SHOULD" for Android 2.3, the Compatibility Definition for a future version is planned to change these to "MUST". That is, these requirements are optional in Android 2.3 but will be required by a future version. Existing and new devices that run Android 2.3 are very strongly encouraged to meet these requirements in Android 2.3 , or they will not be able to attain Android compatibility when upgraded to the future version.
If a device implementation meets the requirements of this section, it MAY report support for low-latency audio, by reporting the feature "android.hardware.audio.low-latency" via the
android.content.pm.PackageManager
class. [ Resources, 27 ] Conversely, if the device implementation does not meet these requirements it MUST NOT report support for low-latency audio.6. Developer Tool Compatibility
Device implementations MUST support the Android Developer Tools provided in the Android SDK. Specifically, Android-compatible devices MUST be compatible with:
- Android Debug Bridge (known as adb) [ Resources, 23 ]
Device implementations MUST support alladb
functions as documented in the Android SDK. The device-sideadb
daemon SHOULD be inactive by default, but there MUST be a user-accessible mechanism to turn on the Android Debug Bridge. - Dalvik Debug Monitor Service (known as ddms) [ Resources, 23 ]
Device implementations MUST support allddms
features as documented in the Android SDK. Asddms
usesadb
, support forddms
SHOULD be inactive by default, but MUST be supported whenever the user has activated the Android Debug Bridge, as above. - Monkey [ Resources, 26 ]
Device implementations MUST include the Monkey framework, and make it available for applications to use.
Most Linux-based systems and Apple Macintosh systems recognize Android devices using the standard Android SDK tools, without additional support; however Microsoft Windows systems typically require a driver for new Android devices. (For instance, new vendor IDs and sometimes new device IDs require custom USB drivers for Windows systems.) If a device implementation is unrecognized by the
adb
tool as provided in the standard Android SDK, device implementers MUST provide Windows drivers allowing developers to connect to the device using theadb
protocol. These drivers MUST be provided for Windows XP, Windows Vista, and Windows 7, in both 32-bit and 64-bit versions.7. Hardware Compatibility
Android is intended to enable device implementers to create innovative form factors and configurations. At the same time Android developers write innovative applications that rely on the various hardware and features available through the Android APIs. The requirements in this section strike a balance between innovations available to device implementers, and the needs of developers to ensure their apps are only available to devices where they will run properly.
If a device includes a particular hardware component that has a corresponding API for third-party developers, the device implementation MUST implement that API as described in the Android SDK documentation. If an API in the SDK interacts with a hardware component that is stated to be optional and the device implementation does not possess that component:
- complete class definitions (as documented by the SDK) for the component's APIs MUST still be present
- the API's behaviors MUST be implemented as no-ops in some reasonable fashion
- API methods MUST return null values where permitted by the SDK documentation
- API methods MUST return no-op implementations of classes where null values are not permitted by the SDK documentation
- API methods MUST NOT throw exceptions not documented by the SDK documentation
A typical example of a scenario where these requirements apply is the telephony API: even on non-phone devices, these APIs must be implemented as reasonable no-ops.
Device implementations MUST accurately report accurate hardware configuration information via the
getSystemAvailableFeatures()
andhasSystemFeature(String)
methods on theandroid.content.pm.PackageManager
class. [ Resources, 27 ]7.1. Display and Graphics
Android 2.3 includes facilities that automatically adjust application assets and UI layouts appropriately for the device, to ensure that third-party applications run well on a variety of hardware configurations [ Resources, 28 ]. Devices MUST properly implement these APIs and behaviors, as detailed in this section.
7.1.1. Screen Configurations
Device implementations MAY use screens of any pixel dimensions, provided that they meet the following requirements:
- screens MUST be at least 2.5 inches in physical diagonal size
- density MUST be at least 100 dpi
- the aspect ratio MUST be between 1.333 (4:3) and 1.779 (16:9)
- the display technology used consists of square pixels
Device implementations with a screen meeting the requirements above are considered compatible, and no additional action is necessary. The Android framework implementation automatically computes display characteristics such as screen size bucket and density bucket. In the majority of cases, the framework decisions are the correct ones. If the default framework computations are used, no additional action is necessary. Device implementers wishing to change the defaults, or use a screen that does not meet the requirements above MUST contact the Android Compatibility Team for guidance, as provided for in Section 12.
The units used by the requirements above are defined as follows:
- "Physical diagonal size" is the distance in inches between two opposing corners of the illuminated portion of the display.
- "dpi" (meaning "dots per inch") is the number of pixels encompassed by a linear horizontal or vertical span of 1". Where dpi values are listed, both horizontal and vertical dpi must fall within the range.
- "Aspect ratio" is the ratio of the longer dimension of the screen to the shorter dimension. For example, a display of 480x854 pixels would be 854 / 480 = 1.779, or roughly "16:9".
Device implementations MUST use only displays with a single static configuration. That is, device implementations MUST NOT enable multiple screen configurations. For instance, since a typical television supports multiple resolutions such as 1080p, 720p, and so on, this configuration is not compatible with Android 2.3. (However, support for such configurations is under investigation and planned for a future version of Android.)
7.1.2. Display Metrics
Device implementations MUST report correct values for all display metrics defined in
android.util.DisplayMetrics
[ Resources, 29 ].7.1.3. Declared Screen Support
Applications optionally indicate which screen sizes they support via the
<supports-screens>
attribute in the AndroidManifest.xml file. Device implementations MUST correctly honor applications' stated support for small, medium, and large screens, as described in the Android SDK documentation.7.1.4. Screen Orientation
Compatible devices MUST support dynamic orientation by applications to either portrait or landscape screen orientation. That is, the device must respect the application's request for a specific screen orientation. Device implementations MAY select either portrait or landscape orientation as the default. Devices that cannot be physically rotated MAY meet this requirement by "letterboxing" applications that request portrait mode, using only a portion of the available display.
Devices MUST report the correct value for the device's current orientation, whenever queried via the android.content.res.Configuration.orientation, android.view.Display.getOrientation(), or other APIs.
7.1.5. 3D Graphics Acceleration
Device implementations MUST support OpenGL ES 1.0, as required by the Android 2.3 APIs. For devices that lack 3D acceleration hardware, a software implementation of OpenGL ES 1.0 is provided by the upstream Android Open-Source Project. Device implementations SHOULD support OpenGL ES 2.0.
Implementations MAY omit Open GL ES 2.0 support; however if support is omitted, device implementations MUST NOT report as supporting OpenGL ES 2.0. Specifically, if a device implementations lacks OpenGL ES 2.0 support:
- the managed APIs (such as via the
GLES10.getString()
method) MUST NOT report support for OpenGL ES 2.0 - the native C/C++ OpenGL APIs (that is, those available to apps via libGLES_v1CM.so, libGLES_v2.so, or libEGL.so) MUST NOT report support for OpenGL ES 2.0.
Conversely, if a device implementation does support OpenGL ES 2.0, it MUST accurately report that support via the routes just listed.
Note that Android 2.3 includes support for applications to optionally specify that they require specific OpenGL texture compression formats. These formats are typically vendor-specific. Device implementations are not required by Android 2.3 to implement any specific texture compression format. However, they SHOULD accurately report any texture compression formats that they do support, via the
getString()
method in the OpenGL API.7.2. Input Devices
Android 2.3 supports a number of modalities for user input. Device implementations MUST support user input devices as provided for in this section.
7.2.1. Keyboard
Device implementations:
- MUST include support for the Input Management Framework (which allows third party developers to create Input Management Engines -- ie soft keyboard) as detailed at developer.android.com
- MUST provide at least one soft keyboard implementation (regardless of whether a hard keyboard is present)
- MAY include additional soft keyboard implementations
- MAY include a hardware keyboard
- MUST NOT include a hardware keyboard that does not match one of the formats specified in
android.content.res.Configuration.keyboard
[ Resources, 30 ] (that is, QWERTY, or 12-key)
7.2.2. Non-touch Navigation
Device implementations:
- MAY omit a non-touch navigation option (that is, may omit a trackball, d-pad, or wheel)
- MUST report the correct value for
android.content.res.Configuration.navigation
[ Resources, 30 ] - MUST provide a reasonable alternative user interface mechanism for the selection and editing of text, compatible with Input Management Engines. The upstream Android Open-Source code includes a selection mechanism suitable for use with devices that lack non-touch navigation inputs.
7.2.3. Navigation keys
The Home, Menu and Back functions are essential to the Android navigation paradigm. Device implementations MUST make these functions available to the user at all times, regardless of application state. These functions SHOULD be implemented via dedicated buttons. They MAY be implemented using software, gestures, touch panel, etc., but if so they MUST be always accessible and not obscure or interfere with the available application display area.
Device implementers SHOULD also provide a dedicated search key. Device implementers MAY also provide send and end keys for phone calls.
7.2.4. Touchscreen input
Device implementations:
- MUST have a touchscreen
- MAY have either capacitive or resistive touchscreen
- MUST report the value of
android.content.res.Configuration
[ Resources, 30 ] reflecting corresponding to the type of the specific touchscreen on the device - SHOULD support fully independently tracked pointers, if the touchscreen supports multiple pointers
7.3. Sensors
Android 2.3 includes APIs for accessing a variety of sensor types. Devices implementations generally MAY omit these sensors, as provided for in the following subsections. If a device includes a particular sensor type that has a corresponding API for third-party developers, the device implementation MUST implement that API as described in the Android SDK documentation. For example, device implementations:
- MUST accurately report the presence or absence of sensors per the
android.content.pm.PackageManager
class. [ Resources, 27 ] - MUST return an accurate list of supported sensors via the
SensorManager.getSensorList()
and similar methods - MUST behave reasonably for all other sensor APIs (for example, by returning true or false as appropriate when applications attempt to register listeners, not calling sensor listeners when the corresponding sensors are not present; etc.)
The list above is not comprehensive; the documented behavior of the Android SDK is to be considered authoritative.
Some sensor types are synthetic, meaning they can be derived from data provided by one or more other sensors. (Examples include the orientation sensor, and the linear acceleration sensor.) Device implementations SHOULD implement these sensor types, when they include the prerequisite physical sensors.
The Android 2.3 APIs introduce a notion of a "streaming" sensor, which is one that returns data continuously, rather than only when the data changes. Device implementations MUST continuously provide periodic data samples for any API indicated by the Android 2.3 SDK documentation to be a streaming sensor.
7.3.1. Accelerometer
Device implementations SHOULD include a 3-axis accelerometer. If a device implementation does include a 3-axis accelerometer, it:
- MUST be able to deliver events at 50 Hz or greater
- MUST comply with the Android sensor coordinate system as detailed in the Android APIs (see [ Resources, 31 ])
- MUST be capable of measuring from freefall up to twice gravity (2g) or more on any three-dimensional vector
- MUST have 8-bits of accuracy or more
- MUST have a standard deviation no greater than 0.05 m/s^2
7.3.2. Magnetometer
Device implementations SHOULD include a 3-axis magnetometer (ie compass.) If a device does include a 3-axis magnetometer, it:
- MUST be able to deliver events at 10 Hz or greater
- MUST comply with the Android sensor coordinate system as detailed in the Android APIs (see [ Resources, 31 ]).
- MUST be capable of sampling a range of field strengths adequate to cover the geomagnetic field
- MUST have 8-bits of accuracy or more
- MUST have a standard deviation no greater than 0.5 µT
7.3.3. GPS
Device implementations SHOULD include a GPS receiver. If a device implementation does include a GPS receiver, it SHOULD include some form of "assisted GPS" technique to minimize GPS lock-on time.
7.3.4. Gyroscope
Device implementations SHOULD include a gyroscope (ie angular change sensor.) Devices SHOULD NOT include a gyroscope sensor unless a 3-axis accelerometer is also included. If a device implementation includes a gyroscope, it:
- MUST be capable of measuring orientation changes up to 5.5*Pi radians/second (that is, approximately 1,000 degrees per second)
- MUST be able to deliver events at 100 Hz or greater
- MUST have 8-bits of accuracy or more
7.3.5. Barometer
Device implementations MAY include a barometer (ie ambient air pressure sensor.) If a device implementation includes a barometer, it:
- MUST be able to deliver events at 5 Hz or greater
- MUST have adequate precision to enable estimating altitude
7.3.7. Thermometer
Device implementations MAY but SHOULD NOT include a thermometer (ie temperature sensor.) If a device implementation does include a thermometer, it MUST measure the temperature of the device CPU. It MUST NOT measure any other temperature. (Note that this sensor type is deprecated in the Android 2.3 APIs.)
7.3.7. Photometer
Device implementations MAY include a photometer (ie ambient light sensor.)
7.3.8. Proximity Sensor
Device implementations MAY include a proximity sensor. If a device implementation does include a proximity sensor, it MUST measure the proximity of an object in the same direction as the screen. That is, the proximity sensor MUST be oriented to detect objects close to the screen, as the primary intent of this sensor type is to detect a phone in use by the user. If a device implementation includes a proximity sensor with any other orientation, it MUST NOT be accessible through this API. If a device implementation has a proximity sensor, it MUST be have 1-bit of accuracy or more.
7.4. Data Connectivity
Network connectivity and access to the Internet are vital features of Android. Meanwhile, device-to-device interaction adds significant value to Android devices and applications. Device implementations MUST meet the data connectivity requirements in this section.
7.4.1. Telephony
"Telephony" as used by the Android 2.3 APIs and this document refers specifically to hardware related to placing voice calls and sending SMS messages via a GSM or CDMA network. While these voice calls may or may not be packet-switched, they are for the purposes of Android 2.3 considered independent of any data connectivity that may be implemented using the same network. In other words, the Android "telephony" functionality and APIs refer specifically to voice calls and SMS; for instance, device implementations that cannot place calls or send/receive SMS messages MUST NOT report the "android.hardware.telephony" feature or any sub-features, regardless of whether they use a cellular network for data connectivity.
Android 2.3 MAY be used on devices that do not include telephony hardware. That is, Android 2.3 is compatible with devices that are not phones. However, if a device implementation does include GSM or CDMA telephony, it MUST implement full support for the API for that technology. Device implementations that do not include telephony hardware MUST implement the full APIs as no-ops.
7.4.2. IEEE 802.11 (WiFi)
Android 2.3 device implementations SHOULD include support for one or more forms of 802.11 (b/g/a/n, etc.) If a device implementation does include support for 802.11, it MUST implement the corresponding Android API.
7.4.3. Bluetooth
Device implementations SHOULD include a Bluetooth transceiver. Device implementations that do include a Bluetooth transceiver MUST enable the RFCOMM-based Bluetooth API as described in the SDK documentation [ Resources, 32 ]. Device implementations SHOULD implement relevant Bluetooth profiles, such as A2DP, AVRCP, OBEX, etc. as appropriate for the device.
The Compatibility Test Suite includes cases that cover basic operation of the Android RFCOMM Bluetooth API. However, since Bluetooth is a communications protocol between devices, it cannot be fully tested by unit tests running on a single device. Consequently, device implementations MUST also pass the human-driven Bluetooth test procedure described in Appendix A.
7.4.4. Near-Field Communications
Device implementations SHOULD include a transceiver and related hardware for Near-Field Communications (NFC). If a device implementation does include NFC hardware, then it:
- MUST report the android.hardware.nfc feature from the
android.content.pm.PackageManager.hasSystemFeature()
method. [ Resources, 27 ] - MUST be capable of reading and writing NDEF messages via the following NFC standards:
- MUST be capable of acting as an NFC Forum reader/writer (as defined by the NFC Forum technical specification NFCForum-TS-DigitalProtocol-1.0) via the following NFC standards:
- NfcA (ISO14443-3A)
- NfcB (ISO14443-3B)
- NfcF (JIS 6319-4)
- NfcV (ISO 15693)
- IsoDep (ISO 14443-4)
- NFC Forum Tag Types 1, 2, 3, 4 (defined by the NFC Forum)
- MUST be capable of transmitting and receiving data via the following peer-to-peer standards and protocols:
- ISO 18092
- LLCP 1.0 (defined by the NFC Forum)
- SDP 1.0 (defined by the NFC Forum)
- NDEF Push Protocol [ Resources, 33 ]
- MUST scan for all supported technologies while in NFC discovery mode.
- SHOULD be in NFC discovery mode while the device is awake with the screen active.
(Note that publicly available links are not available for the JIS, ISO, and NFC Forum specifications cited above.)
Additionally, device implementations SHOULD support the following widely-deployed MIFARE technologies.
- MIFARE Classic (NXP MF1S503x [ Resources, 34 ], MF1S703x [ Resources, 35 ])
- MIFARE Ultralight (NXP MF0ICU1 [ Resources, 36 ], MF0ICU2 [ Resources, 37 ])
- NDEF on MIFARE Classic (NXP AN130511 [ Resources, 38 ], AN130411 [ Resources, 39 ])
Note that Android 2.3.3 includes APIs for these MIFARE types. If a device implementation supports MIFARE, it:
- MUST implement the corresponding Android APIs as documented by the Android SDK
- MUST report the feature com.nxp.mifare from the
android.content.pm.PackageManager.hasSystemFeature()
method. [ Resources, 27 ] Note that this is not a standard Android feature, and as such does not appear as a constant on thePackageManager
class. - MUST NOT implement the corresponding Android APIs nor report the com.nxp.mifare feature unless it also implements general NFC support as described in this section
If a device implementation does not include NFC hardware, it MUST NOT declare the android.hardware.nfc feature from the
android.content.pm.PackageManager.hasSystemFeature()
method [ Resources, 27 ], and MUST implement the Android 2.3 NFC API as a no-op.As the classes
android.nfc.NdefMessage
andandroid.nfc.NdefRecord
represent a protocol-independent data representation format, device implementations MUST implement these APIs even if they do not include support for NFC or declare the android.hardware.nfc feature.7.4.5. Minimum Network Capability
Device implementations MUST include support for one or more forms of data networking. Specifically, device implementations MUST include support for at least one data standard capable of 200Kbit/sec or greater. Examples of technologies that satisfy this requirement include EDGE, HSPA, EV-DO, 802.11g, Ethernet, etc.
Device implementations where a physical networking standard (such as Ethernet) is the primary data connection SHOULD also include support for at least one common wireless data standard, such as 802.11 (WiFi).
Devices MAY implement more than one form of data connectivity.
7.5. Cameras
Device implementations SHOULD include a rear-facing camera, and MAY include a front-facing camera. A rear-facing camera is a camera located on the side of the device opposite the display; that is, it images scenes on the far side of the device, like a traditional camera. A front-facing camera is a camera located on the same side of the device as the display; that is, a camera typically used to image the user, such as for video conferencing and similar applications.
7.5.1. Rear-Facing Camera
Device implementations SHOULD include a rear-facing camera. If a device implementation includes a rear-facing camera, it:
- MUST have a resolution of at least 2 megapixels
- SHOULD have either hardware auto-focus, or software auto-focus implemented in the camera driver (transparent to application software)
- MAY have fixed-focus or EDOF (extended depth of field) hardware
- MAY include a flash. If the Camera includes a flash, the flash lamp MUST NOT be lit while an android.hardware.Camera.PreviewCallback instance has been registered on a Camera preview surface, unless the application has explicitly enabled the flash by enabling the
FLASH_MODE_AUTO
orFLASH_MODE_ON
attributes of aCamera.Parameters
object. Note that this constraint does not apply to the device's built-in system camera application, but only to third-party applications usingCamera.PreviewCallback
.
7.5.2. Front-Facing Camera
Device implementations MAY include a front-facing camera. If a device implementation includes a front-facing camera, it:
- MUST have a resolution of at least VGA (that is, 640x480 pixels)
- MUST NOT use a front-facing camera as the default for the Camera API. That is, the camera API in Android 2.3 has specific support for front-facing cameras, and device implementations MUST NOT configure the API to to treat a front-facing camera as the default rear-facing camera, even if it is the only camera on the device.
- MAY include features (such as auto-focus, flash, etc.) available to rear-facing cameras as described in Section 7.5.1.
- MUST horizontally reflect (ie mirror) the stream displayed by an app in a CameraPreview, as follows:
- If the device implementation is capable of being rotated by user (such as automatically via an accelerometer or manually via user input), the camera preview MUST be mirrored horizontally relative to the device's current orientation.
- If the current application has explicitly requested that the Camera display be rotated via a call to the
android.hardware.Camera.setDisplayOrientation()
[ Resources, 40 ] method, the camera preview MUST be mirrored horizontally relative to the orientation specified by the application. - Otherwise, the preview MUST be mirrored along the device's default horizontal axis.
- MUST mirror the image data returned to any "postview" camera callback handlers, in the same manner as the camera preview image stream. (If the device implementation does not support postview callbacks, this requirement obviously does not apply.)
- MUST NOT mirror the final captured still image or video streams returned to application callbacks or committed to media storage
7.5.3. Camera API Behavior
Device implementations MUST implement the following behaviors for the camera-related APIs, for both front- and rear-facing cameras:
- If an application has never called android.hardware.Camera.Parameters.setPreviewFormat(int), then the device MUST use android.hardware.PixelFormat.YCbCr_420_SP for preview data provided to application callbacks.
- If an application registers an android.hardware.Camera.PreviewCallback instance and the system calls the onPreviewFrame() method when the preview format is YCbCr_420_SP, the data in the byte[] passed into onPreviewFrame() must further be in the NV21 encoding format. That is, NV21 MUST be the default.
- Device implementations SHOULD support the YV12 format (as denoted by the
android.graphics.ImageFormat.YV12
constant) for camera previews for both front- and rear-facing cameras. Note that the Compatibility Definition for a future version is planned to change this requirement to "MUST". That is, YV12 support is optional in Android 2.3 but will be required by a future version. Existing and new devices that run Android 2.3 are very strongly encouraged to meet this requirement in Android 2.3 , or they will not be able to attain Android compatibility when upgraded to the future version.
Device implementations MUST implement the full Camera API included in the Android 2.3 SDK documentation [ Resources, 41 ]), regardless of whether the device includes hardware autofocus or other capabilities. For instance, cameras that lack autofocus MUST still call any registered
android.hardware.Camera.AutoFocusCallback
instances (even though this has no relevance to a non-autofocus camera.) Note that this does apply to front-facing cameras; for instance, even though most front-facing cameras do not support autofocus, the API callbacks must still be "faked" as described.Device implementations MUST recognize and honor each parameter name defined as a constant on the
android.hardware.Camera.Parameters
class, if the underlying hardware supports the feature. If the device hardware does not support a feature, the API must behave as documented. Conversely, Device implementations MUST NOT honor or recognize string constants passed to theandroid.hardware.Camera.setParameters()
method other than those documented as constants on theandroid.hardware.Camera.Parameters
. That is, device implementations MUST support all standard Camera parameters if the hardware allows, and MUST NOT support custom Camera parameter types.7.5.4. Camera Orientation
Both front- and rear-facing cameras, if present, MUST be oriented so that the long dimension of the camera aligns with the screen's long dimension. That is, when the device is held in the landscape orientation, a cameras MUST capture images in the landscape orientation. This applies regardless of the device's natural orientation; that is, it applies to landscape-primary devices as well as portrait-primary devices.
7.6. Memory and Storage
The fundamental function of Android 2.3 is to run applications. Device implementations MUST the requirements of this section, to ensure adequate storage and memory for applications to run properly.
7.6.1. Minimum Memory and Storage
Device implementations MUST have at least 128MB of memory available to the kernel and userspace. The 128MB MUST be in addition to any memory dedicated to hardware components such as radio, memory, and so on that is not under the kernel's control.
Device implementations MUST have at least 150MB of non-volatile storage available for user data. That is, the
/data
partition MUST be at least 150MB.Beyond the requirements above, device implementations SHOULD have at least 1GB of non-volatile storage available for user data. Note that this higher requirement is planned to become a hard minimum in a future version of Android. Device implementations are strongly encouraged to meet these requirements now, or else they may not be eligible for compatibility for a future version of Android.
The Android APIs include a Download Manager that applications may use to download data files. The Download Manager implementation MUST be capable of downloading individual files 55MB in size, or larger. The Download Manager implementation SHOULD be capable of downloading files 100MB in size, or larger.
7.6.2. Application Shared Storage
Device implementations MUST offer shared storage for applications. The shared storage provided MUST be at least 1GB in size.
Device implementations MUST be configured with shared storage mounted by default, "out of the box". If the shared storage is not mounted on the Linux path
/sdcard
, then the device MUST include a Linux symbolic link from/sdcard
to the actual mount point.Device implementations MUST enforce as documented the
android.permission.WRITE_EXTERNAL_STORAGE
permission on this shared storage. Shared storage MUST otherwise be writable by any application that obtains that permission.Device implementations MAY have hardware for user-accessible removable storage, such as a Secure Digital card. Alternatively, device implementations MAY allocate internal (non-removable) storage as shared storage for apps.
Regardless of the form of shared storage used, device implementations MUST provide some mechanism to access the contents of shared storage from a host computer, such as USB mass storage or Media Transfer Protocol.
It is illustrative to consider two common examples. If a device implementation includes an SD card slot to satisfy the shared storage requirement, a FAT-formatted SD card 1GB in size or larger MUST be included with the device as sold to users, and MUST be mounted by default. Alternatively, if a device implementation uses internal fixed storage to satisfy this requirement, that storage MUST be 1GB in size or larger and mounted on
/sdcard
(or/sdcard
MUST be a symbolic link to the physical location if it is mounted elsewhere.)Device implementations that include multiple shared storage paths (such as both an SD card slot and shared internal storage) SHOULD modify the core applications such as the media scanner and ContentProvider to transparently support files placed in both locations.
7.7. USB
Device implementations:
- MUST implement a USB client, connectable to a USB host with a standard USB-A port
- MUST implement the Android Debug Bridge over USB (as described in Section 7)
- MUST implement the USB mass storage specification, to allow a host connected to the device to access the contents of the /sdcard volume
- SHOULD use the micro USB form factor on the device side
- MAY include a non-standard port on the device side, but if so MUST ship with a cable capable of connecting the custom pinout to standard USB-A port
8. Performance Compatibility
Compatible implementations must ensure not only that applications simply run correctly on the device, but that they do so with reasonable performance and overall good user experience. Device implementations MUST meet the key performance metrics of an Android 2.3 compatible device defined in the table below:
Metric Performance Threshold Comments Application Launch Time The following applications should launch within the specified time. - Browser: less than 1300ms
- MMS/SMS: less than 700ms
- AlarmClock: less than 650ms
The launch time is measured as the total time to complete loading the default activity for the application, including the time it takes to start the Linux process, load the Android package into the Dalvik VM, and call onCreate. Simultaneous Applications When multiple applications have been launched, re-launching an already-running application after it has been launched must take less than the original launch time. 9. Security Model Compatibility
Device implementations MUST implement a security model consistent with the Android platform security model as defined in Security and Permissions reference document in the APIs [ Resources, 42 ] in the Android developer documentation. Device implementations MUST support installation of self-signed applications without requiring any additional permissions/certificates from any third parties/authorities. Specifically, compatible devices MUST support the security mechanisms described in the follow sub-sections.
9.1. Permissions
Device implementations MUST support the Android permissions model as defined in the Android developer documentation [ Resources, 42 ]. Specifically, implementations MUST enforce each permission defined as described in the SDK documentation; no permissions may be omitted, altered, or ignored. Implementations MAY add additional permissions, provided the new permission ID strings are not in the android.* namespace.
9.2. UID and Process Isolation
Device implementations MUST support the Android application sandbox model, in which each application runs as a unique Unix-style UID and in a separate process. Device implementations MUST support running multiple applications as the same Linux user ID, provided that the applications are properly signed and constructed, as defined in the Security and Permissions reference [ Resources, 42 ].
9.3. Filesystem Permissions
Device implementations MUST support the Android file access permissions model as defined in as defined in the Security and Permissions reference [ Resources, 42 ].
9.4. Alternate Execution Environments
Device implementations MAY include runtime environments that execute applications using some other software or technology than the Dalvik virtual machine or native code. However, such alternate execution environments MUST NOT compromise the Android security model or the security of installed Android applications, as described in this section.
Alternate runtimes MUST themselves be Android applications, and abide by the standard Android security model, as described elsewhere in Section 9.
Alternate runtimes MUST NOT be granted access to resources protected by permissions not requested in the runtime's AndroidManifest.xml file via the
<uses-permission>
mechanism.Alternate runtimes MUST NOT permit applications to make use of features protected by Android permissions restricted to system applications.
Alternate runtimes MUST abide by the Android sandbox model. Specifically:
- Alternate runtimes SHOULD install apps via the PackageManager into separate Android sandboxes (that is, Linux user IDs, etc.)
- Alternate runtimes MAY provide a single Android sandbox shared by all applications using the alternate runtime.
- Alternate runtimes and installed applications using an alternate runtime MUST NOT reuse the sandbox of any other app installed on the device, except through the standard Android mechanisms of shared user ID and signing certificate
- Alternate runtimes MUST NOT launch with, grant, or be granted access to the sandboxes corresponding to other Android applications.
Alternate runtimes MUST NOT be launched with, be granted, or grant to other applications any privileges of the superuser (root), or of any other user ID.
The .apk files of alternate runtimes MAY be included in the system image of a device implementation, but MUST be signed with a key distinct from the key used to sign other applications included with the device implementation.
When installing applications, alternate runtimes MUST obtain user consent for the Android permissions used by the application. That is, if an application needs to make use of a device resource for which there is a corresponding Android permission (such as Camera, GPS, etc.), the alternate runtime MUST inform the user that the application will be able to access that resource. If the runtime environment does not record application capabilities in this manner, the runtime environment MUST list all permissions held by the runtime itself when installing any application using that runtime.
10. Software Compatibility Testing
The Android Open-Source Project includes various testing tools to verify that device implementations are compatible. Device implementations MUST pass all tests described in this section.
However, note that no software test package is fully comprehensive. For this reason, device implementers are very strongly encouraged to make the minimum number of changes as possible to the reference and preferred implementation of Android 2.3 available from the Android Open-Source Project. This will minimize the risk of introducing bugs that create incompatibilities requiring rework and potential device updates.
10.1. Compatibility Test Suite
Device implementations MUST pass the Android Compatibility Test Suite (CTS) [ Resources, 2 ] available from the Android Open Source Project, using the final shipping software on the device. Additionally, device implementers SHOULD use the reference implementation in the Android Open Source tree as much as possible, and MUST ensure compatibility in cases of ambiguity in CTS and for any reimplementations of parts of the reference source code.
The CTS is designed to be run on an actual device. Like any software, the CTS may itself contain bugs. The CTS will be versioned independently of this Compatibility Definition, and multiple revisions of the CTS may be released for Android 2.3. Device implementations MUST pass the latest CTS version available at the time the device software is completed.
MUST pass the most recent version of the Android Compatibility Test Suite (CTS) available at the time of the device implementation's software is completed. (The CTS is available as part of the Android Open Source Project [ Resources, 2 ].) The CTS tests many, but not all, of the components outlined in this document.
10.2. CTS Verifier
Device implementations MUST correctly execute all applicable cases in the CTS Verifier. The CTS Verifier is included with the Compatibility Test Suite, and is intended to be run by a human operator to test functionality that cannot be tested by an automated system, such as correct functioning of a camera and sensors.
The CTS Verifier has tests for many kinds of hardware, including some hardware that is optional. Device implementations MUST pass all tests for hardware which they possess; for instance, if a device possesses an accelerometer, it MUST correctly execute the Accelerometer test case in the CTS Verifier. Test cases for features noted as optional by this Compatibility Definition Document MAY be skipped or omitted.
Every device and every build MUST correctly run the CTS Verifier, as noted above. However, since many builds are very similar, device implementers are not expected to explicitly run the CTS Verifier on builds that differ only in trivial ways. Specifically, device implementations that differ from an implementation that has passed the CTS Verfier only by the set of included locales, branding, etc. MAY omit the CTS Verifier test.
10.3. Reference Applications
Device implementers MUST test implementation compatibility using the following open-source applications:
- The "Apps for Android" applications [ Resources, 43 ].
- Replica Island (available in Android Market; only required for device implementations that support with OpenGL ES 2.0)
Each app above MUST launch and behave correctly on the implementation, for the implementation to be considered compatible.
11. Updatable Software
Device implementations MUST include a mechanism to replace the entirety of the system software. The mechanism need not perform "live" upgrades -- that is, a device restart MAY be required.
Any method can be used, provided that it can replace the entirety of the software preinstalled on the device. For instance, any of the following approaches will satisfy this requirement:
- Over-the-air (OTA) downloads with offline update via reboot
- "Tethered" updates over USB from a host PC
- "Offline" updates via a reboot and update from a file on removable storage
The update mechanism used MUST support updates without wiping user data. Note that the upstream Android software includes an update mechanism that satisfies this requirement.
If an error is found in a device implementation after it has been released but within its reasonable product lifetime that is determined in consultation with the Android Compatibility Team to affect the compatibility of third-party applications, the device implementer MUST correct the error via a software update available that can be applied per the mechanism just described.
12. Contact Us
You can contact the document authors at compatibility@android.com for clarifications and to bring up any issues that you think the document does not cover.
Appendix A - Bluetooth Test Procedure
The Compatibility Test Suite includes cases that cover basic operation of the Android RFCOMM Bluetooth API. However, since Bluetooth is a communications protocol between devices, it cannot be fully tested by unit tests running on a single device. Consequently, device implementations MUST also pass the human-operated Bluetooth test procedure described below.
The test procedure is based on the BluetoothChat sample app included in the Android open-source project tree. The procedure requires two devices:
- a candidate device implementation running the software build to be tested
- a separate device implementation already known to be compatible, and of a model from the device implementation being tested -- that is, a "known good" device implementation
The test procedure below refers to these devices as the "candidate" and "known good" devices, respectively.
Setup and Installation
- Build BluetoothChat.apk via 'make samples' from an Android source code tree.
- Install BluetoothChat.apk on the known-good device.
- Install BluetoothChat.apk on the candidate device.
Test Bluetooth Control by Apps
- Launch BluetoothChat on the candidate device, while Bluetooth is disabled.
- Verify that the candidate device either turns on Bluetooth, or prompts the user with a dialog to turn on Bluetooth.
Test Pairing and Communication
- Launch the Bluetooth Chat app on both devices.
- Make the known-good device discoverable from within BluetoothChat (using the Menu).
- On the candidate device, scan for Bluetooth devices from within BluetoothChat (using the Menu) and pair with the known-good device.
- Send 10 or more messages from each device, and verify that the other device receives them correctly.
- Close the BluetoothChat app on both devices by pressing Home .
- Unpair each device from the other, using the device Settings app.
Test Pairing and Communication in the Reverse Direction
- Launch the Bluetooth Chat app on both devices.
- Make the candidate device discoverable from within BluetoothChat (using the Menu).
- On the known-good device, scan for Bluetooth devices from within BluetoothChat (using the Menu) and pair with the candidate device.
- Send 10 or messages from each device, and verify that the other device receives them correctly.
- Close the Bluetooth Chat app on both devices by pressing Back repeatedly to get to the Launcher.
Test Re-Launches
- Re-launch the Bluetooth Chat app on both devices.
- Send 10 or messages from each device, and verify that the other device receives them correctly.
Note: the above tests have some cases which end a test section by using Home, and some using Back. These tests are not redundant and are not optional: the objective is to verify that the Bluetooth API and stack works correctly both when Activities are explicitly terminated (via the user pressing Back, which calls finish()), and implicitly sent to background (via the user pressing Home.) Each test sequence MUST be performed as described.
- MUST be capable of acting as an NFC Forum reader/writer (as defined by the NFC Forum technical specification NFCForum-TS-DigitalProtocol-1.0) via the following NFC standards:
- MUST be capable of acting as an NFC Forum reader/writer (as defined by the NFC Forum technical specification NFCForum-TS-DigitalProtocol-1.0) via the following NFC standards: