基于块的 OTA

您可以为运行 Android 5.0 的新设备启用基于块的无线下载 (OTA) 更新。OTA 是 OEM 远程更新设备系统分区的机制

  • Android 5.0 及更高版本使用块 OTA 更新,以确保每个设备都使用完全相同的分区。块 OTA 不是比较单个文件和计算二进制补丁,而是将整个分区作为一个文件处理并计算单个二进制补丁,从而确保生成的分区包含完全相同的位。这使得设备系统映像可以通过 fastboot 或 OTA 达到相同的状态。
  • Android 4.4 及更早版本使用文件 OTA 更新,这确保了设备包含类似的文件内容、权限和模式,但允许元数据(例如时间戳和底层存储的布局)因设备而异,具体取决于更新方法。

由于块 OTA 确保每个设备都使用相同的分区,因此可以使用 dm-verity 对系统分区进行加密签名。有关 dm-verity 的详细信息,请参阅已验证启动

注意: 在使用 dm-verity 之前,您必须有一个可用的块 OTA 系统。

建议

对于搭载 Android 5.0 或更高版本推出的设备,请在出厂 ROM 中使用块 OTA 更新。要为后续更新生成基于块的 OTA,请将 --block 选项传递给 ota_from_target_files

对于搭载 Android 4.4 或更早版本推出的设备,请使用文件 OTA 更新。虽然可以通过发送 Android 5.0 或更高版本的完整块 OTA 来过渡设备,但这需要发送完整 OTA,其大小明显大于增量 OTA(因此不建议这样做)。

由于 dm-verity 需要引导加载程序支持,而这种支持仅在新推出的搭载 Android 5.0 或更高版本的设备中才有,因此您无法为现有设备启用 dm-verity。

从事 Android OTA 系统(恢复映像和生成 OTA 的脚本)开发的开发者可以通过订阅 android-ota@googlegroups.com 邮件列表来了解最新变化。

文件 OTA 与块 OTA

在基于文件的 OTA 期间,Android 尝试在文件系统层(逐个文件)更改系统分区的内容。更新不保证以一致的顺序写入文件、具有一致的上次修改时间或超级块,甚至不保证将块放置在块设备上的相同位置。因此,基于文件的 OTA 在启用 dm-verity 的设备上会失败;在 OTA 尝试后,设备不会启动。

在基于块的 OTA 期间,Android 会向设备提供两个块映像之间的差异(而不是两组文件)。更新在块级别(文件系统下方)针对相应的构建服务器检查设备版本,使用以下方法之一

  • 完整更新。复制完整系统映像很简单,并且使补丁生成变得容易,但也生成了大型映像,这会使应用补丁的成本很高。
  • 增量更新。使用二进制差异工具生成较小的映像并使补丁应用变得容易,但在生成补丁本身时会占用大量内存。

注意: adb fastboot 在设备上放置的位与完整 OTA 完全相同,因此刷写与块 OTA 兼容。

更新未修改的系统

对于运行 Android 5.0 的具有未修改系统分区的设备,块 OTA 的下载和安装过程与文件 OTA 保持相同。但是,OTA 更新本身可能包含以下一个或多个差异

  • 下载大小.

    完整块 OTA 更新的大小与完整文件 OTA 更新的大小大致相同,增量更新可能只大几个兆字节。

    comparison of OTA sizes

    图 1. 比较 Android 5.0 和 Android 5.1 版本之间 Nexus 6 的 OTA 大小(目标版本更改各不相同)

    通常,由于以下原因,增量块 OTA 更新大于增量文件 OTA 更新

    • 数据保留。与基于文件的 OTA 相比,基于块的 OTA 保留更多数据(文件元数据、dm-verity 数据、ext4 布局等)。
    • 计算算法差异。在文件 OTA 更新中,如果文件路径在两个版本中都相同,则 OTA 软件包不包含该文件的数据。在块 OTA 更新中,确定文件中几乎没有更改或没有更改取决于补丁计算算法的质量以及源系统和目标系统中文件数据的布局。
  • 对闪存和 RAM 故障的敏感性。如果文件已损坏,则只要文件 OTA 不接触已损坏的文件,文件 OTA 就会成功,但如果块 OTA 检测到系统分区上的任何损坏,则块 OTA 就会失败。

更新已修改的系统

对于运行 Android 5.0 的具有已修改系统分区的设备

  • 增量块 OTA 更新失败。系统分区可能会在 adb remount 期间或由于恶意软件而修改。文件 OTA 可以容忍对分区的一些更改,例如添加不属于源版本或目标版本的文件。但是,块 OTA 不能容忍向分区添加内容,因此用户需要安装完整 OTA 以覆盖任何系统分区修改)或刷写新的系统映像以启用未来的 OTA。
  • 尝试更改已修改的文件会导致更新失败。对于文件 OTA 和块 OTA 更新,如果 OTA 尝试更改已修改的文件,则 OTA 更新将失败。
  • 尝试访问已修改的文件会生成错误(仅限 dm-verity)。对于文件 OTA 和块 OTA 更新,如果启用了 dm-verity 并且 OTA 尝试访问系统文件系统的已修改部分,则 OTA 会生成错误。