Google 致力于为黑人社区推动种族平等。查看具体举措

动态系统更新

借助动态系统更新 (DSU),您能够制作 Android 系统映像,供用户从互联网下载并试用,而不会出现损坏当前系统映像的风险。本文档介绍了如何支持 DSU。

内核要求

如需了解内核要求,请参阅实现动态分区

此外,DSU 依靠 device-mapper-verity (dm-verity) 内核功能来验证 Android 系统映像。因此,您必须启用以下内核配置:

  • CONFIG_DM_VERITY=y
  • CONFIG_DM_VERITY_FEC=y

分区要求

存储与已安装映像相关的数据需要使用 metadata 分区(16 MB 或更大)。必须在第一阶段装载期间装载该分区。

userdata 分区必须使用 f2fs 或 ext4 文件系统。使用 f2fs 时,请纳入 Android 通用内核中提供的所有 f2fs 相关补丁程序。

DSU 是用通用内核 4.9 进行开发和测试的。建议使用内核 4.9 及更高版本来实现此功能。

供应商 HAL 行为

Weaver HAL

Weaver HAL 提供固定数量的槽来存储用户密钥。DSU 使用两个额外的密钥槽。如果 OEM 具有 Weaver HAL,则需要有足够的槽来存储通用系统映像 (GSI) 和主机映像。

Gatekeeper HAL

Gatekeeper HAL 需要支持较大的 USER_ID 值,因为 GSI 使 UID 偏移 1000000 到 HAL。

验证启动

ramdisk 中必须包含三个 GSI 密钥:Q-GSI、R-GSI 和 S-GSI。因此,设备可以使用 DSU 或修改 fstab 设置来验证包含这些密钥的 GSI 映像。

要包含 GSI 密钥,请将下面这行代码添加到文件 device/<device_name>/device.mk 中:

$(call inherit-product, $(SRC_TARGET_DIR)/product/gsi_keys.mk)

回滚保护

使用 DSU 时,下载的 Android 系统映像必须比设备上的当前系统映像新。具体方法是比较两个系统映像的 Android 启动时验证 (AVB) AVB 属性描述符中的安全补丁程序级别:Prop: com.android.build.system.security_patch -> '2019-04-05'

对于没有使用 AVB 的设备,将当前系统映像的安全补丁程序级别放入引导加载程序内核 cmdline 中:androidboot.system.security_patch=2019-04-05

硬件要求

启动 DSU 实例时,系统会分配两个临时文件:

  • 存储 GSI.img 的逻辑分区 (1~1.5 G)
  • 一个 8 GB 的空 /data 分区,作为运行 GSI 的沙盒

我们建议在启动 DSU 实例之前保留至少 10 GB 的可用空间。DSU 还支持从 SD 卡分配。当存在 SD 卡时,它具有最高的分配优先级。SD 卡支持对于可能没有足够内部存储空间的低功耗设备至关重要。当存在 SD 卡时,请确保未合并该卡。DSU 不支持合并的 SD 卡。

可用的前端

您可以使用 adb 或使用应用启动 DSU。

使用 adb 启动 DSU

要使用 adb 启动 DSU,请输入以下命令:

$>simg2img out/target/product/.../system.img system.raw
$>gzip -c system.raw > system.raw.gz
$>adb push system.raw.gz /storage/emulated/0/Download
$>adb shell am start-activity \
-n com.android.dynsystem/com.android.dynsystem.VerificationActivity  \
-a android.os.image.action.START_INSTALL    \
-d file:///storage/emulated/0/Download/system.raw.gz  \
--el KEY_SYSTEM_SIZE $(du -b system.raw|cut -f1)  \
--el KEY_USERDATA_SIZE 8589934592

使用应用启动 DSU

DSU 的主要入口点是 android.os.image.DynamicSystemClient.java API:

public class DynamicSystemClient {

...
...

     /**
     * Start installing DynamicSystem from URL with default userdata size.
     *
     * @param systemUrl A network URL or a file URL to system image.
     * @param systemSize size of system image.
     */
    public void start(String systemUrl, long systemSize) {
        start(systemUrl, systemSize, DEFAULT_USERDATA_SIZE);
    }

您必须在设备上捆绑/预安装此应用。由于 DynamicSystemClient 是系统 API,因此您无法使用常规 SDK API 编译该应用,也无法将其发布到 Play 商店。此应用的目的如下:

  1. 使用供应商定义的方案获取映像列表和相应的网址。
  2. 将列表中的映像与设备进行匹配,并显示兼容的映像供用户选择。
  3. 调用 DynamicSystemClient.start,如下所示:

    DynamicSystemClient aot = new DynamicSystemClient(...)
       aot.start(
            ...URL of the selected image...,
            ...uncompressed size of the selected image...);
    
    

该网址指向经过 gzip 压缩的非稀疏系统映像文件,您可以使用以下命令编译此文件:

$> simg2img ${OUT}/system.img ${OUT}/system.raw
$> gzip ${OUT}/system.raw
$> ls ${OUT}/system.raw.gz

文件名应遵循以下格式:

<android version>.<lunch name>.<user defined title>.raw.gz

例如:

  • o.aosp_taimen-userdebug.2018dev.raw.gz
  • p.aosp_taimen-userdebug.2018dev.raw.gz

功能标记

DSU 功能位于 settings_dynamic_android 功能标记下。在使用 DSU 之前,请确保已启用相应的功能标记。

启用功能标记。

图 1. 启用功能标记

功能标记界面在运行用户编译版本的设备上可能不可用。在这种情况下,请改用 adb 命令:

adb shell setprop persist.sys.fflag.override.settings_dynamic_system 1

GCE 上的供应商主机系统映像(可选)

系统映像的可能存储位置之一是 Google Compute Engine (GCE) 存储分区。发布管理员使用 GCP 存储控制台添加/删除/更改已发布的系统映像。

映像必须可公开访问,如下所示:

在 GCE 中公开访问

图 2. 在 GCE 中公开访问

此处提供了公开某项内容的过程。