迁移到 Android 8.0

Android 8.0(API 级别 26)引入了行为变更以及可供您在应用中利用的新功能和 API。本文档简要介绍了将应用迁移到 Android 8.0 的两个关键阶段的步骤:

  1. 确保与 Android 8.0 兼容

    验证您的应用能否在新版平台上完全正常运行。在此阶段,您不需要使用新的 API,也不需要更改应用的 targetSdkVersion,但可能需要进行一些细微更改。

  2. 更新您的目标版本并使用 Android 8.0 功能

    当您准备好利用平台的新功能时,请将 targetSdkVersion 更新为 26,验证应用是否继续按预期运行,然后开始使用新的 API。

确保与 Android 8.0 兼容

这样做的目标是确保您的现有应用可在 Android 8.0(API 级别 26)上正常运行。由于一些平台变更可能会影响应用的行为方式,因此可能需要进行一些调整,但您不需要使用新的 API 或更改 targetSdkVersion

逐步确保与 Android 8.0 兼容

准备搭载 Android 8.0 的设备

  • 如果您使用的是兼容设备(Pixel、Pixel XL、Pixel C、Nexus 5X、Nexus 6P 或 Nexus Player),请按照刷写设备的说明进行操作。
  • 或下载适用于 Android 模拟器的 Android 8.0 系统映像。它在 SDK 管理器Android 8.0 下列为 Google APIs Intel x86 Atom System Image

    注意:您可以从 Android Studio 3.0 及更高版本下载 Android 8.0 系统映像。如需了解详情,请参阅以下部分以获取 Android 8.0 SDK

执行兼容性测试

在大多数情况下,与 Android 8.0(API 级别 26)的兼容性测试与您准备发布应用时执行的测试属于同一类型。这时有必要查阅核心应用质量指南测试最佳实践

不过,测试还有另一个方面:Android 8.0 向 Android 平台引入了一些变化,即使您不更改 targetSdkVersion,它也会影响应用的行为或彻底破坏应用。因此,请务必查看表 1 中的主要更改,并测试为适应这些变化而实施的所有修复。

表 1. 对搭载 Android 8.0 的所有应用都有影响的关键变更。

更改 总结 更多参考信息
后台位置更新频率下降 如果您的应用从后台服务接收位置信息更新,则在 Android 8.0(API 级别 26)上接收更新的频率低于更低版本的 Android。具体而言,后台服务接收位置信息更新的频率不能超过每小时几次。不过,当您的应用在前台运行时,位置信息更新的频率保持不变。 后台位置信息限制
不再支持的 net.hostname 查询 net.hostname 系统属性会生成 null 结果。
来自 send(DatagramPacket) 的新例外情况 如果之前执行的 connect(InetAddress, int) 方法失败,send(DatagramPacket) 方法会抛出 SocketException 行为变更:网络和 HTTP(S) 连接
AbstractCollection 方法中的正确 NullPointerException 现在,AbstractCollection.removeAll(null)AbstractCollection.retainAll(null) 会始终抛出 NullPointerException;以前,当集合为空时不会抛出 NullPointerException。此更改使行为与文档一致。 行为变更:集合处理
Currency.getDisplayName(null) 中的适当 NullPointerException 调用 Currency.getDisplayName(null) 会抛出 NullPointerException 行为变更:语言区域和国际化

如需查看 Android 8.0(API 级别 26)中的更详尽行为变更列表,另请参阅 Android 8.0 行为变更

更新您的目标版本并使用 Android 8.0 功能

本部分说明了如何通过将 targetSdkVersion 更新为 26 并增加 Android 8.0 中提供的新功能来实现对 Android 8.0(API 级别 26)的全面支持。

除了提供新 API 之外,在您将 targetSdkVersion 更新到 26 时,Android 8.0 还引入了一些行为变更。由于某些行为变更可能需要更改代码以避免服务中断,因此您应该先查看以 Android 8.0 为目标平台的应用的所有行为变更,了解更改 targetSdkVersion 后应用会受到哪些影响。

注意:上述旨在确保平台兼容性的步骤是将应用以 Android 8.0 为目标平台的先决条件,因此请您务必先完成这些步骤。

逐步更新目标版本并使用 Android 8.0 功能

获取 Android 8.0 SDK

