您可以使用 ota_from_target_files
工具(在 build/make/tools/releasetools
中提供)为使用 A/B 系统更新 或 非 A/B 系统更新 的设备构建完整和增量 OTA 软件包。该工具将 Android 构建系统生成的 target-files.zip
文件作为输入。
对于运行 Android 11 或更高版本的设备,您可以为具有不同 SKU 的多个设备构建一个 OTA 软件包。为此,需要将目标设备配置为使用动态指纹和更新 OTA 元数据,以在前提条件和后置条件条目中包含设备名称和指纹。
Android 8.0 弃用了非 A/B 设备的基于文件的 OTA 软件包,此类设备必须改为使用 基于块的 OTA 软件包。要生成基于块的 OTA 软件包或运行 Android 7.x 或更低版本的设备,请将 --block
选项传递给 ota_from_target_files
参数。
构建完整更新
完整更新是一个 OTA 包,其中包含设备的整个最终状态(系统、引导和恢复分区)。只要设备能够接收和应用该软件包,无论设备当前处于何种状态,该软件包都可以安装 build。例如,以下命令使用发布工具为 tardis
设备构建 target-files.zip
归档文件。
. build/envsetup.sh && lunch tardis-eng
mkdir dist_output
make dist DIST_DIR=dist_output
make dist
构建一个完整的 OTA 包(在 $OUT
中)。生成的 .zip
文件包含为 tardis
设备构建 OTA 包所需的一切内容。您也可以将 ota_from_target_files
构建为 python 二进制文件并调用它来构建完整包或增量包。
ota_from_target_files dist_output/tardis-target_files.zip ota_update.zip
ota_from_target_files
路径在 $PATH
中设置,生成的 python 二进制文件位于 out/
目录中。
ota_update.zip
现在可以发送到测试设备(所有内容均使用测试密钥签名)。对于用户设备,请生成并使用您自己的私钥,如为发布版本签名 build中所述。
构建增量更新
增量更新是一个 OTA 包,其中包含对设备上已有数据的二进制补丁。包含增量更新的包通常较小,因为它们不需要包含未更改的文件。此外,由于更改的文件通常与其先前版本非常相似,因此该包只需要包含两个文件之间差异的编码。
您只能在具有用于构建软件包的源 build 的设备上安装增量更新包。要构建增量更新,您需要来自先前 build 的 target_files.zip
文件(您要从中更新的文件)以及来自新 build 的 target_files.zip
文件。例如,以下命令使用发布工具为 tardis
设备构建增量更新。
ota_from_target_files -i PREVIOUS-tardis-target_files.zip dist_output/tardis-target_files.zip incremental_ota_update.zip
此 build 与之前的 build 非常相似,并且增量更新包 (incremental_ota_update.zip
) 比相应的完整更新包小得多(大约 1 MB 而不是 60 MB)。
仅将增量包分发到运行与增量包起点完全相同的先前 build 的设备。您必须刷写 PREVIOUS-tardis-target_files.zip
或 PREVIOUS-tardis-img.zip
中的映像(两者均使用 make dist
构建,要使用 fastboot update
刷写),而不是 PRODUCT_OUT
目录下的映像(使用 make
构建,这将使用 fastboot flashall
刷写)。尝试在具有其他 build 的设备上安装增量包会导致安装错误。当安装失败时,设备保持相同的工作状态(运行旧系统);该软件包在接触要更新的文件之前,会验证所有要更新文件的先前状态,因此设备不会处于半升级状态。
为了获得最佳用户体验,每 3–4 个增量更新提供一次完整更新。这有助于用户赶上最新版本,并避免漫长的增量更新安装序列。
为多个 SKU 构建 OTA 包
Android 11 或更高版本支持对具有不同 SKU 的多个设备使用单个 OTA 包。这样做需要配置目标设备以使用动态指纹,并更新 OTA 元数据(使用 OTA 工具)以在前提条件和后置条件条目中包含设备名称和指纹。
关于 SKU
SKU 的格式是组合的build 参数值的变体,并且通常是当前 build_fingerprint
参数的未声明子集。OEM 可以对 SKU 使用任何 CDD 批准的 build 参数组合,同时对这些 SKU 使用单个映像。例如,以下 SKU 有多个变体
SKU = <product><device><modifierA><modifierB><modifierC>
modifierA
是设备级别(例如 Pro、Premium 或 Plus)modifierB
是硬件变体(例如无线电)modifierC
是区域,可以是通用的(例如 NA、EMEA 或 CHN),也可以是特定于国家/地区或语言的(例如 JPN、ENG 或 CHN)
许多 OEM 对多个 SKU 使用单个映像,然后在设备启动后在运行时派生最终产品名称和设备指纹。此过程简化了平台开发过程,使具有细微自定义但产品名称不同的设备可以共享通用映像(例如 tardis
和 tardispro
)。
使用动态指纹
指纹是 build 参数(例如 ro.product.brand
、ro.product.name
和 ro.product.device
)的已定义串联。设备的指纹源自系统分区指纹,并用作设备上运行的映像(和字节)的唯一标识符。要创建动态指纹,请在设备的 build.prop
文件中使用动态逻辑以在设备启动时获取引导加载程序变量的值,然后使用该数据为该设备创建动态指纹。
例如,要对 tardis
和 tardispro
设备使用动态指纹,请更新以下文件,如下所示。
更新
odm/etc/build_std.prop
文件以包含以下行。ro.odm.product.device=tardis
更新
odm/etc/build_pro.prop
文件以包含以下行。ro.odm.product.device=tardispro
更新
odm/etc/build.prop
文件以包含以下行。ro.odm.product.device=tardis import /odm/etc/build_${ro.boot.product.hardware.sku}.prop
这些行根据 ro.boot.product.hardware.sku
引导加载程序属性(只读)的值动态设置设备名称、指纹和 ro.build.fingerprint
值。
更新 OTA 包元数据
OTA 包包含一个元数据文件 (META-INF/com/android/metadata
),用于描述该包,包括 OTA 包的前提条件和后置条件。例如,以下代码是针对 tardis
设备的 OTA 包的元数据文件。
post-build=google/tardis/tardis:11/RP1A.200521.001/6516341:userdebug/dev-keys
post-build-incremental=6516341
post-sdk-level=30
post-security-patch-level=2020-07-05
post-timestamp=1590026334
pre-build=google/tardis/tardis:11/RP1A.200519.002.A1/6515794:userdebug/dev-keys
pre-build-incremental=6515794
pre-device=tardis
pre-device
、pre-build-incremental
和 pre-build
值定义了设备在 OTA 包可以安装之前必须具有的状态。post-build-incremental
和 post-build
值定义了设备在 OTA 包安装后预期具有的状态。pre-
和 post-
字段的值源自以下相应的 build 属性。
pre-device
值源自ro.product.device
build 属性。pre-build-incremental
和post-build-incremental
值源自ro.build.version.incremental
build 属性。pre-build
和post-build
值源自ro.build.fingerprint
build 属性。
在运行 Android 11 或更高版本的设备上,您可以使用 OTA 工具中的 --boot_variable_file
标志来指定文件的路径,该文件包含用于创建设备动态指纹的运行时变量的值。然后,数据用于更新 OTA 元数据,以在 pre-
和 post-
条件中包含设备名称和指纹(使用管道字符 | 作为分隔符)。--boot_variable_file
标志具有以下语法和描述。
- 语法:
--boot_variable_file <path>
- 描述:指定文件的路径,该文件包含
ro.boot.*
属性的可能值。当某些ro.product.*
属性被 import 语句覆盖时,用于计算可能的运行时指纹。该文件期望每行一个属性,其中每行具有以下格式:prop_name=value1,value2
。
例如,当属性为 ro.boot.product.hardware.sku=std,pro
时,tardis
和 tardispro
设备的 OTA 元数据如下所示。
post-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-device=tardis|tardispro
要在运行 Android 10 的设备上支持此功能,请参阅参考实现。此变更列表有条件地解析 build.prop
文件中的 import
语句,这使属性覆盖能够被识别并反映在最终的 OTA 元数据中。