迁移到 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

Ensure compatibility with Android 8.0 step-by-step

准备运行 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 系统映像**。

    **注意:**Android 8.0 系统映像可从 Android Studio 3.0 及更高版本下载。有关更多信息,请参阅以下部分以 获取 Android 8.0 SDK

执行兼容性测试

在大多数情况下,与 Android 8.0(API 级别 26)的兼容性测试与您准备发布应用时执行的测试类型相同。现在是时候回顾一下 核心应用质量指南测试最佳实践 了。

但是,测试还有另一个方面:Android 8.0 对 Android 平台进行了更改,即使您不更改 targetSdkVersion,这些更改也可能会影响您的应用的行为或导致应用完全崩溃。因此,务必查看表 1 中的关键更改,并测试您为适应这些更改而实施的任何修复。

表 1. 影响在 Android 8.0 设备上运行的所有应用的关键更改。

更改 摘要 更多参考
较不频繁的后台位置更新 如果您的应用从后台服务接收位置更新,与旧版 Android 相比,它在 Android 8.0(API 级别 26)上接收到的更新频率较低。具体而言,后台服务每小时最多只能接收几次位置更新。但是,当您的应用处于前台时,位置更新的速率保持不变。 后台位置限制
net.hostname 不再受支持查询 net.hostname 系统属性会产生空结果。
来自 send(DatagramPacket) 的新异常 如果先前执行的 connect(InetAddress, int) 方法失败,则 send(DatagramPacket) 方法会抛出 SocketException 行为变更:网络和 HTTP(S) 连接
来自 NullPointerException 的正确 AbstractCollection 方法 现在 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 外,Android 8.0 在您将 targetSdkVersion 更新到 26 时还会引入一些行为变更。由于某些行为变更可能需要更改代码才能避免中断,因此,在更改 targetSdkVersion 时,您应首先了解您的应用可能会受到哪些影响,方法是查看所有 针对 Android 8.0 的应用的行为变更

注意:上述 确保平台兼容性 的步骤是将您的应用定位到 Android 8.0 的前提条件,因此请确保您首先完成这些步骤。

Update target version and use Android 8.0 features step-by-step

获取 Android 8.0 SDK

您可以使用最新版本的 Android Studio(推荐使用 Android Studio 3.0 或更高版本)获取用于使用 Android 8.0(API 级别 26)构建应用的 SDK 软件包。Android Studio 3.0 及更高版本包含可帮助您使用 Android 8.0 功能(例如 自适应图标可下载字体)的工具。如果您暂时不需要这些功能,则可以使用 Android Studio 2.3.3 稳定版来使用 Android 8.0 构建您的应用并使用新的 API。

要设置任一版本的 Android Studio,请按照以下步骤操作

  1. 启动 Android Studio,然后单击工具 > SDK 管理器打开 SDK 管理器。
  2. SDK 平台选项卡中,选中显示软件包详情。在Android 8.0 预览版下方,选中以下内容
    • Android SDK 平台 26
    • Google APIs Intel x86 Atom 系统映像(仅模拟器需要)
  3. 切换到SDK 工具选项卡,然后选中所有显示有可用更新的项目(单击显示短横线 的每个复选框)。这应包括以下必需项目的最新版本
    • Android SDK Build-Tools 26.0.0
    • Android SDK Platform-Tools 26.0.0
    • Android 模拟器 26.0.0
  4. 单击确定安装所有选定的 SDK 软件包。

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

更新您的构建配置

compileSdkVersiontargetSdkVersion 和 Support Library 版本更新到最新的可用版本,例如

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)引入了对广播接收器的新的 限制,因此您应移除为隐式广播意图注册的任何广播接收器。保留它们不会在构建时或运行时中断您的应用,但在您的应用在 Android 8.0 上运行时,它们无效。

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

此新限制有一些例外情况。有关在针对 Android 8.0 的应用中仍然有效的隐式广播的列表,请参阅 隐式广播例外情况

测试您的 Android 8.0 应用

完成上述准备工作后,您可以构建您的应用,然后进一步测试它,以确保它在面向 Android 8.0(API 级别 26)时能够正常工作。这是再次查看 核心应用质量指南测试最佳实践 的好时机。

当您使用设置为 26 的 targetSdkVersion 构建应用时,您应该了解一些具体的平台更改。即使您没有在 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