迁移到 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) 播放器),请按照 说明 刷写设备
  • 或者下载适用于 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. 影响所有应用的主要变更 在 Android 8.0 设备上运行。

更改 摘要 其他参考
后台位置更新频率下降 如果您的应用从后台服务接收位置信息更新,则接收频率降低 Android 8.0(API 级别 26)上的更新(与旧版本 Android 相比)。具体来说就是, 服务接收位置更新的次数每小时不能超过几次。不过,虽然您的 应用在前台运行时,位置信息更新频率保持不变。 <ph type="x-smartling-placeholder"></ph> 后台位置信息限制
不再支持net.hostname 查询 net.hostname 系统属性会生成 null 结果。
来自 send(DatagramPacket) 的新例外情况 send(DatagramPacket) 方法会抛出 SocketException 如果之前执行的 connect(InetAddress, int) 方法失败。 <ph type="x-smartling-placeholder"></ph> 行为变更:网络和 HTTP(S) 连接
以下时段的适当NullPointerExceptionAbstractCollection 方法 AbstractCollection.removeAll(null)AbstractCollection.retainAll(null) 现在始终抛出 NullPointerException; 之前,当集合为空时不会抛出 NullPointerException。 此更改使行为与文档保持一致。 <ph type="x-smartling-placeholder"></ph> 行为变更:集合的处理
以下时段的适当NullPointerExceptionCurrency.getDisplayName(null) 正在呼叫Currency.getDisplayName(null) 会抛出 NullPointerException <ph type="x-smartling-placeholder"></ph> 行为变更:语言区域和国际化

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

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

本部分介绍如何实现对 Android 8.0 的全面支持 (API 级别 26)- 通过将 targetSdkVersion 更新为 26 以及如何添加 Android 8.0 中提供的新功能

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

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

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

获取 Android 8.0 SDK

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

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

  1. 启动 Android Studio,并依次点击 工具 >SDK 管理器
  2. SDK Platforms 标签页中,选中 Show Package Details。低于 Android 8.0 预览版会检查以下内容: <ph type="x-smartling-placeholder">
      </ph>
    • Android SDK 平台 26
    • Google API Intel x86 Atom 系统映像 (仅模拟器需要)
  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() 方法 在列表实现中,Collections.sort() 现在会抛出 ConcurrentModificationException 行为 变更:集合处理

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

要探索 Android 8.0(API 级别 26)提供的新功能和 API,请参阅 Android 8.0 功能和 API