您可以获取 SDK 软件包,以使用最新版 Android Studio(建议使用 Android Studio 3.0+)在 Android 8.0(API 级别 26)中构建应用。 Android Studio 3.0 及更高版本包含一些可帮助您实现 Android 8.0 功能的工具,例如自适应图标可下载字体。 如果您尚不需要这些功能,则可以使用稳定版 Android Studio 2.3.3 构建搭载 Android 8.0 的应用,并使用新的 API。

如需设置任一版本的 Android Studio,请按以下步骤操作:

  1. 启动 Android Studio,然后依次点击 Tools > SDK Manager 打开 SDK 管理器。
  2. SDK Platforms 标签页中,勾选 Show Package Details。在 Android 8.0 Preview 下,检查以下内容:
    • Android SDK 平台 26
    • Google APIs Intel x86 Atom System Image(仅模拟器需要)
  3. 切换到 SDK Tools 标签页,然后勾选所有有可用更新的项(点击每个显示为短划线 的复选框)。这其中应包含以下所需项的最新版本:
    • Android SDK Build-Tools 26.0.0
    • Android SDK Platform-Tools 26.0.0
    • Android 模拟器 26.0.0
  4. 点击 OK 安装所有选定的 SDK 软件包。

现在,您可以开始使用 Android 8.0 构建应用了。

更新构建配置

compileSdkVersiontargetSdkVersion 和支持库版本更新到最新的可用修订版本,例如:

android {
  compileSdkVersion 26

  defaultConfig {
    targetSdkVersion 26
  }
  ...
}

dependencies {
  compile 'com.android.support:appcompat-v7:26.0.0'
}

// REQUIRED: Google's new Maven repo is required for the latest
// support library that is compatible with Android 8.0
repositories {
    google()

    // If you're using a version of Gradle lower than 4.1, you must instead use:
    // maven {
    //     url 'https://maven.google.com'
    // }
}

从清单文件中移除广播接收器

由于 Android 8.0(API 级别 26)引入了对广播接收器的新限制,因此您应该移除为隐式广播 intent 注册的任何广播接收器。将它们留在原位不会在构建时或运行时破坏您的应用,但当应用在 Android 8.0 上运行时,它们不会产生任何影响。

只有您的应用可以响应的广播(显式广播 intent 和专门发送到您应用的软件包名称的广播)在 Android 8.0 上继续以相同方式工作。

这项新限制存在例外情况。如需查看在以 Android 8.0 为目标平台的应用中仍然适用的隐式广播的列表,请参阅隐式广播例外情况

测试 Android 8.0 应用

完成上述准备工作后,您就可以构建应用,然后进一步对其进行测试,以确保它可以在以 Android 8.0(API 级别 26)为目标平台时正常运行。这时有必要再次回顾一下核心应用质量指南测试最佳实践

如果您在构建应用时将 targetSdkVersion 设置为 26,应该注意特定的平台变更。即使您不实现 Android 8.0 中的新功能,其中一些变更也可能会严重影响应用的行为,甚至彻底破坏您的应用。

表 2 列出了这些变化以及可获得更多信息的链接。

表 2.targetSdkVersion 设置为 26 时影响应用的关键变更。

更改 总结 其他参考资料
隐私权 Android 8.0(API 级别 26)不支持使用 net.dns1、net.dns2、net.dns3 或 net.dns4 系统属性。 行为变更:隐私权
已强制执行可写且可执行的代码段 对于原生库,Android 8.0(API 级别 26)强制执行以下规则:数据不应可执行,代码不应可写入。 行为变更:原生库
ELF 标头和部分验证 动态链接器会检查 ELF 标头和节标头中的更多值,如果值无效,则会失败。 行为变更:原生库
通知 以 Android 8.0(API 级别 26)SDK 版本为目标平台的应用必须实现一个或多个通知渠道,才能向用户发布通知。 API 概览:通知
List.sort() 方法 此方法的实现不能再调用 Collections.sort(),或者您的应用会因堆栈溢出而抛出异常。 行为变更:集合处理
Collections.sort() 方法 在 List 实现中,Collections.sort() 现在会抛出 ConcurrentModificationException 行为变更:集合处理

如需查看 Android 8.0(API 级别 26)中的更详尽行为变更列表,请参阅 Android 8.0 行为变更

如需了解 Android 8.0(API 级别 26)提供的新功能和 API,请参阅 Android 8.0 功能和 API