<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.uotan.cn/index.php?action=history&amp;feed=atom&amp;title=Dynamic_System_Updates</id>
	<title>Dynamic System Updates - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.uotan.cn/index.php?action=history&amp;feed=atom&amp;title=Dynamic_System_Updates"/>
	<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Dynamic_System_Updates&amp;action=history"/>
	<updated>2026-06-13T20:40:27Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Dynamic_System_Updates&amp;diff=622&amp;oldid=prev</id>
		<title>2024年8月6日 (二) 05:51 SakuraKyuo</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Dynamic_System_Updates&amp;diff=622&amp;oldid=prev"/>
		<updated>2024-08-06T05:51:47Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh-Hans-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2024年8月6日 (二) 13:51的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l23&quot;&gt;第23行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第23行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   openssl genrsa -out oem_cert_pri.pem 2048&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   openssl genrsa -out oem_cert_pri.pem 2048&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   openssl rsa -in oem_cert_pri.pem -pubout -out oem_cert_pub.pem&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   openssl rsa -in oem_cert_pri.pem -pubout -out oem_cert_pub.pem&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;私钥可能无法访问，并且只保存在[[wikipedia:Hardware_security_module|硬件安全模块 (HSM)]] 中。在这种情况下，密钥生成后可能会提供 x509 公钥证书。如需了解如何通过 x509 证书生成 AVB &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;公钥，请参阅将配对公钥添加到 &lt;/del&gt;ramdisk 部分。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;私钥可能无法访问，并且只保存在[[wikipedia:Hardware_security_module|硬件安全模块 (HSM)]] 中。在这种情况下，密钥生成后可能会提供 x509 公钥证书。如需了解如何通过 x509 证书生成 AVB &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;公钥，请参阅将[[Dynamic System Updates#将配对公钥添加到 &lt;/ins&gt;ramdisk&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|配对公钥添加到 ramdisk]] &lt;/ins&gt;部分。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;如需将 x509 证书转换为 PEM 格式，请运行以下命令：&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;如需将 x509 证书转换为 PEM 格式，请运行以下命令：&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>SakuraKyuo</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Dynamic_System_Updates&amp;diff=621&amp;oldid=prev</id>
		<title>SakuraKyuo：​首次创建</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Dynamic_System_Updates&amp;diff=621&amp;oldid=prev"/>
		<updated>2024-08-06T05:51:16Z</updated>

		<summary type="html">&lt;p&gt;首次创建&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Dynamic System Updates（DSU）是谷歌在Android 10中引入的一项创新功能。它允许用户在设备上加载和运行新的Android系统映像，作为当前操作系统的替代，而无需擦除现有系统。这意味着用户可以轻松地尝试下一个Android版本或测试不同的Android体验，而不会破坏他们现有系统。&lt;br /&gt;
&lt;br /&gt;
=== DSU的功能和优势： ===&lt;br /&gt;
&lt;br /&gt;
* '''无需擦除现有系统：''' DSU允许用户加载新的Android系统映像，而不会擦除当前的操作系统和数据。这种无缝切换的能力使得用户可以灵活地管理和测试不同版本的Android系统。&lt;br /&gt;
* '''灵活性和便捷性：''' 用户可以根据需要随时启用或禁用DSU功能。这为开发者、测试人员和普通用户提供了便利，他们可以在不影响现有配置的情况下，尝试和评估新的Android版本或功能。&lt;br /&gt;
* '''安全性保障：''' DSU依赖于device-mapper-verity（dm-verity）内核功能来验证新加载的Android系统映像。这种安全性措施确保系统映像的完整性和安全性，防止恶意软件或损坏的系统映像被加载和运行。&lt;br /&gt;
&lt;br /&gt;
=== DSU的实现要求： ===&lt;br /&gt;
&lt;br /&gt;
* 为了启用DSU功能，系统必须配置以下内核选项：&lt;br /&gt;
&lt;br /&gt;
  CONFIG_DM_VERITY=y&lt;br /&gt;
  CONFIG_DM_VERITY_FEC=y&lt;br /&gt;
&lt;br /&gt;
* Google为了存储与已安装DSU镜像相关的数据需要使用 &amp;lt;code&amp;gt;metadata&amp;lt;/code&amp;gt; 分区，这要求机器必须为动态分区(Dynamic Partition)&lt;br /&gt;
&lt;br /&gt;
=== DSU 流程 ===&lt;br /&gt;
本部分介绍如何执行多个 DSU 配置流程。&lt;br /&gt;
&lt;br /&gt;
==== 生成新的密钥对 ====&lt;br /&gt;
使用 &amp;lt;code&amp;gt;openssl&amp;lt;/code&amp;gt; 命令生成 &amp;lt;code&amp;gt;.pem&amp;lt;/code&amp;gt; 格式的 RSA 私钥/公钥对（例如，大小为 2048 位）：&lt;br /&gt;
  openssl genrsa -out oem_cert_pri.pem 2048&lt;br /&gt;
  openssl rsa -in oem_cert_pri.pem -pubout -out oem_cert_pub.pem&lt;br /&gt;
私钥可能无法访问，并且只保存在[[wikipedia:Hardware_security_module|硬件安全模块 (HSM)]] 中。在这种情况下，密钥生成后可能会提供 x509 公钥证书。如需了解如何通过 x509 证书生成 AVB 公钥，请参阅将配对公钥添加到 ramdisk 部分。&lt;br /&gt;
&lt;br /&gt;
如需将 x509 证书转换为 PEM 格式，请运行以下命令：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -pubkey -noout -in oem_cert_pub.x509.pem &amp;gt; oem_cert_pub.pem&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 将配对公钥添加到 ramdisk ====&lt;br /&gt;
&amp;lt;code&amp;gt;oem_cert.avbpubkey&amp;lt;/code&amp;gt; 必须放在 &amp;lt;code&amp;gt;/avb/*.avbpubkey&amp;lt;/code&amp;gt; 下，以验证已签名的 DSU 软件包。首先，将 PEM 格式的公钥转换为 AVB 公钥格式：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;avbtool extract_public_key --key oem_cert_pub.pem --output oem_cert.avbpubkey&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后，按照以下步骤在第一阶段 ramdisk 中添加公钥。&lt;br /&gt;
&lt;br /&gt;
* 1. 添加一个预构建模块以复制 &amp;lt;code&amp;gt;avbpubkey&amp;lt;/code&amp;gt;。例如，使用如下内容可添加 &amp;lt;code&amp;gt;device/&amp;lt;company&amp;gt;/&amp;lt;board&amp;gt;/oem_cert.avbpubkey&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;device/&amp;lt;company&amp;gt;/&amp;lt;board&amp;gt;/avb/Android.mk&amp;lt;/code&amp;gt;：&lt;br /&gt;
&lt;br /&gt;
  include $(CLEAR_VARS)&lt;br /&gt;
  &lt;br /&gt;
  LOCAL_MODULE := oem_cert.avbpubkey&lt;br /&gt;
  LOCAL_MODULE_CLASS := ETC&lt;br /&gt;
  LOCAL_SRC_FILES := $(LOCAL_MODULE)&lt;br /&gt;
  ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)&lt;br /&gt;
  LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/first_stage_ramdisk/avb&lt;br /&gt;
  else&lt;br /&gt;
  LOCAL_MODULE_PATH := $(TARGET_RAMDISK_OUT)/avb&lt;br /&gt;
  endif&lt;br /&gt;
  &lt;br /&gt;
  include $(BUILD_PREBUILT)&lt;br /&gt;
&lt;br /&gt;
* 2. 让 droidcore 目标依赖于添加的 &amp;lt;code&amp;gt;oem_cert.avbpubkey&amp;lt;/code&amp;gt;：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;droidcore: oem_cert.avbpubkey&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 在 JSON 描述符中生成 AVB 公钥属性 ====&lt;br /&gt;
&amp;lt;code&amp;gt;oem_cert.avbpubkey&amp;lt;/code&amp;gt; 采用 AVB 公钥二进制格式。在将它放入 JSON 描述符之前，使用 SHA-1 使其可读。&lt;br /&gt;
  sha1sum oem_cert.avbpubkey | cut -f1 -d ' '&lt;br /&gt;
  3e62f2be9d9d813ef5........866ac72a51fd20&lt;br /&gt;
以下将是 JSON 描述符的 &amp;lt;code&amp;gt;pubkey&amp;lt;/code&amp;gt; 属性的内容。&lt;br /&gt;
     &amp;quot;images&amp;quot;:[&lt;br /&gt;
       {&lt;br /&gt;
          ...&lt;br /&gt;
          &amp;quot;pubkey&amp;quot;:&amp;quot;3e62f2be9d9d813ef5........866ac72a51fd20&amp;quot;,&lt;br /&gt;
          ...&lt;br /&gt;
       },&lt;br /&gt;
&lt;br /&gt;
==== 对 DSU 软件包进行签名 ====&lt;br /&gt;
使用下列方法之一对 DSU 软件包进行签名：&lt;br /&gt;
&lt;br /&gt;
* '''方法 1：重复使用通过原始 AVB 签名流程创建的工件创建 DSU 软件包。一种替代方式是从发布软件包中提取已签名的映像，并使用提取的映像直接创建 ZIP 文件。'''&lt;br /&gt;
* '''方法 2：在私钥可用时使用以下命令对 DSU 分区进行签名。DSU 软件包（ZIP 文件）中的每个 &amp;lt;code&amp;gt;img&amp;lt;/code&amp;gt; 均会单独签名：'''&lt;br /&gt;
  key_len=$(openssl rsa -in oem_cert_pri.pem -text | grep Private-Key | sed -e 's/.*(\(.*\) bit.*/\1/')&lt;br /&gt;
  for partition in system product; do&lt;br /&gt;
    avbtool add_hashtree_footer \&lt;br /&gt;
        --image ${OUT}/${partition}.img \&lt;br /&gt;
        --partition_name ${partition} \&lt;br /&gt;
        --algorithm SHA256_RSA${key_len} \&lt;br /&gt;
        --key oem_cert_pri.pem&lt;br /&gt;
  done&lt;br /&gt;
如需详细了解如何使用 &amp;lt;code&amp;gt;avbtool&amp;lt;/code&amp;gt; 添加 &amp;lt;code&amp;gt;add_hashtree_footer&amp;lt;/code&amp;gt;，请参阅使用 [https://android.googlesource.com/platform/external/avb/#using-avbtool avbtool]。&lt;br /&gt;
&lt;br /&gt;
==== 在本地验证 DSU 软件包 ====&lt;br /&gt;
建议您使用以下命令对照配对公钥验证所有本地映像：&lt;br /&gt;
  for partition in system product; do&lt;br /&gt;
      avbtool verify_image --image ${OUT}/${partition}.img  --key oem_cert_pub.pem&lt;br /&gt;
  done&lt;br /&gt;
预期的输出如下所示：&lt;br /&gt;
 Verifying image dsu/system.img using key at oem_cert_pub.pem&lt;br /&gt;
 vbmeta: Successfully verified footer and SHA256_RSA2048 vbmeta struct in dsu/system.img&lt;br /&gt;
 : Successfully verified sha1 hashtree of dsu/system.img for image of 898494464 bytes&lt;br /&gt;
 &lt;br /&gt;
 Verifying image dsu/product.img using key at oem_cert_pub.pem&lt;br /&gt;
 vbmeta: Successfully verified footer and SHA256_RSA2048 vbmeta struct in dsu/product.img&lt;br /&gt;
 : Successfully verified sha1 hashtree of dsu/product.img for image of 905830400 bytes&lt;br /&gt;
&lt;br /&gt;
==== 创建 DSU 软件包 ====&lt;br /&gt;
以下示例将展示如何创建一个包含 &amp;lt;code&amp;gt;system.img&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;product.img&amp;lt;/code&amp;gt; 的 DSU 软件包：&lt;br /&gt;
 dsu.zip {&lt;br /&gt;
     - system.img&lt;br /&gt;
     - product.img&lt;br /&gt;
 }&lt;br /&gt;
在两个映像均已签名后，使用以下命令创建 ZIP 文件：&lt;br /&gt;
  mkdir -p dsu&lt;br /&gt;
  cp ${OUT}/system.img dsu&lt;br /&gt;
  cp ${OUT}/product.img dsu&lt;br /&gt;
  cd dsu &amp;amp;&amp;amp; zip ../dsu.zip *.img &amp;amp;&amp;amp; cd -&lt;br /&gt;
&lt;br /&gt;
==== 自定义一键式 DSU ====&lt;br /&gt;
默认情况下，DSU 加载器指向 GSI 映像的元数据，即 &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://...google.com/.../gsi-src.json&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
OEM 可以通过定义指向其 JSON 描述符的 &amp;lt;code&amp;gt;persist.sys.fflag.override.settings_dynamic_system.list&amp;lt;/code&amp;gt; 属性来覆盖该列表。例如，OEM 可能会提供包含 GSI 和 OEM 专有映像的 JSON 元数据，如下所示：&lt;br /&gt;
 {&lt;br /&gt;
     &amp;quot;include&amp;quot;: [&amp;quot;&amp;lt;nowiki&amp;gt;https://dl.google.com/.../gsi-src.JSON&amp;lt;/nowiki&amp;gt;&amp;quot;]&lt;br /&gt;
     &amp;quot;images&amp;quot;:[&lt;br /&gt;
       {&lt;br /&gt;
          &amp;quot;name&amp;quot;:&amp;quot;OEM image&amp;quot;,&lt;br /&gt;
          &amp;quot;os_version&amp;quot;:&amp;quot;10&amp;quot;,&lt;br /&gt;
          &amp;quot;cpu_abi&amp;quot;: &amp;quot;arm64-v8a&amp;quot;,&lt;br /&gt;
          &amp;quot;details&amp;quot;:&amp;quot;...&amp;quot;,&lt;br /&gt;
          &amp;quot;vndk&amp;quot;:[&lt;br /&gt;
             27,&lt;br /&gt;
             28,&lt;br /&gt;
             29&lt;br /&gt;
          ],&lt;br /&gt;
          &amp;quot;spl&amp;quot;:&amp;quot;...&amp;quot;,&lt;br /&gt;
          &amp;quot;pubkey&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
          &amp;quot;uri&amp;quot;:&amp;quot;&amp;lt;nowiki&amp;gt;https://.../....zip&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
       },&lt;br /&gt;
 }&lt;br /&gt;
OEM 可以链接已发布的 DSU 元数据，如图所示。&lt;br /&gt;
[[文件:Dsu-metadata-chaining.png|缩略图]]&lt;/div&gt;</summary>
		<author><name>SakuraKyuo</name></author>
	</entry>
</feed>