打开/关闭搜索
搜索
打开/关闭菜单
通知
打开/关闭个人菜单
查看“Dynamic System Updates”的源代码
来自Uotan Wiki · 刷机百科
查看
阅读
查看源代码
查看历史
associated-pages
页面
讨论
更多操作
←
Dynamic System Updates
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
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镜像相关的数据需要使用 <code>metadata</code> 分区,这要求机器必须为动态分区(Dynamic Partition) === DSU 流程 === 本部分介绍如何执行多个 DSU 配置流程。 ==== 生成新的密钥对 ==== 使用 <code>openssl</code> 命令生成 <code>.pem</code> 格式的 RSA 私钥/公钥对(例如,大小为 2048 位): openssl genrsa -out oem_cert_pri.pem 2048 openssl rsa -in oem_cert_pri.pem -pubout -out oem_cert_pub.pem 私钥可能无法访问,并且只保存在[[wikipedia:Hardware_security_module|硬件安全模块 (HSM)]] 中。在这种情况下,密钥生成后可能会提供 x509 公钥证书。如需了解如何通过 x509 证书生成 AVB 公钥,请参阅将[[Dynamic System Updates#将配对公钥添加到 ramdisk|配对公钥添加到 ramdisk]] 部分。 如需将 x509 证书转换为 PEM 格式,请运行以下命令: <code>openssl x509 -pubkey -noout -in oem_cert_pub.x509.pem > oem_cert_pub.pem</code> ==== 将配对公钥添加到 ramdisk ==== <code>oem_cert.avbpubkey</code> 必须放在 <code>/avb/*.avbpubkey</code> 下,以验证已签名的 DSU 软件包。首先,将 PEM 格式的公钥转换为 AVB 公钥格式: <code>avbtool extract_public_key --key oem_cert_pub.pem --output oem_cert.avbpubkey</code> 然后,按照以下步骤在第一阶段 ramdisk 中添加公钥。 * 1. 添加一个预构建模块以复制 <code>avbpubkey</code>。例如,使用如下内容可添加 <code>device/<company>/<board>/oem_cert.avbpubkey</code> 和 <code>device/<company>/<board>/avb/Android.mk</code>: 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 目标依赖于添加的 <code>oem_cert.avbpubkey</code>: <code>droidcore: oem_cert.avbpubkey</code> ==== 在 JSON 描述符中生成 AVB 公钥属性 ==== <code>oem_cert.avbpubkey</code> 采用 AVB 公钥二进制格式。在将它放入 JSON 描述符之前,使用 SHA-1 使其可读。 sha1sum oem_cert.avbpubkey | cut -f1 -d ' ' 3e62f2be9d9d813ef5........866ac72a51fd20 以下将是 JSON 描述符的 <code>pubkey</code> 属性的内容。 "images":[ { ... "pubkey":"3e62f2be9d9d813ef5........866ac72a51fd20", ... }, ==== 对 DSU 软件包进行签名 ==== 使用下列方法之一对 DSU 软件包进行签名: * '''方法 1:重复使用通过原始 AVB 签名流程创建的工件创建 DSU 软件包。一种替代方式是从发布软件包中提取已签名的映像,并使用提取的映像直接创建 ZIP 文件。''' * '''方法 2:在私钥可用时使用以下命令对 DSU 分区进行签名。DSU 软件包(ZIP 文件)中的每个 <code>img</code> 均会单独签名:''' 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 如需详细了解如何使用 <code>avbtool</code> 添加 <code>add_hashtree_footer</code>,请参阅使用 [https://android.googlesource.com/platform/external/avb/#using-avbtool 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 软件包 ==== 以下示例将展示如何创建一个包含 <code>system.img</code> 和 <code>product.img</code> 的 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 映像的元数据,即 <code><nowiki>https://...google.com/.../gsi-src.json</nowiki></code>。 OEM 可以通过定义指向其 JSON 描述符的 <code>persist.sys.fflag.override.settings_dynamic_system.list</code> 属性来覆盖该列表。例如,OEM 可能会提供包含 GSI 和 OEM 专有映像的 JSON 元数据,如下所示: { "include": ["<nowiki>https://dl.google.com/.../gsi-src.JSON</nowiki>"] "images":[ { "name":"OEM image", "os_version":"10", "cpu_abi": "arm64-v8a", "details":"...", "vndk":[ 27, 28, 29 ], "spl":"...", "pubkey":"", "uri":"<nowiki>https://.../....zip</nowiki>" }, } OEM 可以链接已发布的 DSU 元数据,如图所示。 [[文件:Dsu-metadata-chaining.png|缩略图]]
返回
Dynamic System Updates
。