lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

向 Android 8.0 迁移应用

Android 8.0 引入了若干新的功能和 API,并加入了即便您未对应用做任何更改仍可能对其行为产生影响的一些变动。为帮助您做好准备,本页面将说明如何执行兼容性测试,以及如何更新应用以便利用 Android 8.0 的新功能:

  1. 确保平台兼容性

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

  2. 使用 Android 8.0 SDK 构建应用

    当您准备好利用平台的新功能时,将 targetSdkVersion 更新至“O”,验证应用是否仍可按预期方式运行,然后开始使用新的 API。

确保平台兼容性

这一步的目标是确保应用在 Android 8.0 上可照常运行。由于一些平台变化可能影响应用的行为方式,因此可能需要进行一些调整,但您不需要使用新的 API 或更改 targetSdkVersion

准备一台运行 Android 8.0 的设备

  • 如果您有一台兼容设备(Pixel、Pixel XL、Pixel C、Nexus 5X、Nexus 6P 或 Nexus Player),请从下载页面获得适合您的设备的 Android 8.0 系统映像,然后按照说明将映像刷入设备
  • 或下载适用于 Android Emulator 的 Android 8.0 系统映像。它列于 SDK 管理器Android 8.0 Preview 下,显示为 Google APIs Intel x86 Atom System Image

    :Android 8.0 系统映像只能通过 Android Studio 3.0 Canary 下载。如需了解详细信息,请参阅下面一节以获取 Android 8.0 SDK

执行兼容性测试

与 Android 8.0 的兼容性测试多半与您准备发布应用时执行的测试属于同一类型。这时有必要回顾一下核心应用质量准则测试最佳做法

不过,测试还有另一个层面:Android 8.0 向 Android 平台引入了一些变化,即便不对 targetSdkVersion 做任何变动,仍可能影响应用的行为或令其根本无法运行。因此,您必须回顾表 1 中的关键变化,并对任何为适应这些变化而实现的修复进行测试。

表 1. 对运行在 Android 8.0 设备上的所有应用都有影响的关键变化。

变化 摘要 其他参考资料
后台位置更新频率下降 如果应用接收来自后台服务的位置更新,则其在 Android 8.0 上接收更新的频率要比旧版本 Android 低。具体地讲,后台服务接收位置更新的频率不能超过每小时几次。不过,当应用位于前台时,位置更新频率不变。 后台位置限制
不再支持 net.hostname 查询 net.hostname 系统属性返回的结果为空。
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 行为变更列表,另请参阅 Android 8.0 行为变更

构建具有 Android 8.0 功能的应用

如表 2 所述,除了提供新的 API 外,Android 8.0 还会在您更新 targetSdkVersion 时引发其他行为变更。本节说明如何将开发环境设置为以新平台为目标,以及如何着手构建和测试 Android 8.0 API 带来的变化和新功能。

:上述旨在确保平台兼容性的步骤是面向 Android 8.0 构建应用的先决条件,因此请您务必先完成这些步骤。

获取 Android 8.0 SDK

  1. 安装 Android Studio 3.0 Canary

    只有 Android Studio 3.0 包含对 Android 8.0 提供的所有新开发者功能的支持。因此您需要获得 Android Studio 3.0 Canary 版本,以便开始使用 Android 8.0 SDK。但您仍可保留已安装的 Android Studio 稳定版。

  2. 启动 Android Studio 3.0,然后点击 Tools > Android > SDK Manager 打开 SDK 管理器。
  3. SDK Platforms 标签中,选中 Show Package Details。在 Android 8.0 Preview 下选中下列项:
    • Android SDK Platform O
    • Google APIs Intel x86 Atom System Image(只需在使用模拟器时选中)
  4. 切换到 SDK Tools 标签,选中所有已提供更新的项(点击每个显示破折号 的复选框)。这应该包括下列必需项:
    • Android SDK Build-Tools 26.0.0(rc2 或更高版本)
    • Android SDK Platform-Tools 26.0.0(rc2 或更高版本)
    • Android Emulator 26.0.0
    • Support Repository
  5. 点击 OK 安装所有选定的 SDK 软件包。

现在您就可以开始使用 Android 8.0 进行开发了。

更新构建配置

compileSdkVersionbuildToolsVersiontargetSdkVersion 和 Support Library 版本更新为下列版本:

android {
  compileSdkVersion 'android-O'
  buildToolsVersion '26.0.0-rc2'

  defaultConfig {
    targetSdkVersion 'O'
  }
  ...
}

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

// REQUIRED: Google's new Maven repo is required for the latest
// support library that is compatible with Android 8.0
repositories {
    maven {
        url 'https://maven.google.com'
    }
}

您不能在此配置下发布应用。“O”版本是一个临时 API 级别,只能用于 Android 8.0 期间的开发和测试。您必须等到最终 API 级别发布时再发布 Android 8.0 变更,届时再次更新配置。

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

由于 Android 8.0 引入了新的广播接收器限制,因此您应该移除所有为隐式广播 Intent 注册的广播接收器。将它们留在原位并不会在构建时或运行时令应用失效,但当应用运行在 Android 8.0 上时它们不起任何作用。

显式广播 Intent(只有您的应用可以响应的 Intent)在 Android 8.0 上仍以相同方式工作。

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

测试 Android 8.0 应用

完成以上准备工作后,您就可以构建应用,然后对其做进一步测试,以确保 Android 8.0 为目标平台时它能正常工作。这时有必要回顾一下核心应用质量准则测试最佳做法

如果您构建应用时设置了适用于 Android 8.0 的 targetSdkVersion,应该注意特定的平台变化。即便您不实现 Android 8.0 中的新功能,其中的一些变化仍可能严重影响应用的行为或令其根本无法运行。

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

表 2. targetSdkVersion 设置为“O”时影响应用的关键变化。

变化 摘要 其他参考资料
隐私性 Android 8.0 不支持使用 net.dns1、net.dns2、net.dns3 或 net.dns4 系统属性。 行为变更:隐私性
实行了可写且可执行的代码段 对于原生库,Android 8.0 实行的规则是:数据不应可执行,代码不应可写。 行为变更:原生库
ELF 标头和节验证 动态链接器对 ELF 标头和节头中的更多值进行检查,如果值无效则失败。 行为变更:原生库
通知 以 SDK 的 Android 8.0 版本为目标平台的应用必须实现一个或多个通知渠道,以便向用户发布通知。 API 概览:通知
List.sort() 方法 该方法的实现不得再调用 Collections.sort(),否则应用将因堆栈溢出而引发异常。 行为变更:集合的处理
Collections.sort() 方法 在列表实现中,Collections.sort() 现在会引发 ConcurrentModificationException 行为变更:集合的处理

如需查看更详尽的 Android 8.0 行为变更列表,请参阅 Android 8.0 行为变更

要想探究 Android 8.0 提供的新功能和新 API,请参阅 Android 8.0 功能和 API