版权所有 © 2010, Google Inc. 保留所有权利。
compatibility@android.com
1. 简介
本文档列举了移动电话要与 Android 2.1 兼容必须满足的要求。
“必须”、“不得”、“必需”、“应”、“不应”、“应该”、“不应该”、“建议”、“可以”和“可选”的使用符合 RFC2119 [参考资料,1] 中定义的 IETF 标准。
在本文档中,“设备实现者”或“实现者”是指开发运行 Android 2.1 的硬件/软件解决方案的个人或组织。“设备实现”或“实现”是指如此开发的硬件/软件解决方案。
要被视为与 Android 2.1 兼容,设备实现
- 必须满足本兼容性定义中提出的要求,包括通过引用并入的任何文档。
- 必须通过设备实现的软件完成时可用的最新版本的 Android 兼容性测试套件 (CTS)。(CTS 作为 Android 开源项目 [参考资料,2] 的一部分提供。)CTS 测试了本文档中概述的许多组件,但并非全部。
如果本定义或 CTS 保持沉默、含义模糊或不完整,则设备实现者有责任确保与现有实现兼容。因此,Android 开源项目 [参考资料,3] 既是 Android 的参考实现,也是首选实现。强烈建议设备实现者基于 Android 开源项目提供的“上游”源代码来实现其实现。虽然某些组件可以在理论上被替换为替代实现,但不鼓励这种做法,因为通过 CTS 测试将变得更加困难。设备实现者有责任确保与标准 Android 实现的完全行为兼容性,包括且超出兼容性测试套件的范围。最后,请注意,本文档明确禁止某些组件替换和修改。
2. 参考资料
- IETF RFC2119 要求级别:http://www.ietf.org/rfc/rfc2119.txt
- Android 兼容性计划概览:https://aosp.org.cn/compatibility/index.html
- Android 开源项目:https://aosp.org.cn/
- API 定义和文档:https://developer.android.com.cn/reference/packages.html
- Android 权限参考:https://developer.android.com.cn/reference/android/Manifest.permission.html
- android.os.Build 参考:https://developer.android.com.cn/reference/android/os/Build.html
- Android 2.1 允许的版本字符串:https://aosp.org.cn/docs/compatibility/2.1/versions.html
- android.webkit.WebView 类:https://developer.android.com.cn/reference/android/webkit/WebView.html
- HTML5:http://www.whatwg.org/specs/web-apps/current-work/multipage/
- Dalvik 虚拟机规范:可在 Android 源代码 dalvik/docs 中找到
- AppWidgets:https://developer.android.com.cn/guide/practices/ui_guidelines/widget_design.html
- 通知:https://developer.android.com.cn/guide/topics/ui/notifiers/notifications.html
- 应用资源:http://code.google.com/android/reference/available-resources.html
- 状态栏图标样式指南:https://developer.android.com.cn/guide/practices/ui_guideline /icon_design.html#statusbarstructure
- 搜索管理器:https://developer.android.com.cn/reference/android/app/SearchManager.html
- Toast:https://developer.android.com.cn/reference/android/widget/Toast.html
- 动态壁纸:https://android-developers.googleblog.com/2010/02/live-wallpapers.html
- Android 应用:http://code.google.com/p/apps-for-android
- 参考工具文档(适用于 adb、aapt、ddms):https://developer.android.com.cn/guide/developing/tools/index.html
- Android apk 文件描述:https://developer.android.com.cn/guide/topics/fundamentals.html
- 清单文件:https://developer.android.com.cn/guide/topics/manifest/manifest-intro.html
- Monkey 测试工具:https://developer.android.com.cn/studio/test/other-testing-tools/monkey
- 支持多种屏幕:https://developer.android.com.cn/guide/practices/screens_support.html
- android.content.res.Configuration:https://developer.android.com.cn/reference/android/content/res/Configuration.html
- android.util.DisplayMetrics:https://developer.android.com.cn/reference/android/util/DisplayMetrics.html
- android.hardware.Camera:https://developer.android.com.cn/reference/android/hardware/Camera.html
- 传感器坐标空间:https://developer.android.com.cn/reference/android/hardware/SensorEvent.html
- Android 安全和权限参考:https://developer.android.com.cn/guide/topics/security/security.html
- 蓝牙 API:https://developer.android.com.cn/reference/android/bluetooth/package-summary.html
许多这些参考资料直接或间接地来源于 Android 2.1 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.1 SDK [参考资料,4] 暴露的任何已记录 API 的完整实现,包括所有已记录的行为。
除非本兼容性定义明确允许,否则设备实现不得省略任何托管 API、更改 API 接口或签名、偏离已记录的行为或包含空操作。
3.2. 软 API 兼容性
除了第 3.1 节中的托管 API 之外,Android 还包括一个重要的运行时“软”API,其形式包括 Intent、权限以及 Android 应用程序的类似方面,这些方面无法在应用程序编译时强制执行。本节详细介绍了与 Android 2.1 兼容所需的“软”API 和系统行为。设备实现必须满足本节中提出的所有要求。
3.2.1. 权限
设备实现者必须支持并强制执行权限参考页面 [参考资料,5] 中记录的所有权限常量。请注意,第 10 节列出了与 Android 安全模型相关的其他要求。
3.2.2. 构建参数
Android API 在 android.os.Build
类 [参考资料,6] 上包含许多常量,这些常量旨在描述当前设备。为了在设备实现中提供一致且有意义的值,下表包含对设备实现必须遵守的这些值的格式的其他限制。
参数 | 注释 |
android.os.Build.VERSION.RELEASE | 当前正在执行的 Android 系统的版本,采用人类可读的格式。此字段必须具有 [参考资料,7] 中定义的字符串值之一。 |
android.os.Build.VERSION.SDK | 当前正在执行的 Android 系统的版本,采用第三方应用程序代码可访问的格式。对于 Android 2.1,此字段必须具有整数值 7。 |
android.os.Build.VERSION.INCREMENTAL | 设备实现者选择的值,用于指定当前正在执行的 Android 系统的特定构建,采用人类可读的格式。对于运送给最终用户的不同版本,不得重复使用此值。此字段的典型用途是指示用于生成构建的版本号或源代码控制更改标识符。对此字段的特定格式没有要求,但它不得为 null 或空字符串 ("")。 |
android.os.Build.BOARD | 设备实现者选择的值,用于标识设备使用的特定内部硬件,采用人类可读的格式。此字段的可能用途是指示设备主板的特定修订版本。对此字段的特定格式没有要求,但它不得为 null 或空字符串 ("")。 |
android.os.Build.BRAND | 设备实现者选择的值,用于标识生产设备的公司的名称、组织、个人等,采用人类可读的格式。此字段的可能用途是指示销售设备的 OEM 和/或运营商。对此字段的特定格式没有要求,但它不得为 null 或空字符串 ("")。 |
android.os.Build.DEVICE | 设备实现者选择的值,用于标识设备机身(有时称为“工业设计”)的特定配置或修订版本。对此字段的特定格式没有要求,但它不得为 null 或空字符串 ("")。 |
android.os.Build.FINGERPRINT | 唯一标识此构建的字符串。它应该是相当人类可读的。它必须遵循此模板$(BRAND)/$(PRODUCT)/$(DEVICE)/$(BOARD):$(VERSION.RELEASE)/$(ID)/$(VERSION.INCREMENTAL):$(TYPE)/$(TAGS) 例如 acme/mydevice/generic/generic:2.1-update1/ERC77/3359:userdebug/test-keys 指纹不得包含空格。如果上面模板中包含的其他字段包含空格,则应在指纹中将其替换为 ASCII 下划线 ("_") 字符。 |
android.os.Build.HOST | 唯一标识构建所在的主机的字符串,采用人类可读的格式。对此字段的特定格式没有要求,但它不得为 null 或空字符串 ("")。 |
android.os.Build.ID | 设备实现者选择的标识符,用于指代特定版本,采用人类可读的格式。此字段可以与 android.os.Build.VERSION.INCREMENTAL 相同,但应该是对最终用户来说足够有意义的值,以便区分软件版本。对此字段的特定格式没有要求,但它不得为 null 或空字符串 ("")。 |
android.os.Build.MODEL | 设备实现者选择的值,包含最终用户已知的设备名称。这应该是设备向最终用户营销和销售时使用的名称。对此字段的特定格式没有要求,但它不得为 null 或空字符串 ("")。 |
android.os.Build.PRODUCT | 设备实现者选择的值,包含设备的开发名称或代号。必须是人类可读的,但不一定旨在供最终用户查看。对此字段的特定格式没有要求,但它不得为 null 或空字符串 ("")。 |
android.os.Build.TAGS | 设备实现者选择的以逗号分隔的标记列表,用于进一步区分构建。例如,“unsigned,debug”。此字段不得为 null 或空字符串 (""),但单个标记(例如“release”)也可以。 |
android.os.Build.TIME | 表示构建发生时间的时间戳的值。 |
android.os.Build.TYPE | 设备实现者选择的值,用于指定构建的运行时配置。此字段应具有与三个典型的 Android 运行时配置之一相对应的值:“user”、“userdebug”或“eng”。 |
android.os.Build.USER | 生成构建的用户名或用户 ID(或自动化用户)。对此字段的特定格式没有要求,但它不得为 null 或空字符串 ("")。 |
3.2.3. Intent 兼容性
Android 使用 Intent 来实现应用程序之间松散耦合的集成。本节介绍与设备实现必须遵守的 Intent 模式相关的要求。“遵守”是指设备实现者必须提供一个 Android Activity 或 Service,它指定匹配的 Intent 过滤器,并绑定到每个指定的 Intent 模式并为其实现正确的行为。
3.2.3.1. 核心应用程序 Intent
Android 上游项目定义了许多核心应用程序,例如电话拨号器、日历、联系人簿、音乐播放器等。设备实现者可以替换这些应用程序,使用替代版本。
但是,任何此类替代版本都必须遵守上游项目提供的相同 Intent 模式。例如,如果设备包含替代音乐播放器,则它仍然必须遵守第三方应用程序发出的用于选择歌曲的 Intent 模式。
以下应用程序被视为核心 Android 系统应用程序
- 桌面时钟
- 浏览器
- 日历
- 计算器
- 相机
- 联系人
- 电子邮件
- 图库
- 全局搜索
- 启动器
- LivePicker(即动态壁纸选择器应用程序;如果设备不支持动态壁纸,则可以省略,根据第 3.8.5 节。)
- 消息(又名“Mms”)
- 音乐
- 电话
- 设置
- 录音机
核心 Android 系统应用程序包括各种 Activity 或 Service 组件,这些组件被认为是“公共的”。也就是说,属性“android:exported”可能不存在,或者可能具有值“true”。
对于核心 Android 系统应用之一中定义的每个未通过值为“false”的 android:exported 属性标记为非公共的 Activity 或 Service,设备实现必须包含一个相同类型的组件,该组件实现与核心 Android 系统应用相同的 Intent 过滤器模式。
换句话说,设备实现可以替换核心 Android 系统应用;但是,如果这样做,设备实现必须支持每个被替换的核心 Android 系统应用定义的全部 Intent 模式。
3.2.3.2. Intent 覆盖
由于 Android 是一个可扩展平台,设备实现者必须允许核心系统应用中定义的每个 Intent 模式被第三方应用程序覆盖。上游 Android 开源项目默认允许这样做;设备实现者不得将特殊权限附加到系统应用程序对这些 Intent 模式的使用,或阻止第三方应用程序绑定到和接管这些模式的控制权。此项禁止特别包括但不限于禁用“选择器”用户界面,该界面允许用户在处理相同 Intent 模式的多个应用程序之间进行选择。
3.2.3.3. Intent 命名空间
设备实现者不得包含任何 Android 组件,该组件使用 android.* 命名空间中的 ACTION、CATEGORY 或其他键字符串来遵守任何新的 Intent 或广播 Intent 模式。设备实现者不得包含任何 Android 组件,该组件使用属于另一个组织的软件包空间中的 ACTION、CATEGORY 或其他键字符串来遵守任何新的 Intent 或广播 Intent 模式。设备实现者不得更改或扩展第 3.2.3.1 节中列出的核心应用使用的任何 Intent 模式。
此项禁止类似于第 3.6 节中为 Java 语言类指定的禁止。
3.2.3.4. 广播 Intent
第三方应用程序依赖于平台广播某些 Intent,以通知它们硬件或软件环境的变化。Android 兼容设备必须广播公共广播 Intent 以响应适当的系统事件。广播 Intent 在 SDK 文档中进行了描述。
3.3. 原生 API 兼容性
在 Dalvik 中运行的托管代码可以调用在应用程序 .apk 文件中作为 ELF .so 文件提供的本机代码,该文件针对相应的设备硬件架构编译。设备实现必须包含对在托管环境中运行的代码的支持,以使用标准 Java 原生接口 (JNI) 语义调用本机代码。以下 API 必须可用于本机代码
- libc(C 库)
- libm(数学库)
- JNI 接口
- libz(Zlib 压缩)
- liblog(Android 日志记录)
- 对 C++ 的最低限度支持
- 对 OpenGL 的支持,如下所述
设备实现必须支持 OpenGL ES 1.0。缺少硬件加速的设备必须使用软件渲染器实现 OpenGL ES 1.0。设备实现应尽可能多地实现设备硬件支持的 OpenGL ES 1.1。如果硬件能够在这些 API 上实现合理的性能,则设备实现应为 OpenGL ES 2.0 提供实现。
这些库必须与 Android 开源项目提供的 Bionic 版本源代码兼容(即标头兼容)和二进制兼容(对于给定的处理器架构)。由于 Bionic 实现与其他实现(例如 GNU C 库)不完全兼容,因此设备实现者应使用 Android 实现。如果设备实现者使用这些库的不同实现,他们必须确保标头、二进制和行为兼容性。
设备实现必须通过 android.os.Build.CPU_ABI
API 准确报告设备支持的原生应用程序二进制接口 (ABI)。ABI 必须是 Android NDK 最新版本中的条目之一,位于文件 docs/CPU-ARCH-ABIS.txt
中。请注意,Android NDK 的其他版本可能会引入对其他 ABI 的支持。
原生代码兼容性具有挑战性。因此,应重申,强烈鼓励设备实现者使用上述库的上游实现,以帮助确保兼容性。
3.4. Web API 兼容性
许多开发人员和应用程序依赖于 android.webkit.WebView
类 [参考资料,8] 的行为来获得用户界面,因此 WebView 实现必须在 Android 实现之间兼容。Android 开源实现使用 WebKit 渲染引擎来实现 WebView。
由于为 Web 浏览器开发全面的测试套件不可行,因此设备实现者必须在 WebView 实现中使用 WebKit 的特定上游构建。具体而言
- WebView 必须使用 Android 2.1 的上游 Android 开源树中的 530.17 WebKit 构建。此构建包括 WebView 的一组特定功能和安全修复。
- WebView 报告的用户代理字符串必须采用以下格式
Mozilla/5.0 (Linux; U; Android $(VERSION); $(LOCALE); $(MODEL) Build/$(BUILD)) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17
- $(VERSION) 字符串的值必须与
android.os.Build.VERSION.RELEASE
的值相同 - $(LOCALE) 字符串的值应遵循国家/地区代码和语言的 ISO 约定,并且应指代设备当前配置的区域设置
- $(MODEL) 字符串的值必须与
android.os.Build.MODEL
的值相同 - $(BUILD) 字符串的值必须与
android.os.Build.ID
的值相同
- $(VERSION) 字符串的值必须与
实现可以在独立的浏览器应用程序中发布自定义用户代理字符串。更重要的是,独立的浏览器可以基于替代浏览器技术(例如 Firefox、Opera 等)。但是,即使发布了替代浏览器应用程序,提供给第三方应用程序的 WebView 组件也必须如上所述基于 WebKit。
WebView 配置必须包含对 HTML5 数据库、应用程序缓存和地理位置 API 的支持 [Resources, 9]。 WebView 必须包含某种形式的 HTML5 <video>
标签的支持。独立的浏览器应用程序(无论是基于上游 WebKit 浏览器应用程序还是第三方替代品)必须包含对 WebView 刚刚列出的相同 HTML5 功能的支持。
3.5. API 行为兼容性
每种 API 类型(托管、软、原生和 Web)的行为必须与上游 Android 开源项目的首选实现保持一致 [Resources, 3]。 一些具体的兼容性领域包括:
- 设备不得更改标准 Intent 的行为或含义
- 设备不得更改特定类型的系统组件(例如 Service、Activity、ContentProvider 等)的生命周期或生命周期语义
- 设备不得更改特定权限的语义
以上列表并非详尽无遗,设备实现者有责任确保行为兼容性。 因此,设备实现者应尽可能使用通过 Android 开源项目提供的源代码,而不是重新实现系统的重要部分。
兼容性测试套件 (CTS) 测试了平台行为兼容性的重要部分,但并非全部。 实现者有责任确保与 Android 开源项目的行为兼容性。
3.6. API 命名空间
Android 遵循 Java 编程语言定义的包和类命名空间约定。 为了确保与第三方应用程序的兼容性,设备实现者不得对这些包命名空间进行任何禁止的修改(见下文)
- java.*
- javax.*
- sun.*
- android.*
- com.android.*
禁止的修改包括:
- 设备实现不得通过更改任何方法或类签名,或通过删除类或类字段来修改 Android 平台上公开的 API。
- 设备实现者可以修改 API 的底层实现,但此类修改不得影响任何公开 API 的声明行为和 Java 语言签名。
- 设备实现者不得在上述 API 中添加任何公开的元素(例如类或接口,或现有类或接口的字段或方法)。
“公开的元素”是指上游 Android 源代码中未用“@hide”标记修饰的任何构造。 换句话说,设备实现者不得在上述命名空间中公开新的 API 或更改现有 API。 设备实现者可以进行仅限内部的修改,但这些修改不得向开发人员宣传或以其他方式公开。
设备实现者可以添加自定义 API,但任何此类 API 不得位于由其他组织拥有或引用其他组织的命名空间中。 例如,设备实现者不得向 com.google.* 或类似命名空间添加 API; 只有 Google 可以这样做。 同样,Google 不得向其他公司的命名空间添加 API。
如果设备实现者建议改进上述包命名空间之一(例如,通过向现有 API 添加有用的新功能,或添加新的 API),则实现者应访问 source.android.com 并根据该站点上的信息开始贡献更改和代码的过程。
请注意,上述限制与 Java 编程语言中命名 API 的标准约定相对应; 本节旨在加强这些约定,并通过将其纳入此兼容性定义使其具有约束力。
3.7. 虚拟机兼容性
设备实现必须支持完整的 Dalvik 可执行 (DEX) 字节码规范和 Dalvik 虚拟机语义 [Resources, 10]。
设备实现必须配置 Dalvik,以便在中低密度屏幕的设备上为每个应用程序分配至少 16MB 的内存。 设备实现必须配置 Dalvik,以便在高密度屏幕的设备上为每个应用程序分配至少 24MB 的内存。 请注意,设备实现可以分配比这些数字更多的内存,但不是必需的。
3.8. 用户界面兼容性
Android 平台包含一些开发人员 API,允许开发人员挂接到系统用户界面。 设备实现必须将这些标准 UI API 整合到他们开发的自定义用户界面中,如下所述。
3.8.1. 小部件
Android 定义了一种组件类型以及相应的 API 和生命周期,允许应用程序向最终用户公开“AppWidget” [Resources, 11]。 Android 开源参考版本包括一个启动器应用程序,其中包含允许用户从主屏幕添加、查看和删除 AppWidget 的用户界面元素。
设备实现者可以替换参考启动器(即主屏幕)的替代方案。 替代启动器应包含对 AppWidget 的内置支持,并公开用户界面元素以直接在启动器内添加、配置、查看和删除 AppWidget。 替代启动器可以省略这些用户界面元素; 但是,如果省略了这些元素,则设备实现者必须提供一个可从启动器访问的单独应用程序,允许用户添加、配置、查看和删除 AppWidget。
3.8.2. 通知
Android 包含允许开发人员通知用户重要事件的 API [Resources, 12]。 设备实现者必须为定义的每类通知提供支持; 具体而言:声音、振动、灯光和状态栏。
此外,实现必须正确渲染 API [Resources, 13] 或状态栏图标样式指南 [Resources, 14] 中提供的所有资源(图标、声音文件等)。 设备实现者可以为通知提供与参考 Android 开源实现提供的用户体验不同的用户体验; 但是,此类替代通知系统必须支持现有的通知资源,如上所述。
3.8.3. 搜索
Android 包含 API [Resources, 15],允许开发人员将搜索整合到他们的应用程序中,并将他们应用程序的数据公开到全局系统搜索中。 一般来说,此功能由一个单一的、系统范围的用户界面组成,该界面允许用户输入查询、在用户键入时显示建议以及显示结果。 Android API 允许开发人员重用此界面以在他们自己的应用程序中提供搜索,并允许开发人员为公共全局搜索用户界面提供结果。
设备实现必须包含一个单一的、共享的、系统范围的搜索用户界面,该界面能够实时响应用户输入提供建议。 设备实现必须实现允许开发人员重用此用户界面以在他们自己的应用程序中提供搜索的 API。 设备实现必须实现允许第三方应用程序在全局搜索模式下运行时向搜索框添加建议的 API。 如果未安装任何利用此功能的第三方应用程序,则默认行为应是显示 Web 搜索引擎结果和建议。
设备实现可以附带备用搜索用户界面,但应包括一个硬或软专用搜索按钮,该按钮可以在任何应用程序中的任何时间使用,以调用搜索框架,其行为在 API 文档中提供。
3.8.4. Toast
应用程序可以使用“Toast”API(在 [Resources, 16] 中定义)向最终用户显示简短的非模态字符串,这些字符串会在短暂的时间后消失。 设备实现必须以某种高度可见的方式向最终用户显示来自应用程序的 Toast。
3.8.5. 动态壁纸
Android 定义了一种组件类型以及相应的 API 和生命周期,允许应用程序向最终用户公开一个或多个“动态壁纸” [Resources, 17]。 动态壁纸是动画、图案或类似的图像,具有有限的输入功能,可作为壁纸显示在其他应用程序后面。
如果硬件可以运行所有动态壁纸,且功能不受限制,以合理的帧速率运行,且不对其他应用程序产生不利影响,则认为该硬件能够可靠地运行动态壁纸。 如果硬件的限制导致壁纸和/或应用程序崩溃、故障、消耗过多的 CPU 或电池电量,或者以不可接受的低帧速率运行,则认为该硬件无法运行动态壁纸。 例如,某些动态壁纸可以使用 Open GL 1.0 或 2.0 上下文来渲染其内容。 动态壁纸在不支持多个 OpenGL 上下文的硬件上无法可靠运行,因为动态壁纸对 OpenGL 上下文的使用可能会与也使用 OpenGL 上下文的其他应用程序冲突。
能够如上所述可靠运行动态壁纸的设备实现应实现动态壁纸。 确定为不能如上所述可靠运行动态壁纸的设备实现不得实现动态壁纸。
4. 参考软件兼容性
设备实现者必须使用以下开源应用程序测试实现兼容性
- 计算器(包含在 SDK 中)
- Lunar Lander(包含在 SDK 中)
- “Apps for Android”应用程序 [Resources, 18]。
对于被认为是兼容的实现,上述每个应用程序都必须在实现上启动并正确运行。
此外,设备实现者必须测试这些冒烟测试应用程序的每个菜单项(包括所有子菜单)
- ApiDemos(包含在 SDK 中)
- ManualSmokeTests(包含在 CTS 中)
上述应用程序中的每个测试用例都必须在设备实现上正确运行。
5. 应用程序打包兼容性
设备实现必须安装并运行由官方 Android SDK [Resources, 19] 中包含的“aapt”工具生成的 Android “.apk”文件。
设备实现不得扩展 .apk [Resources, 20]、Android Manifest [Resources, 21] 或 Dalvik 字节码 [Resources, 10] 格式,以防止这些文件在其他兼容设备上正确安装和运行。 设备实现者应使用 Dalvik 的参考上游实现和参考实现的包管理系统。
6. 多媒体兼容性
设备实现必须支持以下多媒体编解码器。 所有这些编解码器都在 Android 开源项目的首选 Android 实现中作为软件实现提供。
请注意,Google 和开放手机联盟均未声明这些编解码器不受第三方专利的约束。 那些打算在硬件或软件产品中使用此源代码的人员应注意,此代码的实现(包括在开源软件或共享软件中)可能需要获得相关专利持有人的专利许可。
音频 | ||||
名称 | 编码器 | 解码器 | 详细信息 | 文件/容器格式 |
AAC LC/LTP | X | 单声道/立体声内容,标准比特率高达 160 kbps,采样率在 8 到 48kHz 之间的任意组合 | 3GPP (.3gp) 和 MPEG-4 (.mp4, .m4a)。 不支持原始 AAC (.aac) | |
HE-AACv1 (AAC+) | X | |||
HE-AACv2 (增强型 AAC+) | X | |||
AMR-NB | X | X | 4.75 至 12.2 kbps 采样 @ 8kHz | 3GPP (.3gp) |
AMR-WB | X | 9 个速率,从 6.60 kbit/s 到 23.85 kbit/s 采样 @ 16kHz | 3GPP (.3gp) | |
MP3 | X | 单声道/立体声 8-320Kbps 恒定 (CBR) 或可变比特率 (VBR) | MP3 (.mp3) | |
MIDI | X | MIDI 类型 0 和 1。 DLS 版本 1 和 2。 XMF 和 Mobile XMF。 支持铃声格式 RTTTL/RTX、OTA 和 iMelody | 类型 0 和 1 (.mid, .xmf, .mxmf)。 还有 RTTTL/RTX (.rtttl, .rtx)、OTA (.ota) 和 iMelody (.imy) | |
Ogg Vorbis | X | Ogg (.ogg) | ||
PCM | X | 8 位和 16 位线性 PCM(速率高达硬件限制) | WAVE (.wav) | |
图像 | ||||
JPEG | X | X | 基本+渐进 | |
GIF | X | |||
PNG | X | X | ||
BMP | X | |||
视频 | ||||
H.263 | X | X | 3GPP (.3gp) 文件 | |
H.264 | X | 3GPP (.3gp) 和 MPEG-4 (.mp4) 文件 | ||
MPEG4 简单配置文件 | X | 3GPP (.3gp) 文件 |
请注意,上表未列出大多数视频编解码器的特定比特率要求。 原因是实际上,当前的设备硬件不一定支持完全映射到相关标准指定的所需比特率的比特率。 相反,设备实现应支持硬件上可行的最高比特率,最高可达规范定义的限制。
7. 开发人员工具兼容性
设备实现必须支持 Android SDK 中提供的 Android 开发人员工具。 具体而言,Android 兼容设备必须与以下工具兼容:
- Android 调试桥 (adb) [Resources, 19]
设备实现必须支持 Android SDK 中记录的所有adb
功能。 设备端adb
守护程序应默认处于非活动状态,但必须有一个用户可访问的机制来打开 Android 调试桥。 - Dalvik 调试监视器服务 (ddms) [Resources, 19]
设备实现必须支持 Android SDK 中记录的所有ddms
功能。 由于ddms
使用adb
,因此默认情况下ddms
的支持应处于非活动状态,但只要用户已激活 Android 调试桥(如上所述),就必须支持ddms
。 - Monkey [Resources, 22]
设备实现必须包含 Monkey 框架,并使其可供应用程序使用。
8. 硬件兼容性
Android 旨在支持设备实现者创建创新的外形和配置。 同时,Android 开发人员期望所有 Android 设备都具有某些硬件、传感器和 API。 本节列出了所有 Android 2.1 兼容设备必须支持的硬件功能。
如果设备包含具有第三方开发人员对应 API 的特定硬件组件,则设备实现必须实现 Android SDK 文档中定义的 API。 如果 SDK 中的 API 与声明为可选的硬件组件交互,并且设备实现不具有该组件,则
- 组件 API 的类定义必须存在
- API 的行为必须以某种合理的方式实现为无操作
- API 方法必须在 SDK 文档允许的情况下返回空值
- API 方法必须在 SDK 文档不允许空值的情况下返回类的无操作实现
这些要求适用的典型场景示例是电话 API:即使在非电话设备上,这些 API 也必须实现为合理的无操作。
设备实现必须通过 android.content.pm.PackageManager
类上的 getSystemAvailableFeatures()
和 hasSystemFeature(String)
方法准确报告准确的硬件配置信息。
8.1. 显示屏
Android 2.1 包含在某些情况下执行某些自动缩放和变换操作的工具,以确保第三方应用程序在各种硬件配置上合理运行 [Resources, 23]。 设备必须正确实现这些行为,如本节所述。
对于 Android 2.1,以下是最常见的显示配置
屏幕类型 | 宽度(像素) | 高度(像素) | 对角线长度范围(英寸) | 屏幕尺寸组 | 屏幕密度组 |
QVGA | 240 | 320 | 2.6 - 3.0 | 小 | 低 |
WQVGA | 240 | 400 | 3.2 - 3.5 | 普通 | 低 |
FWQVGA | 240 | 432 | 3.5 - 3.8 | 普通 | 低 |
HVGA | 320 | 480 | 3.0 - 3.5 | 普通 | 中 |
WVGA | 480 | 800 | 3.3 - 4.0 | 普通 | 高 |
FWVGA | 480 | 854 | 3.5 - 4.0 | 普通 | 高 |
WVGA | 480 | 800 | 4.8 - 5.5 | 大 | 中 |
FWVGA | 480 | 854 | 5.0 - 5.8 | 大 | 中 |
与上述标准配置之一对应的设备实现必须配置为通过 android.content.res.Configuration
[Resources, 24] 类向应用程序报告指示的屏幕尺寸。
某些 .apk 包的清单未将其标识为支持特定密度范围。 运行此类应用程序时,以下约束适用:
- 设备实现必须将缺少密度限定符的 .apk 中的资源解释为默认为“中等”(在 SDK 文档中称为“mdpi”)。
- 在“低”密度屏幕上运行时,设备实现必须将中等/mdpi 资产按 0.75 的系数缩小。
- 在“高”密度屏幕上运行时,设备实现必须将中等/mdpi 资产按 1.5 的系数放大。
- 设备实现不得在密度范围内缩放资产,并且必须在密度范围之间按这些系数精确缩放资产。
8.1.2. 非标准显示配置
不符合第 8.1.1 节中列出的标准配置之一的显示配置需要额外的考虑和工作才能兼容。 设备实现者必须按照第 12 节中的规定联系 Android 兼容性团队,以获取屏幕尺寸桶、密度和缩放因子的分类。 当提供此信息后,设备实现者必须按照指定的方式实现它们。
请注意,某些显示配置(例如非常大或非常小的屏幕,以及某些纵横比)从根本上与 Android 2.1 不兼容; 因此,鼓励设备实现者在开发过程的早期与 Android 兼容性团队联系。
8.1.3. 显示指标
设备实现必须报告 android.util.DisplayMetrics
[Resources, 25] 中定义的所有显示指标的正确值。
8.2. 键盘
设备实现
- 必须包含对输入管理框架的支持(允许第三方开发人员创建输入管理引擎——即软键盘),详见 developer.android.com
- 必须提供至少一个软键盘实现(无论是否存在硬键盘)
- 可以包含其他软键盘实现
- 可以包含硬件键盘
- 不得包含与
android.content.res.Configuration.keyboard
[Resources, 24] 中指定的格式之一(即 QWERTY 或 12 键)不匹配的硬件键盘
8.3. 非触摸导航
设备实现
- 可以省略非触摸导航选项(即,可以省略轨迹球、d-pad 或滚轮)
- 必须报告
android.content.res.Configuration.navigation
[Resources, 24] 的正确值
8.4. 屏幕方向
兼容设备必须支持应用程序动态定向到纵向或横向屏幕方向。 也就是说,设备必须尊重应用程序对特定屏幕方向的请求。 设备实现可以选择纵向或横向方向作为默认方向。
设备必须在通过 android.content.res.Configuration.orientation、android.view.Display.getOrientation() 或其他 API 查询时报告设备当前方向的正确值。
8.5. 触摸屏输入
设备实现
- 必须具有触摸屏
- 可以具有电容式或电阻式触摸屏
- 必须报告
android.content.res.Configuration
[Resources, 24] 的值,该值反映设备上特定触摸屏的类型
8.6. USB
设备实现
- 必须实现 USB 客户端,可连接到带有标准 USB-A 端口的 USB 主机
- 必须通过 USB 实现 Android 调试桥(如第 7 节中所述)
- 必须实现 USB 大容量存储规范,以允许连接到设备的主机访问 /sdcard 卷的内容
- 设备侧应使用 micro USB 外形尺寸
- 设备侧可以包含非标准端口,但如果是这样,则必须附带能够将自定义引脚排列连接到标准 USB-A 端口的电缆
8.7. 导航键
主页、菜单和返回功能对于 Android 导航范例至关重要。 设备实现必须始终向用户提供这些功能,无论应用程序状态如何。 这些功能应通过专用按钮实现。 它们可以使用软件、手势、触摸面板等实现,但如果是这样,它们必须始终可访问且不遮挡或干扰可用的应用程序显示区域。
设备实现者还应提供专用搜索键。 设备实现者还可以为电话呼叫提供发送和结束键。
8.8. 无线数据网络
设备实现必须包含对无线高速数据网络的支持。 具体而言,设备实现必须包含对至少一种能够达到 200Kbit/秒或更高速度的无线数据标准的支持。 满足此要求的技术的示例包括 EDGE、HSPA、EV-DO、802.11g 等。
如果设备实现包含 Android SDK 包含 API 的特定模式(即 WiFi、GSM 或 CDMA),则实现必须支持该 API。
设备可以实现多种形式的无线数据连接。 设备可以实现有线数据连接(例如以太网),但无论如何都必须包含至少一种形式的无线连接,如上所述。
8.9. 摄像头
设备实现必须包含摄像头。 包含的摄像头
- 必须具有至少 2 百万像素的分辨率
- 应具有硬件自动对焦或在摄像头驱动程序中实现的软件自动对焦(对应用程序软件透明)
- 可以具有固定焦距或 EDOF(扩展景深)硬件
- 可以包含闪光灯。 如果摄像头包含闪光灯,则当 android.hardware.Camera.PreviewCallback 实例已在摄像头预览表面上注册时,闪光灯不得亮起,除非应用程序已通过启用
Camera.Parameters
对象的FLASH_MODE_AUTO
或FLASH_MODE_ON
属性显式启用了闪光灯。 请注意,此约束不适用于设备的内置系统摄像头应用程序,而仅适用于使用Camera.PreviewCallback
的第三方应用程序。
设备实现必须为摄像头相关 API 实现以下行为
- 如果应用程序从未调用 android.hardware.Camera.Parameters.setPreviewFormat(int),则设备必须对提供给应用程序回调的预览数据使用 android.hardware.PixelFormat.YCbCr_420_SP。
- 如果应用程序注册了 android.hardware.Camera.PreviewCallback 实例,并且当预览格式为 YCbCr_420_SP 时系统调用了 onPreviewFrame() 方法,则传递到 onPreviewFrame() 中的 byte[] 中的数据必须进一步采用 NV21 编码格式。 (这是 7k 硬件系列本机使用的格式。)也就是说,NV21 必须是默认格式。
设备实现必须实现 Android 2.1 SDK 文档 [Resources, 26] 中包含的完整摄像头 API,无论设备是否包含硬件自动对焦或其他功能。 例如,缺少自动对焦功能的摄像头仍必须调用任何注册的 android.hardware.Camera.AutoFocusCallback
实例(即使这与非自动对焦摄像头无关)。
如果底层硬件支持该功能,则设备实现必须识别并遵守在 android.hardware.Camera.Parameters
类上定义为常量的每个参数名称。 如果设备硬件不支持某项功能,则 API 必须按照文档中的说明运行。 相反,设备实现不得遵守或识别传递给 android.hardware.Camera.setParameters()
方法的字符串常量,除非这些常量以指示设备实现者名称的字符串为前缀,而不是在 android.hardware.Camera.Parameters
上记录为常量的字符串常量。 也就是说,如果硬件允许,设备实现必须支持所有标准摄像头参数,并且除非参数名称通过字符串前缀清楚地指示为非标准参数类型,否则不得支持自定义摄像头参数类型。
8.10. 加速度计
设备实现必须包含一个 3 轴加速度计,并且必须能够以 50 Hz 或更高的频率传递事件。 加速度计使用的坐标系必须符合 Android 传感器坐标系,如 Android API 中详述(参见 [Resources, 27])。
8.11. 指南针
设备实现必须包含一个 3 轴指南针,并且必须能够以 10 Hz 或更高的频率传递事件。 指南针使用的坐标系必须符合 Android API 中定义的 Android 传感器坐标系(参见 [Resources, 27])。
8.12. GPS
设备实现必须包含 GPS,并且应包含某种形式的“辅助 GPS”技术,以最大限度地缩短 GPS 定位时间。
8.13. 电话
Android 2.1 可以用于不包含电话硬件的设备。 也就是说,Android 2.1 与非电话设备兼容。 但是,如果设备实现确实包含 GSM 或 CDMA 电话,则它必须实现对该技术 API 的完整支持。 不包含电话硬件的设备实现必须将完整 API 实现为无操作。
另请参见第 8.8 节,无线数据网络。
8.14. 内存和存储
设备实现必须具有至少 92MB 的内存可供内核和用户空间使用。 92MB 必须是专用于硬件组件(如无线电、内存等)且不受内核控制的任何内存之外的内存。
设备实现必须具有至少 150MB 的非易失性存储空间可供用户数据使用。 也就是说,/data
分区必须至少为 150MB。
8.15. 应用程序共享存储
设备实现必须为应用程序提供共享存储。 提供的共享存储空间必须至少为 2GB。
设备实现必须配置为默认“开箱即用”安装共享存储。 如果共享存储未安装在 Linux 路径 /sdcard
上,则设备必须包含从 /sdcard
到实际挂载点的 Linux 符号链接。
设备实现必须按照文档规定在共享存储上强制执行 android.permission.WRITE_EXTERNAL_STORAGE
权限。 否则,共享存储必须可由任何获得该权限的应用程序写入。
设备实现可以具有用于用户可访问的可移动存储的硬件,例如安全数字卡。 或者,设备实现可以将内部(不可移动)存储分配为应用程序的共享存储。
无论使用何种形式的共享存储,共享存储都必须实现 USB 大容量存储,如第 8.6 节中所述。 开箱即用时,共享存储必须以 FAT 文件系统挂载。
考虑两个常见的示例具有启发意义。 如果设备实现包含 SD 卡插槽以满足共享存储要求,则必须在销售给用户的设备中包含 2GB 或更大的 FAT 格式 SD 卡,并且必须默认挂载。 或者,如果设备实现使用内部固定存储来满足此要求,则该存储必须为 2GB 或更大,并挂载在 /sdcard
上(或者 /sdcard
必须是指向物理位置的符号链接,如果它挂载在其他位置)。
8.16. 蓝牙
设备实现必须包含蓝牙收发器。 设备实现必须启用 SDK 文档 [Resources, 29] 中描述的基于 RFCOMM 的蓝牙 API。 设备实现应根据设备的适用性实现相关的蓝牙配置文件,例如 A2DP、AVRCP、OBEX 等。
9. 性能兼容性
Android 兼容性计划的目标之一是为消费者实现一致的应用程序体验。 兼容的实现不仅必须确保应用程序在设备上简单地正确运行,而且还必须以合理的性能和良好的整体用户体验运行。 设备实现必须满足下表中定义的 Android 2.1 兼容设备的关键性能指标
指标 | 性能阈值 | 注释 |
应用程序启动时间 | 以下应用程序应在指定的时间内启动。
|
启动时间测量为完成加载应用程序默认活动的总时间,包括启动 Linux 进程、将 Android 包加载到 Dalvik VM 以及调用 onCreate 所需的时间。 |
同时运行的应用程序 | 当启动多个应用程序后,重新启动已启动的应用程序所花费的时间必须少于原始启动时间。 |
10. 安全模型兼容性
设备实现必须实现与 Android 平台安全模型一致的安全模型,如 Android 开发人员文档中 API 中的安全和权限参考文档 [Resources, 28] 中所定义。 设备实现必须支持安装自签名应用程序,而无需任何第三方/机构的额外权限/证书。 具体而言,兼容设备必须支持以下子节中描述的安全机制。
10.1. 权限
设备实现必须支持 Android 开发人员文档 [Resources, 28] 中定义的 Android 权限模型。 具体而言,实现必须强制执行 SDK 文档中所述的每个定义的权限; 不得省略、更改或忽略任何权限。 实现可以添加额外的权限,前提是新的权限 ID 字符串不在 android.* 命名空间中。
10.2. UID 和进程隔离
设备实现必须支持 Android 应用程序沙箱模型,其中每个应用程序都作为唯一的 Unix 样式 UID 并在单独的进程中运行。 设备实现必须支持以相同的 Linux 用户 ID 运行多个应用程序,前提是这些应用程序已正确签名和构造,如安全和权限参考 [Resources, 28] 中所定义。
10.3. 文件系统权限
设备实现必须支持 Android 文件访问权限模型,如安全和权限参考 [Resources, 28] 中所定义。
11. 兼容性测试套件
设备实现**必须**通过 Android 兼容性测试套件 (CTS) [资源 2],该套件可从 Android 开源项目获取,并使用设备上的最终发布软件进行测试。此外,设备实现者**应该**尽可能使用 Android 开源树中的参考实现,并且**必须**确保在 CTS 存在歧义以及对参考源代码的任何重新实现的情况下保持兼容性。
CTS 旨在实际设备上运行。与任何软件一样,CTS 本身可能包含错误。CTS 的版本将独立于本兼容性定义进行版本控制,并且可能会为 Android 2.1 发布多个 CTS 版本。设备实现**必须**通过设备软件完成时可用的最新 CTS 版本。
12. 可更新软件
设备实现**必须**包含一种机制来替换整个系统软件。该机制无需执行“实时”升级——也就是说,可能**需要**重启设备。
可以使用任何方法,只要它可以替换设备上预装的全部软件即可。例如,以下任何方法都将满足此要求:
- 通过重启进行离线更新的无线下载 (OTA)
- 通过 USB 从主机 PC 进行“有线”更新
- 通过重启和从可移动存储设备上的文件进行更新的“离线”更新
所使用的更新机制**必须**支持在不擦除用户数据的情况下进行更新。请注意,上游 Android 软件包含一种满足此要求的更新机制。
如果在设备实现发布后但在其合理的产品寿命期内发现错误,并且经与 Android 兼容性团队协商后确定该错误会影响第三方应用程序的兼容性,则设备实现者**必须**通过可根据刚刚描述的机制应用的软件更新来纠正该错误。
13. 联系我们
您可以联系文档作者 compatibility@android.com 以获得澄清,并提出您认为文档未涵盖的任何问题。