Android 9(API 级别 28)引入了一些您的应用可加以利用的新功能和 API,以及新行为变更。本文档简要介绍了迁移步骤 从两个关键阶段将应用迁移到 Android 9:
- 确保与 Android 9 基本兼容
验证您的现有应用能否在新版本的平台上完全正常运行。 在此阶段,您不需要使用新的 API,也不需要更改应用的
targetSdkVersion
, 但可能需要进行细微更改 - 以新平台为目标,使用 Android 9 SDK 编译,然后使用 Android 9 功能构建
当您准备好利用平台的新功能时,请将
targetSdkVersion
更新为28
,验证应用是否仍可按预期方式运行,然后开始使用新的 API。
准备一台运行 Android 9 的设备
如果您使用的是兼容设备,请获取 制造商为您的设备提供的 Android 9 系统映像;点击此处获取 出厂映像 Pixel 设备。一般说明: 如需刷写系统映像,请点击此处。
您还可以为 Android 模拟器下载 Android 9 系统映像。它在 SDK 管理器的 Android API 28 下列为 Google APIs Intel x86 Atom System Image。
注意:Android 9 模拟器系统映像可在 Android Studio 3.1 及更高版本中下载;Android Studio 3.2 提供最佳兼容性。 如需了解详情,请参阅获取 Android 9 SDK。
确保与 Android 9 兼容
此处的目标是确保您的现有应用在 Android 9 上照常运行。由于一些平台变更可能会影响应用的行为方式,
但您可能需要进行一些调整,但无需使用新的 API 或
更改您的targetSdkVersion
。
执行兼容性测试
在大多数情况下,测试与 Android 9 的兼容性 与准备发布应用时执行的测试相同。这时有必要查阅应用核心质量指南和测试最佳实践。
不过,测试还有另一个层面:Android 9 向 Android 平台引入了一些变化,即便不更改 targetSdkVersion
,它们仍可能会影响应用的行为或令其无法运行。因此,您必须回顾表 1 中的关键变化,并对任何为适应这些变化而实现的修复进行测试。
表 1. 影响所有应用的主要变更 在 Android 9 设备上运行。
更改 | 摘要 |
---|---|
针对非 SDK 接口的限制 |
现在,无论是直接访问特定的非 SDK 接口,
或通过反射来实现的尝试访问受限接口会产生如下错误:
NoSuchFieldException 和NoSuchMethodException 。
如需了解详情,请参阅针对非 SDK 接口的限制。
|
移除 Crypto 提供程序 |
从 Android 9 开始,Crypto JCA 提供程序已被移除。调用 SecureRandom.getInstance("SHA1PRNG", "Crypto") 将会抛出 NoSuchProviderException 。
|
更严格的 UTF-8 解码器 | 在 Android 9 中,针对 Java 语言的 UTF-8 解码器比以往更严格,并且遵循 Unicode 标准。 |
已禁止空闲应用访问摄像头、麦克风和传感器 | 在应用处于空闲状态时,不能再访问相机、麦克风或 SensorManager 传感器。 |
如需查看针对在 Android 9 上运行的所有应用的更详尽的行为变更列表, 请参阅行为变更文档。
更新您的目标版本并使用 Android P 功能
本部分说明了如何通过将 targetSdkVersion
更新为 28 并增加 Android 9 中提供的新功能来实现对 Android 9 的全面支持。
除提供新 API 之外,在您将 targetSdkVersion
更新为 28 后,您会注意到 Android 9 还引入了一些行为变更。因为某些行为
您可能需要更改代码以避免服务中断,您应该首先了解应用的
查看以 Android 9 为目标平台的应用的所有行为变更,了解更改 targetSdkVersion
时的影响。
注意:上述旨在确保平台兼容性的步骤是将应用以 Android 9 为目标平台的先决条件,因此请务必先完成这些步骤。
获取 Android 9 SDK
您可以使用 Android Studio 3.1 或更高版本获取 SDK 软件包,以便利用 Android 9 构建应用。 如果您还不需要 Android 9 中的新功能,并且只想使用新功能进行编译 平台版本,则可以使用 Android Studio 3.1。 Android Studio 3.2 全面支持 Android 9 功能。
测试 Android 9 应用
完成上述准备工作后,您便可以构建应用,然后对其进行进一步测试,以确保应用在以 Android 9(API 级别 28)为目标平台时能够正常运行。这时有必要再次回顾一下核心应用质量指南和测试最佳实践。
如果您在构建应用时将 targetSdkVersion
设置为 P,则应该注意特定的平台变化。部分
这些更改可能会严重影响应用的行为,甚至
即使您不实施新的
Android 9 中的新功能。
表 2 列出了这些变化以及可获得更多信息的链接。
表 2. 影响应用的主要变更
当 targetSdkVersion
设置为 28 时。
更改 | 摘要 |
---|---|
前台服务权限 | 现在,想要使用前台服务的应用必须首先请求 FOREGROUND_SERVICE 权限。这是普通权限,因此,系统会自动向请求授权的用户授予此权限 应用。在没有此权限的情况下启动前台服务会抛出 SecurityException。 |
弃用 Bouncy Castle 加密 |
Android 9 废弃了几个来自 Bouncy Castle 提供程序中的加密技术,改为使用这些加密技术
由 Conscrypt 提供程序提供。对 getInstance() 的调用:
请求获得 Bouncy
城堡提供程序生成 NoSuchAlgorithmException 错误。要解决这些错误,请不要在 getInstance() 中指定提供程序(也就是请求默认实现)。
|
移除了对 Build.serial 的直接访问
|
现在,需要 Build.serial 标识符的应用必须请求 READ_PHONE_STATE
权限,然后使用 Android 9 中新增的 Build.getSerial() 方法。
|
不允许共享 WebView 数据目录 | 应用无法再跨进程共享单个 WebView 数据目录。如果您的应用 多个进程使用 WebView、CookieManager 或 android.webkit 中的任何其他 API 软件包,那么当第二个进程调用 WebView 方法时,您的应用将会崩溃。 |
SELinux 禁止访问应用的数据目录 | 系统会强制执行按应用划分的 SELinux 沙盒,并针对各应用实施 SELinux 限制 应用的私有数据目录通过路径直接访问另一个应用的数据目录的行为 现在不允许。应用可以继续使用 IPC 机制分享数据,包括通过传递 FD。 |
如需查看针对以 Android 9 为目标平台的应用所进行行为变更的更详尽列表, 请参阅行为变更文档。
如需探索 Android 9 中的新功能和 API,请参阅 Android 9 功能和 API。