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

    注意: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 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 的前提条件,请务必先完成这些步骤。

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

获取 Android 8.0 SDK

您可以使用最新版本的 Android Studio(建议使用 Android Studio 3.0+)获取 SDK 软件包,以使用 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 Manager。
  2. SDK Platforms 标签页中,勾选 Show Package Details。在 Android 8.0 Preview 下方勾选以下项
    • Android SDK Platform 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 Emulator 26.0.0
  4. 点击 OK 安装所有选定的 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'
    // }
}

从您的 manifest 文件中移除广播接收器

由于 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