Dynamic System Updates:修订间差异

来自Uotan Wiki · 刷机百科
(首次创建)
 
无编辑摘要
 
第23行: 第23行:
   openssl genrsa -out oem_cert_pri.pem 2048
   openssl genrsa -out oem_cert_pri.pem 2048
   openssl rsa -in oem_cert_pri.pem -pubout -out oem_cert_pub.pem
   openssl rsa -in oem_cert_pri.pem -pubout -out oem_cert_pub.pem
私钥可能无法访问,并且只保存在[[wikipedia:Hardware_security_module|硬件安全模块 (HSM)]] 中。在这种情况下,密钥生成后可能会提供 x509 公钥证书。如需了解如何通过 x509 证书生成 AVB 公钥,请参阅将配对公钥添加到 ramdisk 部分。
私钥可能无法访问,并且只保存在[[wikipedia:Hardware_security_module|硬件安全模块 (HSM)]] 中。在这种情况下,密钥生成后可能会提供 x509 公钥证书。如需了解如何通过 x509 证书生成 AVB 公钥,请参阅将[[Dynamic System Updates#将配对公钥添加到 ramdisk|配对公钥添加到 ramdisk]] 部分。


如需将 x509 证书转换为 PEM 格式,请运行以下命令:
如需将 x509 证书转换为 PEM 格式,请运行以下命令:

2024年8月6日 (二) 13:51的最新版本

Dynamic System Updates(DSU)是谷歌在Android 10中引入的一项创新功能。它允许用户在设备上加载和运行新的Android系统映像,作为当前操作系统的替代,而无需擦除现有系统。这意味着用户可以轻松地尝试下一个Android版本或测试不同的Android体验,而不会破坏他们现有系统。

DSU的功能和优势:

  • 无需擦除现有系统: DSU允许用户加载新的Android系统映像,而不会擦除当前的操作系统和数据。这种无缝切换的能力使得用户可以灵活地管理和测试不同版本的Android系统。
  • 灵活性和便捷性: 用户可以根据需要随时启用或禁用DSU功能。这为开发者、测试人员和普通用户提供了便利,他们可以在不影响现有配置的情况下,尝试和评估新的Android版本或功能。
  • 安全性保障: DSU依赖于device-mapper-verity(dm-verity)内核功能来验证新加载的Android系统映像。这种安全性措施确保系统映像的完整性和安全性,防止恶意软件或损坏的系统映像被加载和运行。

DSU的实现要求:

  • 为了启用DSU功能,系统必须配置以下内核选项:
 CONFIG_DM_VERITY=y
 CONFIG_DM_VERITY_FEC=y
  • Google为了存储与已安装DSU镜像相关的数据需要使用 metadata 分区,这要求机器必须为动态分区(Dynamic Partition)

DSU 流程

本部分介绍如何执行多个 DSU 配置流程。

生成新的密钥对

使用 openssl 命令生成 .pem 格式的 RSA 私钥/公钥对(例如,大小为 2048 位):

 openssl genrsa -out oem_cert_pri.pem 2048
 openssl rsa -in oem_cert_pri.pem -pubout -out oem_cert_pub.pem

私钥可能无法访问,并且只保存在硬件安全模块 (HSM) 中。在这种情况下,密钥生成后可能会提供 x509 公钥证书。如需了解如何通过 x509 证书生成 AVB 公钥,请参阅将配对公钥添加到 ramdisk 部分。

如需将 x509 证书转换为 PEM 格式,请运行以下命令:

openssl x509 -pubkey -noout -in oem_cert_pub.x509.pem > oem_cert_pub.pem

将配对公钥添加到 ramdisk

oem_cert.avbpubkey 必须放在 /avb/*.avbpubkey 下,以验证已签名的 DSU 软件包。首先,将 PEM 格式的公钥转换为 AVB 公钥格式:

avbtool extract_public_key --key oem_cert_pub.pem --output oem_cert.avbpubkey

然后,按照以下步骤在第一阶段 ramdisk 中添加公钥。

  • 1. 添加一个预构建模块以复制 avbpubkey。例如,使用如下内容可添加 device/<company>/<board>/oem_cert.avbpubkeydevice/<company>/<board>/avb/Android.mk
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := oem_cert.avbpubkey
 LOCAL_MODULE_CLASS := ETC
 LOCAL_SRC_FILES := $(LOCAL_MODULE)
 ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
 LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/first_stage_ramdisk/avb
 else
 LOCAL_MODULE_PATH := $(TARGET_RAMDISK_OUT)/avb
 endif
 
 include $(BUILD_PREBUILT)
  • 2. 让 droidcore 目标依赖于添加的 oem_cert.avbpubkey

droidcore: oem_cert.avbpubkey

在 JSON 描述符中生成 AVB 公钥属性

oem_cert.avbpubkey 采用 AVB 公钥二进制格式。在将它放入 JSON 描述符之前,使用 SHA-1 使其可读。

 sha1sum oem_cert.avbpubkey | cut -f1 -d ' '
 3e62f2be9d9d813ef5........866ac72a51fd20

以下将是 JSON 描述符的 pubkey 属性的内容。

    "images":[
      {
         ...
         "pubkey":"3e62f2be9d9d813ef5........866ac72a51fd20",
         ...
      },

对 DSU 软件包进行签名

使用下列方法之一对 DSU 软件包进行签名:

  • 方法 1:重复使用通过原始 AVB 签名流程创建的工件创建 DSU 软件包。一种替代方式是从发布软件包中提取已签名的映像,并使用提取的映像直接创建 ZIP 文件。
  • 方法 2:在私钥可用时使用以下命令对 DSU 分区进行签名。DSU 软件包(ZIP 文件)中的每个 img 均会单独签名:
 key_len=$(openssl rsa -in oem_cert_pri.pem -text | grep Private-Key | sed -e 's/.*(\(.*\) bit.*/\1/')
 for partition in system product; do
   avbtool add_hashtree_footer \
       --image ${OUT}/${partition}.img \
       --partition_name ${partition} \
       --algorithm SHA256_RSA${key_len} \
       --key oem_cert_pri.pem
 done

如需详细了解如何使用 avbtool 添加 add_hashtree_footer,请参阅使用 avbtool

在本地验证 DSU 软件包

建议您使用以下命令对照配对公钥验证所有本地映像:

 for partition in system product; do
     avbtool verify_image --image ${OUT}/${partition}.img  --key oem_cert_pub.pem
 done

预期的输出如下所示:

Verifying image dsu/system.img using key at oem_cert_pub.pem
vbmeta: Successfully verified footer and SHA256_RSA2048 vbmeta struct in dsu/system.img
: Successfully verified sha1 hashtree of dsu/system.img for image of 898494464 bytes

Verifying image dsu/product.img using key at oem_cert_pub.pem
vbmeta: Successfully verified footer and SHA256_RSA2048 vbmeta struct in dsu/product.img
: Successfully verified sha1 hashtree of dsu/product.img for image of 905830400 bytes

创建 DSU 软件包

以下示例将展示如何创建一个包含 system.imgproduct.img 的 DSU 软件包:

dsu.zip {
    - system.img
    - product.img
}

在两个映像均已签名后,使用以下命令创建 ZIP 文件:

 mkdir -p dsu
 cp ${OUT}/system.img dsu
 cp ${OUT}/product.img dsu
 cd dsu && zip ../dsu.zip *.img && cd -

自定义一键式 DSU

默认情况下,DSU 加载器指向 GSI 映像的元数据,即 https://...google.com/.../gsi-src.json

OEM 可以通过定义指向其 JSON 描述符的 persist.sys.fflag.override.settings_dynamic_system.list 属性来覆盖该列表。例如,OEM 可能会提供包含 GSI 和 OEM 专有映像的 JSON 元数据,如下所示:

{
    "include": ["https://dl.google.com/.../gsi-src.JSON"]
    "images":[
      {
         "name":"OEM image",
         "os_version":"10",
         "cpu_abi": "arm64-v8a",
         "details":"...",
         "vndk":[
            27,
            28,
            29
         ],
         "spl":"...",
         "pubkey":"",
         "uri":"https://.../....zip"
      },
}

OEM 可以链接已发布的 DSU 元数据,如图所示。