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