<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.uotan.cn/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Luluzzy</id>
	<title>Uotan Wiki · 刷机百科 - 用户贡献 [zh-cn]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.uotan.cn/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Luluzzy"/>
	<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E7%89%B9%E6%AE%8A:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/Luluzzy"/>
	<updated>2026-06-17T09:49:53Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=881</id>
		<title>Android 分区详解</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=881"/>
		<updated>2024-08-19T12:48:58Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​修改表格内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Android 设备包含若干个分区，这些分区在Android启动和运行过程中发挥不同的作用。'''&lt;br /&gt;
&lt;br /&gt;
== 常见分区详解​ ==&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含一个内核映像，使用 &amp;lt;code&amp;gt;mkbootimg&amp;lt;/code&amp;gt; 创建。您可以使用虚拟分区直接刷写任意映像，而无需刷写新的 boot 分区。 此分区还包含在 Android 13 之前发布的设备中的通用 ramdisk。'''&lt;br /&gt;
&lt;br /&gt;
* kernel：&amp;lt;code&amp;gt;kernel&amp;lt;/code&amp;gt; 虚拟分区通过将新内核映像写入旧内核映像来覆盖内核（&amp;lt;code&amp;gt;zImage&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;zImage-dtb&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;Image.gz-dtb&amp;lt;/code&amp;gt;）。如果提供的开发内核不兼容，则可能需要使用关联的内核模块更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;dtb&amp;lt;/code&amp;gt; 分区（如果存在）。&lt;br /&gt;
&lt;br /&gt;
* ramdisk：&amp;lt;code&amp;gt;ramdisk&amp;lt;/code&amp;gt; 虚拟分区通过将新 ramdisk 映像写入旧 ramdisk 映像来覆盖 ramdisk。&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含发布时搭载 Android 13 及更高版本的设备的通用 ramdisk。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含 Android 框架。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;system_ext&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''由谷歌在 Android 11添加的一个新分区，可以使用 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 资源'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''许多 OEM 会自定义 AOSP 系统映像，以实现自己的功能并满足运营商的要求。不过，如果进行这类自定义，则无法针对多个软件 SKU 使用单个系统映像。映像必须各不相同，才能支持不同的语言区域、运营商等自定义。如果使用单独的 &amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt; 分区来包含自定义项，则可以针对多个软件 SKU 使用单个系统映像（&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 分区会托管可在众多软件 SKU 之间共享的通用代码）。&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区会继续托管 SoC 专属 BSP 代码，这类代码可以基于指定 SoC 在多台设备之间共享。'''&lt;br /&gt;
&lt;br /&gt;
'''使用单独的分区存在一些弊端，例如，难以管理磁盘空间（应该预留一定的空间满足未来增长的空间需求），以及难以在各分区之间维护稳定的应用二进制接口 (ABI)。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储在 OTA 过程中启动的恢复映像。支持无缝更新的设备可以将恢复映像存储为 &amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 映像中包含的 ramdisk（而不是单独的映像）。'''&lt;br /&gt;
&lt;br /&gt;
'''注意：某些厂商的VAB分区结构设备不包含recovery分区，他们会将recovery分区与boot分区合并，因此当你需要刷入第三方Recovery时需要使用命令：&amp;lt;code&amp;gt;fastboot boot boot.img(具体名称自定)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;cache&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储临时数据，如果设备使用无缝更新，则此分区是可选的。cache 分区并非必须可从引导加载程序写入，但必须可清空。此分区大小取决于设备类型和 &amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 上的可用空间。通常，50 MB 至 100 MB 就足够了。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;misc&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区供 recovery 分区使用，大小为 4 KB 或更大。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含用户安装的应用和数据，包括自定义数据。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;metadata&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区用于在设备使用元数据加密时存储元数据加密密钥。大小为 16 MB 或更大。此分区未经加密，且系统不会对其数据拍摄快照。数据会在设备恢复出厂设置时被清空。此分区的使用受到严格限制。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含原始设计制造商 (ODM) 对系统芯片 (SoC) 供应商板级支持包 (BSP) 的自定义设置。利用此类自定义设置，ODM 可以替换或自定义 SoC 组件，并在硬件抽象层 (HAL) 上为板级组件、守护程序和 ODM 特定的功能实现内核模块。此分区是可选的；通常情况下，它用于存储自定义设置，以便设备可以针对多个硬件 SKU 使用单个供应商映像。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区专门用于存储 ODM 内核模块。将 ODM 内核模块存储在 &amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区即可更新 ODM 内核模块。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含一些厂商私有的二进制文件以及驱动等内容，用于实现厂商特定功能以及服务，例如图像传感器，音频，显示等，具体作用可以参考于ODM分区，而在各大厂商的系统维护中，如今 一加 （OnePlus），小米（Xiaomi）等厂商也开始使用ODM分区来存放他们的私有驱动文件，即将 /odm 作为另一个 /vendor 分区处理。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区专门用于存储供应商内核模块。将供应商内核模块存储在 &amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区即可更新内核模块。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor_boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''Android 11 引入了通用内核映像 (GKI) 的概念。为了能够使用 GKI 轻松启动任意设备，Android 11 设备使用启动映像头文件版本 3，所有供应商专用信息都已从 &amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 分区分离出来并转移到新的 &amp;lt;code&amp;gt;vendor_boot&amp;lt;/code&amp;gt; 分区中，也就是在Android11中该分区由一个头文件、供应商 ramdisk 和设备树 blob (DTB) 组成。'''&lt;br /&gt;
&lt;br /&gt;
'''而相对的，在安卓12中使用的是版本4，此时该分区由一个头文件、供应商 ramdisk 区段（包含串联起来的所有供应商 ramdisk 片段）、设备树 blob (DTB) 和供应商 ramdisk 表组成。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含无线装置映像，只有包含无线装置且在专用分区中存储无线装置专用软件的设备才需要此分区。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;tos&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区用于存储 Trusty 操作系统的二进制映像文件，仅在设备包含 Trusty 时使用。Trusty 是 Google 的可信执行环境 (TEE) 操作系统实现，与 Android 并行运行。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;pvmfw&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储受保护的虚拟机固件 (pvmfw)，即在受保护的虚拟机中运行的第一个代码。如需了解详情，请参阅受保护的虚拟机固件。'''&lt;br /&gt;
&lt;br /&gt;
== System-as-root ==&lt;br /&gt;
在 Android 9 中，非 A/B 设备应采用 system-as-root，以便通过系统专用 OTA 进行更新。&lt;br /&gt;
&lt;br /&gt;
'''注意：如果设备使用的是 A/B 分区架构，则无需做出任何改动。'''&lt;br /&gt;
&lt;br /&gt;
与将 &amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt; 改为&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt;分区的A/B设备不同，非A/B设备必须保留单独的&amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt; 分区，因为它们没有后备插槽分区（例如，从 &amp;lt;code&amp;gt;boot_a&amp;lt;/code&amp;gt; 切换到 &amp;lt;code&amp;gt;boot_b&amp;lt;/code&amp;gt;）。如果在非A/B 设备上移除 &amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt;并使其与A/B架构类似，那么在&amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;分区更新失败时，恢复模式可能会遭到破坏。因此，对于非A/B设备来说，&amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt;分区必须作为单独的分区存在（不同于非A/B设备的&amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;），这意味着恢复映像将继续延迟更新（即如同 Android 9 之前的设备中那样）。&lt;br /&gt;
&lt;br /&gt;
对于SAR设备与先前的旧设备，最明显的区别便在于分区的挂载点上，见&amp;lt;!-- 此表基于谷歌官方文档再度绘制 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''（非AB设备）'''&lt;br /&gt;
[[文件:安卓SAR.png|缩略图|963x963像素|居中]]&lt;br /&gt;
== AB分区与无缝更新 ==&lt;br /&gt;
Android 有两种更新机制：A/B（无缝）更新和非 A/B 更新，支持无缝更新的系统分区类型有两种，一种是AB分区，一种是VAB分区。&lt;br /&gt;
&lt;br /&gt;
'''安卓系统从7.0开始引入新的OTA升级方式，叫做A/B系统。A/B系统就是设备上有A和B两套可以工作的系统（用户数据只有一份，为两套系统共用），而这样做的好处就是，当OTA进行失败时可以直接切换到另外一个未经OTA的槽位，从而防止设备变砖，而缺点也很明显——两套系统分区意味着其占据多原来一倍的大小。'''&lt;br /&gt;
&lt;br /&gt;
'''而在2020年9月9日，谷歌正式发布了Android11 代号 Android R，而伴随其发布，谷歌也向各大厂商几乎强制安利了一项技术，出厂安卓11的机型必须使用VAB架构 Android Virtual A/B ,而在后续版本Android 12/13 中又增加了 VABC (Virtual A/B with Compression)，增加了压缩功能。''' &lt;br /&gt;
&lt;br /&gt;
'''首先让我们来看一下传统分区与VAB分区的结构'''&lt;br /&gt;
[[文件:安卓分区结构对比2.png|缩略图|1029x1029像素|居中]]&lt;br /&gt;
&lt;br /&gt;
A-only 即仅有一套分区表的系统分区模式，而后面安卓引入了A-only 动态分区。动态分区的内容可以见下方。&lt;br /&gt;
&lt;br /&gt;
'''也就是说，在AB分区的设备中，system_a和system_b等ab分区是真实存在的，他们会占用空间，而在VAB中(以下以默认槽位A为例)，system_a和system_b并非同时存在，因此不会占据大量空间。无缝更新最大的优点在于：几乎无感，安全。'''&lt;br /&gt;
&lt;br /&gt;
OTA 更新可以在系统运行期间进行，不会打断正常的使用。在更新写入完成后，只需要重启一次切换槽位即可完成系统更新。如果 OTA因为刷机失败等原因导致无法启动，将继续启动先前的操作系统。&lt;br /&gt;
&lt;br /&gt;
更新包可以流式传输到 A/B 设备，因此在安装之前不需要先下载更新包。流式更新意味着用户没有必要在 /data 或 /cache 上留出足够的可用空间以存储更新包。&lt;br /&gt;
&lt;br /&gt;
相比之下A-Only设备则没有上述优点，因为只有一套系统分区，如果OTA失败则会直接导致设备无法开机&lt;br /&gt;
&lt;br /&gt;
'''空间占用对比：'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- 源自Android Open Source Project 并进行重绘以及翻译 --&amp;gt;[[文件:分区2.png|居中|缩略图|837x837像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* 以PixelOS为例&lt;br /&gt;
&lt;br /&gt;
== 动态分区 ==&lt;br /&gt;
动态分区是 Android 的用户空间分区系统。使用此分区系统，您可以在无线下载 (OTA) 更新期间创建、销毁分区或者调整分区大小。借助动态分区，供应商无需担心各个分区（例如 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt;）的大小。取而代之的是，设备会分配一个 &amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 分区，其中的子分区可动态调整大小。各个分区映像不再需要为将来的 OTA 预留空间。相反，&amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 中剩余的可用空间还可用于所有动态分区。&lt;br /&gt;
&lt;br /&gt;
通俗的来讲，就是将常见的 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;system_ext&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt;等分区包括在&amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt;分区里面，而动态分区并不意味着super分区就是&lt;br /&gt;
&lt;br /&gt;
可以随意调节的，事实上可以动态调节的是super里面的分区，在总体大小保持固定的情况下，我们可以根据各个分区所需要使用的大小来动态分配。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 参考资料：             ==&lt;br /&gt;
①安卓常见分区：https://source.android.com/docs/core/architecture/partitions?hl=zh-cn#standard-partitions&lt;br /&gt;
&lt;br /&gt;
②安卓A/B系统分区：https://source.android.google.cn/docs/core/ota/ab?hl=zh-cn&lt;br /&gt;
&lt;br /&gt;
③安卓分区布局：https://source.android.google.cn/docs/core/architecture/bootloader/system-as-root?hl=zh-cn#ramdisk&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E5%88%86%E5%8C%BA2.png&amp;diff=880</id>
		<title>文件:分区2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E5%88%86%E5%8C%BA2.png&amp;diff=880"/>
		<updated>2024-08-19T12:48:20Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;分区2&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E4%BF%AE%E6%94%B9%E6%96%B9%E6%A1%88%E5%90%88%E9%9B%86&amp;diff=879</id>
		<title>修改方案合集</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E4%BF%AE%E6%94%B9%E6%96%B9%E6%A1%88%E5%90%88%E9%9B%86&amp;diff=879"/>
		<updated>2024-08-19T04:55:45Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​修正部分排版&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 去除安卓13开始的签名校验 ==&lt;br /&gt;
'''作者：酷安@霓霆快雨 @小破孩'''&lt;br /&gt;
&lt;br /&gt;
'''工具：(Android) MT管理器   （Windows）JADX'''&lt;br /&gt;
&lt;br /&gt;
先找到&amp;lt;code&amp;gt;system/framework/services.jar&amp;lt;/code&amp;gt;然后查看里面的文件&lt;br /&gt;
&lt;br /&gt;
dex文件全选之后，用Dex编辑器++打开&lt;br /&gt;
&lt;br /&gt;
然后搜索代码&amp;lt;code&amp;gt;getMinimumSignatureSchemeVersionForTargetSdk&amp;lt;/code&amp;gt;会得到四个结果&lt;br /&gt;
&lt;br /&gt;
其类名分别为&lt;br /&gt;
[[文件:搜素结果.png|缩略图|553x553px|居中]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
分别点进去，选中&amp;lt;code&amp;gt;invoke-static&amp;lt;/code&amp;gt;到&amp;lt;code&amp;gt;move-result&amp;lt;/code&amp;gt;两行更换为&amp;lt;code&amp;gt;const/4 v*, 0x0&amp;lt;/code&amp;gt; “*”是move result后面的数字(寄存器)&lt;br /&gt;
[[文件:选中文本1.png|缩略图|672x672px|居中]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
以自己实际smali代码中的数字为准，注意不要改错。&lt;br /&gt;
&lt;br /&gt;
以此类推修改完上述4个地方之后一路保存返回之后完成对services.jar的修改，替换进系统测试能否正常开机即可&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E4%BF%AE%E6%94%B9%E6%96%B9%E6%A1%88%E5%90%88%E9%9B%86&amp;diff=878</id>
		<title>修改方案合集</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E4%BF%AE%E6%94%B9%E6%96%B9%E6%A1%88%E5%90%88%E9%9B%86&amp;diff=878"/>
		<updated>2024-08-19T04:54:46Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​修改部分页面排版&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 去除安卓13开始的签名校验 ==&lt;br /&gt;
'''作者：酷安@霓霆快雨 @小破孩'''&lt;br /&gt;
&lt;br /&gt;
'''工具：(Android) MT管理器   （Windows）JADX'''&lt;br /&gt;
&lt;br /&gt;
先找到&amp;lt;code&amp;gt;system/framework/services.jar&amp;lt;/code&amp;gt;然后查看里面的文件&lt;br /&gt;
&lt;br /&gt;
dex文件全选之后，用Dex编辑器++打开&lt;br /&gt;
&lt;br /&gt;
然后搜索代码&amp;lt;code&amp;gt;getMinimumSignatureSchemeVersionForTargetSdk&amp;lt;/code&amp;gt;会得到四个结果&lt;br /&gt;
&lt;br /&gt;
其类名分别为&lt;br /&gt;
[[文件:搜素结果.png|缩略图|553x553px|居中]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                                                                                                                                                                                                                                                                                                    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
分别点进去，选中&amp;lt;code&amp;gt;invoke-static&amp;lt;/code&amp;gt;到&amp;lt;code&amp;gt;move-result&amp;lt;/code&amp;gt;两行更换为&amp;lt;code&amp;gt;const/4 v*, 0x0&amp;lt;/code&amp;gt; “*”是move result后面的数字(寄存器)&lt;br /&gt;
[[文件:选中文本1.png|缩略图|672x672px|居中]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                                                                                                                   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
以自己实际smali代码中的数字为准，注意不要改错。&lt;br /&gt;
&lt;br /&gt;
以此类推修改完上述4个地方之后一路保存返回之后完成对services.jar的修改，替换进系统测试能否正常开机即可&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E4%BF%AE%E6%94%B9%E6%96%B9%E6%A1%88%E5%90%88%E9%9B%86&amp;diff=877</id>
		<title>修改方案合集</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E4%BF%AE%E6%94%B9%E6%96%B9%E6%A1%88%E5%90%88%E9%9B%86&amp;diff=877"/>
		<updated>2024-08-19T04:53:23Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​修改部分页面排版&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 去除安卓13开始的签名校验 ==&lt;br /&gt;
'''作者：酷安@霓霆快雨 @小破孩'''&lt;br /&gt;
&lt;br /&gt;
'''工具：(Android) MT管理器   （Windows）JADX'''&lt;br /&gt;
&lt;br /&gt;
先找到&amp;lt;code&amp;gt;system/framework/services.jar&amp;lt;/code&amp;gt;然后查看里面的文件&lt;br /&gt;
&lt;br /&gt;
dex文件全选之后，用Dex编辑器++打开&lt;br /&gt;
&lt;br /&gt;
然后搜索代码&amp;lt;code&amp;gt;getMinimumSignatureSchemeVersionForTargetSdk&amp;lt;/code&amp;gt;会得到四个结果&lt;br /&gt;
&lt;br /&gt;
其类名分别为&lt;br /&gt;
[[文件:搜素结果.png|左|缩略图|553x553px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                                                                                                                                                                                                                                                                                                    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
分别点进去，选中&amp;lt;code&amp;gt;invoke-static&amp;lt;/code&amp;gt;到&amp;lt;code&amp;gt;move-result&amp;lt;/code&amp;gt;两行更换为&amp;lt;code&amp;gt;const/4 v*, 0x0&amp;lt;/code&amp;gt; “*”是move result后面的数字(寄存器)&lt;br /&gt;
[[文件:选中文本1.png|左|缩略图|672x672px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                                                                                                                   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
以自己实际smali代码中的数字为准，注意不要改错。&lt;br /&gt;
&lt;br /&gt;
以此类推修改完上述4个地方之后一路保存返回之后完成对services.jar的修改，替换进系统测试能否正常开机即可&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E4%BF%AE%E6%94%B9%E6%96%B9%E6%A1%88%E5%90%88%E9%9B%86&amp;diff=876</id>
		<title>修改方案合集</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E4%BF%AE%E6%94%B9%E6%96%B9%E6%A1%88%E5%90%88%E9%9B%86&amp;diff=876"/>
		<updated>2024-08-19T04:27:32Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​补充内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 去除安卓13开始的签名校验 ==&lt;br /&gt;
'''作者：酷安@霓霆快雨 @小破孩'''&lt;br /&gt;
&lt;br /&gt;
'''工具：(Android) MT管理器   （Windows）JADX'''&lt;br /&gt;
&lt;br /&gt;
先找到&amp;lt;code&amp;gt;system/framework/services.jar&amp;lt;/code&amp;gt;然后查看里面的文件&lt;br /&gt;
&lt;br /&gt;
dex文件全选之后，用Dex编辑器++打开&lt;br /&gt;
&lt;br /&gt;
然后搜索代码&amp;lt;code&amp;gt;getMinimumSignatureSchemeVersionForTargetSdk&amp;lt;/code&amp;gt;会得到四个结果&lt;br /&gt;
&lt;br /&gt;
其类名分别为&lt;br /&gt;
[[文件:搜素结果.png|左|缩略图|672x672像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
分别点进去，选中&amp;lt;code&amp;gt;invoke-static&amp;lt;/code&amp;gt;到&amp;lt;code&amp;gt;move-result&amp;lt;/code&amp;gt;两行更换为&amp;lt;code&amp;gt;const/4 v*, 0x0&amp;lt;/code&amp;gt; “*”是move result后面的数字(寄存器)&lt;br /&gt;
[[文件:选中文本1.png|左|缩略图|672x672px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
以自己实际smali代码中的数字为准，注意不要改错。&lt;br /&gt;
&lt;br /&gt;
以此类推修改完上述4个地方之后一路保存返回之后完成对services.jar的修改，替换进系统测试能否正常开机即可&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E6%90%9C%E7%B4%A0%E7%BB%93%E6%9E%9C.png&amp;diff=875</id>
		<title>文件:搜素结果.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E6%90%9C%E7%B4%A0%E7%BB%93%E6%9E%9C.png&amp;diff=875"/>
		<updated>2024-08-19T04:23:50Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;搜索结果&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E4%BF%AE%E6%94%B9%E6%96%B9%E6%A1%88%E5%90%88%E9%9B%86&amp;diff=874</id>
		<title>修改方案合集</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E4%BF%AE%E6%94%B9%E6%96%B9%E6%A1%88%E5%90%88%E9%9B%86&amp;diff=874"/>
		<updated>2024-08-19T04:22:07Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​创建页面并增加签名校验内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 去除安卓13开始的签名校验 ==&lt;br /&gt;
'''作者：酷安@霓霆快雨 @小破孩'''&lt;br /&gt;
&lt;br /&gt;
'''工具：(Android) MT管理器   （Windows）JADX'''&lt;br /&gt;
&lt;br /&gt;
先找到&amp;lt;code&amp;gt;system/framework/services.jar&amp;lt;/code&amp;gt;然后查看里面的文件&lt;br /&gt;
&lt;br /&gt;
dex文件全选之后，用Dex编辑器++打开&lt;br /&gt;
&lt;br /&gt;
然后搜索代码&amp;lt;code&amp;gt;getMinimumSignatureSchemeVersionForTargetSdk&amp;lt;/code&amp;gt;会得到四个结果&lt;br /&gt;
&lt;br /&gt;
其类名分别为&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
分别点进去，选中invoke-static到move-result两行更换为const/4 v*, 0x0“*”是move result后面的数字，&lt;br /&gt;
[[文件:选中文本1.png|左|缩略图|924x924像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
以自己的实际为准&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E9%80%89%E4%B8%AD%E6%96%87%E6%9C%AC1.png&amp;diff=873</id>
		<title>文件:选中文本1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E9%80%89%E4%B8%AD%E6%96%87%E6%9C%AC1.png&amp;diff=873"/>
		<updated>2024-08-19T04:20:56Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;选中文本1&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=872</id>
		<title>Android 分区详解</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=872"/>
		<updated>2024-08-19T03:57:59Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​更改表格&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Android 设备包含若干个分区，这些分区在Android启动和运行过程中发挥不同的作用。'''&lt;br /&gt;
&lt;br /&gt;
== 常见分区详解​ ==&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含一个内核映像，使用 &amp;lt;code&amp;gt;mkbootimg&amp;lt;/code&amp;gt; 创建。您可以使用虚拟分区直接刷写任意映像，而无需刷写新的 boot 分区。 此分区还包含在 Android 13 之前发布的设备中的通用 ramdisk。'''&lt;br /&gt;
&lt;br /&gt;
* kernel：&amp;lt;code&amp;gt;kernel&amp;lt;/code&amp;gt; 虚拟分区通过将新内核映像写入旧内核映像来覆盖内核（&amp;lt;code&amp;gt;zImage&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;zImage-dtb&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;Image.gz-dtb&amp;lt;/code&amp;gt;）。如果提供的开发内核不兼容，则可能需要使用关联的内核模块更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;dtb&amp;lt;/code&amp;gt; 分区（如果存在）。&lt;br /&gt;
&lt;br /&gt;
* ramdisk：&amp;lt;code&amp;gt;ramdisk&amp;lt;/code&amp;gt; 虚拟分区通过将新 ramdisk 映像写入旧 ramdisk 映像来覆盖 ramdisk。&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含发布时搭载 Android 13 及更高版本的设备的通用 ramdisk。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含 Android 框架。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;system_ext&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''由谷歌在 Android 11添加的一个新分区，可以使用 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 资源'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''许多 OEM 会自定义 AOSP 系统映像，以实现自己的功能并满足运营商的要求。不过，如果进行这类自定义，则无法针对多个软件 SKU 使用单个系统映像。映像必须各不相同，才能支持不同的语言区域、运营商等自定义。如果使用单独的 &amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt; 分区来包含自定义项，则可以针对多个软件 SKU 使用单个系统映像（&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 分区会托管可在众多软件 SKU 之间共享的通用代码）。&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区会继续托管 SoC 专属 BSP 代码，这类代码可以基于指定 SoC 在多台设备之间共享。'''&lt;br /&gt;
&lt;br /&gt;
'''使用单独的分区存在一些弊端，例如，难以管理磁盘空间（应该预留一定的空间满足未来增长的空间需求），以及难以在各分区之间维护稳定的应用二进制接口 (ABI)。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储在 OTA 过程中启动的恢复映像。支持无缝更新的设备可以将恢复映像存储为 &amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 映像中包含的 ramdisk（而不是单独的映像）。'''&lt;br /&gt;
&lt;br /&gt;
'''注意：某些厂商的VAB分区结构设备不包含recovery分区，他们会将recovery分区与boot分区合并，因此当你需要刷入第三方Recovery时需要使用命令：&amp;lt;code&amp;gt;fastboot boot boot.img(具体名称自定)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;cache&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储临时数据，如果设备使用无缝更新，则此分区是可选的。cache 分区并非必须可从引导加载程序写入，但必须可清空。此分区大小取决于设备类型和 &amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 上的可用空间。通常，50 MB 至 100 MB 就足够了。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;misc&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区供 recovery 分区使用，大小为 4 KB 或更大。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含用户安装的应用和数据，包括自定义数据。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;metadata&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区用于在设备使用元数据加密时存储元数据加密密钥。大小为 16 MB 或更大。此分区未经加密，且系统不会对其数据拍摄快照。数据会在设备恢复出厂设置时被清空。此分区的使用受到严格限制。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含原始设计制造商 (ODM) 对系统芯片 (SoC) 供应商板级支持包 (BSP) 的自定义设置。利用此类自定义设置，ODM 可以替换或自定义 SoC 组件，并在硬件抽象层 (HAL) 上为板级组件、守护程序和 ODM 特定的功能实现内核模块。此分区是可选的；通常情况下，它用于存储自定义设置，以便设备可以针对多个硬件 SKU 使用单个供应商映像。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区专门用于存储 ODM 内核模块。将 ODM 内核模块存储在 &amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区即可更新 ODM 内核模块。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含一些厂商私有的二进制文件以及驱动等内容，用于实现厂商特定功能以及服务，例如图像传感器，音频，显示等，具体作用可以参考于ODM分区，而在各大厂商的系统维护中，如今 一加 （OnePlus），小米（Xiaomi）等厂商也开始使用ODM分区来存放他们的私有驱动文件，即将 /odm 作为另一个 /vendor 分区处理。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区专门用于存储供应商内核模块。将供应商内核模块存储在 &amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区即可更新内核模块。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor_boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''Android 11 引入了通用内核映像 (GKI) 的概念。为了能够使用 GKI 轻松启动任意设备，Android 11 设备使用启动映像头文件版本 3，所有供应商专用信息都已从 &amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 分区分离出来并转移到新的 &amp;lt;code&amp;gt;vendor_boot&amp;lt;/code&amp;gt; 分区中，也就是在Android11中该分区由一个头文件、供应商 ramdisk 和设备树 blob (DTB) 组成。'''&lt;br /&gt;
&lt;br /&gt;
'''而相对的，在安卓12中使用的是版本4，此时该分区由一个头文件、供应商 ramdisk 区段（包含串联起来的所有供应商 ramdisk 片段）、设备树 blob (DTB) 和供应商 ramdisk 表组成。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含无线装置映像，只有包含无线装置且在专用分区中存储无线装置专用软件的设备才需要此分区。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;tos&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区用于存储 Trusty 操作系统的二进制映像文件，仅在设备包含 Trusty 时使用。Trusty 是 Google 的可信执行环境 (TEE) 操作系统实现，与 Android 并行运行。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;pvmfw&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储受保护的虚拟机固件 (pvmfw)，即在受保护的虚拟机中运行的第一个代码。如需了解详情，请参阅受保护的虚拟机固件。'''&lt;br /&gt;
&lt;br /&gt;
== System-as-root ==&lt;br /&gt;
在 Android 9 中，非 A/B 设备应采用 system-as-root，以便通过系统专用 OTA 进行更新。&lt;br /&gt;
&lt;br /&gt;
'''注意：如果设备使用的是 A/B 分区架构，则无需做出任何改动。'''&lt;br /&gt;
&lt;br /&gt;
与将 &amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt; 改为&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt;分区的A/B设备不同，非A/B设备必须保留单独的&amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt; 分区，因为它们没有后备插槽分区（例如，从 &amp;lt;code&amp;gt;boot_a&amp;lt;/code&amp;gt; 切换到 &amp;lt;code&amp;gt;boot_b&amp;lt;/code&amp;gt;）。如果在非A/B 设备上移除 &amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt;并使其与A/B架构类似，那么在&amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;分区更新失败时，恢复模式可能会遭到破坏。因此，对于非A/B设备来说，&amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt;分区必须作为单独的分区存在（不同于非A/B设备的&amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;），这意味着恢复映像将继续延迟更新（即如同 Android 9 之前的设备中那样）。&lt;br /&gt;
&lt;br /&gt;
对于SAR设备与先前的旧设备，最明显的区别便在于分区的挂载点上，见&amp;lt;!-- 此表基于谷歌官方文档再度绘制 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''（非AB设备）'''&lt;br /&gt;
[[文件:安卓SAR.png|缩略图|963x963像素|居中]]&lt;br /&gt;
== AB分区与无缝更新 ==&lt;br /&gt;
Android 有两种更新机制：A/B（无缝）更新和非 A/B 更新，支持无缝更新的系统分区类型有两种，一种是AB分区，一种是VAB分区。&lt;br /&gt;
&lt;br /&gt;
'''安卓系统从7.0开始引入新的OTA升级方式，叫做A/B系统。A/B系统就是设备上有A和B两套可以工作的系统（用户数据只有一份，为两套系统共用），而这样做的好处就是，当OTA进行失败时可以直接切换到另外一个未经OTA的槽位，从而防止设备变砖，而缺点也很明显——两套系统分区意味着其占据多原来一倍的大小。'''&lt;br /&gt;
&lt;br /&gt;
'''而在2020年9月9日，谷歌正式发布了Android11 代号 Android R，而伴随其发布，谷歌也向各大厂商几乎强制安利了一项技术，出厂安卓11的机型必须使用VAB架构 Android Virtual A/B ,而在后续版本Android 12/13 中又增加了 VABC (Virtual A/B with Compression)，增加了压缩功能。''' &lt;br /&gt;
&lt;br /&gt;
'''首先让我们来看一下传统分区与VAB分区的结构'''&lt;br /&gt;
[[文件:安卓分区结构对比2.png|缩略图|1029x1029像素|居中]]&lt;br /&gt;
&lt;br /&gt;
A-only 即仅有一套分区表的系统分区模式，而后面安卓引入了A-only 动态分区。动态分区的内容可以见下方。&lt;br /&gt;
&lt;br /&gt;
'''也就是说，在AB分区的设备中，system_a和system_b等ab分区是真实存在的，他们会占用空间，而在VAB中(以下以默认槽位A为例)，system_a和system_b并非同时存在，因此不会占据大量空间。无缝更新最大的优点在于：几乎无感，安全。'''&lt;br /&gt;
&lt;br /&gt;
OTA 更新可以在系统运行期间进行，不会打断正常的使用。在更新写入完成后，只需要重启一次切换槽位即可完成系统更新。如果 OTA因为刷机失败等原因导致无法启动，将继续启动先前的操作系统。&lt;br /&gt;
&lt;br /&gt;
更新包可以流式传输到 A/B 设备，因此在安装之前不需要先下载更新包。流式更新意味着用户没有必要在 /data 或 /cache 上留出足够的可用空间以存储更新包。&lt;br /&gt;
&lt;br /&gt;
相比之下A-Only设备则没有上述优点，因为只有一套系统分区，如果OTA失败则会直接导致设备无法开机&lt;br /&gt;
&lt;br /&gt;
'''空间占用对比：'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- 源自Android Open Source Project 并进行重绘以及翻译 --&amp;gt;[[文件:分区.png|左|缩略图|997x997像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* 以PixelOS为例&lt;br /&gt;
&lt;br /&gt;
== 动态分区 ==&lt;br /&gt;
动态分区是 Android 的用户空间分区系统。使用此分区系统，您可以在无线下载 (OTA) 更新期间创建、销毁分区或者调整分区大小。借助动态分区，供应商无需担心各个分区（例如 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt;）的大小。取而代之的是，设备会分配一个 &amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 分区，其中的子分区可动态调整大小。各个分区映像不再需要为将来的 OTA 预留空间。相反，&amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 中剩余的可用空间还可用于所有动态分区。&lt;br /&gt;
&lt;br /&gt;
通俗的来讲，就是将常见的 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;system_ext&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt;等分区包括在&amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt;分区里面，而动态分区并不意味着super分区就是&lt;br /&gt;
&lt;br /&gt;
可以随意调节的，事实上可以动态调节的是super里面的分区，在总体大小保持固定的情况下，我们可以根据各个分区所需要使用的大小来动态分配。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 参考资料：             ==&lt;br /&gt;
①安卓常见分区：https://source.android.com/docs/core/architecture/partitions?hl=zh-cn#standard-partitions&lt;br /&gt;
&lt;br /&gt;
②安卓A/B系统分区：https://source.android.google.cn/docs/core/ota/ab?hl=zh-cn&lt;br /&gt;
&lt;br /&gt;
③安卓分区布局：https://source.android.google.cn/docs/core/architecture/bootloader/system-as-root?hl=zh-cn#ramdisk&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E5%88%86%E5%8C%BA.png&amp;diff=871</id>
		<title>文件:分区.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E5%88%86%E5%8C%BA.png&amp;diff=871"/>
		<updated>2024-08-19T03:56:55Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;分区&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android%E5%86%85%E6%A0%B8%E7%BC%96%E8%AF%91%E5%85%A5%E9%97%A8&amp;diff=870</id>
		<title>Android内核编译入门</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android%E5%86%85%E6%A0%B8%E7%BC%96%E8%AF%91%E5%85%A5%E9%97%A8&amp;diff=870"/>
		<updated>2024-08-18T15:02:04Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​加入WSL迁移教程&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Android 内核简介 ===&lt;br /&gt;
安卓内核用的也是linux（LTS），google把LTS内核和Android的一些补丁、模块结合形成自己的Android通用内核（Android common kernel，ACK）。也就是GKI, Generic Kernel Image。如果你的手机是量产机（Google除外），还会被cpu厂商例如高通，联发科再次开发，下放到手机厂商还会有部分修改。&lt;br /&gt;
&lt;br /&gt;
相当于现在变成了一个Image，镜像了。&lt;br /&gt;
&lt;br /&gt;
GKI 内核会与包含系统芯片 (SoC) 和板级代码的硬件专用供应商模块进行交互。GKI 内核与供应商模块之间的交互通过内核模块接口 (KMI) 来实现，该接口由标识供应商模块所需的函数和全局数据的符号列表组成。&lt;br /&gt;
&lt;br /&gt;
=== 配置使用环境 ===&lt;br /&gt;
&lt;br /&gt;
===== 推荐的编译环境 =====&lt;br /&gt;
Ubuntu 20.04 / 22.04&lt;br /&gt;
&lt;br /&gt;
Arch Linux&lt;br /&gt;
&lt;br /&gt;
(因为主播使用的就是这个喵）&lt;br /&gt;
&lt;br /&gt;
考虑到编译环境的稳定性不是很推荐装一些其他的系统&lt;br /&gt;
&lt;br /&gt;
你可以使用 VMware virtual machine 或者 WSL2 （Windows Subsystem on Linux）&lt;br /&gt;
&lt;br /&gt;
目前我更推荐使用 WSL 因为其安装较为方便，并且可以与 Microsoft VScode 协同工作方便你对Git的使用以及对内核源码的修改&lt;br /&gt;
&lt;br /&gt;
（当然 Vmware 也可以，只不过我印象不太好，这货 bug 稍微有点多）&lt;br /&gt;
&lt;br /&gt;
关于这两者方案优劣对比详见百度，此处不赘述。&lt;br /&gt;
&lt;br /&gt;
===== 安装WSL2教程 =====&lt;br /&gt;
需要先启用适用于 Linux 的 Windows 子系统以及虚拟化：&lt;br /&gt;
&lt;br /&gt;
按下键盘&amp;lt;code&amp;gt;win+R&amp;lt;/code&amp;gt;，并输入&amp;lt;code&amp;gt;powershell&amp;lt;/code&amp;gt;回车&lt;br /&gt;
&lt;br /&gt;
在&amp;lt;code&amp;gt;poershell&amp;lt;/code&amp;gt;终端内输入以下内容:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;wsl --set --default-version 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
随后打开你的微软应用商店 Microsoft Store&lt;br /&gt;
&lt;br /&gt;
搜索 Ubuntu，选择一个你喜欢的版本安装即可&lt;br /&gt;
&lt;br /&gt;
在安装完WSL后，我们可以注意到其默认安装目录为：&amp;lt;code&amp;gt;C：Program Files\WindowsApps&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你需要拉内核源码的话后续会占用你大量C盘的空间，因此下一步我们对WSL进行迁移。&lt;br /&gt;
&lt;br /&gt;
我们首先打开 &amp;lt;code&amp;gt;powershell&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
随后输入 &amp;lt;code&amp;gt;wsl -l -v&amp;lt;/code&amp;gt;之后powershell会输出一段：&lt;br /&gt;
&lt;br /&gt;
NAME                      STATE           VERSION&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Ubuntu-20.04    Stopped         2&lt;br /&gt;
&lt;br /&gt;
确认目前状态为 Stopped 之后，我们输入：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;wsl --export Ubunut-20.04 D:\WSL\ubuntu-20.04.tar&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
将WSL的系统镜像导出到其他盘，随后注销目前系统的WSL&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;wsl --unregister Ubuntu-20.04&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
随后我们导入刚才导出的tar文件&amp;lt;code&amp;gt;wsl --import &amp;lt;导入名称&amp;gt; &amp;lt;导入盘的路径&amp;gt; &amp;lt;刚才导出的tar的路径&amp;gt; --version 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如根据上面的：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;wsl --import Ubuntu-20.04 D:\WSL D:\WSL\ubuntu-20.04.tar --version 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
随后再次打开即可&lt;br /&gt;
&lt;br /&gt;
===== 安装一些必要的工具依赖 =====&lt;br /&gt;
&amp;lt;code&amp;gt;apt-get update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt-get install -y build-essential bc bison python curl git zip ftp gcc-aarch64-linux-gnu gcc-arm-linux-gnueabi libssl-dev lftp wget libfl-dev gcc bc zip make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些依赖可以通过百度查到对应的作用，此处不赘述。&lt;br /&gt;
&lt;br /&gt;
如若你在编译时遇见提示缺依赖的情况，你也可以百度依赖的名字来查询解决方式。&lt;br /&gt;
&lt;br /&gt;
* 安装/下载交叉编译工具链&lt;br /&gt;
&lt;br /&gt;
'''Clang'''&lt;br /&gt;
&lt;br /&gt;
此处推荐两个 &lt;br /&gt;
&lt;br /&gt;
一个是Google官方提供的Clang编译器：[https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/ Google Clang]&lt;br /&gt;
&lt;br /&gt;
一个是由知名大佬kdrag0n 提供的预编译Clang：[https://github.com/kdrag0n/proton-clang Proton Clang]&lt;br /&gt;
&lt;br /&gt;
==== 拉取内核源码 ====&lt;br /&gt;
关于如何找到你的内核源码这件事，大部分内核源码在开源时都会参照以下命名规则命名&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;android_kernel_厂商_平台&amp;lt;/code&amp;gt; 例如 &amp;lt;code&amp;gt;android_kernel_xiaomi_sm8250&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在针对特定机型进行优化或者重构后的源码也会有开发者将其命名为&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;android_kernel_厂商_设备代号（或者机型名称）&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
设备代号请参照这里 ：[[设备代号收录集合]]&lt;br /&gt;
&lt;br /&gt;
我们一般可以在&amp;lt;code&amp;gt;Github&amp;lt;/code&amp;gt;找到这些源码&lt;br /&gt;
&lt;br /&gt;
如果您需要拉取ACK（Android Common Kernel）请前往Google OpenSource&lt;br /&gt;
&lt;br /&gt;
==== 设置环境变量并开始编译 ====&lt;br /&gt;
首先你需要进入你内核源码的目录，你也可以将下列的指令写在脚本里面&amp;lt;pre&amp;gt;&lt;br /&gt;
export CC='放clang的路径/bin/clang'&lt;br /&gt;
export CLANG_TRIPLE=aarch64-linux-gnu-&lt;br /&gt;
export CROSS_COMPILE='aarch64-linux-gnu编译器的路径/bin/aarch64-linux-gnu-'&lt;br /&gt;
export CROSS_COMPILE_ARM32='arm-linux-gnueabi编译器的路径/bin/arm-linux-gnueabi-'&lt;br /&gt;
export ARCH=arm64&lt;br /&gt;
export SUBARCH=arm64&lt;br /&gt;
export KBUILD_BUILD_HOST = &amp;quot;hostname&amp;quot;&lt;br /&gt;
export KBUILD_BUILD_USER = &amp;quot;username&amp;quot;&lt;br /&gt;
make O=out ''device''_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
这里需要注意的是，最后的&amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
取决于你编译的设备的代号，查看你设备的代号请见：[[设备代号收录集合]]&lt;br /&gt;
&lt;br /&gt;
而&amp;lt;code&amp;gt;defconfig&amp;lt;/code&amp;gt;则是你设备在内核中的配置文件，一套内核源码可能被多个设备共有。在编译的时候，make通过不同的配置文件来区分这些设备，这些配置文件在arch/[架构]/config下，在make的时候无需指定路径，直接输入配置文件名字即可。&amp;lt;ref&amp;gt;此处引用了 grislux55 在gitbook上的内核编译教程中针对配置文件的介绍，文末贴上了引用资料链接&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
举个简单的例子，内核源码就是一个大超市，&amp;lt;code&amp;gt;defconfig&amp;lt;/code&amp;gt;（'''购物清单'''）则负责告诉&amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;，'''你需要购买什么东西（对其进行编译），从而达成对设备驱动的区分'''&lt;br /&gt;
&lt;br /&gt;
=== 获取编译结果并刷入测试 ===&lt;br /&gt;
内核文件在[你的项目/输出路径/arch/目标内核架构/boot]下&lt;br /&gt;
&lt;br /&gt;
例如我们编译了xiaomi_sdm8250的内核，则在android_kernel_xiaomi_sm8250/out/arch/arm64/boot/里面&lt;br /&gt;
&lt;br /&gt;
其名为Image或者Image.gz或者Image.gz-dtb&lt;br /&gt;
&lt;br /&gt;
他们的区别在于&lt;br /&gt;
&lt;br /&gt;
随后你需要刷入测试，以前有一种方法是使用 Android Image Kitchen 来解开boot.img 并将你编译好的dtb替换进去，现在看来这种方法未免太不优雅，因此我们可以使用由osm0sis大佬开发的Anykernel3打包卡刷包文件，并可以在 TWRP REC 或者 Horizen Kernel Flasher内进行刷入附链接：&lt;br /&gt;
&lt;br /&gt;
[https://github.com/osm0sis/AnyKernel3 ①Anykernel3]   ②Horizen Kernel Flasher ③[https://twrp.me/ TWRP rec]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 资料参考： ===&lt;br /&gt;
[1] Gtibook 安卓内核编译教程：https://jebchou.gitbook.io/android-kernel-magic/02begin_compile&lt;br /&gt;
&lt;br /&gt;
[2] CSDN 安卓架构-内核：https://blog.csdn.net/weixin_40557160/article/details/128388849&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=869</id>
		<title>Android 分区详解</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=869"/>
		<updated>2024-08-18T14:39:23Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​加入vendor_boot&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Android 设备包含若干个分区，这些分区在Android启动和运行过程中发挥不同的作用。'''&lt;br /&gt;
&lt;br /&gt;
== 常见分区详解​ ==&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含一个内核映像，使用 &amp;lt;code&amp;gt;mkbootimg&amp;lt;/code&amp;gt; 创建。您可以使用虚拟分区直接刷写任意映像，而无需刷写新的 boot 分区。 此分区还包含在 Android 13 之前发布的设备中的通用 ramdisk。'''&lt;br /&gt;
&lt;br /&gt;
* kernel：&amp;lt;code&amp;gt;kernel&amp;lt;/code&amp;gt; 虚拟分区通过将新内核映像写入旧内核映像来覆盖内核（&amp;lt;code&amp;gt;zImage&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;zImage-dtb&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;Image.gz-dtb&amp;lt;/code&amp;gt;）。如果提供的开发内核不兼容，则可能需要使用关联的内核模块更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;dtb&amp;lt;/code&amp;gt; 分区（如果存在）。&lt;br /&gt;
&lt;br /&gt;
* ramdisk：&amp;lt;code&amp;gt;ramdisk&amp;lt;/code&amp;gt; 虚拟分区通过将新 ramdisk 映像写入旧 ramdisk 映像来覆盖 ramdisk。&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含发布时搭载 Android 13 及更高版本的设备的通用 ramdisk。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含 Android 框架。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;system_ext&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''由谷歌在 Android 11添加的一个新分区，可以使用 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 资源'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''许多 OEM 会自定义 AOSP 系统映像，以实现自己的功能并满足运营商的要求。不过，如果进行这类自定义，则无法针对多个软件 SKU 使用单个系统映像。映像必须各不相同，才能支持不同的语言区域、运营商等自定义。如果使用单独的 &amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt; 分区来包含自定义项，则可以针对多个软件 SKU 使用单个系统映像（&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 分区会托管可在众多软件 SKU 之间共享的通用代码）。&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区会继续托管 SoC 专属 BSP 代码，这类代码可以基于指定 SoC 在多台设备之间共享。'''&lt;br /&gt;
&lt;br /&gt;
'''使用单独的分区存在一些弊端，例如，难以管理磁盘空间（应该预留一定的空间满足未来增长的空间需求），以及难以在各分区之间维护稳定的应用二进制接口 (ABI)。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储在 OTA 过程中启动的恢复映像。支持无缝更新的设备可以将恢复映像存储为 &amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 映像中包含的 ramdisk（而不是单独的映像）。'''&lt;br /&gt;
&lt;br /&gt;
'''注意：某些厂商的VAB分区结构设备不包含recovery分区，他们会将recovery分区与boot分区合并，因此当你需要刷入第三方Recovery时需要使用命令：&amp;lt;code&amp;gt;fastboot boot boot.img(具体名称自定)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;cache&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储临时数据，如果设备使用无缝更新，则此分区是可选的。cache 分区并非必须可从引导加载程序写入，但必须可清空。此分区大小取决于设备类型和 &amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 上的可用空间。通常，50 MB 至 100 MB 就足够了。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;misc&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区供 recovery 分区使用，大小为 4 KB 或更大。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含用户安装的应用和数据，包括自定义数据。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;metadata&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区用于在设备使用元数据加密时存储元数据加密密钥。大小为 16 MB 或更大。此分区未经加密，且系统不会对其数据拍摄快照。数据会在设备恢复出厂设置时被清空。此分区的使用受到严格限制。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含原始设计制造商 (ODM) 对系统芯片 (SoC) 供应商板级支持包 (BSP) 的自定义设置。利用此类自定义设置，ODM 可以替换或自定义 SoC 组件，并在硬件抽象层 (HAL) 上为板级组件、守护程序和 ODM 特定的功能实现内核模块。此分区是可选的；通常情况下，它用于存储自定义设置，以便设备可以针对多个硬件 SKU 使用单个供应商映像。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区专门用于存储 ODM 内核模块。将 ODM 内核模块存储在 &amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区即可更新 ODM 内核模块。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含一些厂商私有的二进制文件以及驱动等内容，用于实现厂商特定功能以及服务，例如图像传感器，音频，显示等，具体作用可以参考于ODM分区，而在各大厂商的系统维护中，如今 一加 （OnePlus），小米（Xiaomi）等厂商也开始使用ODM分区来存放他们的私有驱动文件，即将 /odm 作为另一个 /vendor 分区处理。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区专门用于存储供应商内核模块。将供应商内核模块存储在 &amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区即可更新内核模块。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor_boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''Android 11 引入了通用内核映像 (GKI) 的概念。为了能够使用 GKI 轻松启动任意设备，Android 11 设备使用启动映像头文件版本 3，所有供应商专用信息都已从 &amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 分区分离出来并转移到新的 &amp;lt;code&amp;gt;vendor_boot&amp;lt;/code&amp;gt; 分区中，也就是在Android11中该分区由一个头文件、供应商 ramdisk 和设备树 blob (DTB) 组成。'''&lt;br /&gt;
&lt;br /&gt;
'''而相对的，在安卓12中使用的是版本4，此时该分区由一个头文件、供应商 ramdisk 区段（包含串联起来的所有供应商 ramdisk 片段）、设备树 blob (DTB) 和供应商 ramdisk 表组成。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含无线装置映像，只有包含无线装置且在专用分区中存储无线装置专用软件的设备才需要此分区。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;tos&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区用于存储 Trusty 操作系统的二进制映像文件，仅在设备包含 Trusty 时使用。Trusty 是 Google 的可信执行环境 (TEE) 操作系统实现，与 Android 并行运行。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;pvmfw&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储受保护的虚拟机固件 (pvmfw)，即在受保护的虚拟机中运行的第一个代码。如需了解详情，请参阅受保护的虚拟机固件。'''&lt;br /&gt;
&lt;br /&gt;
== System-as-root ==&lt;br /&gt;
在 Android 9 中，非 A/B 设备应采用 system-as-root，以便通过系统专用 OTA 进行更新。&lt;br /&gt;
&lt;br /&gt;
'''注意：如果设备使用的是 A/B 分区架构，则无需做出任何改动。'''&lt;br /&gt;
&lt;br /&gt;
与将 &amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt; 改为&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt;分区的A/B设备不同，非A/B设备必须保留单独的&amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt; 分区，因为它们没有后备插槽分区（例如，从 &amp;lt;code&amp;gt;boot_a&amp;lt;/code&amp;gt; 切换到 &amp;lt;code&amp;gt;boot_b&amp;lt;/code&amp;gt;）。如果在非A/B 设备上移除 &amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt;并使其与A/B架构类似，那么在&amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;分区更新失败时，恢复模式可能会遭到破坏。因此，对于非A/B设备来说，&amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt;分区必须作为单独的分区存在（不同于非A/B设备的&amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;），这意味着恢复映像将继续延迟更新（即如同 Android 9 之前的设备中那样）。&lt;br /&gt;
&lt;br /&gt;
对于SAR设备与先前的旧设备，最明显的区别便在于分区的挂载点上，见&amp;lt;!-- 此表基于谷歌官方文档再度绘制 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''（非AB设备）'''&lt;br /&gt;
[[文件:安卓SAR.png|缩略图|963x963像素|居中]]&lt;br /&gt;
== AB分区与无缝更新 ==&lt;br /&gt;
Android 有两种更新机制：A/B（无缝）更新和非 A/B 更新，支持无缝更新的系统分区类型有两种，一种是AB分区，一种是VAB分区。&lt;br /&gt;
&lt;br /&gt;
'''安卓系统从7.0开始引入新的OTA升级方式，叫做A/B系统。A/B系统就是设备上有A和B两套可以工作的系统（用户数据只有一份，为两套系统共用），而这样做的好处就是，当OTA进行失败时可以直接切换到另外一个未经OTA的槽位，从而防止设备变砖，而缺点也很明显——两套系统分区意味着其占据多原来一倍的大小。'''&lt;br /&gt;
&lt;br /&gt;
'''而在2020年9月9日，谷歌正式发布了Android11 代号 Android R，而伴随其发布，谷歌也向各大厂商几乎强制安利了一项技术，出厂安卓11的机型必须使用VAB架构 Android Virtual A/B ,而在后续版本Android 12/13 中又增加了 VABC (Virtual A/B with Compression)，增加了压缩功能。''' &lt;br /&gt;
&lt;br /&gt;
'''首先让我们来看一下传统分区与VAB分区的结构'''&lt;br /&gt;
[[文件:安卓分区结构对比2.png|缩略图|1029x1029像素|居中]]&lt;br /&gt;
&lt;br /&gt;
A-only 即仅有一套分区表的系统分区模式，而后面安卓引入了A-only 动态分区。动态分区的内容可以见下方。&lt;br /&gt;
&lt;br /&gt;
'''也就是说，在AB分区的设备中，system_a和system_b等ab分区是真实存在的，他们会占用空间，而在VAB中(以下以默认槽位A为例)，system_a和system_b并非同时存在，因此不会占据大量空间。无缝更新最大的优点在于：几乎无感，安全。'''&lt;br /&gt;
&lt;br /&gt;
OTA 更新可以在系统运行期间进行，不会打断正常的使用。在更新写入完成后，只需要重启一次切换槽位即可完成系统更新。如果 OTA因为刷机失败等原因导致无法启动，将继续启动先前的操作系统。&lt;br /&gt;
&lt;br /&gt;
更新包可以流式传输到 A/B 设备，因此在安装之前不需要先下载更新包。流式更新意味着用户没有必要在 /data 或 /cache 上留出足够的可用空间以存储更新包。&lt;br /&gt;
&lt;br /&gt;
相比之下A-Only设备则没有上述优点，因为只有一套系统分区，如果OTA失败则会直接导致设备无法开机&lt;br /&gt;
&lt;br /&gt;
'''空间占用对比：'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- 图源自Android Open Source Project --&amp;gt;[[文件:谷歌提供的图片.png|缩略图|897x897px|居中]]&lt;br /&gt;
&lt;br /&gt;
== 动态分区 ==&lt;br /&gt;
动态分区是 Android 的用户空间分区系统。使用此分区系统，您可以在无线下载 (OTA) 更新期间创建、销毁分区或者调整分区大小。借助动态分区，供应商无需担心各个分区（例如 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt;）的大小。取而代之的是，设备会分配一个 &amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 分区，其中的子分区可动态调整大小。各个分区映像不再需要为将来的 OTA 预留空间。相反，&amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 中剩余的可用空间还可用于所有动态分区。&lt;br /&gt;
&lt;br /&gt;
通俗的来讲，就是将常见的 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;system_ext&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt;等分区包括在&amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt;分区里面，而动态分区并不意味着super分区就是&lt;br /&gt;
&lt;br /&gt;
可以随意调节的，事实上可以动态调节的是super里面的分区，在总体大小保持固定的情况下，我们可以根据各个分区所需要使用的大小来动态分配。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 参考资料：             ==&lt;br /&gt;
①安卓常见分区：https://source.android.com/docs/core/architecture/partitions?hl=zh-cn#standard-partitions&lt;br /&gt;
&lt;br /&gt;
②安卓A/B系统分区：https://source.android.google.cn/docs/core/ota/ab?hl=zh-cn&lt;br /&gt;
&lt;br /&gt;
③安卓分区布局：https://source.android.google.cn/docs/core/architecture/bootloader/system-as-root?hl=zh-cn#ramdisk&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=868</id>
		<title>Android 分区详解</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=868"/>
		<updated>2024-08-18T14:30:54Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​修改动态分区内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Android 设备包含若干个分区，这些分区在Android启动和运行过程中发挥不同的作用。'''&lt;br /&gt;
&lt;br /&gt;
== 常见分区详解​ ==&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含一个内核映像，使用 &amp;lt;code&amp;gt;mkbootimg&amp;lt;/code&amp;gt; 创建。您可以使用虚拟分区直接刷写任意映像，而无需刷写新的 boot 分区。 此分区还包含在 Android 13 之前发布的设备中的通用 ramdisk。'''&lt;br /&gt;
&lt;br /&gt;
* kernel：&amp;lt;code&amp;gt;kernel&amp;lt;/code&amp;gt; 虚拟分区通过将新内核映像写入旧内核映像来覆盖内核（&amp;lt;code&amp;gt;zImage&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;zImage-dtb&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;Image.gz-dtb&amp;lt;/code&amp;gt;）。如果提供的开发内核不兼容，则可能需要使用关联的内核模块更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;dtb&amp;lt;/code&amp;gt; 分区（如果存在）。&lt;br /&gt;
&lt;br /&gt;
* ramdisk：&amp;lt;code&amp;gt;ramdisk&amp;lt;/code&amp;gt; 虚拟分区通过将新 ramdisk 映像写入旧 ramdisk 映像来覆盖 ramdisk。&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含发布时搭载 Android 13 及更高版本的设备的通用 ramdisk。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含 Android 框架。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;system_ext&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''由谷歌在 Android 11添加的一个新分区，可以使用 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 资源'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''许多 OEM 会自定义 AOSP 系统映像，以实现自己的功能并满足运营商的要求。不过，如果进行这类自定义，则无法针对多个软件 SKU 使用单个系统映像。映像必须各不相同，才能支持不同的语言区域、运营商等自定义。如果使用单独的 &amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt; 分区来包含自定义项，则可以针对多个软件 SKU 使用单个系统映像（&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 分区会托管可在众多软件 SKU 之间共享的通用代码）。&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区会继续托管 SoC 专属 BSP 代码，这类代码可以基于指定 SoC 在多台设备之间共享。'''&lt;br /&gt;
&lt;br /&gt;
'''使用单独的分区存在一些弊端，例如，难以管理磁盘空间（应该预留一定的空间满足未来增长的空间需求），以及难以在各分区之间维护稳定的应用二进制接口 (ABI)。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储在 OTA 过程中启动的恢复映像。支持无缝更新的设备可以将恢复映像存储为 &amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 映像中包含的 ramdisk（而不是单独的映像）。'''&lt;br /&gt;
&lt;br /&gt;
'''注意：某些厂商的VAB分区结构设备不包含recovery分区，他们会将recovery分区与boot分区合并，因此当你需要刷入第三方Recovery时需要使用命令：&amp;lt;code&amp;gt;fastboot boot boot.img(具体名称自定)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;cache&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储临时数据，如果设备使用无缝更新，则此分区是可选的。cache 分区并非必须可从引导加载程序写入，但必须可清空。此分区大小取决于设备类型和 &amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 上的可用空间。通常，50 MB 至 100 MB 就足够了。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;misc&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区供 recovery 分区使用，大小为 4 KB 或更大。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含用户安装的应用和数据，包括自定义数据。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;metadata&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区用于在设备使用元数据加密时存储元数据加密密钥。大小为 16 MB 或更大。此分区未经加密，且系统不会对其数据拍摄快照。数据会在设备恢复出厂设置时被清空。此分区的使用受到严格限制。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含原始设计制造商 (ODM) 对系统芯片 (SoC) 供应商板级支持包 (BSP) 的自定义设置。利用此类自定义设置，ODM 可以替换或自定义 SoC 组件，并在硬件抽象层 (HAL) 上为板级组件、守护程序和 ODM 特定的功能实现内核模块。此分区是可选的；通常情况下，它用于存储自定义设置，以便设备可以针对多个硬件 SKU 使用单个供应商映像。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区专门用于存储 ODM 内核模块。将 ODM 内核模块存储在 &amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区即可更新 ODM 内核模块。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含一些厂商私有的二进制文件以及驱动等内容，用于实现厂商特定功能以及服务，例如图像传感器，音频，显示等，具体作用可以参考于ODM分区，而在各大厂商的系统维护中，如今 一加 （OnePlus），小米（Xiaomi）等厂商也开始使用ODM分区来存放他们的私有驱动文件，即将 /odm 作为另一个 /vendor 分区处理。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区专门用于存储供应商内核模块。将供应商内核模块存储在 &amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区即可更新内核模块。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含无线装置映像，只有包含无线装置且在专用分区中存储无线装置专用软件的设备才需要此分区。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;tos&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区用于存储 Trusty 操作系统的二进制映像文件，仅在设备包含 Trusty 时使用。Trusty 是 Google 的可信执行环境 (TEE) 操作系统实现，与 Android 并行运行。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;pvmfw&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储受保护的虚拟机固件 (pvmfw)，即在受保护的虚拟机中运行的第一个代码。如需了解详情，请参阅受保护的虚拟机固件。'''&lt;br /&gt;
&lt;br /&gt;
== System-as-root ==&lt;br /&gt;
在 Android 9 中，非 A/B 设备应采用 system-as-root，以便通过系统专用 OTA 进行更新。&lt;br /&gt;
&lt;br /&gt;
'''注意：如果设备使用的是 A/B 分区架构，则无需做出任何改动。'''&lt;br /&gt;
&lt;br /&gt;
与将 &amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt; 改为&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt;分区的A/B设备不同，非A/B设备必须保留单独的&amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt; 分区，因为它们没有后备插槽分区（例如，从 &amp;lt;code&amp;gt;boot_a&amp;lt;/code&amp;gt; 切换到 &amp;lt;code&amp;gt;boot_b&amp;lt;/code&amp;gt;）。如果在非A/B 设备上移除 &amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt;并使其与A/B架构类似，那么在&amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;分区更新失败时，恢复模式可能会遭到破坏。因此，对于非A/B设备来说，&amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt;分区必须作为单独的分区存在（不同于非A/B设备的&amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;），这意味着恢复映像将继续延迟更新（即如同 Android 9 之前的设备中那样）。&lt;br /&gt;
&lt;br /&gt;
对于SAR设备与先前的旧设备，最明显的区别便在于分区的挂载点上，见&amp;lt;!-- 此表基于谷歌官方文档再度绘制 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''（非AB设备）'''&lt;br /&gt;
[[文件:安卓SAR.png|缩略图|963x963像素|居中]]&lt;br /&gt;
== AB分区与无缝更新 ==&lt;br /&gt;
Android 有两种更新机制：A/B（无缝）更新和非 A/B 更新，支持无缝更新的系统分区类型有两种，一种是AB分区，一种是VAB分区。&lt;br /&gt;
&lt;br /&gt;
'''安卓系统从7.0开始引入新的OTA升级方式，叫做A/B系统。A/B系统就是设备上有A和B两套可以工作的系统（用户数据只有一份，为两套系统共用），而这样做的好处就是，当OTA进行失败时可以直接切换到另外一个未经OTA的槽位，从而防止设备变砖，而缺点也很明显——两套系统分区意味着其占据多原来一倍的大小。'''&lt;br /&gt;
&lt;br /&gt;
'''而在2020年9月9日，谷歌正式发布了Android11 代号 Android R，而伴随其发布，谷歌也向各大厂商几乎强制安利了一项技术，出厂安卓11的机型必须使用VAB架构 Android Virtual A/B ,而在后续版本Android 12/13 中又增加了 VABC (Virtual A/B with Compression)，增加了压缩功能。''' &lt;br /&gt;
&lt;br /&gt;
'''首先让我们来看一下传统分区与VAB分区的结构'''&lt;br /&gt;
[[文件:安卓分区结构对比2.png|缩略图|1029x1029像素|居中]]&lt;br /&gt;
&lt;br /&gt;
A-only 即仅有一套分区表的系统分区模式，而后面安卓引入了A-only 动态分区。动态分区的内容可以见下方。&lt;br /&gt;
&lt;br /&gt;
'''也就是说，在AB分区的设备中，system_a和system_b等ab分区是真实存在的，他们会占用空间，而在VAB中(以下以默认槽位A为例)，system_a和system_b并非同时存在，因此不会占据大量空间。无缝更新最大的优点在于：几乎无感，安全。'''&lt;br /&gt;
&lt;br /&gt;
OTA 更新可以在系统运行期间进行，不会打断正常的使用。在更新写入完成后，只需要重启一次切换槽位即可完成系统更新。如果 OTA因为刷机失败等原因导致无法启动，将继续启动先前的操作系统。&lt;br /&gt;
&lt;br /&gt;
更新包可以流式传输到 A/B 设备，因此在安装之前不需要先下载更新包。流式更新意味着用户没有必要在 /data 或 /cache 上留出足够的可用空间以存储更新包。&lt;br /&gt;
&lt;br /&gt;
相比之下A-Only设备则没有上述优点，因为只有一套系统分区，如果OTA失败则会直接导致设备无法开机&lt;br /&gt;
&lt;br /&gt;
'''空间占用对比：'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- 图源自Android Open Source Project --&amp;gt;[[文件:谷歌提供的图片.png|缩略图|897x897px|居中]]&lt;br /&gt;
&lt;br /&gt;
== 动态分区 ==&lt;br /&gt;
动态分区是 Android 的用户空间分区系统。使用此分区系统，您可以在无线下载 (OTA) 更新期间创建、销毁分区或者调整分区大小。借助动态分区，供应商无需担心各个分区（例如 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt;）的大小。取而代之的是，设备会分配一个 &amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 分区，其中的子分区可动态调整大小。各个分区映像不再需要为将来的 OTA 预留空间。相反，&amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 中剩余的可用空间还可用于所有动态分区。&lt;br /&gt;
&lt;br /&gt;
通俗的来讲，就是将常见的 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;system_ext&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt;等分区包括在&amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt;分区里面，而动态分区并不意味着super分区就是&lt;br /&gt;
&lt;br /&gt;
可以随意调节的，事实上可以动态调节的是super里面的分区，在总体大小保持固定的情况下，我们可以根据各个分区所需要使用的大小来动态分配。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 参考资料：             ==&lt;br /&gt;
①安卓常见分区：https://source.android.com/docs/core/architecture/partitions?hl=zh-cn#standard-partitions&lt;br /&gt;
&lt;br /&gt;
②安卓A/B系统分区：https://source.android.google.cn/docs/core/ota/ab?hl=zh-cn&lt;br /&gt;
&lt;br /&gt;
③安卓分区布局：https://source.android.google.cn/docs/core/architecture/bootloader/system-as-root?hl=zh-cn#ramdisk&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=864</id>
		<title>Android 分区详解</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=864"/>
		<updated>2024-08-18T14:03:40Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​修改部分内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Android 设备包含若干个分区，这些分区在Android启动和运行过程中发挥不同的作用。&lt;br /&gt;
&lt;br /&gt;
部分 A/B 设备为了支持无缝更新，把 boot、system、vendor 和 radio 配置了两个槽位（如：&amp;lt;code&amp;gt;system_a&amp;lt;/code&amp;gt;，&amp;lt;code&amp;gt;system_b&amp;lt;/code&amp;gt;）。&lt;br /&gt;
&lt;br /&gt;
== 常见分区详解​ ==&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含一个内核映像，使用 &amp;lt;code&amp;gt;mkbootimg&amp;lt;/code&amp;gt; 创建。您可以使用虚拟分区直接刷写任意映像，而无需刷写新的 boot 分区。 此分区还包含在 Android 13 之前发布的设备中的通用 ramdisk。'''&lt;br /&gt;
&lt;br /&gt;
* kernel：&amp;lt;code&amp;gt;kernel&amp;lt;/code&amp;gt; 虚拟分区通过将新内核映像写入旧内核映像来覆盖内核（&amp;lt;code&amp;gt;zImage&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;zImage-dtb&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;Image.gz-dtb&amp;lt;/code&amp;gt;）。如果提供的开发内核不兼容，则可能需要使用关联的内核模块更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;dtb&amp;lt;/code&amp;gt; 分区（如果存在）。&lt;br /&gt;
&lt;br /&gt;
* ramdisk：&amp;lt;code&amp;gt;ramdisk&amp;lt;/code&amp;gt; 虚拟分区通过将新 ramdisk 映像写入旧 ramdisk 映像来覆盖 ramdisk。&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含发布时搭载 Android 13 及更高版本的设备的通用 ramdisk。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含 Android 框架。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;system_ext&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''由谷歌在 Android 11添加的一个新分区，可以使用 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 资源'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储在 OTA 过程中启动的恢复映像。支持无缝更新的设备可以将恢复映像存储为 &amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 映像中包含的 ramdisk（而不是单独的映像）。'''&lt;br /&gt;
&lt;br /&gt;
'''注意：某些厂商的VAB分区结构设备不包含recovery分区，他们会将recovery分区与boot分区合并，因此当你需要刷入第三方Recovery时需要使用命令：&amp;lt;code&amp;gt;fastboot boot boot.img(具体名称自定)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;cache&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储临时数据，如果设备使用无缝更新，则此分区是可选的。cache 分区并非必须可从引导加载程序写入，但必须可清空。此分区大小取决于设备类型和 &amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 上的可用空间。通常，50 MB 至 100 MB 就足够了。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;misc&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区供 recovery 分区使用，大小为 4 KB 或更大。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含用户安装的应用和数据，包括自定义数据。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;metadata&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区用于在设备使用元数据加密时存储元数据加密密钥。大小为 16 MB 或更大。此分区未经加密，且系统不会对其数据拍摄快照。数据会在设备恢复出厂设置时被清空。此分区的使用受到严格限制。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含原始设计制造商 (ODM) 对系统芯片 (SoC) 供应商板级支持包 (BSP) 的自定义设置。利用此类自定义设置，ODM 可以替换或自定义 SoC 组件，并在硬件抽象层 (HAL) 上为板级组件、守护程序和 ODM 特定的功能实现内核模块。此分区是可选的；通常情况下，它用于存储自定义设置，以便设备可以针对多个硬件 SKU 使用单个供应商映像。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区专门用于存储 ODM 内核模块。将 ODM 内核模块存储在 &amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区即可更新 ODM 内核模块。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含一些厂商私有的二进制文件以及驱动等内容，用于实现厂商特定功能以及服务，例如图像传感器，音频，显示等，具体作用可以参考于ODM分区，而在各大厂商的系统维护中，如今 一加 （OnePlus），小米（Xiaomi）等厂商也开始使用ODM分区来存放他们的私有驱动文件，即将 /odm 作为另一个 /vendor 分区处理。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区专门用于存储供应商内核模块。将供应商内核模块存储在 &amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区即可更新内核模块。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含无线装置映像，只有包含无线装置且在专用分区中存储无线装置专用软件的设备才需要此分区。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;tos&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区用于存储 Trusty 操作系统的二进制映像文件，仅在设备包含 Trusty 时使用。Trusty 是 Google 的可信执行环境 (TEE) 操作系统实现，与 Android 并行运行。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;pvmfw&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储受保护的虚拟机固件 (pvmfw)，即在受保护的虚拟机中运行的第一个代码。如需了解详情，请参阅受保护的虚拟机固件。'''&lt;br /&gt;
&lt;br /&gt;
== 动态分区 ==&lt;br /&gt;
搭载 Android 11 及更高版本的设备可以支持动态分区，此类分区属于 Android 的用户空间分区系统，支持在无线下载 (OTA) 更新期间创建和销毁分区以及调整分区大小。使用此分区系统，您可以在无线下载 (OTA) 更新期间创建、销毁分区或者调整分区大小。借助动态分区，供应商无需担心各个分区（例如 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt;）的大小。取而代之的是，设备会分配一个 &amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 分区，其中的子分区可动态调整大小。各个分区映像不再需要为将来的 OTA 预留空间。相反，&amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 中剩余的可用空间还可用于所有动态分区。&lt;br /&gt;
&lt;br /&gt;
== 关于 system-as-root ==&lt;br /&gt;
在 Android 9 中，非 A/B 设备应采用 system-as-root，以便通过系统专用 OTA 进行更新。&lt;br /&gt;
&lt;br /&gt;
'''注意：如果设备使用的是 A/B 分区架构，则无需做出任何改动。'''&lt;br /&gt;
&lt;br /&gt;
与将 &amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt; 改为&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt;分区的A/B设备不同，非A/B设备必须保留单独的&amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt; 分区，因为它们没有后备插槽分区（例如，从 &amp;lt;code&amp;gt;boot_a&amp;lt;/code&amp;gt; 切换到 &amp;lt;code&amp;gt;boot_b&amp;lt;/code&amp;gt;）。如果在非A/B 设备上移除 &amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt;并使其与A/B架构类似，那么在&amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;分区更新失败时，恢复模式可能会遭到破坏。因此，对于非A/B设备来说，&amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt;分区必须作为单独的分区存在（不同于非A/B设备的&amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;），这意味着恢复映像将继续延迟更新（即如同 Android 9 之前的设备中那样）。&lt;br /&gt;
&lt;br /&gt;
对于SAR设备与先前的旧设备，最明显的区别便在于分区的挂载点上，见&amp;lt;!-- 此表基于谷歌官方文档再度绘制 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''（非AB设备）'''&lt;br /&gt;
[[文件:安卓SAR.png|左|缩略图|963x963像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== AB分区与无缝更新 ==&lt;br /&gt;
Android 有两种更新机制：A/B（无缝）更新和非 A/B 更新，支持无缝更新的系统分区类型有两种，一种是AB分区，一种是VAB分区。&lt;br /&gt;
&lt;br /&gt;
'''安卓系统从7.0开始引入新的OTA升级方式，叫做A/B系统。A/B系统就是设备上有A和B两套可以工作的系统（用户数据只有一份，为两套系统共用），而这样做的好处就是，当OTA进行失败时可以直接切换到另外一个未经OTA的槽位，从而防止设备变砖，而缺点也很明显——两套系统分区意味着其占据多原来一倍的大小。'''&lt;br /&gt;
&lt;br /&gt;
'''而在2020年9月9日，谷歌正式发布了Android11 代号 Android R，而伴随其发布，谷歌也向各大厂商几乎强制安利了一项技术，出厂安卓11的机型必须使用VAB架构 Android Virtual A/B ,而在后续版本Android 12/13 中又增加了 VABC (Virtual A/B with Compression)，增加了压缩功能。''' &lt;br /&gt;
&lt;br /&gt;
'''首先让我们来看一下传统分区与VAB分区的结构'''&lt;br /&gt;
[[文件:安卓分区结构对比2.png|左|缩略图|1029x1029像素]]&lt;br /&gt;
&lt;br /&gt;
'''也就是说，在AB分区的设备中，system_a和system_b等ab分区是真实存在的，他们会占用空间，而在VAB中(以下以默认槽位A为例)，system_a和system_b并非同时存在，因此不会占据大量空间。无缝更新最大的优点在于：几乎无感，安全。'''&lt;br /&gt;
&lt;br /&gt;
OTA 更新可以在系统运行期间进行，不会打断正常的使用。在更新写入完成后，只需要重启一次切换槽位即可完成系统更新。如果 OTA因为刷机失败等原因导致无法启动，将继续启动先前的操作系统。&lt;br /&gt;
&lt;br /&gt;
更新包可以流式传输到 A/B 设备，因此在安装之前不需要先下载更新包。流式更新意味着用户没有必要在 /data 或 /cache 上留出足够的可用空间以存储更新包。&lt;br /&gt;
&lt;br /&gt;
相比之下A-Only设备则没有上述优点，因为只有一套系统分区，如果OTA失败则会直接导致设备无法开机&lt;br /&gt;
&lt;br /&gt;
'''空间占用对比'''&amp;lt;!-- 图源自Android Open Source Project --&amp;gt;'''：'''&lt;br /&gt;
[[文件:谷歌提供的图片.png|左|缩略图|897x897px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 参考资料：             ==&lt;br /&gt;
①安卓常见分区：https://source.android.com/docs/core/architecture/partitions?hl=zh-cn#standard-partitions&lt;br /&gt;
&lt;br /&gt;
②安卓A/B系统分区：https://source.android.google.cn/docs/core/ota/ab?hl=zh-cn&lt;br /&gt;
&lt;br /&gt;
③安卓分区布局：https://source.android.google.cn/docs/core/architecture/bootloader/system-as-root?hl=zh-cn#ramdisk&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E5%AE%89%E5%8D%93SAR.png&amp;diff=863</id>
		<title>文件:安卓SAR.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E5%AE%89%E5%8D%93SAR.png&amp;diff=863"/>
		<updated>2024-08-18T13:58:07Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SAR&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=862</id>
		<title>Android 分区详解</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=862"/>
		<updated>2024-08-18T13:48:47Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​修正内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Android 设备包含若干个分区，这些分区在Android启动和运行过程中发挥不同的作用。&lt;br /&gt;
&lt;br /&gt;
部分 A/B 设备为了支持无缝更新，把 boot、system、vendor 和 radio 配置了两个槽位（如：&amp;lt;code&amp;gt;system_a&amp;lt;/code&amp;gt;，&amp;lt;code&amp;gt;system_b&amp;lt;/code&amp;gt;）。&lt;br /&gt;
&lt;br /&gt;
== 常见分区详解​ ==&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含一个内核映像，使用 &amp;lt;code&amp;gt;mkbootimg&amp;lt;/code&amp;gt; 创建。您可以使用虚拟分区直接刷写任意映像，而无需刷写新的 boot 分区。 此分区还包含在 Android 13 之前发布的设备中的通用 ramdisk。'''&lt;br /&gt;
&lt;br /&gt;
* kernel：&amp;lt;code&amp;gt;kernel&amp;lt;/code&amp;gt; 虚拟分区通过将新内核映像写入旧内核映像来覆盖内核（&amp;lt;code&amp;gt;zImage&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;zImage-dtb&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;Image.gz-dtb&amp;lt;/code&amp;gt;）。如果提供的开发内核不兼容，则可能需要使用关联的内核模块更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;dtb&amp;lt;/code&amp;gt; 分区（如果存在）。&lt;br /&gt;
&lt;br /&gt;
* ramdisk：&amp;lt;code&amp;gt;ramdisk&amp;lt;/code&amp;gt; 虚拟分区通过将新 ramdisk 映像写入旧 ramdisk 映像来覆盖 ramdisk。&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含发布时搭载 Android 13 及更高版本的设备的通用 ramdisk。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含 Android 框架。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储在 OTA 过程中启动的恢复映像。支持无缝更新的设备可以将恢复映像存储为 &amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 映像中包含的 ramdisk（而不是单独的映像）。'''&lt;br /&gt;
&lt;br /&gt;
'''注意：某些厂商的VAB分区结构设备不包含recovery分区，他们会将recovery分区与boot分区合并，因此当你需要刷入第三方Recovery时需要使用命令：&amp;lt;code&amp;gt;fastboot boot boot.img(具体名称自定)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;cache&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储临时数据，如果设备使用无缝更新，则此分区是可选的。cache 分区并非必须可从引导加载程序写入，但必须可清空。此分区大小取决于设备类型和 &amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 上的可用空间。通常，50 MB 至 100 MB 就足够了。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;misc&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区供 recovery 分区使用，大小为 4 KB 或更大。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含用户安装的应用和数据，包括自定义数据。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;metadata&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区用于在设备使用元数据加密时存储元数据加密密钥。大小为 16 MB 或更大。此分区未经加密，且系统不会对其数据拍摄快照。数据会在设备恢复出厂设置时被清空。此分区的使用受到严格限制。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含原始设计制造商 (ODM) 对系统芯片 (SoC) 供应商板级支持包 (BSP) 的自定义设置。利用此类自定义设置，ODM 可以替换或自定义 SoC 组件，并在硬件抽象层 (HAL) 上为板级组件、守护程序和 ODM 特定的功能实现内核模块。此分区是可选的；通常情况下，它用于存储自定义设置，以便设备可以针对多个硬件 SKU 使用单个供应商映像。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区专门用于存储 ODM 内核模块。将 ODM 内核模块存储在 &amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区即可更新 ODM 内核模块。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含一些厂商私有的二进制文件以及驱动等内容，用于实现厂商特定功能以及服务，例如图像传感器，音频，显示等，具体作用可以参考于ODM分区，而在各大厂商的系统维护中，如今 一加 （OnePlus），小米（Xiaomi）等厂商也开始使用ODM分区来存放他们的私有驱动文件，即将 /odm 作为另一个 /vendor 分区处理。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区专门用于存储供应商内核模块。将供应商内核模块存储在 &amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区即可更新内核模块。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含无线装置映像，只有包含无线装置且在专用分区中存储无线装置专用软件的设备才需要此分区。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;tos&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区用于存储 Trusty 操作系统的二进制映像文件，仅在设备包含 Trusty 时使用。Trusty 是 Google 的可信执行环境 (TEE) 操作系统实现，与 Android 并行运行。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;pvmfw&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储受保护的虚拟机固件 (pvmfw)，即在受保护的虚拟机中运行的第一个代码。如需了解详情，请参阅受保护的虚拟机固件。'''&lt;br /&gt;
&lt;br /&gt;
== 动态分区 ==&lt;br /&gt;
搭载 Android 11 及更高版本的设备可以支持动态分区，此类分区属于 Android 的用户空间分区系统，支持在无线下载 (OTA) 更新期间创建和销毁分区以及调整分区大小。使用此分区系统，您可以在无线下载 (OTA) 更新期间创建、销毁分区或者调整分区大小。借助动态分区，供应商无需担心各个分区（例如 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt;）的大小。取而代之的是，设备会分配一个 &amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 分区，其中的子分区可动态调整大小。各个分区映像不再需要为将来的 OTA 预留空间。相反，&amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 中剩余的可用空间还可用于所有动态分区。&lt;br /&gt;
&lt;br /&gt;
== 关于 system-as-root ==&lt;br /&gt;
在 Android 9 中，非 A/B 设备应采用 system-as-root，以便通过系统专用 OTA 进行更新。&lt;br /&gt;
&lt;br /&gt;
'''注意：如果设备使用的是 A/B 分区架构，则无需做出任何改动。'''&lt;br /&gt;
&lt;br /&gt;
与将 &amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt; 改为&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt;分区的A/B设备不同，非A/B设备必须保留单独的&amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt; 分区，因为它们没有后备插槽分区（例如，从 &amp;lt;code&amp;gt;boot_a&amp;lt;/code&amp;gt; 切换到 &amp;lt;code&amp;gt;boot_b&amp;lt;/code&amp;gt;）。如果在非A/B 设备上移除 &amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt;并使其与A/B架构类似，那么在&amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;分区更新失败时，恢复模式可能会遭到破坏。因此，对于非A/B设备来说，&amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt;分区必须作为单独的分区存在（不同于非A/B设备的&amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;），这意味着恢复映像将继续延迟更新（即如同 Android 9 之前的设备中那样）。&lt;br /&gt;
&lt;br /&gt;
对于SAR设备与先前的旧设备，最明显的区别便在于分区的挂载点上，见&amp;lt;!-- 此表基于谷歌官方文档再度绘制 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''（非AB设备）'''&lt;br /&gt;
[[文件:Boot.png|左|缩略图|951x951像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:System.png|左|缩略图|960x960像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== AB分区与无缝更新 ==&lt;br /&gt;
Android 有两种更新机制：A/B（无缝）更新和非 A/B 更新，支持无缝更新的系统分区类型有两种，一种是AB分区，一种是VAB分区。&lt;br /&gt;
&lt;br /&gt;
'''安卓系统从7.0开始引入新的OTA升级方式，叫做A/B系统。A/B系统就是设备上有A和B两套可以工作的系统（用户数据只有一份，为两套系统共用），而这样做的好处就是，当OTA进行失败时可以直接切换到另外一个未经OTA的槽位，从而防止设备变砖，而缺点也很明显——两套系统分区意味着其占据多原来一倍的大小。'''&lt;br /&gt;
&lt;br /&gt;
'''而在2020年9月9日，谷歌正式发布了Android11 代号 Android R，而伴随其发布，谷歌也向各大厂商几乎强制安利了一项技术，出厂安卓11的机型必须使用VAB架构 Android Virtual A/B ,而在后续版本Android 12/13 中又增加了 VABC (Virtual A/B with Compression)，增加了压缩功能。''' &lt;br /&gt;
&lt;br /&gt;
'''首先让我们来看一下传统分区与VAB分区的结构'''&lt;br /&gt;
[[文件:安卓分区结构对比2.png|左|缩略图|1029x1029像素]]&lt;br /&gt;
&lt;br /&gt;
'''也就是说，在AB分区的设备中，system_a和system_b等ab分区是真实存在的，他们会占用空间，而在VAB中(以下以默认槽位A为例)，system_a和system_b并非同时存在，因此不会占据大量空间。无缝更新最大的优点在于：几乎无感，安全。'''&lt;br /&gt;
&lt;br /&gt;
OTA 更新可以在系统运行期间进行，不会打断正常的使用。在更新写入完成后，只需要重启一次切换槽位即可完成系统更新。如果 OTA因为刷机失败等原因导致无法启动，将继续启动先前的操作系统。&lt;br /&gt;
&lt;br /&gt;
更新包可以流式传输到 A/B 设备，因此在安装之前不需要先下载更新包。流式更新意味着用户没有必要在 /data 或 /cache 上留出足够的可用空间以存储更新包。&lt;br /&gt;
&lt;br /&gt;
相比之下A-Only设备则没有上述优点，因为只有一套系统分区，如果OTA失败则会直接导致设备无法开机&lt;br /&gt;
&lt;br /&gt;
'''空间占用对比'''&amp;lt;!-- 图源自Android Open Source Project --&amp;gt;'''：'''&lt;br /&gt;
[[文件:谷歌提供的图片.png|左|缩略图|897x897px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 参考资料：             ==&lt;br /&gt;
①安卓常见分区：https://source.android.com/docs/core/architecture/partitions?hl=zh-cn#standard-partitions&lt;br /&gt;
&lt;br /&gt;
②安卓A/B系统分区：https://source.android.google.cn/docs/core/ota/ab?hl=zh-cn&lt;br /&gt;
&lt;br /&gt;
③安卓分区布局：https://source.android.google.cn/docs/core/architecture/bootloader/system-as-root?hl=zh-cn#ramdisk&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:System.png&amp;diff=861</id>
		<title>文件:System.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:System.png&amp;diff=861"/>
		<updated>2024-08-18T13:47:56Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;system&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:Boot.png&amp;diff=860</id>
		<title>文件:Boot.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:Boot.png&amp;diff=860"/>
		<updated>2024-08-18T13:46:39Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;boot&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=857</id>
		<title>Android 分区详解</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=857"/>
		<updated>2024-08-18T13:40:43Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​修改部分内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Android 设备包含若干个分区，这些分区在Android启动和运行过程中发挥不同的作用。&lt;br /&gt;
&lt;br /&gt;
部分 A/B 设备为了支持无缝更新，把 boot、system、vendor 和 radio 配置了两个槽位（如：&amp;lt;code&amp;gt;system_a&amp;lt;/code&amp;gt;，&amp;lt;code&amp;gt;system_b&amp;lt;/code&amp;gt;）。&lt;br /&gt;
&lt;br /&gt;
== 常见分区详解​ ==&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含一个内核映像，使用 &amp;lt;code&amp;gt;mkbootimg&amp;lt;/code&amp;gt; 创建。您可以使用虚拟分区直接刷写任意映像，而无需刷写新的 boot 分区。 此分区还包含在 Android 13 之前发布的设备中的通用 ramdisk。'''&lt;br /&gt;
&lt;br /&gt;
* kernel：&amp;lt;code&amp;gt;kernel&amp;lt;/code&amp;gt; 虚拟分区通过将新内核映像写入旧内核映像来覆盖内核（&amp;lt;code&amp;gt;zImage&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;zImage-dtb&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;Image.gz-dtb&amp;lt;/code&amp;gt;）。如果提供的开发内核不兼容，则可能需要使用关联的内核模块更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;dtb&amp;lt;/code&amp;gt; 分区（如果存在）。&lt;br /&gt;
&lt;br /&gt;
* ramdisk：&amp;lt;code&amp;gt;ramdisk&amp;lt;/code&amp;gt; 虚拟分区通过将新 ramdisk 映像写入旧 ramdisk 映像来覆盖 ramdisk。&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含发布时搭载 Android 13 及更高版本的设备的通用 ramdisk。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含 Android 框架。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储在 OTA 过程中启动的恢复映像。支持无缝更新的设备可以将恢复映像存储为 &amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 映像中包含的 ramdisk（而不是单独的映像）。'''&lt;br /&gt;
&lt;br /&gt;
'''注意：某些厂商的VAB分区结构设备不包含recovery分区，他们会将recovery分区与boot分区合并，因此当你需要刷入第三方Recovery时需要使用命令：&amp;lt;code&amp;gt;fastboot boot boot.img(具体名称自定)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;cache&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储临时数据，如果设备使用无缝更新，则此分区是可选的。cache 分区并非必须可从引导加载程序写入，但必须可清空。此分区大小取决于设备类型和 &amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 上的可用空间。通常，50 MB 至 100 MB 就足够了。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;misc&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区供 recovery 分区使用，大小为 4 KB 或更大。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含用户安装的应用和数据，包括自定义数据。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;metadata&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区用于在设备使用元数据加密时存储元数据加密密钥。大小为 16 MB 或更大。此分区未经加密，且系统不会对其数据拍摄快照。数据会在设备恢复出厂设置时被清空。此分区的使用受到严格限制。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含原始设计制造商 (ODM) 对系统芯片 (SoC) 供应商板级支持包 (BSP) 的自定义设置。利用此类自定义设置，ODM 可以替换或自定义 SoC 组件，并在硬件抽象层 (HAL) 上为板级组件、守护程序和 ODM 特定的功能实现内核模块。此分区是可选的；通常情况下，它用于存储自定义设置，以便设备可以针对多个硬件 SKU 使用单个供应商映像。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区专门用于存储 ODM 内核模块。将 ODM 内核模块存储在 &amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区即可更新 ODM 内核模块。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含一些厂商私有的二进制文件以及驱动等内容，用于实现厂商特定功能以及服务，例如图像传感器，音频，显示等，具体作用可以参考于ODM分区，而在各大厂商的系统维护中，如今 一加 （OnePlus），小米（Xiaomi）等厂商也开始使用ODM分区来存放他们的私有驱动文件，即将 /odm 作为另一个 /vendor 分区处理。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区专门用于存储供应商内核模块。将供应商内核模块存储在 &amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区即可更新内核模块。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含无线装置映像，只有包含无线装置且在专用分区中存储无线装置专用软件的设备才需要此分区。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;tos&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区用于存储 Trusty 操作系统的二进制映像文件，仅在设备包含 Trusty 时使用。Trusty 是 Google 的可信执行环境 (TEE) 操作系统实现，与 Android 并行运行。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;pvmfw&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储受保护的虚拟机固件 (pvmfw)，即在受保护的虚拟机中运行的第一个代码。如需了解详情，请参阅受保护的虚拟机固件。'''&lt;br /&gt;
&lt;br /&gt;
== 动态分区 ==&lt;br /&gt;
搭载 Android 11 及更高版本的设备可以支持动态分区，此类分区属于 Android 的用户空间分区系统，支持在无线下载 (OTA) 更新期间创建和销毁分区以及调整分区大小。使用此分区系统，您可以在无线下载 (OTA) 更新期间创建、销毁分区或者调整分区大小。借助动态分区，供应商无需担心各个分区（例如 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt;）的大小。取而代之的是，设备会分配一个 &amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 分区，其中的子分区可动态调整大小。各个分区映像不再需要为将来的 OTA 预留空间。相反，&amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 中剩余的可用空间还可用于所有动态分区。&lt;br /&gt;
&lt;br /&gt;
== 关于 system-as-root ==&lt;br /&gt;
在 Android 9 中，非 A/B 设备应采用 system-as-root，以便通过系统专用 OTA 进行更新。&lt;br /&gt;
&lt;br /&gt;
'''注意：如果设备使用的是 A/B 分区架构，则无需做出任何改动。'''&lt;br /&gt;
&lt;br /&gt;
与将 &amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt; 改为&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt;分区的A/B设备不同，非A/B设备必须保留单独的&amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt; 分区，因为它们没有后备插槽分区（例如，从 &amp;lt;code&amp;gt;boot_a&amp;lt;/code&amp;gt; 切换到 &amp;lt;code&amp;gt;boot_b&amp;lt;/code&amp;gt;）。如果在非A/B 设备上移除 &amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt;并使其与A/B架构类似，那么在&amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;分区更新失败时，恢复模式可能会遭到破坏。因此，对于非A/B设备来说，&amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt;分区必须作为单独的分区存在（不同于非A/B设备的&amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;），这意味着恢复映像将继续延迟更新（即如同 Android 9 之前的设备中那样）。&lt;br /&gt;
&lt;br /&gt;
对于SAR设备与先前的旧设备，最明显的区别便在于分区的挂载点上，见&amp;lt;!-- 此表基于谷歌官方文档再度绘制 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''（非AB设备）'''&lt;br /&gt;
[[文件:重绘-boot.png|左|缩略图|934x934像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:重绘-system.png|左|缩略图|940x940像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== AB分区与无缝更新 ==&lt;br /&gt;
Android 有两种更新机制：A/B（无缝）更新和非 A/B 更新，支持无缝更新的系统分区类型有两种，一种是AB分区，一种是VAB分区。&lt;br /&gt;
&lt;br /&gt;
'''安卓系统从7.0开始引入新的OTA升级方式，叫做A/B系统。A/B系统就是设备上有A和B两套可以工作的系统（用户数据只有一份，为两套系统共用），而这样做的好处就是，当OTA进行失败时可以直接切换到另外一个未经OTA的槽位，从而防止设备变砖，而缺点也很明显——两套系统分区意味着其占据多原来一倍的大小。'''&lt;br /&gt;
&lt;br /&gt;
'''而在2020年9月9日，谷歌正式发布了Android11 代号 Android R，而伴随其发布，谷歌也向各大厂商几乎强制安利了一项技术，出厂安卓11的机型必须使用VAB架构 Android Virtual A/B ,而在后续版本Android 12/13 中又增加了 VABC (Virtual A/B with Compression)，增加了压缩功能。''' &lt;br /&gt;
&lt;br /&gt;
'''首先让我们来看一下传统分区与VAB分区的结构'''&lt;br /&gt;
[[文件:安卓分区结构对比2.png|左|缩略图|1029x1029像素]]&lt;br /&gt;
&lt;br /&gt;
'''也就是说，在AB分区的设备中，system_a和system_b等ab分区是真实存在的，他们会占用空间，而在VAB中(以下以默认槽位A为例)，system_a和system_b并非同时存在，因此不会占据大量空间。无缝更新最大的优点在于：几乎无感，安全。'''&lt;br /&gt;
&lt;br /&gt;
OTA 更新可以在系统运行期间进行，不会打断正常的使用。在更新写入完成后，只需要重启一次切换槽位即可完成系统更新。如果 OTA因为刷机失败等原因导致无法启动，将继续启动先前的操作系统。&lt;br /&gt;
&lt;br /&gt;
更新包可以流式传输到 A/B 设备，因此在安装之前不需要先下载更新包。流式更新意味着用户没有必要在 /data 或 /cache 上留出足够的可用空间以存储更新包。&lt;br /&gt;
&lt;br /&gt;
相比之下A-Only设备则没有上述优点，因为只有一套系统分区，如果OTA失败则会直接导致设备无法开机&lt;br /&gt;
&lt;br /&gt;
'''空间占用对比'''&amp;lt;!-- 图源自Android Open Source Project --&amp;gt;'''：'''&lt;br /&gt;
[[文件:谷歌提供的图片.png|左|缩略图|897x897px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 参考资料：             ==&lt;br /&gt;
①安卓常见分区：https://source.android.com/docs/core/architecture/partitions?hl=zh-cn#standard-partitions&lt;br /&gt;
&lt;br /&gt;
②安卓A/B系统分区：https://source.android.google.cn/docs/core/ota/ab?hl=zh-cn&lt;br /&gt;
&lt;br /&gt;
③安卓分区布局：https://source.android.google.cn/docs/core/architecture/bootloader/system-as-root?hl=zh-cn#ramdisk&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=856</id>
		<title>Android 分区详解</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=856"/>
		<updated>2024-08-18T13:39:24Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​添加system-as-root&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Android 设备包含若干个分区，这些分区在Android启动和运行过程中发挥不同的作用。&lt;br /&gt;
&lt;br /&gt;
部分 A/B 设备为了支持无缝更新，把 boot、system、vendor 和 radio 配置了两个槽位（如：&amp;lt;code&amp;gt;system_a&amp;lt;/code&amp;gt;，&amp;lt;code&amp;gt;system_b&amp;lt;/code&amp;gt;）。&lt;br /&gt;
&lt;br /&gt;
== 常见分区详解​ ==&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含一个内核映像，使用 &amp;lt;code&amp;gt;mkbootimg&amp;lt;/code&amp;gt; 创建。您可以使用虚拟分区直接刷写任意映像，而无需刷写新的 boot 分区。 此分区还包含在 Android 13 之前发布的设备中的通用 ramdisk。'''&lt;br /&gt;
&lt;br /&gt;
* kernel：&amp;lt;code&amp;gt;kernel&amp;lt;/code&amp;gt; 虚拟分区通过将新内核映像写入旧内核映像来覆盖内核（&amp;lt;code&amp;gt;zImage&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;zImage-dtb&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;Image.gz-dtb&amp;lt;/code&amp;gt;）。如果提供的开发内核不兼容，则可能需要使用关联的内核模块更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;dtb&amp;lt;/code&amp;gt; 分区（如果存在）。&lt;br /&gt;
&lt;br /&gt;
* ramdisk：&amp;lt;code&amp;gt;ramdisk&amp;lt;/code&amp;gt; 虚拟分区通过将新 ramdisk 映像写入旧 ramdisk 映像来覆盖 ramdisk。&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含发布时搭载 Android 13 及更高版本的设备的通用 ramdisk。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含 Android 框架。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储在 OTA 过程中启动的恢复映像。支持无缝更新的设备可以将恢复映像存储为 &amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 映像中包含的 ramdisk（而不是单独的映像）。'''&lt;br /&gt;
&lt;br /&gt;
'''注意：某些厂商的VAB分区结构设备不包含recovery分区，他们会将recovery分区与boot分区合并，因此当你需要刷入第三方Recovery时需要使用命令：&amp;lt;code&amp;gt;fastboot boot boot.img(具体名称自定)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;cache&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储临时数据，如果设备使用无缝更新，则此分区是可选的。cache 分区并非必须可从引导加载程序写入，但必须可清空。此分区大小取决于设备类型和 &amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 上的可用空间。通常，50 MB 至 100 MB 就足够了。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;misc&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区供 recovery 分区使用，大小为 4 KB 或更大。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含用户安装的应用和数据，包括自定义数据。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;metadata&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区用于在设备使用元数据加密时存储元数据加密密钥。大小为 16 MB 或更大。此分区未经加密，且系统不会对其数据拍摄快照。数据会在设备恢复出厂设置时被清空。此分区的使用受到严格限制。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含原始设计制造商 (ODM) 对系统芯片 (SoC) 供应商板级支持包 (BSP) 的自定义设置。利用此类自定义设置，ODM 可以替换或自定义 SoC 组件，并在硬件抽象层 (HAL) 上为板级组件、守护程序和 ODM 特定的功能实现内核模块。此分区是可选的；通常情况下，它用于存储自定义设置，以便设备可以针对多个硬件 SKU 使用单个供应商映像。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区专门用于存储 ODM 内核模块。将 ODM 内核模块存储在 &amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区即可更新 ODM 内核模块。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含一些厂商私有的二进制文件以及驱动等内容，用于实现厂商特定功能以及服务，例如图像传感器，音频，显示等，具体作用可以参考于ODM分区，而在各大厂商的系统维护中，如今 一加 （OnePlus），小米（Xiaomi）等厂商也开始使用ODM分区来存放他们的私有驱动文件，即将 /odm 作为另一个 /vendor 分区处理。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区专门用于存储供应商内核模块。将供应商内核模块存储在 &amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区即可更新内核模块。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含无线装置映像，只有包含无线装置且在专用分区中存储无线装置专用软件的设备才需要此分区。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;tos&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区用于存储 Trusty 操作系统的二进制映像文件，仅在设备包含 Trusty 时使用。Trusty 是 Google 的可信执行环境 (TEE) 操作系统实现，与 Android 并行运行。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;pvmfw&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储受保护的虚拟机固件 (pvmfw)，即在受保护的虚拟机中运行的第一个代码。如需了解详情，请参阅受保护的虚拟机固件。'''&lt;br /&gt;
&lt;br /&gt;
== 动态分区 ==&lt;br /&gt;
搭载 Android 11 及更高版本的设备可以支持动态分区，此类分区属于 Android 的用户空间分区系统，支持在无线下载 (OTA) 更新期间创建和销毁分区以及调整分区大小。使用此分区系统，您可以在无线下载 (OTA) 更新期间创建、销毁分区或者调整分区大小。借助动态分区，供应商无需担心各个分区（例如 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt;）的大小。取而代之的是，设备会分配一个 &amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 分区，其中的子分区可动态调整大小。各个分区映像不再需要为将来的 OTA 预留空间。相反，&amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 中剩余的可用空间还可用于所有动态分区。&lt;br /&gt;
&lt;br /&gt;
== 关于 system-as-root ==&lt;br /&gt;
在 Android 9 中，非 A/B 设备应采用 system-as-root，以便通过系统专用 OTA 进行更新。&lt;br /&gt;
&lt;br /&gt;
'''注意：如果设备使用的是 A/B 分区架构，则无需做出任何改动。'''&lt;br /&gt;
&lt;br /&gt;
与将 &amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt; 改为&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt;分区的A/B设备不同，非A/B设备必须保留单独的&amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt; 分区，因为它们没有后备插槽分区（例如，从 &amp;lt;code&amp;gt;boot_a&amp;lt;/code&amp;gt; 切换到 &amp;lt;code&amp;gt;boot_b&amp;lt;/code&amp;gt;）。如果在非A/B 设备上移除 &amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt;并使其与A/B架构类似，那么在&amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;分区更新失败时，恢复模式可能会遭到破坏。因此，对于非A/B设备来说，&amp;lt;code&amp;gt;/recovery&amp;lt;/code&amp;gt;分区必须作为单独的分区存在（不同于非A/B设备的&amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;），这意味着恢复映像将继续延迟更新（即如同 Android 9 之前的设备中那样）。&lt;br /&gt;
&lt;br /&gt;
对于SAR设备与先前的旧设备，最明显的区别便在于分区的挂载点上，见&amp;lt;!-- 此表基于谷歌官方文档再度绘制 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''（非AB设备）'''&lt;br /&gt;
[[文件:重绘-boot.png|左|缩略图|934x934像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:重绘-system.png|左|缩略图|940x940像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== AB分区与无缝更新 ==&lt;br /&gt;
Android 有两种更新机制：A/B（无缝）更新和非 A/B 更新，支持无缝更新的系统分区类型有两种，一种是AB分区，一种是VAB分区。&lt;br /&gt;
&lt;br /&gt;
'''安卓系统从7.0开始引入新的OTA升级方式，叫做A/B系统。A/B系统就是设备上有A和B两套可以工作的系统（用户数据只有一份，为两套系统共用），而这样做的好处就是，当OTA进行失败时可以直接切换到另外一个未经OTA的槽位，从而防止设备变砖，而缺点也很明显——两套系统分区意味着其占据多原来一倍的大小。'''&lt;br /&gt;
&lt;br /&gt;
'''而在2020年9月9日，谷歌正式发布了Android11 代号 Android R，而伴随其发布，谷歌也向各大厂商几乎强制安利了一项技术，出厂安卓11的机型必须使用VAB架构 Android Virtual A/B ,而在后续版本Android 12/13 中又增加了 VABC (Virtual A/B with Compression)，增加了压缩功能。''' &lt;br /&gt;
&lt;br /&gt;
'''首先让我们来看一下传统分区与VAB分区的结构'''&lt;br /&gt;
[[文件:安卓分区结构对比2.png|左|缩略图|1029x1029像素]]&lt;br /&gt;
&lt;br /&gt;
'''也就是说，在AB分区的设备中，system_a和system_b等ab分区是真实存在的，他们会占用空间，而在VAB中(以下以默认槽位A为例)，system_a和system_b并非同时存在，因此不会占据大量空间。无缝更新最大的优点在于：几乎无感，安全。'''&lt;br /&gt;
&lt;br /&gt;
OTA 更新可以在系统运行期间进行，不会打断正常的使用。在更新写入完成后，只需要重启一次切换槽位即可完成系统更新。如果 OTA因为刷机失败等原因导致无法启动，将继续启动先前的操作系统。&lt;br /&gt;
&lt;br /&gt;
更新包可以流式传输到 A/B 设备，因此在安装之前不需要先下载更新包。流式更新意味着用户没有必要在 /data 或 /cache 上留出足够的可用空间以存储更新包。&lt;br /&gt;
&lt;br /&gt;
相比之下A-Only设备则没有上述优点，因为只有一套系统分区，如果OTA失败则会直接导致设备无法开机&lt;br /&gt;
&lt;br /&gt;
'''空间占用对比'''&amp;lt;!-- 图源自Android Open Source Project --&amp;gt;'''：'''&lt;br /&gt;
[[文件:谷歌提供的图片.png|左|缩略图|897x897px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 参考资料：             ==&lt;br /&gt;
①安卓常见分区：https://source.android.com/docs/core/architecture/partitions?hl=zh-cn#standard-partitions&lt;br /&gt;
&lt;br /&gt;
②安卓A/B系统分区：https://source.android.google.cn/docs/core/ota/ab?hl=zh-cn&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E9%87%8D%E7%BB%98-system.png&amp;diff=855</id>
		<title>文件:重绘-system.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E9%87%8D%E7%BB%98-system.png&amp;diff=855"/>
		<updated>2024-08-18T13:37:58Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;重绘-system&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E9%87%8D%E7%BB%98-boot.png&amp;diff=854</id>
		<title>文件:重绘-boot.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E9%87%8D%E7%BB%98-boot.png&amp;diff=854"/>
		<updated>2024-08-18T13:37:18Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;重绘-boot&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:1.png&amp;diff=853</id>
		<title>文件:1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:1.png&amp;diff=853"/>
		<updated>2024-08-18T13:18:36Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=852</id>
		<title>Android 分区详解</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=852"/>
		<updated>2024-08-18T13:07:58Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​更新一些内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Android 设备包含若干个分区，这些分区在Android启动和运行过程中发挥不同的作用。&lt;br /&gt;
&lt;br /&gt;
部分 A/B 设备为了支持无缝更新，把 boot、system、vendor 和 radio 配置了两个槽位（如：&amp;lt;code&amp;gt;system_a&amp;lt;/code&amp;gt;，&amp;lt;code&amp;gt;system_b&amp;lt;/code&amp;gt;）。&lt;br /&gt;
&lt;br /&gt;
== 常见分区详解​ ==&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含一个内核映像，使用 &amp;lt;code&amp;gt;mkbootimg&amp;lt;/code&amp;gt; 创建。您可以使用虚拟分区直接刷写任意映像，而无需刷写新的 boot 分区。 此分区还包含在 Android 13 之前发布的设备中的通用 ramdisk。'''&lt;br /&gt;
&lt;br /&gt;
* kernel：&amp;lt;code&amp;gt;kernel&amp;lt;/code&amp;gt; 虚拟分区通过将新内核映像写入旧内核映像来覆盖内核（&amp;lt;code&amp;gt;zImage&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;zImage-dtb&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;Image.gz-dtb&amp;lt;/code&amp;gt;）。如果提供的开发内核不兼容，则可能需要使用关联的内核模块更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;dtb&amp;lt;/code&amp;gt; 分区（如果存在）。&lt;br /&gt;
&lt;br /&gt;
* ramdisk：&amp;lt;code&amp;gt;ramdisk&amp;lt;/code&amp;gt; 虚拟分区通过将新 ramdisk 映像写入旧 ramdisk 映像来覆盖 ramdisk。&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含发布时搭载 Android 13 及更高版本的设备的通用 ramdisk。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含 Android 框架。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储在 OTA 过程中启动的恢复映像。支持无缝更新的设备可以将恢复映像存储为 &amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 映像中包含的 ramdisk（而不是单独的映像）。'''&lt;br /&gt;
&lt;br /&gt;
'''注意：某些厂商的VAB分区结构设备不包含recovery分区，他们会将recovery分区与boot分区合并，因此当你需要刷入第三方Recovery时需要使用命令：&amp;lt;code&amp;gt;fastboot boot boot.img(具体名称自定)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;cache&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储临时数据，如果设备使用无缝更新，则此分区是可选的。cache 分区并非必须可从引导加载程序写入，但必须可清空。此分区大小取决于设备类型和 &amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 上的可用空间。通常，50 MB 至 100 MB 就足够了。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;misc&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区供 recovery 分区使用，大小为 4 KB 或更大。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含用户安装的应用和数据，包括自定义数据。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;metadata&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区用于在设备使用元数据加密时存储元数据加密密钥。大小为 16 MB 或更大。此分区未经加密，且系统不会对其数据拍摄快照。数据会在设备恢复出厂设置时被清空。此分区的使用受到严格限制。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含原始设计制造商 (ODM) 对系统芯片 (SoC) 供应商板级支持包 (BSP) 的自定义设置。利用此类自定义设置，ODM 可以替换或自定义 SoC 组件，并在硬件抽象层 (HAL) 上为板级组件、守护程序和 ODM 特定的功能实现内核模块。此分区是可选的；通常情况下，它用于存储自定义设置，以便设备可以针对多个硬件 SKU 使用单个供应商映像。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区专门用于存储 ODM 内核模块。将 ODM 内核模块存储在 &amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区即可更新 ODM 内核模块。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含一些厂商私有的二进制文件以及驱动等内容，用于实现厂商特定功能以及服务，例如图像传感器，音频，显示等，具体作用可以参考于ODM分区，而在各大厂商的系统维护中，如今 一加 （OnePlus），小米（Xiaomi）等厂商也开始使用ODM分区来存放他们的私有驱动文件，即将 /odm 作为另一个 /vendor 分区处理。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区专门用于存储供应商内核模块。将供应商内核模块存储在 &amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区即可更新内核模块。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;radio&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区包含无线装置映像，只有包含无线装置且在专用分区中存储无线装置专用软件的设备才需要此分区。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;tos&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区用于存储 Trusty 操作系统的二进制映像文件，仅在设备包含 Trusty 时使用。Trusty 是 Google 的可信执行环境 (TEE) 操作系统实现，与 Android 并行运行。'''&lt;br /&gt;
&lt;br /&gt;
=== '''&amp;lt;code&amp;gt;pvmfw&amp;lt;/code&amp;gt; 分区'''： ===&lt;br /&gt;
'''此分区会存储受保护的虚拟机固件 (pvmfw)，即在受保护的虚拟机中运行的第一个代码。如需了解详情，请参阅受保护的虚拟机固件。'''&lt;br /&gt;
&lt;br /&gt;
== 动态分区 ==&lt;br /&gt;
搭载 Android 11 及更高版本的设备可以支持动态分区，此类分区属于 Android 的用户空间分区系统，支持在无线下载 (OTA) 更新期间创建和销毁分区以及调整分区大小。使用此分区系统，您可以在无线下载 (OTA) 更新期间创建、销毁分区或者调整分区大小。借助动态分区，供应商无需担心各个分区（例如 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt;）的大小。取而代之的是，设备会分配一个 &amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 分区，其中的子分区可动态调整大小。各个分区映像不再需要为将来的 OTA 预留空间。相反，&amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 中剩余的可用空间还可用于所有动态分区。&lt;br /&gt;
&lt;br /&gt;
== AB分区与无缝更新 ==&lt;br /&gt;
Android 有两种更新机制：A/B（无缝）更新和非 A/B 更新，支持无缝更新的系统分区类型有两种，一种是AB分区，一种是VAB分区。&lt;br /&gt;
&lt;br /&gt;
'''安卓系统从7.0开始引入新的OTA升级方式，叫做A/B系统。A/B系统就是设备上有A和B两套可以工作的系统（用户数据只有一份，为两套系统共用），而这样做的好处就是，当OTA进行失败时可以直接切换到另外一个未经OTA的槽位，从而防止设备变砖，而缺点也很明显——两套系统分区意味着其占据多原来一倍的大小。'''&lt;br /&gt;
&lt;br /&gt;
'''而在2020年9月9日，谷歌正式发布了Android11 代号 Android R，而伴随其发布，谷歌也向各大厂商几乎强制安利了一项技术，出厂安卓11的机型必须使用VAB架构 Android Virtual A/B ,而在后续版本Android 12/13 中又增加了 VABC (Virtual A/B with Compression)，增加了压缩功能。''' &lt;br /&gt;
&lt;br /&gt;
'''首先让我们来看一下传统分区与VAB分区的结构'''&lt;br /&gt;
[[文件:安卓分区结构对比2.png|左|缩略图|1029x1029像素]]&lt;br /&gt;
&lt;br /&gt;
'''也就是说，在AB分区的设备中，system_a和system_b等ab分区是真实存在的，他们会占用空间，而在VAB中(以下以默认槽位A为例)，system_a和system_b并非同时存在，因此不会占据大量空间。无缝更新最大的优点在于：几乎无感，安全。'''&lt;br /&gt;
&lt;br /&gt;
OTA 更新可以在系统运行期间进行，不会打断正常的使用。在更新写入完成后，只需要重启一次切换槽位即可完成系统更新。如果 OTA因为刷机失败等原因导致无法启动，将继续启动先前的操作系统。&lt;br /&gt;
&lt;br /&gt;
更新包可以流式传输到 A/B 设备，因此在安装之前不需要先下载更新包。流式更新意味着用户没有必要在 /data 或 /cache 上留出足够的可用空间以存储更新包。&lt;br /&gt;
&lt;br /&gt;
相比之下A-Only设备则没有上述优点，因为只有一套系统分区，如果OTA失败则会直接导致设备无法开机&lt;br /&gt;
&lt;br /&gt;
'''空间占用对比'''&amp;lt;!-- 图源自Android Open Source Project --&amp;gt;'''：'''&lt;br /&gt;
[[文件:谷歌提供的图片.png|左|缩略图|897x897px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 参考资料：             ==&lt;br /&gt;
①安卓常见分区：https://source.android.com/docs/core/architecture/partitions?hl=zh-cn#standard-partitions&lt;br /&gt;
&lt;br /&gt;
②安卓A/B系统分区：https://source.android.google.cn/docs/core/ota/ab?hl=zh-cn&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=851</id>
		<title>Android 分区详解</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=851"/>
		<updated>2024-08-18T12:47:57Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​修改部分页面排版&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Android 设备包含若干个分区，这些分区在Android启动和运行过程中发挥不同的作用。&lt;br /&gt;
&lt;br /&gt;
部分 A/B 设备为了支持无缝更新，把 boot、system、vendor 和 radio 配置了两个槽位（如：&amp;lt;code&amp;gt;system_a&amp;lt;/code&amp;gt;，&amp;lt;code&amp;gt;system_b&amp;lt;/code&amp;gt;）。&lt;br /&gt;
&lt;br /&gt;
== 常见分区​ ==&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 分区'''：此分区包含一个内核映像，使用 &amp;lt;code&amp;gt;mkbootimg&amp;lt;/code&amp;gt; 创建。您可以使用虚拟分区直接刷写任意映像，而无需刷写新的 boot 分区。 此分区还包含在 Android 13 之前发布的设备中的通用 ramdisk。&lt;br /&gt;
** kernel：&amp;lt;code&amp;gt;kernel&amp;lt;/code&amp;gt; 虚拟分区通过将新内核映像写入旧内核映像来覆盖内核（&amp;lt;code&amp;gt;zImage&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;zImage-dtb&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;Image.gz-dtb&amp;lt;/code&amp;gt;）。如果提供的开发内核不兼容，则可能需要使用关联的内核模块更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;dtb&amp;lt;/code&amp;gt; 分区（如果存在）。&lt;br /&gt;
** ramdisk：&amp;lt;code&amp;gt;ramdisk&amp;lt;/code&amp;gt; 虚拟分区通过将新 ramdisk 映像写入旧 ramdisk 映像来覆盖 ramdisk。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 分区'''：此分区包含发布时搭载 Android 13 及更高版本的设备的通用 ramdisk。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 分区'''：此分区包含 Android 框架。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区'''：此分区包含原始设计制造商 (ODM) 对系统芯片 (SoC) 供应商板级支持包 (BSP) 的自定义设置。利用此类自定义设置，ODM 可以替换或自定义 SoC 组件，并在硬件抽象层 (HAL) 上为板级组件、守护程序和 ODM 特定的功能实现内核模块。此分区是可选的；通常情况下，它用于存储自定义设置，以便设备可以针对多个硬件 SKU 使用单个供应商映像。如需了解详情，请参阅 ODM 分区。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区'''：此分区专门用于存储 ODM 内核模块。将 ODM 内核模块存储在 &amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区即可更新 ODM 内核模块。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt; 分区'''：此分区会存储在 OTA 过程中启动的恢复映像。支持无缝更新的设备可以将恢复映像存储为 &amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 映像中包含的 ramdisk（而不是单独的映像）。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;cache&amp;lt;/code&amp;gt; 分区'''：此分区会存储临时数据，如果设备使用无缝更新，则此分区是可选的。cache 分区并非必须可从引导加载程序写入，但必须可清空。此分区大小取决于设备类型和 &amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 上的可用空间。通常，50 MB 至 100 MB 就足够了。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;misc&amp;lt;/code&amp;gt; 分区'''：此分区供 recovery 分区使用，大小为 4 KB 或更大。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 分区'''：此分区包含用户安装的应用和数据，包括自定义数据。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;metadata&amp;lt;/code&amp;gt; 分区'''：此分区用于在设备使用元数据加密时存储元数据加密密钥。大小为 16 MB 或更大。此分区未经加密，且系统不会对其数据拍摄快照。数据会在设备恢复出厂设置时被清空。此分区的使用受到严格限制。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区'''：此分区包含所有无法分发给 AOSP 的二进制文件。如果设备不包含专有信息，则可以忽略此分区。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区'''：此分区专门用于存储供应商内核模块。将供应商内核模块存储在 &amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区即可更新内核模块。&lt;br /&gt;
&lt;br /&gt;
== 动态分区 ==&lt;br /&gt;
搭载 Android 11 及更高版本的设备可以支持动态分区，此类分区属于 Android 的用户空间分区系统，支持在无线下载 (OTA) 更新期间创建和销毁分区以及调整分区大小。使用此分区系统，您可以在无线下载 (OTA) 更新期间创建、销毁分区或者调整分区大小。借助动态分区，供应商无需担心各个分区（例如 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt;）的大小。取而代之的是，设备会分配一个 &amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 分区，其中的子分区可动态调整大小。各个分区映像不再需要为将来的 OTA 预留空间。相反，&amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 中剩余的可用空间还可用于所有动态分区。&lt;br /&gt;
&lt;br /&gt;
== AB分区与无缝更新 ==&lt;br /&gt;
Android 有两种更新机制：A/B（无缝）更新和非 A/B 更新，支持无缝更新的系统分区类型有两种，一种是AB分区，一种是VAB分区。&lt;br /&gt;
&lt;br /&gt;
'''安卓系统从7.0开始引入新的OTA升级方式，叫做A/B系统。A/B系统就是设备上有A和B两套可以工作的系统（用户数据只有一份，为两套系统共用），而这样做的好处就是，当OTA进行失败时可以直接切换到另外一个未经OTA的槽位，从而防止设备变砖，而缺点也很明显——两套系统分区意味着其占据多原来一倍的大小。'''&lt;br /&gt;
&lt;br /&gt;
'''而在2020年9月9日，谷歌正式发布了Android11 代号 Android R，而伴随其发布，谷歌也向各大厂商几乎强制安利了一项技术，出厂安卓11的机型必须使用VAB架构 Android Virtual A/B ,而在后续版本Android 12/13 中又增加了 VABC (Virtual A/B with Compression)，增加了压缩功能。''' &lt;br /&gt;
&lt;br /&gt;
'''首先让我们来看一下传统分区与VAB分区的结构'''&lt;br /&gt;
[[文件:安卓分区结构对比2.png|左|缩略图|1029x1029像素]]&lt;br /&gt;
&lt;br /&gt;
'''也就是说，在AB分区的设备中，system_a和system_b等ab分区是真实存在的，他们会占用空间，而在VAB中(以下以默认槽位A为例)，system_a和system_b并非同时存在，因此不会占据大量空间。无缝更新最大的优点在于：几乎无感，安全。'''&lt;br /&gt;
&lt;br /&gt;
OTA 更新可以在系统运行期间进行，不会打断正常的使用。在更新写入完成后，只需要重启一次切换槽位即可完成系统更新。如果 OTA因为刷机失败等原因导致无法启动，将继续启动先前的操作系统。&lt;br /&gt;
&lt;br /&gt;
更新包可以流式传输到 A/B 设备，因此在安装之前不需要先下载更新包。流式更新意味着用户没有必要在 /data 或 /cache 上留出足够的可用空间以存储更新包。&lt;br /&gt;
&lt;br /&gt;
相比之下A-Only设备则没有上述优点，因为只有一套系统分区，如果OTA失败则会直接导致设备无法开机&lt;br /&gt;
&lt;br /&gt;
'''空间占用对比'''&amp;lt;!-- 图源自Android Open Source Project --&amp;gt;'''：'''&lt;br /&gt;
[[文件:谷歌提供的图片.png|左|缩略图|897x897px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 参考资料：             ==&lt;br /&gt;
①安卓常见分区：https://source.android.com/docs/core/architecture/partitions?hl=zh-cn#standard-partitions&lt;br /&gt;
&lt;br /&gt;
②安卓A/B系统分区：https://source.android.google.cn/docs/core/ota/ab?hl=zh-cn&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E5%AE%89%E5%8D%93%E5%88%86%E5%8C%BA%E7%BB%93%E6%9E%84%E5%AF%B9%E6%AF%942.png&amp;diff=850</id>
		<title>文件:安卓分区结构对比2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E5%AE%89%E5%8D%93%E5%88%86%E5%8C%BA%E7%BB%93%E6%9E%84%E5%AF%B9%E6%AF%942.png&amp;diff=850"/>
		<updated>2024-08-18T12:46:32Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;安卓分区结构对比2&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=849</id>
		<title>Android 分区详解</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=849"/>
		<updated>2024-08-18T12:44:18Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​修改部分内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Android 设备包含若干个分区，这些分区在Android启动和运行过程中发挥不同的作用。&lt;br /&gt;
&lt;br /&gt;
部分 A/B 设备为了支持无缝更新，把 boot、system、vendor 和 radio 配置了两个槽位（如：&amp;lt;code&amp;gt;system_a&amp;lt;/code&amp;gt;，&amp;lt;code&amp;gt;system_b&amp;lt;/code&amp;gt;）。&lt;br /&gt;
&lt;br /&gt;
== 常见分区​ ==&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 分区'''：此分区包含一个内核映像，使用 &amp;lt;code&amp;gt;mkbootimg&amp;lt;/code&amp;gt; 创建。您可以使用虚拟分区直接刷写任意映像，而无需刷写新的 boot 分区。 此分区还包含在 Android 13 之前发布的设备中的通用 ramdisk。&lt;br /&gt;
** kernel：&amp;lt;code&amp;gt;kernel&amp;lt;/code&amp;gt; 虚拟分区通过将新内核映像写入旧内核映像来覆盖内核（&amp;lt;code&amp;gt;zImage&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;zImage-dtb&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;Image.gz-dtb&amp;lt;/code&amp;gt;）。如果提供的开发内核不兼容，则可能需要使用关联的内核模块更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;dtb&amp;lt;/code&amp;gt; 分区（如果存在）。&lt;br /&gt;
** ramdisk：&amp;lt;code&amp;gt;ramdisk&amp;lt;/code&amp;gt; 虚拟分区通过将新 ramdisk 映像写入旧 ramdisk 映像来覆盖 ramdisk。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 分区'''：此分区包含发布时搭载 Android 13 及更高版本的设备的通用 ramdisk。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 分区'''：此分区包含 Android 框架。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区'''：此分区包含原始设计制造商 (ODM) 对系统芯片 (SoC) 供应商板级支持包 (BSP) 的自定义设置。利用此类自定义设置，ODM 可以替换或自定义 SoC 组件，并在硬件抽象层 (HAL) 上为板级组件、守护程序和 ODM 特定的功能实现内核模块。此分区是可选的；通常情况下，它用于存储自定义设置，以便设备可以针对多个硬件 SKU 使用单个供应商映像。如需了解详情，请参阅 ODM 分区。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区'''：此分区专门用于存储 ODM 内核模块。将 ODM 内核模块存储在 &amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区即可更新 ODM 内核模块。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt; 分区'''：此分区会存储在 OTA 过程中启动的恢复映像。支持无缝更新的设备可以将恢复映像存储为 &amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 映像中包含的 ramdisk（而不是单独的映像）。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;cache&amp;lt;/code&amp;gt; 分区'''：此分区会存储临时数据，如果设备使用无缝更新，则此分区是可选的。cache 分区并非必须可从引导加载程序写入，但必须可清空。此分区大小取决于设备类型和 &amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 上的可用空间。通常，50 MB 至 100 MB 就足够了。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;misc&amp;lt;/code&amp;gt; 分区'''：此分区供 recovery 分区使用，大小为 4 KB 或更大。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 分区'''：此分区包含用户安装的应用和数据，包括自定义数据。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;metadata&amp;lt;/code&amp;gt; 分区'''：此分区用于在设备使用元数据加密时存储元数据加密密钥。大小为 16 MB 或更大。此分区未经加密，且系统不会对其数据拍摄快照。数据会在设备恢复出厂设置时被清空。此分区的使用受到严格限制。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区'''：此分区包含所有无法分发给 AOSP 的二进制文件。如果设备不包含专有信息，则可以忽略此分区。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区'''：此分区专门用于存储供应商内核模块。将供应商内核模块存储在 &amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区即可更新内核模块。&lt;br /&gt;
&lt;br /&gt;
== 动态分区 ==&lt;br /&gt;
搭载 Android 11 及更高版本的设备可以支持动态分区，此类分区属于 Android 的用户空间分区系统，支持在无线下载 (OTA) 更新期间创建和销毁分区以及调整分区大小。使用此分区系统，您可以在无线下载 (OTA) 更新期间创建、销毁分区或者调整分区大小。借助动态分区，供应商无需担心各个分区（例如 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt;）的大小。取而代之的是，设备会分配一个 &amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 分区，其中的子分区可动态调整大小。各个分区映像不再需要为将来的 OTA 预留空间。相反，&amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 中剩余的可用空间还可用于所有动态分区。&lt;br /&gt;
&lt;br /&gt;
== AB分区与无缝更新 ==&lt;br /&gt;
Android 有两种更新机制：A/B（无缝）更新和非 A/B 更新，支持无缝更新的系统分区类型有两种，一种是AB分区，一种是VAB分区。&lt;br /&gt;
&lt;br /&gt;
'''安卓系统从7.0开始引入新的OTA升级方式，叫做A/B系统。A/B系统就是设备上有A和B两套可以工作的系统（用户数据只有一份，为两套系统共用），而这样做的好处就是，当OTA进行失败时可以直接切换到另外一个未经OTA的槽位，从而防止设备变砖，而缺点也很明显——两套系统分区意味着其占据多原来一倍的大小。'''&lt;br /&gt;
&lt;br /&gt;
'''而在2020年9月9日，谷歌正式发布了Android11 代号 Android R，而伴随其发布，谷歌也向各大厂商几乎强制安利了一项技术，出厂安卓11的机型必须使用VAB架构 Android Virtual A/B ,而在后续版本Android 12/13 中又增加了 VABC (Virtual A/B with Compression)，增加了压缩功能。''' &lt;br /&gt;
&lt;br /&gt;
'''首先让我们来看一下传统分区与VAB分区的结构'''&lt;br /&gt;
&lt;br /&gt;
[[index.php?title=文件:安卓系统分区结构.png|链接=文件:安卓系统分区结构.png|边框|640x640像素]]&lt;br /&gt;
&lt;br /&gt;
'''也就是说，在AB分区的设备中，system_a和system_b等ab分区是真实存在的，他们会占用空间，而在VAB中(以下以默认槽位A为例)，system_a和system_b并非同时存在，因此不会占据大量空间。无缝更新最大的优点在于：几乎无感，安全。'''&lt;br /&gt;
&lt;br /&gt;
OTA 更新可以在系统运行期间进行，不会打断正常的使用。在更新写入完成后，只需要重启一次切换槽位即可完成系统更新。如果 OTA因为刷机失败等原因导致无法启动，将继续启动先前的操作系统。&lt;br /&gt;
&lt;br /&gt;
更新包可以流式传输到 A/B 设备，因此在安装之前不需要先下载更新包。流式更新意味着用户没有必要在 /data 或 /cache 上留出足够的可用空间以存储更新包。&lt;br /&gt;
&lt;br /&gt;
相比之下A-Only设备则没有上述优点，因为只有一套系统分区，如果OTA失败则会直接导致设备无法开机&lt;br /&gt;
&lt;br /&gt;
'''空间占用对比'''&amp;lt;!-- 图源自Android Open Source Project --&amp;gt;'''：'''&lt;br /&gt;
[[文件:谷歌提供的图片.png|左|缩略图|805x805像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 参考资料： ==&lt;br /&gt;
①安卓常见分区：https://source.android.com/docs/core/architecture/partitions?hl=zh-cn#standard-partitions&lt;br /&gt;
&lt;br /&gt;
②安卓A/B系统分区：https://source.android.google.cn/docs/core/ota/ab?hl=zh-cn&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=848</id>
		<title>Android 分区详解</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android_%E5%88%86%E5%8C%BA%E8%AF%A6%E8%A7%A3&amp;diff=848"/>
		<updated>2024-08-18T12:40:29Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​加入关于安卓VAB/AB分区内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Android 设备包含若干个分区，这些分区在Android启动和运行过程中发挥不同的作用。&lt;br /&gt;
&lt;br /&gt;
部分 A/B 设备为了支持无缝更新，把 boot、system、vendor 和 radio 配置了两个槽位（如：&amp;lt;code&amp;gt;system_a&amp;lt;/code&amp;gt;，&amp;lt;code&amp;gt;system_b&amp;lt;/code&amp;gt;）。&lt;br /&gt;
&lt;br /&gt;
== 常见分区​ ==&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 分区'''：此分区包含一个内核映像，使用 &amp;lt;code&amp;gt;mkbootimg&amp;lt;/code&amp;gt; 创建。您可以使用虚拟分区直接刷写任意映像，而无需刷写新的 boot 分区。 此分区还包含在 Android 13 之前发布的设备中的通用 ramdisk。&lt;br /&gt;
** kernel：&amp;lt;code&amp;gt;kernel&amp;lt;/code&amp;gt; 虚拟分区通过将新内核映像写入旧内核映像来覆盖内核（&amp;lt;code&amp;gt;zImage&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;zImage-dtb&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;Image.gz-dtb&amp;lt;/code&amp;gt;）。如果提供的开发内核不兼容，则可能需要使用关联的内核模块更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;dtb&amp;lt;/code&amp;gt; 分区（如果存在）。&lt;br /&gt;
** ramdisk：&amp;lt;code&amp;gt;ramdisk&amp;lt;/code&amp;gt; 虚拟分区通过将新 ramdisk 映像写入旧 ramdisk 映像来覆盖 ramdisk。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 分区'''：此分区包含发布时搭载 Android 13 及更高版本的设备的通用 ramdisk。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; 分区'''：此分区包含 Android 框架。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区'''：此分区包含原始设计制造商 (ODM) 对系统芯片 (SoC) 供应商板级支持包 (BSP) 的自定义设置。利用此类自定义设置，ODM 可以替换或自定义 SoC 组件，并在硬件抽象层 (HAL) 上为板级组件、守护程序和 ODM 特定的功能实现内核模块。此分区是可选的；通常情况下，它用于存储自定义设置，以便设备可以针对多个硬件 SKU 使用单个供应商映像。如需了解详情，请参阅 ODM 分区。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区'''：此分区专门用于存储 ODM 内核模块。将 ODM 内核模块存储在 &amp;lt;code&amp;gt;odm_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;odm&amp;lt;/code&amp;gt; 分区即可更新 ODM 内核模块。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;recovery&amp;lt;/code&amp;gt; 分区'''：此分区会存储在 OTA 过程中启动的恢复映像。支持无缝更新的设备可以将恢复映像存储为 &amp;lt;code&amp;gt;boot&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;init_boot&amp;lt;/code&amp;gt; 映像中包含的 ramdisk（而不是单独的映像）。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;cache&amp;lt;/code&amp;gt; 分区'''：此分区会存储临时数据，如果设备使用无缝更新，则此分区是可选的。cache 分区并非必须可从引导加载程序写入，但必须可清空。此分区大小取决于设备类型和 &amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 上的可用空间。通常，50 MB 至 100 MB 就足够了。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;misc&amp;lt;/code&amp;gt; 分区'''：此分区供 recovery 分区使用，大小为 4 KB 或更大。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;userdata&amp;lt;/code&amp;gt; 分区'''：此分区包含用户安装的应用和数据，包括自定义数据。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;metadata&amp;lt;/code&amp;gt; 分区'''：此分区用于在设备使用元数据加密时存储元数据加密密钥。大小为 16 MB 或更大。此分区未经加密，且系统不会对其数据拍摄快照。数据会在设备恢复出厂设置时被清空。此分区的使用受到严格限制。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区'''：此分区包含所有无法分发给 AOSP 的二进制文件。如果设备不包含专有信息，则可以忽略此分区。&lt;br /&gt;
* '''&amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区'''：此分区专门用于存储供应商内核模块。将供应商内核模块存储在 &amp;lt;code&amp;gt;vendor_dlkm&amp;lt;/code&amp;gt; 分区（而不是 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区）中后，无需更新 &amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 分区即可更新内核模块。&lt;br /&gt;
&lt;br /&gt;
== 动态分区 ==&lt;br /&gt;
搭载 Android 11 及更高版本的设备可以支持动态分区，此类分区属于 Android 的用户空间分区系统，支持在无线下载 (OTA) 更新期间创建和销毁分区以及调整分区大小。使用此分区系统，您可以在无线下载 (OTA) 更新期间创建、销毁分区或者调整分区大小。借助动态分区，供应商无需担心各个分区（例如 &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;vendor&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt;）的大小。取而代之的是，设备会分配一个 &amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 分区，其中的子分区可动态调整大小。各个分区映像不再需要为将来的 OTA 预留空间。相反，&amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; 中剩余的可用空间还可用于所有动态分区。&lt;br /&gt;
&lt;br /&gt;
== AB分区与无缝更新 ==&lt;br /&gt;
Android 有两种更新机制：A/B（无缝）更新和非 A/B 更新，支持无缝更新的系统分区类型有两种，一种是AB分区，一种是VAB分区。&lt;br /&gt;
&lt;br /&gt;
'''安卓系统从7.0开始引入新的OTA升级方式，叫做A/B系统。A/B系统就是设备上有A和B两套可以工作的系统（用户数据只有一份，为两套系统共用），而这样做的好处就是，当OTA进行失败时可以直接切换到另外一个未经OTA的槽位，从而防止设备变砖，而缺点也很明显——两套系统分区意味着其占据多原来一倍的大小。'''&lt;br /&gt;
&lt;br /&gt;
'''而在2020年9月9日，谷歌正式发布了Android11 代号 Android R，而伴随其发布，谷歌也向各大厂商几乎强制安利了一项技术，出厂安卓11的机型必须使用VAB架构 Android Virtual A/B ,而在后续版本Android 12/13 中又增加了 VABC (Virtual A/B with Compression)，增加了压缩功能。''' &lt;br /&gt;
&lt;br /&gt;
'''首先让我们来看一下传统分区与VAB分区的结构'''&lt;br /&gt;
[[文件:安卓系统分区结构.png|边框|左|640x640像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''也就是说，在AB分区的设备中，system_a和system_b等ab分区是真实存在的，他们会占用空间，而在VAB中(以下以默认槽位A为例)，system_a和system_b并非同时存在，在切换槽位时进行的操作比较复杂。无缝更新最大的优点在于：几乎无感，安全。'''&lt;br /&gt;
&lt;br /&gt;
OTA 更新可以在系统运行期间进行，不会打断正常的使用。在更新写入完成后，只需要重启一次切换槽位即可完成系统更新。如果 OTA因为刷机失败等原因导致无法启动，将继续启动先前的操作系统。&lt;br /&gt;
&lt;br /&gt;
更新包可以流式传输到 A/B 设备，因此在安装之前不需要先下载更新包。流式更新意味着用户没有必要在 /data 或 /cache 上留出足够的可用空间以存储更新包。&lt;br /&gt;
&lt;br /&gt;
相比之下A-Only设备则没有上述优点，因为只有一套系统分区，如果OTA失败则会直接导致设备无法开机&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
空间占用对比：&lt;br /&gt;
[[文件:谷歌提供的图片.png|左|缩略图|805x805像素]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
参考资料(来自AOSP文档)：https://source.android.com/docs/core/architecture/partitions?hl=zh-cn#standard-partitions&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E8%B0%B7%E6%AD%8C%E6%8F%90%E4%BE%9B%E7%9A%84%E5%9B%BE%E7%89%87.png&amp;diff=847</id>
		<title>文件:谷歌提供的图片.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E8%B0%B7%E6%AD%8C%E6%8F%90%E4%BE%9B%E7%9A%84%E5%9B%BE%E7%89%87.png&amp;diff=847"/>
		<updated>2024-08-18T12:38:38Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;谷歌提供的图片&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E5%AE%89%E5%8D%93%E7%B3%BB%E7%BB%9F%E5%88%86%E5%8C%BA%E7%BB%93%E6%9E%84.png&amp;diff=846</id>
		<title>文件:安卓系统分区结构.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E5%AE%89%E5%8D%93%E7%B3%BB%E7%BB%9F%E5%88%86%E5%8C%BA%E7%BB%93%E6%9E%84.png&amp;diff=846"/>
		<updated>2024-08-18T12:36:05Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;安卓系统分区结构&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E5%AE%89%E5%8D%93%E5%88%86%E5%8C%BA%E7%BB%93%E6%9E%84%E5%AF%B9%E6%AF%94.png&amp;diff=845</id>
		<title>文件:安卓分区结构对比.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E6%96%87%E4%BB%B6:%E5%AE%89%E5%8D%93%E5%88%86%E5%8C%BA%E7%BB%93%E6%9E%84%E5%AF%B9%E6%AF%94.png&amp;diff=845"/>
		<updated>2024-08-18T12:34:12Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;安卓分区结构对比&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=488</id>
		<title>Git使用教程</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=488"/>
		<updated>2024-02-16T12:21:45Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​git submodule&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Git的由来： ===&lt;br /&gt;
Git是一个开源的分布式版本控制系统，可以有效、高速地处理从很小到非常大的项目版本管理，也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper。&lt;br /&gt;
&lt;br /&gt;
=== 常见的代码托管平台： ===&lt;br /&gt;
[https://github.com Github]&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com Gitlab]&lt;br /&gt;
&lt;br /&gt;
[https://gitee.com Gitee]&lt;br /&gt;
&lt;br /&gt;
=== Git 常见命令: ===&lt;br /&gt;
&lt;br /&gt;
==== git init ====&lt;br /&gt;
在本地目录中初始化一个新的Git仓库&lt;br /&gt;
&lt;br /&gt;
==== git config ====&lt;br /&gt;
用于配置用户的信息以及其他设置,在使用git之前您必须完成以下步骤。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.name &amp;quot;your username&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.email &amp;quot;your email&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git clone ====&lt;br /&gt;
用于将远程仓库的代码克隆到本地，以下是命令中各个参数的含义：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;url&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆某个地址(url)的仓库，远程仓库的地址可以是本地的目录，也可以是例如github,giteee,gitlab一类的代码托管平台&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--depth=&amp;lt;number&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆仓库并且保留number条提交历史，number在此处即表达我们克隆的深度。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-b &amp;lt;branch&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆指定分支下的仓库内容&lt;br /&gt;
&lt;br /&gt;
例如我们要克隆&amp;lt;code&amp;gt;LineageOS&amp;lt;/code&amp;gt;的内核源码，指定&amp;lt;code&amp;gt;lineage-21&amp;lt;/code&amp;gt;分支，且仅保留最近一个提交，则需要输入:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone -b lineage-21 &amp;lt;nowiki&amp;gt;https://github.com/LineageOS/android_kernel_xiaomi_sdm845&amp;lt;/nowiki&amp;gt; --depth=1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git add ====&lt;br /&gt;
添加某个文件，或者目录到暂存区，用于告诉git你需要将哪些文件的更改包含在下一次的提交(commit)之中添加一个或者多个文件到暂存区之中&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [file1] [file2]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加指定目录(文件)到暂存区，包括子目录：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [dir]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加当前目录下的所有文件到暂存区：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git status ====&lt;br /&gt;
查看当前仓库的状态，此时git会在你的终端输出以下内容&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;em style=&amp;quot;color: gray;&amp;quot;&amp;gt;此处演示为英文，如果您的git终端输出为中文也是同理的&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
On branch master&lt;br /&gt;
No commits yet&lt;br /&gt;
Changes to be committed:  &lt;br /&gt;
&lt;br /&gt;
(use “git rm --cached &amp;lt;file&amp;gt;...” to unstage)       &lt;br /&gt;
new file:   makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
输出内容分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
您目前所在的分支&lt;br /&gt;
目前的提交&lt;br /&gt;
需要更改的内容&lt;br /&gt;
新增的文件&lt;br /&gt;
修改的文件&lt;br /&gt;
删除的文件&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git commit ====&lt;br /&gt;
用于将暂存区我们保存的更改文件添加到本地仓库，并且会生成一条提交（commit）&lt;br /&gt;
&lt;br /&gt;
提交暂存区的更改到本地仓库&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;quot;message&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[注] message 可以是你的备注信息&lt;br /&gt;
&lt;br /&gt;
提交暂存区中的指定文件到本地仓库&lt;br /&gt;
&lt;br /&gt;
如果你没有使用上述&amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt;命令暂存你的修改文件，可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
进行直接提交&lt;br /&gt;
&lt;br /&gt;
==== git checkout ====&lt;br /&gt;
&lt;br /&gt;
* 用于分支切换&lt;br /&gt;
&lt;br /&gt;
切换分支：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如在您的仓库中有这几个分支：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-&amp;gt; master (Default)&lt;br /&gt;
   backup&lt;br /&gt;
   test&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
您当前处于 master 分支，如果想要切换到test分支，我们可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 用于检出文件&lt;br /&gt;
将指定的文件恢复到最新的提交状态，撤销你对其的更改&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout -- &amp;lt;file&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git push ====&lt;br /&gt;
用于将本地的分支版本上传到远程仓库并进行合并&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push &amp;lt;remote-host-name&amp;gt; &amp;lt;local-branch-name&amp;gt;:&amp;lt;remote-branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
remote-host-name:远程主机名&lt;br /&gt;
&lt;br /&gt;
local-branch-name:本地分支名&lt;br /&gt;
&lt;br /&gt;
例如，当你的远程主机名为origin ，本地分支名为master，远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master:master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如，当你的rhost名为origin 本地分支名为master远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
本地和远程分支名相同，上述命令可以简写为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当你的远程版本与本地版本有差异，无法直接push时，你可以使用--force 参数来进行强制推送&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push --force origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--force 此处可以直接简单化为 -f &lt;br /&gt;
&lt;br /&gt;
如果你想要删除主机内的某个分支，你可以使用--delete参数&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin --delete &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git diff ====&lt;br /&gt;
用于比较当前工作区与上一个版本之间的差异&lt;br /&gt;
&lt;br /&gt;
例如：（此处仅做不恰当举例，Makefile不是这样乱写的）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
diff --git a/makefile b/makefile&lt;br /&gt;
&lt;br /&gt;
index fbb8c85..d65c7eb 100644&lt;br /&gt;
&lt;br /&gt;
--- a/makefile&lt;br /&gt;
&lt;br /&gt;
+++ b/makefile&lt;br /&gt;
&lt;br /&gt;
@@ -1 +1,2 @@&lt;br /&gt;
&lt;br /&gt;
114514&lt;br /&gt;
&lt;br /&gt;
+1919180&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git log ====&lt;br /&gt;
用于查看提交的历史&lt;br /&gt;
&lt;br /&gt;
例如当你进行一次提交之后，执行 &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt;终端会输出&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit 3a5b0d12f471418b13f2baf5e9e4c112a5e804a8 (HEAD -&amp;gt; master)&lt;br /&gt;
&lt;br /&gt;
Author: luluzzy &amp;lt;1054438588@qq.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Date:   Thu Feb 15 21:28:47 2024 +0800&lt;br /&gt;
&lt;br /&gt;
    initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些输出分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit sha1 hash:   针对你这个提交的 commit id&lt;br /&gt;
Author: commit      作者名称   &amp;lt;you@example.com&amp;gt;&lt;br /&gt;
Date: commit        日期&lt;br /&gt;
commit:             名称&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
关于sha1_hash的介绍请看这里&amp;lt;ref&amp;gt;生成这个hash值，它是对那个commit是Git仓库中内容和头信息Header的一个校验和checksum。Linux kernel开创者和Git的开发者——Linus说，Git使用了sha1并非是为了安全性，而是为了数据的完整性；它可以保证，在很多年后，你重新checkout某个commit时，一定是它多年前的当时的状态，完全一摸一样，完全值得信任。在Git中，根据commit的sha1值40个十六进制数字进行了简单的划分目录，以前2位数字作为目录名，其下面是剩余38位数字组成的一个文件名&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当有多次提交之后，如果我们想要翻之前的提交历史，难免会因为终端输出的内容过多而难以查看翻阅&lt;br /&gt;
&lt;br /&gt;
此时我们可以使用&amp;lt;code&amp;gt;--online&amp;lt;/code&amp;gt;参数来简化输出，此时仅会输出: sha1哈希值 + commit的名称&lt;br /&gt;
&lt;br /&gt;
例如&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
347595d (HEAD -&amp;gt; master) modify makefile&lt;br /&gt;
&lt;br /&gt;
3a5b0d1 initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git cherry-pick ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cherry-pick (遴选) 和它的名称一样，挑选一个我们需要的 commit 进行操作。它可以用于将在其他分支上的 commit 修改，移植到当前的分支。&lt;br /&gt;
&lt;br /&gt;
如果我们想在我们正在开发的版本上，添加一个其他版本中的功能代码。就可以使用 cherry-pick ，将这个功能相关的 commit 提取出来，合入该版本。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git cherry-pick &amp;lt;commit-id&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当我们执行完 &amp;lt;code&amp;gt;cherry-pick&amp;lt;/code&amp;gt;操作之后，会自动生成一个&amp;lt;code&amp;gt;commit&amp;lt;/code&amp;gt;以及对应新的&amp;lt;code&amp;gt;commit-id&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在顺利的情况下我们可以直接通过，但如果遇到代码等因为变量名，写法等不同的情况，&amp;lt;code&amp;gt;cherry-pick&amp;lt;/code&amp;gt;大概率会报错，此时我们需要进行报错处理。&lt;br /&gt;
&lt;br /&gt;
第一种方案是手动修改&lt;br /&gt;
&lt;br /&gt;
我们可以先使用&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;检查当前遴选时冲突的文件&lt;br /&gt;
&lt;br /&gt;
然后 &amp;lt;code&amp;gt;git checkout --ours filename&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后按照提交的修改内容进行手动修改&lt;br /&gt;
&lt;br /&gt;
随后使用&amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt;命令将文件重新加入暂存区&lt;br /&gt;
&lt;br /&gt;
再使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git cherry-pick --continue&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
命令让 cherrypick 操作继续执行。&lt;br /&gt;
&lt;br /&gt;
第二种方案是直接退出&amp;lt;code&amp;gt;cherry-pick&amp;lt;/code&amp;gt;进程，一般适用于冲突文件实在太多了难以按照方案一处理的情况。&lt;br /&gt;
&lt;br /&gt;
需要注意的是，如果您当前正在遴选的提交在该分支已经存在也会冲突，在这种情况下，您需要解决冲突并手动解决问题。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git cherry-pick --abort&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git fetch ====&lt;br /&gt;
git fetch 命令用于从远程获取仓库。&lt;br /&gt;
&lt;br /&gt;
==== git merge ====&lt;br /&gt;
&amp;lt;code&amp;gt;git merge&amp;lt;/code&amp;gt;是用来把分叉的提交历史放回到一起(合并)的方式。&lt;br /&gt;
&lt;br /&gt;
git merge命令用来将你之前使用git branch命令创建的分支以及在此分支上独立开发的内容整合为一个分支。&lt;br /&gt;
&lt;br /&gt;
本&lt;br /&gt;
&lt;br /&gt;
==== git pull ====&lt;br /&gt;
用于从远程获取代码并合并本地的版本。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt;其实就是&amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;git merge FETCH_HEAD&amp;lt;/code&amp;gt; 的简写。&lt;br /&gt;
&lt;br /&gt;
格式如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git pull &amp;lt;remote-host-name&amp;gt; &amp;lt;remote-branch-name&amp;gt;:&amp;lt;local-branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git rebase ====&lt;br /&gt;
用于需要修改历史上某一项commit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git rebase -i HEAD~&amp;lt;commit number&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
commit number就是从头部往前数的commit数量。执行后会弹出你在git config内配置的编辑器，若未配置则是默认，vim居多。然后就可以看见一堆commit前面有pick字样。可以将pick替换为你想要的操作。&lt;br /&gt;
有以下操作：&lt;br /&gt;
&lt;br /&gt;
1.edit，顾名思义编辑此commit，替换完保存后请修改内容，使用&amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt;或vscode，github desktop将修改文件添加到暂存区，之后命令行执行&amp;lt;code&amp;gt;git commit --amend&amp;lt;/code&amp;gt;这样commit就修改成了&lt;br /&gt;
&lt;br /&gt;
2.squash，合并几个提交，确认一个父提交，将要合并的commit，从下向上替换字符串，会从下向上合并(方位指的是&amp;lt;code&amp;gt;git rebase&amp;lt;/code&amp;gt;后弹出的编辑器)&lt;br /&gt;
&lt;br /&gt;
3.drop，需要移除的commit&lt;br /&gt;
&lt;br /&gt;
==== git subtree ====&lt;br /&gt;
子树，在Android开发中多用于Kernel侧更改，如跟踪audio模块等&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git subtree add --prefix=&amp;lt;目录&amp;gt; &amp;lt;仓库地址&amp;gt; &amp;lt;远程分支&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果需要更新远程库时&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git subtree pull --prefix=&amp;lt;目录&amp;gt; &amp;lt;仓库地址&amp;gt; &amp;lt;远程分支&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git submodule ====&lt;br /&gt;
&lt;br /&gt;
===== 子模块功能的概述 =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git submodule&amp;lt;/code&amp;gt;允许在自己的Github仓库里加入别人的github仓库，作为自己仓库的子仓库(即submodule)。&lt;br /&gt;
&lt;br /&gt;
为什么我们会需要使用子模块？当我们维护一个项目时有可能遇到以下情况，例如维护某款机型的KernelSU内核，我们需要将KernelSU导入至我们的内核源码中，如果我们直接clone进去容易带来一个问题，如果KernelSU更新了怎么办？此时我们便可以使用子模块来解决这个问题&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git submodule&amp;lt;/code&amp;gt;允许在git仓库里存放别人仓库的url，作为自己的子模块，其核心内容是在Git仓库里面加入一个&amp;lt;code&amp;gt;.gitmodules&amp;lt;/code&amp;gt;文件，里面会记录各个submodule的名字，路径，以及对应链接。&lt;br /&gt;
&lt;br /&gt;
===== 加入子模块 =====&lt;br /&gt;
&amp;lt;code&amp;gt;git submodule add &amp;lt;url&amp;gt; &amp;lt;path&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
此时 &amp;lt;code&amp;gt;.gitmodules&amp;lt;/code&amp;gt;内会自动生成以下内容&lt;br /&gt;
&lt;br /&gt;
[submodule &amp;quot;xxx&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
path = xxx&lt;br /&gt;
&lt;br /&gt;
url = xxx&lt;br /&gt;
&lt;br /&gt;
===== 初始化子模块 =====&lt;br /&gt;
&amp;lt;code&amp;gt;git submodule init&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 更新子模块 =====&lt;br /&gt;
&amp;lt;code&amp;gt;git submodule update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 参考资料： ====&lt;br /&gt;
[1] 百度百科 -- Git：&amp;lt;nowiki&amp;gt;https://baike.baidu.com/item/GIT/12647237?fr=ge_ala&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[2] 菜鸟教程 -- Git基本操作：&amp;lt;nowiki&amp;gt;https://www.runoob.com/git/git-basic-operations.html&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[3] CSDN -- git merge 使用简介: &amp;lt;nowiki&amp;gt;https://blog.csdn.net/All_In_gzx_cc/article/details/125482617&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=487</id>
		<title>Git使用教程</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=487"/>
		<updated>2024-02-16T12:11:36Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​修正subtree小标题&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Git的由来： ===&lt;br /&gt;
Git是一个开源的分布式版本控制系统，可以有效、高速地处理从很小到非常大的项目版本管理，也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper。&lt;br /&gt;
&lt;br /&gt;
=== 常见的代码托管平台： ===&lt;br /&gt;
[https://github.com Github]&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com Gitlab]&lt;br /&gt;
&lt;br /&gt;
[https://gitee.com Gitee]&lt;br /&gt;
&lt;br /&gt;
=== Git 常见命令: ===&lt;br /&gt;
&lt;br /&gt;
==== git init ====&lt;br /&gt;
在本地目录中初始化一个新的Git仓库&lt;br /&gt;
&lt;br /&gt;
==== git config ====&lt;br /&gt;
用于配置用户的信息以及其他设置,在使用git之前您必须完成以下步骤。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.name &amp;quot;your username&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.email &amp;quot;your email&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git clone ====&lt;br /&gt;
用于将远程仓库的代码克隆到本地，以下是命令中各个参数的含义：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;url&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆某个地址(url)的仓库，远程仓库的地址可以是本地的目录，也可以是例如github,giteee,gitlab一类的代码托管平台&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--depth=&amp;lt;number&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆仓库并且保留number条提交历史，number在此处即表达我们克隆的深度。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-b &amp;lt;branch&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆指定分支下的仓库内容&lt;br /&gt;
&lt;br /&gt;
例如我们要克隆&amp;lt;code&amp;gt;LineageOS&amp;lt;/code&amp;gt;的内核源码，指定&amp;lt;code&amp;gt;lineage-21&amp;lt;/code&amp;gt;分支，且仅保留最近一个提交，则需要输入:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone -b lineage-21 &amp;lt;nowiki&amp;gt;https://github.com/LineageOS/android_kernel_xiaomi_sdm845&amp;lt;/nowiki&amp;gt; --depth=1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git add ====&lt;br /&gt;
添加某个文件，或者目录到暂存区，用于告诉git你需要将哪些文件的更改包含在下一次的提交(commit)之中添加一个或者多个文件到暂存区之中&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [file1] [file2]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加指定目录(文件)到暂存区，包括子目录：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [dir]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加当前目录下的所有文件到暂存区：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git status ====&lt;br /&gt;
查看当前仓库的状态，此时git会在你的终端输出以下内容&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;em style=&amp;quot;color: gray;&amp;quot;&amp;gt;此处演示为英文，如果您的git终端输出为中文也是同理的&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
On branch master&lt;br /&gt;
No commits yet&lt;br /&gt;
Changes to be committed:  &lt;br /&gt;
&lt;br /&gt;
(use “git rm --cached &amp;lt;file&amp;gt;...” to unstage)       &lt;br /&gt;
new file:   makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
输出内容分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
您目前所在的分支&lt;br /&gt;
目前的提交&lt;br /&gt;
需要更改的内容&lt;br /&gt;
新增的文件&lt;br /&gt;
修改的文件&lt;br /&gt;
删除的文件&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git commit ====&lt;br /&gt;
用于将暂存区我们保存的更改文件添加到本地仓库，并且会生成一条提交（commit）&lt;br /&gt;
&lt;br /&gt;
提交暂存区的更改到本地仓库&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;quot;message&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[注] message 可以是你的备注信息&lt;br /&gt;
&lt;br /&gt;
提交暂存区中的指定文件到本地仓库&lt;br /&gt;
&lt;br /&gt;
如果你没有使用上述&amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt;命令暂存你的修改文件，可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
进行直接提交&lt;br /&gt;
&lt;br /&gt;
==== git checkout ====&lt;br /&gt;
&lt;br /&gt;
* 用于分支切换&lt;br /&gt;
&lt;br /&gt;
切换分支：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如在您的仓库中有这几个分支：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-&amp;gt; master (Default)&lt;br /&gt;
   backup&lt;br /&gt;
   test&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
您当前处于 master 分支，如果想要切换到test分支，我们可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 用于检出文件&lt;br /&gt;
将指定的文件恢复到最新的提交状态，撤销你对其的更改&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout -- &amp;lt;file&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git push ====&lt;br /&gt;
用于将本地的分支版本上传到远程仓库并进行合并&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push &amp;lt;remote-host-name&amp;gt; &amp;lt;local-branch-name&amp;gt;:&amp;lt;remote-branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
remote-host-name:远程主机名&lt;br /&gt;
&lt;br /&gt;
local-branch-name:本地分支名&lt;br /&gt;
&lt;br /&gt;
例如，当你的远程主机名为origin ，本地分支名为master，远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master:master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如，当你的rhost名为origin 本地分支名为master远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
本地和远程分支名相同，上述命令可以简写为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当你的远程版本与本地版本有差异，无法直接push时，你可以使用--force 参数来进行强制推送&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push --force origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--force 此处可以直接简单化为 -f &lt;br /&gt;
&lt;br /&gt;
如果你想要删除主机内的某个分支，你可以使用--delete参数&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin --delete &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git diff ====&lt;br /&gt;
用于比较当前工作区与上一个版本之间的差异&lt;br /&gt;
&lt;br /&gt;
例如：（此处仅做不恰当举例，Makefile不是这样乱写的）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
diff --git a/makefile b/makefile&lt;br /&gt;
&lt;br /&gt;
index fbb8c85..d65c7eb 100644&lt;br /&gt;
&lt;br /&gt;
--- a/makefile&lt;br /&gt;
&lt;br /&gt;
+++ b/makefile&lt;br /&gt;
&lt;br /&gt;
@@ -1 +1,2 @@&lt;br /&gt;
&lt;br /&gt;
114514&lt;br /&gt;
&lt;br /&gt;
+1919180&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git log ====&lt;br /&gt;
用于查看提交的历史&lt;br /&gt;
&lt;br /&gt;
例如当你进行一次提交之后，执行 &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt;终端会输出&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit 3a5b0d12f471418b13f2baf5e9e4c112a5e804a8 (HEAD -&amp;gt; master)&lt;br /&gt;
&lt;br /&gt;
Author: luluzzy &amp;lt;1054438588@qq.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Date:   Thu Feb 15 21:28:47 2024 +0800&lt;br /&gt;
&lt;br /&gt;
    initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些输出分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit sha1 hash:   针对你这个提交的 commit id&lt;br /&gt;
Author: commit      作者名称   &amp;lt;you@example.com&amp;gt;&lt;br /&gt;
Date: commit        日期&lt;br /&gt;
commit:             名称&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
关于sha1_hash的介绍请看这里&amp;lt;ref&amp;gt;生成这个hash值，它是对那个commit是Git仓库中内容和头信息Header的一个校验和checksum。Linux kernel开创者和Git的开发者——Linus说，Git使用了sha1并非是为了安全性，而是为了数据的完整性；它可以保证，在很多年后，你重新checkout某个commit时，一定是它多年前的当时的状态，完全一摸一样，完全值得信任。在Git中，根据commit的sha1值40个十六进制数字进行了简单的划分目录，以前2位数字作为目录名，其下面是剩余38位数字组成的一个文件名&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当有多次提交之后，如果我们想要翻之前的提交历史，难免会因为终端输出的内容过多而难以查看翻阅&lt;br /&gt;
&lt;br /&gt;
此时我们可以使用&amp;lt;code&amp;gt;--online&amp;lt;/code&amp;gt;参数来简化输出，此时仅会输出: sha1哈希值 + commit的名称&lt;br /&gt;
&lt;br /&gt;
例如&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
347595d (HEAD -&amp;gt; master) modify makefile&lt;br /&gt;
&lt;br /&gt;
3a5b0d1 initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git cherry-pick ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cherry-pick (遴选) 和它的名称一样，挑选一个我们需要的 commit 进行操作。它可以用于将在其他分支上的 commit 修改，移植到当前的分支。&lt;br /&gt;
&lt;br /&gt;
如果我们想在我们正在开发的版本上，添加一个其他版本中的功能代码。就可以使用 cherry-pick ，将这个功能相关的 commit 提取出来，合入该版本。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git cherry-pick &amp;lt;commit-id&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当我们执行完 &amp;lt;code&amp;gt;cherry-pick&amp;lt;/code&amp;gt;操作之后，会自动生成一个&amp;lt;code&amp;gt;commit&amp;lt;/code&amp;gt;以及对应新的&amp;lt;code&amp;gt;commit-id&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在顺利的情况下我们可以直接通过，但如果遇到代码等因为变量名，写法等不同的情况，&amp;lt;code&amp;gt;cherry-pick&amp;lt;/code&amp;gt;大概率会报错，此时我们需要进行报错处理。&lt;br /&gt;
&lt;br /&gt;
第一种方案是手动修改&lt;br /&gt;
&lt;br /&gt;
我们可以先使用&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;检查当前遴选时冲突的文件&lt;br /&gt;
&lt;br /&gt;
然后 &amp;lt;code&amp;gt;git checkout --ours filename&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后按照提交的修改内容进行手动修改&lt;br /&gt;
&lt;br /&gt;
随后使用&amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt;命令将文件重新加入暂存区&lt;br /&gt;
&lt;br /&gt;
再使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git cherry-pick --continue&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
命令让 cherrypick 操作继续执行。&lt;br /&gt;
&lt;br /&gt;
第二种方案是直接退出&amp;lt;code&amp;gt;cherry-pick&amp;lt;/code&amp;gt;进程，一般适用于冲突文件实在太多了难以按照方案一处理的情况。&lt;br /&gt;
&lt;br /&gt;
需要注意的是，如果您当前正在遴选的提交在该分支已经存在也会冲突，在这种情况下，您需要解决冲突并手动解决问题。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git cherry-pick --abort&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git fetch ====&lt;br /&gt;
git fetch 命令用于从远程获取仓库。&lt;br /&gt;
&lt;br /&gt;
==== git merge ====&lt;br /&gt;
&amp;lt;code&amp;gt;git merge&amp;lt;/code&amp;gt;是用来把分叉的提交历史放回到一起(合并)的方式。&lt;br /&gt;
&lt;br /&gt;
git merge命令用来将你之前使用git branch命令创建的分支以及在此分支上独立开发的内容整合为一个分支。&lt;br /&gt;
&lt;br /&gt;
本&lt;br /&gt;
&lt;br /&gt;
==== git pull ====&lt;br /&gt;
用于从远程获取代码并合并本地的版本。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt;其实就是&amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;git merge FETCH_HEAD&amp;lt;/code&amp;gt; 的简写。&lt;br /&gt;
&lt;br /&gt;
格式如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git pull &amp;lt;remote-host-name&amp;gt; &amp;lt;remote-branch-name&amp;gt;:&amp;lt;local-branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git rebase ====&lt;br /&gt;
用于需要修改历史上某一项commit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git rebase -i HEAD~&amp;lt;commit number&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
commit number就是从头部往前数的commit数量。执行后会弹出你在git config内配置的编辑器，若未配置则是默认，vim居多。然后就可以看见一堆commit前面有pick字样。可以将pick替换为你想要的操作。&lt;br /&gt;
有以下操作：&lt;br /&gt;
&lt;br /&gt;
1.edit，顾名思义编辑此commit，替换完保存后请修改内容，使用&amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt;或vscode，github desktop将修改文件添加到暂存区，之后命令行执行&amp;lt;code&amp;gt;git commit --amend&amp;lt;/code&amp;gt;这样commit就修改成了&lt;br /&gt;
&lt;br /&gt;
2.squash，合并几个提交，确认一个父提交，将要合并的commit，从下向上替换字符串，会从下向上合并(方位指的是&amp;lt;code&amp;gt;git rebase&amp;lt;/code&amp;gt;后弹出的编辑器)&lt;br /&gt;
&lt;br /&gt;
3.drop，需要移除的commit&lt;br /&gt;
&lt;br /&gt;
==== git subtree ====&lt;br /&gt;
子树，在Android开发中多用于Kernel侧更改，如跟踪audio模块等&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git subtree add --prefix=&amp;lt;目录&amp;gt; &amp;lt;仓库地址&amp;gt; &amp;lt;远程分支&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果需要更新远程库时&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git subtree pull --prefix=&amp;lt;目录&amp;gt; &amp;lt;仓库地址&amp;gt; &amp;lt;远程分支&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 参考资料： ====&lt;br /&gt;
[1] 百度百科 -- Git：&amp;lt;nowiki&amp;gt;https://baike.baidu.com/item/GIT/12647237?fr=ge_ala&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[2] 菜鸟教程 -- Git基本操作：&amp;lt;nowiki&amp;gt;https://www.runoob.com/git/git-basic-operations.html&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[3] CSDN -- git merge 使用简介: &amp;lt;nowiki&amp;gt;https://blog.csdn.net/All_In_gzx_cc/article/details/125482617&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android%E5%86%85%E6%A0%B8%E7%BC%96%E8%AF%91%E5%85%A5%E9%97%A8&amp;diff=486</id>
		<title>Android内核编译入门</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android%E5%86%85%E6%A0%B8%E7%BC%96%E8%AF%91%E5%85%A5%E9%97%A8&amp;diff=486"/>
		<updated>2024-02-16T11:55:43Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​设备代号&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Android 内核简介 ===&lt;br /&gt;
安卓内核用的也是linux（LTS），google把LTS内核和Android的一些补丁、模块结合形成自己的Android通用内核（Android common kernel，ACK）。也就是GKI, Generic Kernel Image。&lt;br /&gt;
&lt;br /&gt;
相当于现在变成了一个Image，镜像了。&lt;br /&gt;
&lt;br /&gt;
GKI 内核会与包含系统芯片 (SoC) 和板级代码的硬件专用供应商模块进行交互。GKI 内核与供应商模块之间的交互通过内核模块接口 (KMI) 来实现，该接口由标识供应商模块所需的函数和全局数据的符号列表组成。&lt;br /&gt;
&lt;br /&gt;
=== 配置使用环境 ===&lt;br /&gt;
&lt;br /&gt;
===== 推荐的编译环境 =====&lt;br /&gt;
Ubuntu 20.04 / 22.04&lt;br /&gt;
&lt;br /&gt;
Arch Linux&lt;br /&gt;
&lt;br /&gt;
(因为主播使用的就是这个喵）&lt;br /&gt;
&lt;br /&gt;
考虑到编译环境的稳定性不是很推荐装一些其他的系统&lt;br /&gt;
&lt;br /&gt;
你可以使用 VMware virtual machine 或者 WSL2 （Windows Subsystem on Linux）&lt;br /&gt;
&lt;br /&gt;
目前我更推荐使用 WSL 因为其安装较为方便，并且可以与 Microsoft VScode 协同工作方便你对Git的使用以及对内核源码的修改&lt;br /&gt;
&lt;br /&gt;
（当然 Vmware 也可以，只不过我印象不太好，这货 bug 稍微有点多）&lt;br /&gt;
&lt;br /&gt;
关于这两者方案优劣对比详见百度，此处不赘述。&lt;br /&gt;
&lt;br /&gt;
===== 安装WSL2教程 =====&lt;br /&gt;
需要先启用适用于 Linux 的 Windows 子系统以及虚拟化：&lt;br /&gt;
&lt;br /&gt;
按下键盘&amp;lt;code&amp;gt;win+R&amp;lt;/code&amp;gt;，并输入&amp;lt;code&amp;gt;powershell&amp;lt;/code&amp;gt;回车&lt;br /&gt;
&lt;br /&gt;
在&amp;lt;code&amp;gt;poershell&amp;lt;/code&amp;gt;终端内输入以下内容:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;wsl --set --default-version 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
随后打开你的微软应用商店 Microsoft Store&lt;br /&gt;
&lt;br /&gt;
搜索 Ubuntu，选择一个你喜欢的版本安装即可&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== 安装一些必要的工具依赖 =====&lt;br /&gt;
&amp;lt;code&amp;gt;apt-get update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt-get install -y build-essential bc bison python curl git zip ftp gcc-aarch64-linux-gnu gcc-arm-linux-gnueabi libssl-dev lftp wget libfl-dev gcc bc zip make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些依赖可以通过百度查到对应的作用，此处不赘述。&lt;br /&gt;
&lt;br /&gt;
如若你在编译时遇见提示缺依赖的情况，你也可以百度依赖的名字来查询解决方式。&lt;br /&gt;
&lt;br /&gt;
* 安装/下载交叉编译工具链&lt;br /&gt;
&lt;br /&gt;
'''Clang'''&lt;br /&gt;
&lt;br /&gt;
此处推荐两个 &lt;br /&gt;
&lt;br /&gt;
一个是Google官方提供的Clang编译器：[https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/ Google Clang]&lt;br /&gt;
&lt;br /&gt;
一个是由知名大佬kdrag0n 提供的预编译Clang：[https://github.com/kdrag0n/proton-clang Proton Clang]&lt;br /&gt;
&lt;br /&gt;
==== 拉取内核源码 ====&lt;br /&gt;
关于如何找到你的内核源码这件事，大部分内核源码在开源时都会参照以下命名规则命名&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;android_kernel_厂商_平台&amp;lt;/code&amp;gt; 例如 &amp;lt;code&amp;gt;android_kernel_xiaomi_sm8250&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在针对特定机型进行优化或者重构后的源码也会有开发者将其命名为&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;android_kernel_厂商_设备代号（或者机型名称）&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
设备代号请参照这里 ：[[设备代号收录集合]]&lt;br /&gt;
&lt;br /&gt;
我们一般可以在&amp;lt;code&amp;gt;Github&amp;lt;/code&amp;gt;找到这些源码&lt;br /&gt;
&lt;br /&gt;
如果您需要拉取ACK（Android Common Kernel）请前往Google OpenSource&lt;br /&gt;
&lt;br /&gt;
==== 设置环境变量并开始编译 ====&lt;br /&gt;
首先你需要进入你内核源码的目录，你也可以将下列的指令写在脚本里面&amp;lt;pre&amp;gt;&lt;br /&gt;
export CC='放clang的路径/bin/clang'&lt;br /&gt;
export CLANG_TRIPLE=aarch64-linux-gnu-&lt;br /&gt;
export CROSS_COMPILE='aarch64-linux-gnu编译器的路径/bin/aarch64-linux-gnu-'&lt;br /&gt;
export CROSS_COMPILE_ARM32='arm-linux-gnueabi编译器的路径/bin/arm-linux-gnueabi-'&lt;br /&gt;
export ARCH=arm64&lt;br /&gt;
export SUBARCH=arm64&lt;br /&gt;
export KBUILD_BUILD_HOST = &amp;quot;hostname&amp;quot;&lt;br /&gt;
export KBUILD_BUILD_USER = &amp;quot;username&amp;quot;&lt;br /&gt;
make O=out ''device''_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
这里需要注意的是，最后的&amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
取决于你编译的设备的代号，查看你设备的代号请见：[[设备代号收录集合]]&lt;br /&gt;
&lt;br /&gt;
而&amp;lt;code&amp;gt;defconfig&amp;lt;/code&amp;gt;则是你设备在内核中的配置文件，一套内核源码可能被多个设备共有。在编译的时候，make通过不同的配置文件来区分这些设备，这些配置文件在arch/[架构]/config下，在make的时候无需指定路径，直接输入配置文件名字即可。&amp;lt;ref&amp;gt;此处引用了 grislux55 在gitbook上的内核编译教程中针对配置文件的介绍，文末贴上了引用资料链接&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
举个简单的例子，内核源码就是一个大超市，&amp;lt;code&amp;gt;defconfig&amp;lt;/code&amp;gt;（'''购物清单'''）则负责告诉&amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;，'''你需要购买什么东西（对其进行编译），从而达成对设备驱动的区分'''&lt;br /&gt;
&lt;br /&gt;
=== 获取编译结果并刷入测试 ===&lt;br /&gt;
内核文件在[你的项目/输出路径/arch/目标内核架构/boot]下&lt;br /&gt;
&lt;br /&gt;
例如我们编译了xiaomi_sdm8250的内核，则在android_kernel_xiaomi_sm8250/out/arch/arm64/boot/里面&lt;br /&gt;
&lt;br /&gt;
其名为Image或者Image.gz或者Image.gz-dtb&lt;br /&gt;
&lt;br /&gt;
他们的区别在于&lt;br /&gt;
&lt;br /&gt;
随后你需要刷入测试，以前有一种方法是使用 Android Image Kitchen 来解开boot.img 并将你编译好的dtb替换进去，现在看来这种方法未免太不优雅，因此我们可以使用由osm0sis大佬开发的Anykernel3打包卡刷包文件，并可以在 TWRP REC 或者 Horizen Kernel Flasher内进行刷入附链接：&lt;br /&gt;
&lt;br /&gt;
[https://github.com/osm0sis/AnyKernel3 ①Anykernel3]   ②Horizen Kernel Flasher ③[https://twrp.me/ TWRP rec]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 资料参考： ===&lt;br /&gt;
[1] Gtibook 安卓内核编译教程：https://jebchou.gitbook.io/android-kernel-magic/02begin_compile&lt;br /&gt;
&lt;br /&gt;
[2] CSDN 安卓架构-内核：https://blog.csdn.net/weixin_40557160/article/details/128388849&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android%E5%86%85%E6%A0%B8%E7%BC%96%E8%AF%91%E5%85%A5%E9%97%A8&amp;diff=478</id>
		<title>Android内核编译入门</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android%E5%86%85%E6%A0%B8%E7%BC%96%E8%AF%91%E5%85%A5%E9%97%A8&amp;diff=478"/>
		<updated>2024-02-16T11:00:21Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​加入wsl2安装教程&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Android 内核简介 ===&lt;br /&gt;
安卓内核用的也是linux（LTS），google把LTS内核和Android的一些补丁、模块结合形成自己的Android通用内核（Android common kernel，ACK）。也就是GKI, Generic Kernel Image。&lt;br /&gt;
&lt;br /&gt;
相当于现在变成了一个Image，镜像了。&lt;br /&gt;
&lt;br /&gt;
GKI 内核会与包含系统芯片 (SoC) 和板级代码的硬件专用供应商模块进行交互。GKI 内核与供应商模块之间的交互通过内核模块接口 (KMI) 来实现，该接口由标识供应商模块所需的函数和全局数据的符号列表组成。&lt;br /&gt;
&lt;br /&gt;
=== 配置使用环境 ===&lt;br /&gt;
&lt;br /&gt;
===== 推荐的编译环境 =====&lt;br /&gt;
Ubuntu 20.04 / 22.04&lt;br /&gt;
&lt;br /&gt;
Arch Linux&lt;br /&gt;
&lt;br /&gt;
(因为主播使用的就是这个喵）&lt;br /&gt;
&lt;br /&gt;
考虑到编译环境的稳定性不是很推荐装一些其他的系统&lt;br /&gt;
&lt;br /&gt;
你可以使用 VMware virtual machine 或者 WSL2 （Windows Subsystem on Linux）&lt;br /&gt;
&lt;br /&gt;
目前我更推荐使用 WSL 因为其安装较为方便，并且可以与 Microsoft VScode 协同工作方便你对Git的使用以及对内核源码的修改&lt;br /&gt;
&lt;br /&gt;
（当然 Vmware 也可以，只不过我印象不太好，这货 bug 稍微有点多）&lt;br /&gt;
&lt;br /&gt;
关于这两者方案优劣对比详见百度，此处不赘述。&lt;br /&gt;
&lt;br /&gt;
===== 安装WSL2教程 =====&lt;br /&gt;
需要先启用适用于 Linux 的 Windows 子系统以及虚拟化：&lt;br /&gt;
&lt;br /&gt;
按下键盘&amp;lt;code&amp;gt;win+R&amp;lt;/code&amp;gt;，并输入&amp;lt;code&amp;gt;powershell&amp;lt;/code&amp;gt;回车&lt;br /&gt;
&lt;br /&gt;
在&amp;lt;code&amp;gt;poershell&amp;lt;/code&amp;gt;终端内输入以下内容:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;wsl --set --default-version 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
随后打开你的微软应用商店 Microsoft Store&lt;br /&gt;
&lt;br /&gt;
搜索 Ubuntu，选择一个你喜欢的版本安装即可&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== 安装一些必要的工具依赖 =====&lt;br /&gt;
&amp;lt;code&amp;gt;apt-get update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt-get install -y build-essential bc bison python curl git zip ftp gcc-aarch64-linux-gnu gcc-arm-linux-gnueabi libssl-dev lftp wget libfl-dev gcc bc zip make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些依赖可以通过百度查到对应的作用，此处不赘述。&lt;br /&gt;
&lt;br /&gt;
如若你在编译时遇见提示缺依赖的情况，你也可以百度依赖的名字来查询解决方式。&lt;br /&gt;
&lt;br /&gt;
* 安装/下载交叉编译工具链&lt;br /&gt;
&lt;br /&gt;
'''Clang'''&lt;br /&gt;
&lt;br /&gt;
此处推荐两个 &lt;br /&gt;
&lt;br /&gt;
一个是Google官方提供的Clang编译器：[https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/ Google Clang]&lt;br /&gt;
&lt;br /&gt;
一个是由知名大佬kdrag0n 提供的预编译Clang：[https://github.com/kdrag0n/proton-clang Proton Clang]&lt;br /&gt;
&lt;br /&gt;
==== 拉取内核源码 ====&lt;br /&gt;
关于如何找到你的内核源码这件事，大部分内核源码在开源时都会参照以下命名规则命名&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;android_kernel_厂商_平台&amp;lt;/code&amp;gt; 例如 &amp;lt;code&amp;gt;android_kernel_xiaomi_sm8250&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在针对特定机型进行优化或者重构后的源码也会有开发者将其命名为&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;android_kernel_厂商_设备代号（或者机型名称）&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我们一般可以在&amp;lt;code&amp;gt;Github&amp;lt;/code&amp;gt;找到这些源码&lt;br /&gt;
&lt;br /&gt;
如果您需要拉取ACK（Android Common Kernel）请前往Google OpenSource&lt;br /&gt;
&lt;br /&gt;
==== 设置环境变量并开始编译 ====&lt;br /&gt;
首先你需要进入你内核源码的目录，你也可以将下列的指令写在脚本里面&amp;lt;pre&amp;gt;&lt;br /&gt;
export CC='放clang的路径/bin/clang'&lt;br /&gt;
export CLANG_TRIPLE=aarch64-linux-gnu-&lt;br /&gt;
export CROSS_COMPILE='aarch64-linux-gnu编译器的路径/bin/aarch64-linux-gnu-'&lt;br /&gt;
export CROSS_COMPILE_ARM32='arm-linux-gnueabi编译器的路径/bin/arm-linux-gnueabi-'&lt;br /&gt;
export ARCH=arm64&lt;br /&gt;
export SUBARCH=arm64&lt;br /&gt;
export KBUILD_BUILD_HOST = &amp;quot;hostname&amp;quot;&lt;br /&gt;
export KBUILD_BUILD_USER = &amp;quot;username&amp;quot;&lt;br /&gt;
make O=out ''device''_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
这里需要注意的是，最后的&amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
取决于你编译的设备的代号，查看你设备的代号请见：&lt;br /&gt;
&lt;br /&gt;
而&amp;lt;code&amp;gt;defconfig&amp;lt;/code&amp;gt;则是你设备在内核中的配置文件，一套内核源码可能被多个设备共有。在编译的时候，make通过不同的配置文件来区分这些设备，这些配置文件在arch/[架构]/config下，在make的时候无需指定路径，直接输入配置文件名字即可。&amp;lt;ref&amp;gt;此处引用了 grislux55 在gitbook上的内核编译教程中针对配置文件的介绍，文末贴上了引用资料链接&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
举个简单的例子，内核源码就是一个大超市，&amp;lt;code&amp;gt;defconfig&amp;lt;/code&amp;gt;（'''购物清单'''）则负责告诉&amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;，'''你需要购买什么东西（对其进行编译），从而达成对设备驱动的区分'''&lt;br /&gt;
&lt;br /&gt;
=== 获取编译结果并刷入测试 ===&lt;br /&gt;
内核文件在[你的项目/输出路径/arch/目标内核架构/boot]下&lt;br /&gt;
&lt;br /&gt;
例如我们编译了xiaomi_sdm8250的内核，则在android_kernel_xiaomi_sm8250/out/arch/arm64/boot/里面&lt;br /&gt;
&lt;br /&gt;
其名为Image或者Image.gz或者Image.gz-dtb&lt;br /&gt;
&lt;br /&gt;
他们的区别在于&lt;br /&gt;
&lt;br /&gt;
随后你需要刷入测试，以前有一种方法是使用 Android Image Kitchen 来解开boot.img 并将你编译好的dtb替换进去，现在看来这种方法未免太不优雅，因此我们可以使用由osm0sis大佬开发的Anykernel3打包卡刷包文件，并可以在 TWRP REC 或者 Horizen Kernel Flasher内进行刷入附链接：&lt;br /&gt;
&lt;br /&gt;
[https://github.com/osm0sis/AnyKernel3 ①Anykernel3]   ②Horizen Kernel Flasher ③[https://twrp.me/ TWRP rec]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 资料参考： ===&lt;br /&gt;
[1] Gtibook 安卓内核编译教程：https://jebchou.gitbook.io/android-kernel-magic/02begin_compile&lt;br /&gt;
&lt;br /&gt;
[2] CSDN 安卓架构-内核：https://blog.csdn.net/weixin_40557160/article/details/128388849&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android%E5%86%85%E6%A0%B8%E7%BC%96%E8%AF%91%E5%85%A5%E9%97%A8&amp;diff=477</id>
		<title>Android内核编译入门</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android%E5%86%85%E6%A0%B8%E7%BC%96%E8%AF%91%E5%85%A5%E9%97%A8&amp;diff=477"/>
		<updated>2024-02-16T10:43:42Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​补充内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Android 内核简介 ===&lt;br /&gt;
安卓内核用的也是linux（LTS），google把LTS内核和Android的一些补丁、模块结合形成自己的Android通用内核（Android common kernel，ACK）。也就是GKI, Generic Kernel Image。&lt;br /&gt;
&lt;br /&gt;
相当于现在变成了一个Image，镜像了。&lt;br /&gt;
&lt;br /&gt;
GKI 内核会与包含系统芯片 (SoC) 和板级代码的硬件专用供应商模块进行交互。GKI 内核与供应商模块之间的交互通过内核模块接口 (KMI) 来实现，该接口由标识供应商模块所需的函数和全局数据的符号列表组成。&lt;br /&gt;
&lt;br /&gt;
=== 配置使用环境 ===&lt;br /&gt;
Ubuntu 20.04 / 22.04&lt;br /&gt;
&lt;br /&gt;
Arch Linux&lt;br /&gt;
&lt;br /&gt;
(因为主播使用的就是这个喵）&lt;br /&gt;
&lt;br /&gt;
考虑到编译环境的稳定性不是很推荐装一些其他的系统&lt;br /&gt;
&lt;br /&gt;
你可以使用 VMware virtual machine 或者 WSL2 （Windows Subsystem on Linux）&lt;br /&gt;
&lt;br /&gt;
目前我更推荐使用 WSL 因为其安装较为方便，并且可以与 Microsoft VScode 协同工作方便你对Git的使用以及对内核源码的修改&lt;br /&gt;
&lt;br /&gt;
（当然 Vmware 也可以，只不过我印象不太好，这货 bug 稍微有点多）&lt;br /&gt;
&lt;br /&gt;
关于这两者方案优劣对比详见百度，此处不赘述。&lt;br /&gt;
&lt;br /&gt;
* 安装一些必要的工具依赖&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt-get update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt-get install -y build-essential bc bison python curl git zip ftp gcc-aarch64-linux-gnu gcc-arm-linux-gnueabi libssl-dev lftp wget libfl-dev gcc bc zip make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些依赖可以通过百度查到对应的作用，此处不赘述。&lt;br /&gt;
&lt;br /&gt;
如若你在编译时遇见提示缺依赖的情况，你也可以百度依赖的名字来查询解决方式。&lt;br /&gt;
&lt;br /&gt;
* 安装/下载交叉编译工具链&lt;br /&gt;
&lt;br /&gt;
'''Clang'''&lt;br /&gt;
&lt;br /&gt;
此处推荐两个 &lt;br /&gt;
&lt;br /&gt;
一个是Google官方提供的Clang编译器：[https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/ Google Clang]&lt;br /&gt;
&lt;br /&gt;
一个是由知名大佬kdrag0n 提供的预编译Clang：[https://github.com/kdrag0n/proton-clang Proton Clang]&lt;br /&gt;
&lt;br /&gt;
==== 拉取内核源码 ====&lt;br /&gt;
关于如何找到你的内核源码这件事，大部分内核源码在开源时都会参照以下命名规则命名&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;android_kernel_厂商_平台&amp;lt;/code&amp;gt; 例如 &amp;lt;code&amp;gt;android_kernel_xiaomi_sm8250&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在针对特定机型进行优化或者重构后的源码也会有开发者将其命名为&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;android_kernel_厂商_设备代号（或者机型名称）&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我们一般可以在&amp;lt;code&amp;gt;Github&amp;lt;/code&amp;gt;找到这些源码&lt;br /&gt;
&lt;br /&gt;
如果您需要拉取ACK（Android Common Kernel）请前往Google OpenSource&lt;br /&gt;
&lt;br /&gt;
==== 设置环境变量并开始编译 ====&lt;br /&gt;
首先你需要进入你内核源码的目录，你也可以将下列的指令写在脚本里面&amp;lt;pre&amp;gt;&lt;br /&gt;
export CC='放clang的路径/bin/clang'&lt;br /&gt;
export CLANG_TRIPLE=aarch64-linux-gnu-&lt;br /&gt;
export CROSS_COMPILE='aarch64-linux-gnu编译器的路径/bin/aarch64-linux-gnu-'&lt;br /&gt;
export CROSS_COMPILE_ARM32='arm-linux-gnueabi编译器的路径/bin/arm-linux-gnueabi-'&lt;br /&gt;
export ARCH=arm64&lt;br /&gt;
export SUBARCH=arm64&lt;br /&gt;
export KBUILD_BUILD_HOST = &amp;quot;hostname&amp;quot;&lt;br /&gt;
export KBUILD_BUILD_USER = &amp;quot;username&amp;quot;&lt;br /&gt;
make O=out ''device''_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
这里需要注意的是，最后的&amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
取决于你编译的设备的代号，查看你设备的代号请见：&lt;br /&gt;
&lt;br /&gt;
而&amp;lt;code&amp;gt;defconfig&amp;lt;/code&amp;gt;则是你设备在内核中的配置文件，一套内核源码可能被多个设备共有。在编译的时候，make通过不同的配置文件来区分这些设备，这些配置文件在arch/[架构]/config下，在make的时候无需指定路径，直接输入配置文件名字即可。&amp;lt;ref&amp;gt;此处引用了 grislux55 在gitbook上的内核编译教程中针对配置文件的介绍，文末贴上了引用资料链接&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
举个简单的例子，内核源码就是一个大超市，&amp;lt;code&amp;gt;defconfig&amp;lt;/code&amp;gt;（'''购物清单'''）则负责告诉&amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;，'''你需要购买什么东西（对其进行编译），从而达成对设备驱动的区分'''&lt;br /&gt;
&lt;br /&gt;
=== 获取编译结果并刷入测试 ===&lt;br /&gt;
内核文件在[你的项目/输出路径/arch/目标内核架构/boot]下&lt;br /&gt;
&lt;br /&gt;
例如我们编译了xiaomi_sdm8250的内核，则在android_kernel_xiaomi_sm8250/out/arch/arm64/boot/里面&lt;br /&gt;
&lt;br /&gt;
其名为Image或者Image.gz或者Image.gz-dtb&lt;br /&gt;
&lt;br /&gt;
他们的区别在于&lt;br /&gt;
&lt;br /&gt;
随后你需要刷入测试，以前有一种方法是使用 Android Image Kitchen 来解开boot.img 并将你编译好的dtb替换进去，现在看来这种方法未免太不优雅，因此我们可以使用由osm0sis大佬开发的Anykernel3打包卡刷包文件，并可以在 TWRP REC 或者 Horizen Kernel Flasher内进行刷入附链接：&lt;br /&gt;
&lt;br /&gt;
[https://github.com/osm0sis/AnyKernel3 ①Anykernel3]   ②Horizen Kernel Flasher ③[https://twrp.me/ TWRP rec]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 资料参考： ===&lt;br /&gt;
[1] Gtibook 安卓内核编译教程：https://jebchou.gitbook.io/android-kernel-magic/02begin_compile&lt;br /&gt;
&lt;br /&gt;
[2] CSDN 安卓架构-内核：https://blog.csdn.net/weixin_40557160/article/details/128388849&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android%E5%86%85%E6%A0%B8%E7%BC%96%E8%AF%91%E5%85%A5%E9%97%A8&amp;diff=476</id>
		<title>Android内核编译入门</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android%E5%86%85%E6%A0%B8%E7%BC%96%E8%AF%91%E5%85%A5%E9%97%A8&amp;diff=476"/>
		<updated>2024-02-16T10:32:50Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​小修改&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Android 内核简介 ===&lt;br /&gt;
安卓内核用的也是linux（LTS），google把LTS内核和Android的一些补丁、模块结合形成自己的Android通用内核（Android common kernel，ACK）。也就是GKI, Generic Kernel Image。&lt;br /&gt;
&lt;br /&gt;
相当于现在变成了一个Image，镜像了。&lt;br /&gt;
&lt;br /&gt;
GKI 内核会与包含系统芯片 (SoC) 和板级代码的硬件专用供应商模块进行交互。GKI 内核与供应商模块之间的交互通过内核模块接口 (KMI) 来实现，该接口由标识供应商模块所需的函数和全局数据的符号列表组成。&lt;br /&gt;
&lt;br /&gt;
=== 配置使用环境 ===&lt;br /&gt;
Ubuntu 20.04 / 22.04&lt;br /&gt;
&lt;br /&gt;
Arch Linux&lt;br /&gt;
&lt;br /&gt;
(因为主播使用的就是这个喵）&lt;br /&gt;
&lt;br /&gt;
考虑到编译环境的稳定性不是很推荐装一些其他的系统&lt;br /&gt;
&lt;br /&gt;
你可以使用 VMware virtual machine 或者 WSL2 （Windows Subsystem on Linux）&lt;br /&gt;
&lt;br /&gt;
目前我更推荐使用 WSL 因为其安装较为方便，并且可以与 Microsoft VScode 协同工作方便你对Git的使用以及对内核源码的修改&lt;br /&gt;
&lt;br /&gt;
（当然 Vmware 也可以，只不过我印象不太好，这货 bug 稍微有点多）&lt;br /&gt;
&lt;br /&gt;
关于这两者方案优劣对比详见百度，此处不赘述。&lt;br /&gt;
&lt;br /&gt;
* 安装一些必要的工具依赖&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt-get update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt-get install -y build-essential bc bison python curl git zip ftp gcc-aarch64-linux-gnu gcc-arm-linux-gnueabi libssl-dev lftp wget libfl-dev gcc bc zip make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些依赖可以通过百度查到对应的作用，此处不赘述。&lt;br /&gt;
&lt;br /&gt;
如若你在编译时遇见提示缺依赖的情况，你也可以百度依赖的名字来查询解决方式。&lt;br /&gt;
&lt;br /&gt;
* 安装/下载交叉编译工具链&lt;br /&gt;
&lt;br /&gt;
'''Clang'''&lt;br /&gt;
&lt;br /&gt;
此处推荐两个 &lt;br /&gt;
&lt;br /&gt;
一个是Google官方提供的Clang编译器：[https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/ Google Clang]&lt;br /&gt;
&lt;br /&gt;
一个是由知名大佬kdrag0n 提供的预编译Clang：[https://github.com/kdrag0n/proton-clang Proton Clang]&lt;br /&gt;
&lt;br /&gt;
==== 设置环境变量 ====&lt;br /&gt;
你也可以将下列的指令写在脚本里面&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export CC='放clang的路径/bin/clang'&lt;br /&gt;
export CLANG_TRIPLE=aarch64-linux-gnu-&lt;br /&gt;
export CROSS_COMPILE='aarch64-linux-gnu编译器的路径/bin/aarch64-linux-gnu-'&lt;br /&gt;
export CROSS_COMPILE_ARM32='arm-linux-gnueabi编译器的路径/bin/arm-linux-gnueabi-'&lt;br /&gt;
export ARCH=arm64&lt;br /&gt;
export SUBARCH=arm64&lt;br /&gt;
export KBUILD_BUILD_HOST = &amp;quot;hostname&amp;quot;&lt;br /&gt;
export KBUILD_BUILD_USER = &amp;quot;username&amp;quot;&lt;br /&gt;
make O=out ''device''_defconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
这里需要注意的是，最后的&amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
取决于你编译的设备的代号，查看你设备的代号请见：&lt;br /&gt;
&lt;br /&gt;
而&amp;lt;code&amp;gt;defconfig&amp;lt;/code&amp;gt;则是你设备在内核中的配置文件，一套内核源码可能被多个设备共有。在编译的时候，make通过不同的配置文件来区分这些设备，这些配置文件在arch/[架构]/config下，在make的时候无需指定路径，直接输入配置文件名字即可。&amp;lt;ref&amp;gt;此处引用了 grislux55 在gitbook上的内核编译教程中针对配置文件的介绍，文末贴上了引用资料链接&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
举个简单的例子，内核源码就是一个大超市，&amp;lt;code&amp;gt;defconfig&amp;lt;/code&amp;gt;（'''购物清单'''）则负责告诉&amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;，'''你需要购买什么东西（对其进行编译），从而达成对设备驱动的区分'''&lt;br /&gt;
&lt;br /&gt;
==== 拉取内核源码 ====&lt;br /&gt;
关于如何找到你的内核源码这件事，大部分内核源码在开源时都会参照以下命名规则命名&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;android_kernel_厂商_平台&amp;lt;/code&amp;gt; 例如 &amp;lt;code&amp;gt;android_kernel_xiaomi_sm8250&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在针对特定机型进行优化或者重构后的源码也会有开发者将其命名为&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;android_kernel_厂商_设备代号（或者机型名称）&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我们一般可以在&amp;lt;code&amp;gt;Github&amp;lt;/code&amp;gt;找到这些源码&lt;br /&gt;
&lt;br /&gt;
如果您需要拉取ACK（Android Common Kernel）请前往Google OpenSource&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 资料参考： ===&lt;br /&gt;
[1] Gtibook 安卓内核编译教程：https://jebchou.gitbook.io/android-kernel-magic/02begin_compile&lt;br /&gt;
&lt;br /&gt;
[2] CSDN 安卓架构-内核：https://blog.csdn.net/weixin_40557160/article/details/128388849&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android%E5%86%85%E6%A0%B8%E7%BC%96%E8%AF%91%E5%85%A5%E9%97%A8&amp;diff=475</id>
		<title>Android内核编译入门</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android%E5%86%85%E6%A0%B8%E7%BC%96%E8%AF%91%E5%85%A5%E9%97%A8&amp;diff=475"/>
		<updated>2024-02-16T10:31:41Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​添加一些标注&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Android 内核简介 ===&lt;br /&gt;
安卓内核用的也是linux（LTS），google把LTS内核和Android的一些补丁、模块结合形成自己的Android通用内核（Android common kernel，ACK）。也就是GKI, Generic Kernel Image。&lt;br /&gt;
&lt;br /&gt;
相当于现在变成了一个Image，镜像了。&lt;br /&gt;
&lt;br /&gt;
GKI 内核会与包含系统芯片 (SoC) 和板级代码的硬件专用供应商模块进行交互。GKI 内核与供应商模块之间的交互通过内核模块接口 (KMI) 来实现，该接口由标识供应商模块所需的函数和全局数据的符号列表组成。&lt;br /&gt;
&lt;br /&gt;
=== 配置使用环境 ===&lt;br /&gt;
Ubuntu 20.04 / 22.04&lt;br /&gt;
&lt;br /&gt;
Arch Linux&lt;br /&gt;
&lt;br /&gt;
(因为主播使用的就是这个喵）&lt;br /&gt;
&lt;br /&gt;
考虑到编译环境的稳定性不是很推荐装一些其他的系统&lt;br /&gt;
&lt;br /&gt;
你可以使用 VMware virtual machine 或者 WSL2 （Windows Subsystem on Linux）&lt;br /&gt;
&lt;br /&gt;
目前我更推荐使用 WSL 因为其安装较为方便，并且可以与 Microsoft VScode 协同工作方便你对Git的使用以及对内核源码的修改&lt;br /&gt;
&lt;br /&gt;
（当然 Vmware 也可以，只不过我印象不太好，这货 bug 稍微有点多）&lt;br /&gt;
&lt;br /&gt;
关于这两者方案优劣对比详见百度，此处不赘述。&lt;br /&gt;
&lt;br /&gt;
* 安装一些必要的工具依赖&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt-get update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt-get install -y build-essential bc bison python curl git zip ftp gcc-aarch64-linux-gnu gcc-arm-linux-gnueabi libssl-dev lftp wget libfl-dev gcc bc zip make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些依赖可以通过百度查到对应的作用，此处不赘述。&lt;br /&gt;
&lt;br /&gt;
如若你在编译时遇见提示缺依赖的情况，你也可以百度依赖的名字来查询解决方式。&lt;br /&gt;
&lt;br /&gt;
* 安装/下载交叉编译工具链&lt;br /&gt;
&lt;br /&gt;
'''Clang'''&lt;br /&gt;
&lt;br /&gt;
此处推荐两个 &lt;br /&gt;
&lt;br /&gt;
一个是Google官方提供的Clang编译器：[https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/ Google Clang]&lt;br /&gt;
&lt;br /&gt;
一个是由知名大佬kdrag0n 提供的预编译Clang：[https://github.com/kdrag0n/proton-clang Proton Clang]&lt;br /&gt;
&lt;br /&gt;
==== 设置环境变量 ====&lt;br /&gt;
你也可以将下列的指令写在脚本里面&lt;br /&gt;
&lt;br /&gt;
export CC='放clang的路径/bin/clang'&lt;br /&gt;
&lt;br /&gt;
export CLANG_TRIPLE=aarch64-linux-gnu-&lt;br /&gt;
&lt;br /&gt;
export CROSS_COMPILE='aarch64-linux-gnu编译器的路径/bin/aarch64-linux-gnu-'&lt;br /&gt;
&lt;br /&gt;
export CROSS_COMPILE_ARM32='arm-linux-gnueabi编译器的路径/bin/arm-linux-gnueabi-'&lt;br /&gt;
&lt;br /&gt;
export ARCH=arm64&lt;br /&gt;
&lt;br /&gt;
export SUBARCH=arm64&lt;br /&gt;
&lt;br /&gt;
export KBUILD_BUILD_HOST = &amp;quot;hostname&amp;quot;&lt;br /&gt;
&lt;br /&gt;
export KBUILD_BUILD_USER = &amp;quot;username&amp;quot;&lt;br /&gt;
&lt;br /&gt;
make O=out ''device''_defconfig&lt;br /&gt;
&lt;br /&gt;
这里需要注意的是，最后的&amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
取决于你编译的设备的代号，查看你设备的代号请见：&lt;br /&gt;
&lt;br /&gt;
而&amp;lt;code&amp;gt;defconfig&amp;lt;/code&amp;gt;则是你设备在内核中的配置文件，一套内核源码可能被多个设备共有。在编译的时候，make通过不同的配置文件来区分这些设备，这些配置文件在arch/[架构]/config下，在make的时候无需指定路径，直接输入配置文件名字即可。&amp;lt;ref&amp;gt;此处引用了 grislux55 在gitbook上的内核编译教程中针对配置文件的介绍，文末贴上了引用资料链接&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
举个简单的例子，内核源码就是一个大超市，&amp;lt;code&amp;gt;defconfig&amp;lt;/code&amp;gt;（'''购物清单'''）则负责告诉&amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;，'''你需要购买什么东西（对其进行编译），从而达成对设备驱动的区分'''&lt;br /&gt;
&lt;br /&gt;
==== 拉取内核源码 ====&lt;br /&gt;
关于如何找到你的内核源码这件事，大部分内核源码在开源时都会参照以下命名规则命名&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;android_kernel_厂商_平台&amp;lt;/code&amp;gt; 例如 &amp;lt;code&amp;gt;android_kernel_xiaomi_sm8250&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在针对特定机型进行优化或者重构后的源码也会有开发者将其命名为&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;android_kernel_厂商_设备代号（或者机型名称）&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我们一般可以在&amp;lt;code&amp;gt;Github&amp;lt;/code&amp;gt;找到这些源码&lt;br /&gt;
&lt;br /&gt;
如果您需要拉取ACK（Android Common Kernel）请前往Google OpenSource&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 资料参考： ===&lt;br /&gt;
[1] Gtibook 安卓内核编译教程：https://jebchou.gitbook.io/android-kernel-magic/02begin_compile&lt;br /&gt;
&lt;br /&gt;
[2] CSDN 安卓架构-内核：https://blog.csdn.net/weixin_40557160/article/details/128388849&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android%E5%86%85%E6%A0%B8%E7%BC%96%E8%AF%91%E5%85%A5%E9%97%A8&amp;diff=474</id>
		<title>Android内核编译入门</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android%E5%86%85%E6%A0%B8%E7%BC%96%E8%AF%91%E5%85%A5%E9%97%A8&amp;diff=474"/>
		<updated>2024-02-16T10:28:21Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​补充简介部分内容&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Android 内核简介 ===&lt;br /&gt;
安卓内核用的也是linux（LTS），google把LTS内核和Android的一些补丁、模块结合形成自己的Android通用内核（Android common kernel，ACK）。也就是GKI, Generic Kernel Image。&lt;br /&gt;
&lt;br /&gt;
相当于现在变成了一个Image，镜像了。&lt;br /&gt;
&lt;br /&gt;
GKI 内核会与包含系统芯片 (SoC) 和板级代码的硬件专用供应商模块进行交互。GKI 内核与供应商模块之间的交互通过内核模块接口 (KMI) 来实现，该接口由标识供应商模块所需的函数和全局数据的符号列表组成。&lt;br /&gt;
&lt;br /&gt;
=== 配置使用环境 ===&lt;br /&gt;
Ubuntu 20.04 / 22.04&lt;br /&gt;
&lt;br /&gt;
Arch Linux&lt;br /&gt;
&lt;br /&gt;
(因为主播使用的就是这个喵）&lt;br /&gt;
&lt;br /&gt;
考虑到编译环境的稳定性不是很推荐装一些其他的系统&lt;br /&gt;
&lt;br /&gt;
你可以使用 VMware virtual machine 或者 WSL2 （Windows Subsystem on Linux）&lt;br /&gt;
&lt;br /&gt;
目前我更推荐使用 WSL 因为其安装较为方便，并且可以与 Microsoft VScode 协同工作方便你对Git的使用以及对内核源码的修改&lt;br /&gt;
&lt;br /&gt;
（当然 Vmware 也可以，只不过我印象不太好，这货 bug 稍微有点多）&lt;br /&gt;
&lt;br /&gt;
关于这两者方案优劣对比详见百度，此处不赘述。&lt;br /&gt;
&lt;br /&gt;
* 安装一些必要的工具依赖&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt-get update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt-get install -y build-essential bc bison python curl git zip ftp gcc-aarch64-linux-gnu gcc-arm-linux-gnueabi libssl-dev lftp wget libfl-dev gcc bc zip make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些依赖可以通过百度查到对应的作用，此处不赘述。&lt;br /&gt;
&lt;br /&gt;
如若你在编译时遇见提示缺依赖的情况，你也可以百度依赖的名字来查询解决方式。&lt;br /&gt;
&lt;br /&gt;
* 安装/下载交叉编译工具链&lt;br /&gt;
&lt;br /&gt;
'''Clang'''&lt;br /&gt;
&lt;br /&gt;
此处推荐两个 &lt;br /&gt;
&lt;br /&gt;
一个是Google官方提供的Clang编译器：[https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/ Google Clang]&lt;br /&gt;
&lt;br /&gt;
一个是由知名大佬kdrag0n 提供的预编译Clang：[https://github.com/kdrag0n/proton-clang Proton Clang]&lt;br /&gt;
&lt;br /&gt;
==== 设置环境变量 ====&lt;br /&gt;
你也可以将下列的指令写在脚本里面&lt;br /&gt;
&lt;br /&gt;
export CC='放clang的路径/bin/clang'&lt;br /&gt;
&lt;br /&gt;
export CLANG_TRIPLE=aarch64-linux-gnu-&lt;br /&gt;
&lt;br /&gt;
export CROSS_COMPILE='aarch64-linux-gnu编译器的路径/bin/aarch64-linux-gnu-'&lt;br /&gt;
&lt;br /&gt;
export CROSS_COMPILE_ARM32='arm-linux-gnueabi编译器的路径/bin/arm-linux-gnueabi-'&lt;br /&gt;
&lt;br /&gt;
export ARCH=arm64&lt;br /&gt;
&lt;br /&gt;
export SUBARCH=arm64&lt;br /&gt;
&lt;br /&gt;
export KBUILD_BUILD_HOST=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
export KBUILD_BUILD_USER=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
make O=out ''device''_defconfig&lt;br /&gt;
&lt;br /&gt;
这里需要注意的是，最后的&amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
取决于你编译的设备的代号，查看你设备的代号请见：&lt;br /&gt;
&lt;br /&gt;
而&amp;lt;code&amp;gt;defconfig&amp;lt;/code&amp;gt;则是你设备在内核中的配置文件，一套内核源码可能被多个设备共有。在编译的时候，make通过不同的配置文件来区分这些设备，这些配置文件在arch/[架构]/config下，在make的时候无需指定路径，直接输入配置文件名字即可。&amp;lt;ref&amp;gt;此处引用了 grislux55 在gitbook上的内核编译教程中针对配置文件的介绍，文末贴上了引用资料链接&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
举个简单的例子，内核源码就是一个大超市，'''defconfig'''（'''购物清单'''）则负责告诉 '''make'''，'''你需要购买什么东西（对其进行编译），从而达成对设备驱动的区分'''&lt;br /&gt;
&lt;br /&gt;
==== 拉取内核源码 ====&lt;br /&gt;
关于如何找到你的内核源码这件事，大部分内核源码在开源时都会参照以下命名规则命名&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;android_kernel_厂商_平台&amp;lt;/code&amp;gt; 例如 &amp;lt;code&amp;gt;android_kernel_xiaomi_sm8250&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在针对特定机型进行优化或者重构后的源码也会有开发者将其命名为&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;android_kernel_厂商_设备代号（或者机型名称）&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我们一般可以在&amp;lt;code&amp;gt;Github&amp;lt;/code&amp;gt;找到这些源码&lt;br /&gt;
&lt;br /&gt;
如果您需要拉取ACK（Android Common Kernel）请前往Google OpenSource&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Android%E5%86%85%E6%A0%B8%E7%BC%96%E8%AF%91%E5%85%A5%E9%97%A8&amp;diff=473</id>
		<title>Android内核编译入门</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Android%E5%86%85%E6%A0%B8%E7%BC%96%E8%AF%91%E5%85%A5%E9%97%A8&amp;diff=473"/>
		<updated>2024-02-16T10:24:16Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​添加基本内容（&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Android 内核简介 ===&lt;br /&gt;
&lt;br /&gt;
=== 配置使用环境 ===&lt;br /&gt;
Ubuntu 20.04 / 22.04&lt;br /&gt;
&lt;br /&gt;
Arch Linux&lt;br /&gt;
&lt;br /&gt;
(因为主播使用的就是这个喵）&lt;br /&gt;
&lt;br /&gt;
考虑到编译环境的稳定性不是很推荐装一些其他的系统&lt;br /&gt;
&lt;br /&gt;
你可以使用 VMware virtual machine 或者 WSL2 （Windows Subsystem on Linux）&lt;br /&gt;
&lt;br /&gt;
目前我更推荐使用 WSL 因为其安装较为方便，并且可以与 Microsoft VScode 协同工作方便你对Git的使用以及对内核源码的修改&lt;br /&gt;
&lt;br /&gt;
（当然 Vmware 也可以，只不过我印象不太好，这货 bug 稍微有点多）&lt;br /&gt;
&lt;br /&gt;
关于这两者方案优劣对比详见百度，此处不赘述。&lt;br /&gt;
&lt;br /&gt;
* 安装一些必要的工具依赖&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt-get update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt-get install -y build-essential bc bison python curl git zip ftp gcc-aarch64-linux-gnu gcc-arm-linux-gnueabi libssl-dev lftp wget libfl-dev gcc bc zip make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这些依赖可以通过百度查到对应的作用，此处不赘述。&lt;br /&gt;
&lt;br /&gt;
如若你在编译时遇见提示缺依赖的情况，你也可以百度依赖的名字来查询解决方式。&lt;br /&gt;
&lt;br /&gt;
* 安装/下载交叉编译工具链&lt;br /&gt;
&lt;br /&gt;
'''Clang'''&lt;br /&gt;
&lt;br /&gt;
此处推荐两个 &lt;br /&gt;
&lt;br /&gt;
一个是Google官方提供的Clang编译器：[https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/ Google Clang]&lt;br /&gt;
&lt;br /&gt;
一个是由知名大佬kdrag0n 提供的预编译Clang：[https://github.com/kdrag0n/proton-clang Proton Clang]&lt;br /&gt;
&lt;br /&gt;
==== 设置环境变量 ====&lt;br /&gt;
你也可以将下列的指令写在脚本里面&lt;br /&gt;
&lt;br /&gt;
export CC='放clang的路径/bin/clang'&lt;br /&gt;
&lt;br /&gt;
export CLANG_TRIPLE=aarch64-linux-gnu-&lt;br /&gt;
&lt;br /&gt;
export CROSS_COMPILE='aarch64-linux-gnu编译器的路径/bin/aarch64-linux-gnu-'&lt;br /&gt;
&lt;br /&gt;
export CROSS_COMPILE_ARM32='arm-linux-gnueabi编译器的路径/bin/arm-linux-gnueabi-'&lt;br /&gt;
&lt;br /&gt;
export ARCH=arm64&lt;br /&gt;
&lt;br /&gt;
export SUBARCH=arm64&lt;br /&gt;
&lt;br /&gt;
export KBUILD_BUILD_HOST=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
export KBUILD_BUILD_USER=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
make O=out ''device''_defconfig&lt;br /&gt;
&lt;br /&gt;
这里需要注意的是，最后的&amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
取决于你编译的设备的代号，查看你设备的代号请见：&lt;br /&gt;
&lt;br /&gt;
而&amp;lt;code&amp;gt;defconfig&amp;lt;/code&amp;gt;则是你设备在内核中的配置文件，一套内核源码可能被多个设备共有。在编译的时候，make通过不同的配置文件来区分这些设备，这些配置文件在arch/[架构]/config下，在make的时候无需指定路径，直接输入配置文件名字即可。&amp;lt;ref&amp;gt;此处引用了 grislux55 在gitbook上的内核编译教程中针对配置文件的介绍，文末贴上了引用资料链接&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
举个简单的例子，内核源码就是一个大超市，'''defconfig'''（'''购物清单'''）则负责告诉 '''make'''，'''你需要购买什么东西（对其进行编译），从而达成对设备驱动的区分'''&lt;br /&gt;
&lt;br /&gt;
==== 拉取内核源码 ====&lt;br /&gt;
关于如何找到你的内核源码这件事，大部分内核源码在开源时都会参照以下命名规则命名&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;android_kernel_厂商_平台&amp;lt;/code&amp;gt; 例如 &amp;lt;code&amp;gt;android_kernel_xiaomi_sm8250&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在针对特定机型进行优化或者重构后的源码也会有开发者将其命名为&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;android_kernel_厂商_设备代号（或者机型名称）&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我们一般可以在&amp;lt;code&amp;gt;Github&amp;lt;/code&amp;gt;找到这些源码&lt;br /&gt;
&lt;br /&gt;
如果您需要拉取ACK（Android Common Kernel）请前往Google OpenSource&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=467</id>
		<title>首页</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=%E9%A6%96%E9%A1%B5&amp;diff=467"/>
		<updated>2024-02-16T09:51:30Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​/* 高级内容 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= 欢迎来到 &amp;lt;span style=&amp;quot;display: inline-block; vertical-align: middle; padding-bottom: 11px;&amp;quot;&amp;gt;[[文件:Uotan Wiki.png|120px]]&amp;lt;/span&amp;gt; · 刷机百科 =&lt;br /&gt;
&lt;br /&gt;
'''我们致力于打造一个更适合国人使用、更贴近刷机本身的玩机知识站点'''&lt;br /&gt;
&lt;br /&gt;
'''本站现有{{NUMBEROFUSERS}}名用户，{{NUMBEROFEDITS}}次编辑，{{NUMBEROFARTICLES}}篇条目，{{NUMBEROFACTIVEUSERS}}位活跃编辑者。'''&lt;br /&gt;
== 刷机入门 ==&lt;br /&gt;
# [[ADB与Fastboot|ADB 与 Fastboot]]&lt;br /&gt;
# [[解锁Bootloader|解锁 Bootloader]]&lt;br /&gt;
# [[刷入第三方Recovery|刷入第三方 Recovery]]&lt;br /&gt;
# [[获取Root权限|获取 Root 权限]]&lt;br /&gt;
# [[Miflash线刷|MiFlash 线刷]]&lt;br /&gt;
&lt;br /&gt;
== 进阶内容 ==&lt;br /&gt;
# [[使用柚坛工具箱进行线刷]]&lt;br /&gt;
# [[ADB SideLoad]]&lt;br /&gt;
# [[Fastboot Update]]&lt;br /&gt;
# [[Fastboot 命令]]&lt;br /&gt;
# [[刷入任意单独镜像]]&lt;br /&gt;
# [[9008深度刷机|9008 深度刷机]]&lt;br /&gt;
# [[MTK Flashtool深度刷机|MTK Flashtool 深度刷机]]&lt;br /&gt;
# [[提取分区]]&lt;br /&gt;
# [[修改分区]]&lt;br /&gt;
# [[QCN]]&lt;br /&gt;
# [[Super_Empty]]&lt;br /&gt;
&lt;br /&gt;
== 系统修改 ==&lt;br /&gt;
# [[ADB命令|ADB 命令]]&lt;br /&gt;
# [[Magisk模块|Magisk 模块]]&lt;br /&gt;
# [[LsPosed 模块|LSPosed 模块]]&lt;br /&gt;
# [[KSU 模块]]&lt;br /&gt;
# [[修改教程|修改方案]]&lt;br /&gt;
&lt;br /&gt;
== Mindows工具箱 ==&lt;br /&gt;
# [[为手机刷入Windows|为手机刷入 Windows]]&lt;br /&gt;
# [[更新驱动程序]]&lt;br /&gt;
# [[重新安装Windows|重新安装 Windows]]&lt;br /&gt;
# [[一些常见问题及其解决方案]]&lt;br /&gt;
&lt;br /&gt;
== 高级内容 ==&lt;br /&gt;
# [[Android 分区详解]]&lt;br /&gt;
# [[GKI 内核]]&lt;br /&gt;
# [[如何解包 Android ROM]]&lt;br /&gt;
# [[如何打包 Android ROM]]&lt;br /&gt;
# [[如何从源码构建 TWRP Recovery]]&lt;br /&gt;
# [[如何从源码构建 Android ROM]]&lt;br /&gt;
# [[使用edl.py|使用 edl.py]]&lt;br /&gt;
# [[为手机安装Linux|为手机安装 Linux]]&lt;br /&gt;
# [[Git使用教程]]&lt;br /&gt;
# [[Android内核编译入门]]&lt;br /&gt;
# [[为新设备编写类原生device tree]]&lt;br /&gt;
&lt;br /&gt;
== 知名玩机博主 ==&lt;br /&gt;
# [[极客湾Geekerwan]]&lt;br /&gt;
# [[小白测评]]&lt;br /&gt;
# [[微积分WekiHome]]&lt;br /&gt;
# [[晨钟酱Official]]&lt;br /&gt;
# [[江灵夏草]]&lt;br /&gt;
# [[柚坛UOTAN]]&lt;br /&gt;
# [[派大宝UI]]&lt;br /&gt;
# [[我可以等你十年]]&lt;br /&gt;
# [[某贼]]&lt;br /&gt;
# [[凡生TalkING]]&lt;br /&gt;
&lt;br /&gt;
== 知名良心开发者 ==&lt;br /&gt;
# [[暮间雾]]&lt;br /&gt;
# [[某贼]]&lt;br /&gt;
# [[Amktiao]]&lt;br /&gt;
# [[小太阳ACA]]&lt;br /&gt;
# [[hellobbn]]&lt;br /&gt;
&lt;br /&gt;
== 更多词条 ==&lt;br /&gt;
# [[设备代号收录集合]]&lt;br /&gt;
# [[通用系统镜像]]&lt;br /&gt;
# [[AOSP]]&lt;br /&gt;
# [[Linux mainlining]]&lt;br /&gt;
# [[Windows on arm|WOA (Windows on arm)]]&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=466</id>
		<title>Git使用教程</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=466"/>
		<updated>2024-02-16T09:23:21Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​修订参考资料&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Git的由来： ===&lt;br /&gt;
Git是一个开源的分布式版本控制系统，可以有效、高速地处理从很小到非常大的项目版本管理，也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper。&lt;br /&gt;
&lt;br /&gt;
=== 常见的代码托管平台： ===&lt;br /&gt;
[https://github.com Github]&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com Gitlab]&lt;br /&gt;
&lt;br /&gt;
[https://gitee.com Gitee]&lt;br /&gt;
&lt;br /&gt;
=== Git 常见命令: ===&lt;br /&gt;
&lt;br /&gt;
==== git init ====&lt;br /&gt;
在本地目录中初始化一个新的Git仓库&lt;br /&gt;
&lt;br /&gt;
==== git config ====&lt;br /&gt;
用于配置用户的信息以及其他设置,在使用git之前您必须完成以下步骤。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.name &amp;quot;your username&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.email &amp;quot;your email&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git clone ====&lt;br /&gt;
用于将远程仓库的代码克隆到本地，以下是命令中各个参数的含义：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;url&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆某个地址(url)的仓库，远程仓库的地址可以是本地的目录，也可以是例如github,giteee,gitlab一类的代码托管平台&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--depth=&amp;lt;number&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆仓库并且保留number条提交历史，number在此处即表达我们克隆的深度。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-b &amp;lt;branch&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆指定分支下的仓库内容&lt;br /&gt;
&lt;br /&gt;
例如我们要克隆&amp;lt;code&amp;gt;LineageOS&amp;lt;/code&amp;gt;的内核源码，指定&amp;lt;code&amp;gt;lineage-21&amp;lt;/code&amp;gt;分支，且仅保留最近一个提交，则需要输入:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone -b lineage-21 &amp;lt;nowiki&amp;gt;https://github.com/LineageOS/android_kernel_xiaomi_sdm845&amp;lt;/nowiki&amp;gt; --depth=1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git add ====&lt;br /&gt;
添加某个文件，或者目录到暂存区，用于告诉git你需要将哪些文件的更改包含在下一次的提交(commit)之中添加一个或者多个文件到暂存区之中&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [file1] [file2]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加指定目录(文件)到暂存区，包括子目录：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [dir]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加当前目录下的所有文件到暂存区：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git status ====&lt;br /&gt;
查看当前仓库的状态，此时git会在你的终端输出以下内容&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;em style=&amp;quot;color: gray;&amp;quot;&amp;gt;此处演示为英文，如果您的git终端输出为中文也是同理的&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
On branch master&lt;br /&gt;
No commits yet&lt;br /&gt;
Changes to be committed:  &lt;br /&gt;
&lt;br /&gt;
(use “git rm --cached &amp;lt;file&amp;gt;...” to unstage)       &lt;br /&gt;
new file:   makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
输出内容分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
您目前所在的分支&lt;br /&gt;
目前的提交&lt;br /&gt;
需要更改的内容&lt;br /&gt;
新增的文件&lt;br /&gt;
修改的文件&lt;br /&gt;
删除的文件&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git commit ====&lt;br /&gt;
用于将暂存区我们保存的更改文件添加到本地仓库，并且会生成一条提交（commit）&lt;br /&gt;
&lt;br /&gt;
提交暂存区的更改到本地仓库&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;quot;message&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[注] message 可以是你的备注信息&lt;br /&gt;
&lt;br /&gt;
提交暂存区中的指定文件到本地仓库&lt;br /&gt;
&lt;br /&gt;
如果你没有使用上述&amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt;命令暂存你的修改文件，可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
进行直接提交&lt;br /&gt;
&lt;br /&gt;
==== git checkout ====&lt;br /&gt;
&lt;br /&gt;
* 用于分支切换&lt;br /&gt;
&lt;br /&gt;
切换分支：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如在您的仓库中有这几个分支：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-&amp;gt; master (Default)&lt;br /&gt;
   backup&lt;br /&gt;
   test&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
您当前处于 master 分支，如果想要切换到test分支，我们可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 用于检出文件&lt;br /&gt;
将指定的文件恢复到最新的提交状态，撤销你对其的更改&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout -- &amp;lt;file&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git push ====&lt;br /&gt;
用于将本地的分支版本上传到远程仓库并进行合并&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push &amp;lt;remote-host-name&amp;gt; &amp;lt;local-branch-name&amp;gt;:&amp;lt;remote-branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
remote-host-name:远程主机名&lt;br /&gt;
&lt;br /&gt;
local-branch-name:本地分支名&lt;br /&gt;
&lt;br /&gt;
例如，当你的远程主机名为origin ，本地分支名为master，远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master:master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如，当你的rhost名为origin 本地分支名为master远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
本地和远程分支名相同，上述命令可以简写为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当你的远程版本与本地版本有差异，无法直接push时，你可以使用--force 参数来进行强制推送&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push --force origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--force 此处可以直接简单化为 -f &lt;br /&gt;
&lt;br /&gt;
如果你想要删除主机内的某个分支，你可以使用--delete参数&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin --delete &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git diff ====&lt;br /&gt;
用于比较当前工作区与上一个版本之间的差异&lt;br /&gt;
&lt;br /&gt;
例如：（此处仅做不恰当举例，Makefile不是这样乱写的）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
diff --git a/makefile b/makefile&lt;br /&gt;
&lt;br /&gt;
index fbb8c85..d65c7eb 100644&lt;br /&gt;
&lt;br /&gt;
--- a/makefile&lt;br /&gt;
&lt;br /&gt;
+++ b/makefile&lt;br /&gt;
&lt;br /&gt;
@@ -1 +1,2 @@&lt;br /&gt;
&lt;br /&gt;
114514&lt;br /&gt;
&lt;br /&gt;
+1919180&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git log ====&lt;br /&gt;
用于查看提交的历史&lt;br /&gt;
&lt;br /&gt;
例如当你进行一次提交之后，执行 &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt;终端会输出&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit 3a5b0d12f471418b13f2baf5e9e4c112a5e804a8 (HEAD -&amp;gt; master)&lt;br /&gt;
&lt;br /&gt;
Author: luluzzy &amp;lt;1054438588@qq.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Date:   Thu Feb 15 21:28:47 2024 +0800&lt;br /&gt;
&lt;br /&gt;
    initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些输出分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit sha1 hash:   针对你这个提交的 commit id&lt;br /&gt;
Author: commit      作者名称   &amp;lt;you@example.com&amp;gt;&lt;br /&gt;
Date: commit        日期&lt;br /&gt;
commit:             名称&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
关于sha1_hash的介绍请看这里&amp;lt;ref&amp;gt;生成这个hash值，它是对那个commit是Git仓库中内容和头信息Header的一个校验和checksum。Linux kernel开创者和Git的开发者——Linus说，Git使用了sha1并非是为了安全性，而是为了数据的完整性；它可以保证，在很多年后，你重新checkout某个commit时，一定是它多年前的当时的状态，完全一摸一样，完全值得信任。在Git中，根据commit的sha1值40个十六进制数字进行了简单的划分目录，以前2位数字作为目录名，其下面是剩余38位数字组成的一个文件名&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当有多次提交之后，如果我们想要翻之前的提交历史，难免会因为终端输出的内容过多而难以查看翻阅&lt;br /&gt;
&lt;br /&gt;
此时我们可以使用&amp;lt;code&amp;gt;--online&amp;lt;/code&amp;gt;参数来简化输出，此时仅会输出: sha1哈希值 + commit的名称&lt;br /&gt;
&lt;br /&gt;
例如&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
347595d (HEAD -&amp;gt; master) modify makefile&lt;br /&gt;
&lt;br /&gt;
3a5b0d1 initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git cherry-pick ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cherry-pick (遴选) 和它的名称一样，挑选一个我们需要的 commit 进行操作。它可以用于将在其他分支上的 commit 修改，移植到当前的分支。&lt;br /&gt;
&lt;br /&gt;
如果我们想在我们正在开发的版本上，添加一个其他版本中的功能代码。就可以使用 cherry-pick ，将这个功能相关的 commit 提取出来，合入该版本。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git cherry-pick &amp;lt;commit-id&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当我们执行完 &amp;lt;code&amp;gt;cherry-pick&amp;lt;/code&amp;gt;操作之后，会自动生成一个&amp;lt;code&amp;gt;commit&amp;lt;/code&amp;gt;以及对应新的&amp;lt;code&amp;gt;commit-id&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在顺利的情况下我们可以直接通过，但如果遇到代码等因为变量名，写法等不同的情况，&amp;lt;code&amp;gt;cherry-pick&amp;lt;/code&amp;gt;大概率会报错，此时我们需要进行报错处理。&lt;br /&gt;
&lt;br /&gt;
第一种方案是手动修改&lt;br /&gt;
&lt;br /&gt;
我们可以先使用&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;检查当前遴选时冲突的文件&lt;br /&gt;
&lt;br /&gt;
然后 &amp;lt;code&amp;gt;git checkout --ours filename&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后按照提交的修改内容进行手动修改&lt;br /&gt;
&lt;br /&gt;
随后使用&amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt;命令将文件重新加入暂存区&lt;br /&gt;
&lt;br /&gt;
再使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git cherry-pick --continue&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
命令让 cherrypick 操作继续执行。&lt;br /&gt;
&lt;br /&gt;
第二种方案是直接退出&amp;lt;code&amp;gt;cherry-pick&amp;lt;/code&amp;gt;进程，一般适用于冲突文件实在太多了难以按照方案一处理的情况。&lt;br /&gt;
&lt;br /&gt;
需要注意的是，如果您当前正在遴选的提交在该分支已经存在也会冲突，在这种情况下，您需要解决冲突并手动解决问题。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git cherry-pick --abort&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git fetch ====&lt;br /&gt;
git fetch 命令用于从远程获取仓库。&lt;br /&gt;
&lt;br /&gt;
==== git merge ====&lt;br /&gt;
&amp;lt;code&amp;gt;git merge&amp;lt;/code&amp;gt;是用来把分叉的提交历史放回到一起(合并)的方式。&lt;br /&gt;
&lt;br /&gt;
git merge命令用来将你之前使用git branch命令创建的分支以及在此分支上独立开发的内容整合为一个分支。&lt;br /&gt;
&lt;br /&gt;
本&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== git pull ====&lt;br /&gt;
用于从远程获取代码并合并本地的版本。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt;其实就是&amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;git merge FETCH_HEAD&amp;lt;/code&amp;gt; 的简写。&lt;br /&gt;
&lt;br /&gt;
格式如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git pull &amp;lt;remote-host-name&amp;gt; &amp;lt;remote-branch-name&amp;gt;:&amp;lt;local-branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 参考资料： ====&lt;br /&gt;
[1] 百度百科 -- Git：&amp;lt;nowiki&amp;gt;https://baike.baidu.com/item/GIT/12647237?fr=ge_ala&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[2] 菜鸟教程 -- Git基本操作：&amp;lt;nowiki&amp;gt;https://www.runoob.com/git/git-basic-operations.html&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[3] CSDN -- git merge 使用简介: &amp;lt;nowiki&amp;gt;https://blog.csdn.net/All_In_gzx_cc/article/details/125482617&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=465</id>
		<title>Git使用教程</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=465"/>
		<updated>2024-02-16T09:21:39Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​git fetch and git merge&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Git的由来： ===&lt;br /&gt;
Git是一个开源的分布式版本控制系统，可以有效、高速地处理从很小到非常大的项目版本管理，也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper。&lt;br /&gt;
&lt;br /&gt;
=== 常见的代码托管平台： ===&lt;br /&gt;
[https://github.com Github]&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com Gitlab]&lt;br /&gt;
&lt;br /&gt;
[https://gitee.com Gitee]&lt;br /&gt;
&lt;br /&gt;
=== Git 常见命令: ===&lt;br /&gt;
&lt;br /&gt;
==== git init ====&lt;br /&gt;
在本地目录中初始化一个新的Git仓库&lt;br /&gt;
&lt;br /&gt;
==== git config ====&lt;br /&gt;
用于配置用户的信息以及其他设置,在使用git之前您必须完成以下步骤。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.name &amp;quot;your username&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.email &amp;quot;your email&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git clone ====&lt;br /&gt;
用于将远程仓库的代码克隆到本地，以下是命令中各个参数的含义：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;url&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆某个地址(url)的仓库，远程仓库的地址可以是本地的目录，也可以是例如github,giteee,gitlab一类的代码托管平台&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--depth=&amp;lt;number&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆仓库并且保留number条提交历史，number在此处即表达我们克隆的深度。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-b &amp;lt;branch&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆指定分支下的仓库内容&lt;br /&gt;
&lt;br /&gt;
例如我们要克隆&amp;lt;code&amp;gt;LineageOS&amp;lt;/code&amp;gt;的内核源码，指定&amp;lt;code&amp;gt;lineage-21&amp;lt;/code&amp;gt;分支，且仅保留最近一个提交，则需要输入:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone -b lineage-21 &amp;lt;nowiki&amp;gt;https://github.com/LineageOS/android_kernel_xiaomi_sdm845&amp;lt;/nowiki&amp;gt; --depth=1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git add ====&lt;br /&gt;
添加某个文件，或者目录到暂存区，用于告诉git你需要将哪些文件的更改包含在下一次的提交(commit)之中添加一个或者多个文件到暂存区之中&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [file1] [file2]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加指定目录(文件)到暂存区，包括子目录：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [dir]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加当前目录下的所有文件到暂存区：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git status ====&lt;br /&gt;
查看当前仓库的状态，此时git会在你的终端输出以下内容&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;em style=&amp;quot;color: gray;&amp;quot;&amp;gt;此处演示为英文，如果您的git终端输出为中文也是同理的&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
On branch master&lt;br /&gt;
No commits yet&lt;br /&gt;
Changes to be committed:  &lt;br /&gt;
&lt;br /&gt;
(use “git rm --cached &amp;lt;file&amp;gt;...” to unstage)       &lt;br /&gt;
new file:   makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
输出内容分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
您目前所在的分支&lt;br /&gt;
目前的提交&lt;br /&gt;
需要更改的内容&lt;br /&gt;
新增的文件&lt;br /&gt;
修改的文件&lt;br /&gt;
删除的文件&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git commit ====&lt;br /&gt;
用于将暂存区我们保存的更改文件添加到本地仓库，并且会生成一条提交（commit）&lt;br /&gt;
&lt;br /&gt;
提交暂存区的更改到本地仓库&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;quot;message&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[注] message 可以是你的备注信息&lt;br /&gt;
&lt;br /&gt;
提交暂存区中的指定文件到本地仓库&lt;br /&gt;
&lt;br /&gt;
如果你没有使用上述&amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt;命令暂存你的修改文件，可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
进行直接提交&lt;br /&gt;
&lt;br /&gt;
==== git checkout ====&lt;br /&gt;
&lt;br /&gt;
* 用于分支切换&lt;br /&gt;
&lt;br /&gt;
切换分支：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如在您的仓库中有这几个分支：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-&amp;gt; master (Default)&lt;br /&gt;
   backup&lt;br /&gt;
   test&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
您当前处于 master 分支，如果想要切换到test分支，我们可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 用于检出文件&lt;br /&gt;
将指定的文件恢复到最新的提交状态，撤销你对其的更改&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout -- &amp;lt;file&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git push ====&lt;br /&gt;
用于将本地的分支版本上传到远程仓库并进行合并&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push &amp;lt;remote-host-name&amp;gt; &amp;lt;local-branch-name&amp;gt;:&amp;lt;remote-branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
remote-host-name:远程主机名&lt;br /&gt;
&lt;br /&gt;
local-branch-name:本地分支名&lt;br /&gt;
&lt;br /&gt;
例如，当你的远程主机名为origin ，本地分支名为master，远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master:master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如，当你的rhost名为origin 本地分支名为master远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
本地和远程分支名相同，上述命令可以简写为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当你的远程版本与本地版本有差异，无法直接push时，你可以使用--force 参数来进行强制推送&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push --force origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--force 此处可以直接简单化为 -f &lt;br /&gt;
&lt;br /&gt;
如果你想要删除主机内的某个分支，你可以使用--delete参数&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin --delete &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git diff ====&lt;br /&gt;
用于比较当前工作区与上一个版本之间的差异&lt;br /&gt;
&lt;br /&gt;
例如：（此处仅做不恰当举例，Makefile不是这样乱写的）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
diff --git a/makefile b/makefile&lt;br /&gt;
&lt;br /&gt;
index fbb8c85..d65c7eb 100644&lt;br /&gt;
&lt;br /&gt;
--- a/makefile&lt;br /&gt;
&lt;br /&gt;
+++ b/makefile&lt;br /&gt;
&lt;br /&gt;
@@ -1 +1,2 @@&lt;br /&gt;
&lt;br /&gt;
114514&lt;br /&gt;
&lt;br /&gt;
+1919180&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git log ====&lt;br /&gt;
用于查看提交的历史&lt;br /&gt;
&lt;br /&gt;
例如当你进行一次提交之后，执行 &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt;终端会输出&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit 3a5b0d12f471418b13f2baf5e9e4c112a5e804a8 (HEAD -&amp;gt; master)&lt;br /&gt;
&lt;br /&gt;
Author: luluzzy &amp;lt;1054438588@qq.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Date:   Thu Feb 15 21:28:47 2024 +0800&lt;br /&gt;
&lt;br /&gt;
    initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些输出分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit sha1 hash:   针对你这个提交的 commit id&lt;br /&gt;
Author: commit      作者名称   &amp;lt;you@example.com&amp;gt;&lt;br /&gt;
Date: commit        日期&lt;br /&gt;
commit:             名称&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
关于sha1_hash的介绍请看这里&amp;lt;ref&amp;gt;生成这个hash值，它是对那个commit是Git仓库中内容和头信息Header的一个校验和checksum。Linux kernel开创者和Git的开发者——Linus说，Git使用了sha1并非是为了安全性，而是为了数据的完整性；它可以保证，在很多年后，你重新checkout某个commit时，一定是它多年前的当时的状态，完全一摸一样，完全值得信任。在Git中，根据commit的sha1值40个十六进制数字进行了简单的划分目录，以前2位数字作为目录名，其下面是剩余38位数字组成的一个文件名&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当有多次提交之后，如果我们想要翻之前的提交历史，难免会因为终端输出的内容过多而难以查看翻阅&lt;br /&gt;
&lt;br /&gt;
此时我们可以使用&amp;lt;code&amp;gt;--online&amp;lt;/code&amp;gt;参数来简化输出，此时仅会输出: sha1哈希值 + commit的名称&lt;br /&gt;
&lt;br /&gt;
例如&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
347595d (HEAD -&amp;gt; master) modify makefile&lt;br /&gt;
&lt;br /&gt;
3a5b0d1 initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git cherry-pick ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cherry-pick (遴选) 和它的名称一样，挑选一个我们需要的 commit 进行操作。它可以用于将在其他分支上的 commit 修改，移植到当前的分支。&lt;br /&gt;
&lt;br /&gt;
如果我们想在我们正在开发的版本上，添加一个其他版本中的功能代码。就可以使用 cherry-pick ，将这个功能相关的 commit 提取出来，合入该版本。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git cherry-pick &amp;lt;commit-id&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当我们执行完 &amp;lt;code&amp;gt;cherry-pick&amp;lt;/code&amp;gt;操作之后，会自动生成一个&amp;lt;code&amp;gt;commit&amp;lt;/code&amp;gt;以及对应新的&amp;lt;code&amp;gt;commit-id&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在顺利的情况下我们可以直接通过，但如果遇到代码等因为变量名，写法等不同的情况，&amp;lt;code&amp;gt;cherry-pick&amp;lt;/code&amp;gt;大概率会报错，此时我们需要进行报错处理。&lt;br /&gt;
&lt;br /&gt;
第一种方案是手动修改&lt;br /&gt;
&lt;br /&gt;
我们可以先使用&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;检查当前遴选时冲突的文件&lt;br /&gt;
&lt;br /&gt;
然后 &amp;lt;code&amp;gt;git checkout --ours filename&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后按照提交的修改内容进行手动修改&lt;br /&gt;
&lt;br /&gt;
随后使用&amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt;命令将文件重新加入暂存区&lt;br /&gt;
&lt;br /&gt;
再使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git cherry-pick --continue&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
命令让 cherrypick 操作继续执行。&lt;br /&gt;
&lt;br /&gt;
第二种方案是直接退出&amp;lt;code&amp;gt;cherry-pick&amp;lt;/code&amp;gt;进程，一般适用于冲突文件实在太多了难以按照方案一处理的情况。&lt;br /&gt;
&lt;br /&gt;
需要注意的是，如果您当前正在遴选的提交在该分支已经存在也会冲突，在这种情况下，您需要解决冲突并手动解决问题。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git cherry-pick --abort&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git fetch ====&lt;br /&gt;
git fetch 命令用于从远程获取仓库。&lt;br /&gt;
&lt;br /&gt;
==== git merge ====&lt;br /&gt;
&amp;lt;code&amp;gt;git merge&amp;lt;/code&amp;gt;是用来把分叉的提交历史放回到一起(合并)的方式。&lt;br /&gt;
&lt;br /&gt;
git merge命令用来将你之前使用git branch命令创建的分支以及在此分支上独立开发的内容整合为一个分支。&lt;br /&gt;
&lt;br /&gt;
本&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== git pull ====&lt;br /&gt;
用于从远程获取代码并合并本地的版本。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt;其实就是&amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;git merge FETCH_HEAD&amp;lt;/code&amp;gt; 的简写。&lt;br /&gt;
&lt;br /&gt;
格式如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git pull &amp;lt;remote-host-name&amp;gt; &amp;lt;remote-branch-name&amp;gt;:&amp;lt;local-branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 参考资料： ====&lt;br /&gt;
[1] 百度百科-- Git：&amp;lt;nowiki&amp;gt;https://baike.baidu.com/item/GIT/12647237?fr=ge_ala&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[2] 菜鸟教程-- Git基本操作：&amp;lt;nowiki&amp;gt;https://www.runoob.com/git/git-basic-operations.html&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=464</id>
		<title>Git使用教程</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=464"/>
		<updated>2024-02-16T09:11:46Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​Add little title git cherry-pick&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Git的由来： ===&lt;br /&gt;
Git是一个开源的分布式版本控制系统，可以有效、高速地处理从很小到非常大的项目版本管理，也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper。&lt;br /&gt;
&lt;br /&gt;
=== 常见的代码托管平台： ===&lt;br /&gt;
[https://github.com Github]&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com Gitlab]&lt;br /&gt;
&lt;br /&gt;
[https://gitee.com Gitee]&lt;br /&gt;
&lt;br /&gt;
=== Git 常见命令: ===&lt;br /&gt;
&lt;br /&gt;
==== git init ====&lt;br /&gt;
在本地目录中初始化一个新的Git仓库&lt;br /&gt;
&lt;br /&gt;
==== git config ====&lt;br /&gt;
用于配置用户的信息以及其他设置,在使用git之前您必须完成以下步骤。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.name &amp;quot;your username&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.email &amp;quot;your email&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git clone ====&lt;br /&gt;
用于将远程仓库的代码克隆到本地，以下是命令中各个参数的含义：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;url&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆某个地址(url)的仓库，远程仓库的地址可以是本地的目录，也可以是例如github,giteee,gitlab一类的代码托管平台&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--depth=&amp;lt;number&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆仓库并且保留number条提交历史，number在此处即表达我们克隆的深度。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-b &amp;lt;branch&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆指定分支下的仓库内容&lt;br /&gt;
&lt;br /&gt;
例如我们要克隆&amp;lt;code&amp;gt;LineageOS&amp;lt;/code&amp;gt;的内核源码，指定&amp;lt;code&amp;gt;lineage-21&amp;lt;/code&amp;gt;分支，且仅保留最近一个提交，则需要输入:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone -b lineage-21 &amp;lt;nowiki&amp;gt;https://github.com/LineageOS/android_kernel_xiaomi_sdm845&amp;lt;/nowiki&amp;gt; --depth=1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git add ====&lt;br /&gt;
添加某个文件，或者目录到暂存区，用于告诉git你需要将哪些文件的更改包含在下一次的提交(commit)之中添加一个或者多个文件到暂存区之中&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [file1] [file2]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加指定目录(文件)到暂存区，包括子目录：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [dir]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加当前目录下的所有文件到暂存区：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git status ====&lt;br /&gt;
查看当前仓库的状态，此时git会在你的终端输出以下内容&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;em style=&amp;quot;color: gray;&amp;quot;&amp;gt;此处演示为英文，如果您的git终端输出为中文也是同理的&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
On branch master&lt;br /&gt;
No commits yet&lt;br /&gt;
Changes to be committed:  &lt;br /&gt;
&lt;br /&gt;
(use “git rm --cached &amp;lt;file&amp;gt;...” to unstage)       &lt;br /&gt;
new file:   makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
输出内容分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
您目前所在的分支&lt;br /&gt;
目前的提交&lt;br /&gt;
需要更改的内容&lt;br /&gt;
新增的文件&lt;br /&gt;
修改的文件&lt;br /&gt;
删除的文件&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git commit ====&lt;br /&gt;
用于将暂存区我们保存的更改文件添加到本地仓库，并且会生成一条提交（commit）&lt;br /&gt;
&lt;br /&gt;
提交暂存区的更改到本地仓库&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;quot;message&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[注] message 可以是你的备注信息&lt;br /&gt;
&lt;br /&gt;
提交暂存区中的指定文件到本地仓库&lt;br /&gt;
&lt;br /&gt;
如果你没有使用上述&amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt;命令暂存你的修改文件，可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
进行直接提交&lt;br /&gt;
&lt;br /&gt;
==== git checkout ====&lt;br /&gt;
&lt;br /&gt;
* 用于分支切换&lt;br /&gt;
&lt;br /&gt;
切换分支：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如在您的仓库中有这几个分支：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-&amp;gt; master (Default)&lt;br /&gt;
   backup&lt;br /&gt;
   test&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
您当前处于 master 分支，如果想要切换到test分支，我们可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 用于检出文件&lt;br /&gt;
将指定的文件恢复到最新的提交状态，撤销你对其的更改&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout -- &amp;lt;file&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git push ====&lt;br /&gt;
用于将本地的分支版本上传到远程仓库并进行合并&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push &amp;lt;remote-host-name&amp;gt; &amp;lt;local-branch-name&amp;gt;:&amp;lt;remote-branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
remote-host-name:远程主机名&lt;br /&gt;
&lt;br /&gt;
local-branch-name:本地分支名&lt;br /&gt;
&lt;br /&gt;
例如，当你的远程主机名为origin ，本地分支名为master，远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master:master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如，当你的rhost名为origin 本地分支名为master远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
本地和远程分支名相同，上述命令可以简写为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当你的远程版本与本地版本有差异，无法直接push时，你可以使用--force 参数来进行强制推送&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push --force origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--force 此处可以直接简单化为 -f &lt;br /&gt;
&lt;br /&gt;
如果你想要删除主机内的某个分支，你可以使用--delete参数&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin --delete &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git diff ====&lt;br /&gt;
用于比较当前工作区与上一个版本之间的差异&lt;br /&gt;
&lt;br /&gt;
例如：（此处仅做不恰当举例，Makefile不是这样乱写的）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
diff --git a/makefile b/makefile&lt;br /&gt;
&lt;br /&gt;
index fbb8c85..d65c7eb 100644&lt;br /&gt;
&lt;br /&gt;
--- a/makefile&lt;br /&gt;
&lt;br /&gt;
+++ b/makefile&lt;br /&gt;
&lt;br /&gt;
@@ -1 +1,2 @@&lt;br /&gt;
&lt;br /&gt;
114514&lt;br /&gt;
&lt;br /&gt;
+1919180&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git log ====&lt;br /&gt;
用于查看提交的历史&lt;br /&gt;
&lt;br /&gt;
例如当你进行一次提交之后，执行 &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt;终端会输出&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit 3a5b0d12f471418b13f2baf5e9e4c112a5e804a8 (HEAD -&amp;gt; master)&lt;br /&gt;
&lt;br /&gt;
Author: luluzzy &amp;lt;1054438588@qq.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Date:   Thu Feb 15 21:28:47 2024 +0800&lt;br /&gt;
&lt;br /&gt;
    initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些输出分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit sha1 hash:   针对你这个提交的 commit id&lt;br /&gt;
Author: commit      作者名称   &amp;lt;you@example.com&amp;gt;&lt;br /&gt;
Date: commit        日期&lt;br /&gt;
commit:             名称&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
关于sha1_hash的介绍请看这里&amp;lt;ref&amp;gt;生成这个hash值，它是对那个commit是Git仓库中内容和头信息Header的一个校验和checksum。Linux kernel开创者和Git的开发者——Linus说，Git使用了sha1并非是为了安全性，而是为了数据的完整性；它可以保证，在很多年后，你重新checkout某个commit时，一定是它多年前的当时的状态，完全一摸一样，完全值得信任。在Git中，根据commit的sha1值40个十六进制数字进行了简单的划分目录，以前2位数字作为目录名，其下面是剩余38位数字组成的一个文件名&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当有多次提交之后，如果我们想要翻之前的提交历史，难免会因为终端输出的内容过多而难以查看翻阅&lt;br /&gt;
&lt;br /&gt;
此时我们可以使用&amp;lt;code&amp;gt;--online&amp;lt;/code&amp;gt;参数来简化输出，此时仅会输出: sha1哈希值 + commit的名称&lt;br /&gt;
&lt;br /&gt;
例如&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
347595d (HEAD -&amp;gt; master) modify makefile&lt;br /&gt;
&lt;br /&gt;
3a5b0d1 initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git cherry-pick ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cherry-pick (遴选) 和它的名称一样，挑选一个我们需要的 commit 进行操作。它可以用于将在其他分支上的 commit 修改，移植到当前的分支。&lt;br /&gt;
&lt;br /&gt;
如果我们想在我们正在开发的版本上，添加一个其他版本中的功能代码。就可以使用 cherry-pick ，将这个功能相关的 commit 提取出来，合入该版本。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git cherry-pick &amp;lt;commit-id&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当我们执行完 &amp;lt;code&amp;gt;cherry-pick&amp;lt;/code&amp;gt;操作之后，会自动生成一个&amp;lt;code&amp;gt;commit&amp;lt;/code&amp;gt;以及对应新的&amp;lt;code&amp;gt;commit-id&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在顺利的情况下我们可以直接通过，但如果遇到代码等因为变量名，写法等不同的情况，&amp;lt;code&amp;gt;cherry-pick&amp;lt;/code&amp;gt;大概率会报错，此时我们需要进行报错处理。&lt;br /&gt;
&lt;br /&gt;
第一种方案是手动修改&lt;br /&gt;
&lt;br /&gt;
我们可以先使用&amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;检查当前遴选时冲突的文件&lt;br /&gt;
&lt;br /&gt;
然后 &amp;lt;code&amp;gt;git checkout --ours filename&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后按照提交的修改内容进行手动修改&lt;br /&gt;
&lt;br /&gt;
随后使用&amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt;命令将文件重新加入暂存区&lt;br /&gt;
&lt;br /&gt;
再使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git cherry-pick --continue&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
命令让 cherrypick 操作继续执行。&lt;br /&gt;
&lt;br /&gt;
第二种方案是直接退出&amp;lt;code&amp;gt;cherry-pick&amp;lt;/code&amp;gt;进程，一般适用于冲突文件实在太多了难以按照方案一处理的情况。&lt;br /&gt;
&lt;br /&gt;
需要注意的是，如果您当前正在遴选的提交在该分支已经存在也会冲突，在这种情况下，您需要解决冲突并手动解决问题。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git cherry-pick --abort&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 参考资料： ====&lt;br /&gt;
[1] 百度百科-- Git：&amp;lt;nowiki&amp;gt;https://baike.baidu.com/item/GIT/12647237?fr=ge_ala&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[2] 菜鸟教程-- Git基本操作：&amp;lt;nowiki&amp;gt;https://www.runoob.com/git/git-basic-operations.html&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=401</id>
		<title>Git使用教程</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=401"/>
		<updated>2024-02-15T15:13:27Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​/* git diff */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Git的由来： ===&lt;br /&gt;
Git是一个开源的分布式版本控制系统，可以有效、高速地处理从很小到非常大的项目版本管理，也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper。&lt;br /&gt;
&lt;br /&gt;
=== 常见的代码托管平台： ===&lt;br /&gt;
[https://github.com Github]&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com Gitlab]&lt;br /&gt;
&lt;br /&gt;
[https://gitee.com Gitee]&lt;br /&gt;
&lt;br /&gt;
=== Git 常见命令: ===&lt;br /&gt;
&lt;br /&gt;
==== git init ====&lt;br /&gt;
在本地目录中初始化一个新的Git仓库&lt;br /&gt;
&lt;br /&gt;
==== git config ====&lt;br /&gt;
用于配置用户的信息以及其他设置,在使用git之前您必须完成以下步骤。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.name &amp;quot;your username&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.email &amp;quot;your email&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git clone ====&lt;br /&gt;
用于将远程仓库的代码克隆到本地，以下是命令中各个参数的含义：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;url&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆某个地址(url)的仓库，远程仓库的地址可以是本地的目录，也可以是例如github,giteee,gitlab一类的代码托管平台&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--depth=&amp;lt;number&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆仓库并且保留number条提交历史，number在此处即表达我们克隆的深度。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-b &amp;lt;branch&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆指定分支下的仓库内容&lt;br /&gt;
&lt;br /&gt;
例如我们要克隆&amp;lt;code&amp;gt;LineageOS&amp;lt;/code&amp;gt;的内核源码，指定&amp;lt;code&amp;gt;lineage-21&amp;lt;/code&amp;gt;分支，且仅保留最近一个提交，则需要输入:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone -b lineage-21 &amp;lt;nowiki&amp;gt;https://github.com/LineageOS/android_kernel_xiaomi_sdm845&amp;lt;/nowiki&amp;gt; --depth=1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git add ====&lt;br /&gt;
添加某个文件，或者目录到暂存区，用于告诉git你需要将哪些文件的更改包含在下一次的提交(commit)之中添加一个或者多个文件到暂存区之中&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [file1] [file2]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加指定目录(文件)到暂存区，包括子目录：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [dir]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加当前目录下的所有文件到暂存区：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git status ====&lt;br /&gt;
查看当前仓库的状态，此时git会在你的终端输出以下内容&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;em style=&amp;quot;color: gray;&amp;quot;&amp;gt;此处演示为英文，如果您的git终端输出为中文也是同理的&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
On branch master&lt;br /&gt;
No commits yet&lt;br /&gt;
Changes to be committed:  &lt;br /&gt;
&lt;br /&gt;
(use “git rm --cached &amp;lt;file&amp;gt;...” to unstage)       &lt;br /&gt;
new file:   makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
输出内容分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
您目前所在的分支&lt;br /&gt;
目前的提交&lt;br /&gt;
需要更改的内容&lt;br /&gt;
新增的文件&lt;br /&gt;
修改的文件&lt;br /&gt;
删除的文件&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git commit ====&lt;br /&gt;
用于将暂存区我们保存的更改文件添加到本地仓库，并且会生成一条提交（commit）&lt;br /&gt;
&lt;br /&gt;
提交暂存区的更改到本地仓库&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;quot;message&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[注] message 可以是你的备注信息&lt;br /&gt;
&lt;br /&gt;
提交暂存区中的指定文件到本地仓库&lt;br /&gt;
&lt;br /&gt;
如果你没有使用上述&amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt;命令暂存你的修改文件，可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
进行直接提交&lt;br /&gt;
&lt;br /&gt;
==== git checkout ====&lt;br /&gt;
&lt;br /&gt;
* 用于分支切换&lt;br /&gt;
&lt;br /&gt;
切换分支：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如在您的仓库中有这几个分支：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-&amp;gt; master (Default)&lt;br /&gt;
   backup&lt;br /&gt;
   test&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
您当前处于 master 分支，如果想要切换到test分支，我们可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 用于检出文件&lt;br /&gt;
将指定的文件恢复到最新的提交状态，撤销你对其的更改&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout -- &amp;lt;file&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git push ====&lt;br /&gt;
用于将本地的分支版本上传到远程仓库并进行合并&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push &amp;lt;remote-host-name&amp;gt; &amp;lt;local-branch-name&amp;gt;:&amp;lt;remote-branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
remote-host-name:远程主机名&lt;br /&gt;
&lt;br /&gt;
local-branch-name:本地分支名&lt;br /&gt;
&lt;br /&gt;
例如，当你的远程主机名为origin ，本地分支名为master，远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master:master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如，当你的rhost名为origin 本地分支名为master远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
本地和远程分支名相同，上述命令可以简写为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当你的远程版本与本地版本有差异，无法直接push时，你可以使用--force 参数来进行强制推送&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push --force origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--force 此处可以直接简单化为 -f &lt;br /&gt;
&lt;br /&gt;
如果你想要删除主机内的某个分支，你可以使用--delete参数&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin --delete &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git diff ====&lt;br /&gt;
用于比较当前工作区与上一个版本之间的差异&lt;br /&gt;
&lt;br /&gt;
例如：（此处仅做不恰当举例，Makefile不是这样乱写的）&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
diff --git a/makefile b/makefile&lt;br /&gt;
&lt;br /&gt;
index fbb8c85..d65c7eb 100644&lt;br /&gt;
&lt;br /&gt;
--- a/makefile&lt;br /&gt;
&lt;br /&gt;
+++ b/makefile&lt;br /&gt;
&lt;br /&gt;
@@ -1 +1,2 @@&lt;br /&gt;
&lt;br /&gt;
114514&lt;br /&gt;
&lt;br /&gt;
+1919180&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git log ====&lt;br /&gt;
用于查看提交的历史&lt;br /&gt;
&lt;br /&gt;
例如当你进行一次提交之后，执行 &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt;终端会输出&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit 3a5b0d12f471418b13f2baf5e9e4c112a5e804a8 (HEAD -&amp;gt; master)&lt;br /&gt;
&lt;br /&gt;
Author: luluzzy &amp;lt;1054438588@qq.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Date:   Thu Feb 15 21:28:47 2024 +0800&lt;br /&gt;
&lt;br /&gt;
    initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些输出分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit sha1 hash:   针对你这个提交的 commit id&lt;br /&gt;
Author: commit      作者名称   &amp;lt;you@example.com&amp;gt;&lt;br /&gt;
Date: commit        日期&lt;br /&gt;
commit:             名称&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
关于sha1_hash的介绍请看这里&amp;lt;ref&amp;gt;生成这个hash值，它是对那个commit是Git仓库中内容和头信息Header的一个校验和checksum。Linux kernel开创者和Git的开发者——Linus说，Git使用了sha1并非是为了安全性，而是为了数据的完整性；它可以保证，在很多年后，你重新checkout某个commit时，一定是它多年前的当时的状态，完全一摸一样，完全值得信任。在Git中，根据commit的sha1值40个十六进制数字进行了简单的划分目录，以前2位数字作为目录名，其下面是剩余38位数字组成的一个文件名&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当有多次提交之后，如果我们想要翻之前的提交历史，难免会因为终端输出的内容过多而难以查看翻阅&lt;br /&gt;
&lt;br /&gt;
此时我们可以使用&amp;lt;code&amp;gt;--online&amp;lt;/code&amp;gt;参数来简化输出，此时仅会输出: sha1哈希值 + commit的名称&lt;br /&gt;
&lt;br /&gt;
例如&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
347595d (HEAD -&amp;gt; master) modify makefile&lt;br /&gt;
&lt;br /&gt;
3a5b0d1 initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
==== 参考资料： ====&lt;br /&gt;
[1] 百度百科-- Git：&amp;lt;nowiki&amp;gt;https://baike.baidu.com/item/GIT/12647237?fr=ge_ala&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[2] 菜鸟教程-- Git基本操作：&amp;lt;nowiki&amp;gt;https://www.runoob.com/git/git-basic-operations.html&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=400</id>
		<title>Git使用教程</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=400"/>
		<updated>2024-02-15T15:12:17Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Git的由来： ===&lt;br /&gt;
Git是一个开源的分布式版本控制系统，可以有效、高速地处理从很小到非常大的项目版本管理，也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper。&lt;br /&gt;
&lt;br /&gt;
=== 常见的代码托管平台： ===&lt;br /&gt;
[https://github.com Github]&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com Gitlab]&lt;br /&gt;
&lt;br /&gt;
[https://gitee.com Gitee]&lt;br /&gt;
&lt;br /&gt;
=== Git 常见命令: ===&lt;br /&gt;
&lt;br /&gt;
==== git init ====&lt;br /&gt;
在本地目录中初始化一个新的Git仓库&lt;br /&gt;
&lt;br /&gt;
==== git config ====&lt;br /&gt;
用于配置用户的信息以及其他设置,在使用git之前您必须完成以下步骤。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.name &amp;quot;your username&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.email &amp;quot;your email&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git clone ====&lt;br /&gt;
用于将远程仓库的代码克隆到本地，以下是命令中各个参数的含义：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;url&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆某个地址(url)的仓库，远程仓库的地址可以是本地的目录，也可以是例如github,giteee,gitlab一类的代码托管平台&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--depth=&amp;lt;number&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆仓库并且保留number条提交历史，number在此处即表达我们克隆的深度。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-b &amp;lt;branch&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆指定分支下的仓库内容&lt;br /&gt;
&lt;br /&gt;
例如我们要克隆&amp;lt;code&amp;gt;LineageOS&amp;lt;/code&amp;gt;的内核源码，指定&amp;lt;code&amp;gt;lineage-21&amp;lt;/code&amp;gt;分支，且仅保留最近一个提交，则需要输入:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone -b lineage-21 &amp;lt;nowiki&amp;gt;https://github.com/LineageOS/android_kernel_xiaomi_sdm845&amp;lt;/nowiki&amp;gt; --depth=1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git add ====&lt;br /&gt;
添加某个文件，或者目录到暂存区，用于告诉git你需要将哪些文件的更改包含在下一次的提交(commit)之中添加一个或者多个文件到暂存区之中&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [file1] [file2]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加指定目录(文件)到暂存区，包括子目录：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [dir]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加当前目录下的所有文件到暂存区：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git status ====&lt;br /&gt;
查看当前仓库的状态，此时git会在你的终端输出以下内容&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;em style=&amp;quot;color: gray;&amp;quot;&amp;gt;此处演示为英文，如果您的git终端输出为中文也是同理的&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
On branch master&lt;br /&gt;
No commits yet&lt;br /&gt;
Changes to be committed:  &lt;br /&gt;
&lt;br /&gt;
(use “git rm --cached &amp;lt;file&amp;gt;...” to unstage)       &lt;br /&gt;
new file:   makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
输出内容分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
您目前所在的分支&lt;br /&gt;
目前的提交&lt;br /&gt;
需要更改的内容&lt;br /&gt;
新增的文件&lt;br /&gt;
修改的文件&lt;br /&gt;
删除的文件&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git commit ====&lt;br /&gt;
用于将暂存区我们保存的更改文件添加到本地仓库，并且会生成一条提交（commit）&lt;br /&gt;
&lt;br /&gt;
提交暂存区的更改到本地仓库&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;quot;message&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[注] message 可以是你的备注信息&lt;br /&gt;
&lt;br /&gt;
提交暂存区中的指定文件到本地仓库&lt;br /&gt;
&lt;br /&gt;
如果你没有使用上述&amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt;命令暂存你的修改文件，可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
进行直接提交&lt;br /&gt;
&lt;br /&gt;
==== git checkout ====&lt;br /&gt;
&lt;br /&gt;
* 用于分支切换&lt;br /&gt;
&lt;br /&gt;
切换分支：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如在您的仓库中有这几个分支：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-&amp;gt; master (Default)&lt;br /&gt;
   backup&lt;br /&gt;
   test&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
您当前处于 master 分支，如果想要切换到test分支，我们可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 用于检出文件&lt;br /&gt;
将指定的文件恢复到最新的提交状态，撤销你对其的更改&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout -- &amp;lt;file&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git push ====&lt;br /&gt;
用于将本地的分支版本上传到远程仓库并进行合并&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push &amp;lt;remote-host-name&amp;gt; &amp;lt;local-branch-name&amp;gt;:&amp;lt;remote-branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
remote-host-name:远程主机名&lt;br /&gt;
&lt;br /&gt;
local-branch-name:本地分支名&lt;br /&gt;
&lt;br /&gt;
例如，当你的远程主机名为origin ，本地分支名为master，远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master:master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如，当你的rhost名为origin 本地分支名为master远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
本地和远程分支名相同，上述命令可以简写为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当你的远程版本与本地版本有差异，无法直接push时，你可以使用--force 参数来进行强制推送&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push --force origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--force 此处可以直接简单化为 -f &lt;br /&gt;
&lt;br /&gt;
如果你想要删除主机内的某个分支，你可以使用--delete参数&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin --delete &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git diff ====&lt;br /&gt;
用于比较当前工作区与上一个版本之间的差异&lt;br /&gt;
&lt;br /&gt;
例如：（此处仅做不恰当举例，Makefile不是这样乱写的）&lt;br /&gt;
&lt;br /&gt;
diff --git a/makefile b/makefile&lt;br /&gt;
&lt;br /&gt;
index fbb8c85..d65c7eb 100644&lt;br /&gt;
&lt;br /&gt;
--- a/makefile&lt;br /&gt;
&lt;br /&gt;
+++ b/makefile&lt;br /&gt;
&lt;br /&gt;
@@ -1 +1,2 @@&lt;br /&gt;
&lt;br /&gt;
114514&lt;br /&gt;
&lt;br /&gt;
+1919180&lt;br /&gt;
&lt;br /&gt;
==== git log ====&lt;br /&gt;
用于查看提交的历史&lt;br /&gt;
&lt;br /&gt;
例如当你进行一次提交之后，执行 &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt;终端会输出&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit 3a5b0d12f471418b13f2baf5e9e4c112a5e804a8 (HEAD -&amp;gt; master)&lt;br /&gt;
&lt;br /&gt;
Author: luluzzy &amp;lt;1054438588@qq.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Date:   Thu Feb 15 21:28:47 2024 +0800&lt;br /&gt;
&lt;br /&gt;
    initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些输出分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit sha1 hash:   针对你这个提交的 commit id&lt;br /&gt;
Author: commit      作者名称   &amp;lt;you@example.com&amp;gt;&lt;br /&gt;
Date: commit        日期&lt;br /&gt;
commit:             名称&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
关于sha1_hash的介绍请看这里&amp;lt;ref&amp;gt;生成这个hash值，它是对那个commit是Git仓库中内容和头信息Header的一个校验和checksum。Linux kernel开创者和Git的开发者——Linus说，Git使用了sha1并非是为了安全性，而是为了数据的完整性；它可以保证，在很多年后，你重新checkout某个commit时，一定是它多年前的当时的状态，完全一摸一样，完全值得信任。在Git中，根据commit的sha1值40个十六进制数字进行了简单的划分目录，以前2位数字作为目录名，其下面是剩余38位数字组成的一个文件名&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当有多次提交之后，如果我们想要翻之前的提交历史，难免会因为终端输出的内容过多而难以查看翻阅&lt;br /&gt;
&lt;br /&gt;
此时我们可以使用&amp;lt;code&amp;gt;--online&amp;lt;/code&amp;gt;参数来简化输出，此时仅会输出: sha1哈希值 + commit的名称&lt;br /&gt;
&lt;br /&gt;
例如&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
347595d (HEAD -&amp;gt; master) modify makefile&lt;br /&gt;
&lt;br /&gt;
3a5b0d1 initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
==== 参考资料： ====&lt;br /&gt;
[1] 百度百科-- Git：&amp;lt;nowiki&amp;gt;https://baike.baidu.com/item/GIT/12647237?fr=ge_ala&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[2] 菜鸟教程-- Git基本操作：&amp;lt;nowiki&amp;gt;https://www.runoob.com/git/git-basic-operations.html&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=395</id>
		<title>Git使用教程</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=395"/>
		<updated>2024-02-15T14:59:35Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​/* git clone */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Git的由来： ===&lt;br /&gt;
Git是一个开源的分布式版本控制系统，可以有效、高速地处理从很小到非常大的项目版本管理，也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper。&lt;br /&gt;
&lt;br /&gt;
=== 常见的代码托管平台： ===&lt;br /&gt;
[https://github.com Github]&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com Gitlab]&lt;br /&gt;
&lt;br /&gt;
[https://gitee.com Gitee]&lt;br /&gt;
&lt;br /&gt;
=== Git 常见命令: ===&lt;br /&gt;
&lt;br /&gt;
==== git init ====&lt;br /&gt;
在本地目录中初始化一个新的Git仓库&lt;br /&gt;
&lt;br /&gt;
==== git config ====&lt;br /&gt;
用于配置用户的信息以及其他设置,在使用git之前您必须完成以下步骤。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.name &amp;quot;your username&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.email &amp;quot;your email&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git clone ====&lt;br /&gt;
用于将远程仓库的代码克隆到本地&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;url&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆某个地址(url)的仓库，远程仓库的地址可以是本地的目录，也可以是例如github,giteee,gitlab一类的代码托管平台&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--depth=&amp;lt;number&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆仓库并且保留number条提交历史，number在此处即表达我们克隆的深度。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-b &amp;lt;branch&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆指定分支下的仓库内容&lt;br /&gt;
&lt;br /&gt;
例如我们需要克隆的内核，并且指定los20分支，则需要输入:&lt;br /&gt;
&lt;br /&gt;
==== git add ====&lt;br /&gt;
添加某个文件，或者目录到暂存区，用于告诉git你需要将哪些文件的更改包含在下一次的提交(commit)之中&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
添加一个或者多个文件到暂存区之中&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [file1] [file2]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加指定目录(文件)到暂存区，包括子目录：&lt;br /&gt;
&lt;br /&gt;
添加当前目录下的所有文件到暂存区,包括子目录：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [dir]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加当前目录下的所有文件到暂存区：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git status ====&lt;br /&gt;
查看当前仓库的状态，此时git会在你的终端输出以下内容&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;em style=&amp;quot;color: gray;&amp;quot;&amp;gt;此处演示为英文，如果您的git终端输出为中文也是同理的&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
On branch master&lt;br /&gt;
No commits yet&lt;br /&gt;
Changes to be committed:  &lt;br /&gt;
&lt;br /&gt;
(use “git rm --cached &amp;lt;file&amp;gt;...” to unstage)       &lt;br /&gt;
new file:   makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
输出内容分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
您目前所在的分支&lt;br /&gt;
目前的提交&lt;br /&gt;
需要更改的内容&lt;br /&gt;
新增的文件&lt;br /&gt;
修改的文件&lt;br /&gt;
删除的文件&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git commit ====&lt;br /&gt;
用于将暂存区我们保存的更改文件添加到本地仓库，并且会生成一条提交（commit）&lt;br /&gt;
&lt;br /&gt;
提交暂存区的更改到本地仓库&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;quot;message&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[注] message 可以是你的备注信息&lt;br /&gt;
&lt;br /&gt;
提交暂存区中的指定文件到本地仓库&lt;br /&gt;
&lt;br /&gt;
如果你没有使用上述&amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt;命令暂存你的修改文件，可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
进行直接提交&lt;br /&gt;
&lt;br /&gt;
==== git checkout ====&lt;br /&gt;
&lt;br /&gt;
* 用于分支切换&lt;br /&gt;
&lt;br /&gt;
切换分支：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如在您的仓库中有这几个分支：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-&amp;gt; master (Default)&lt;br /&gt;
   backup&lt;br /&gt;
   test&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
您当前处于 master 分支，如果想要切换到test分支，我们可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 用于检出文件&lt;br /&gt;
将指定的文件恢复到最新的提交状态，撤销你对其的更改&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout -- &amp;lt;file&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git push ====&lt;br /&gt;
用于将本地的分支版本上传到远程仓库并进行合并&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push &amp;lt;remote-host-name&amp;gt; &amp;lt;local-branch-name&amp;gt;:&amp;lt;remote-branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
remote-host-name:远程主机名&lt;br /&gt;
&lt;br /&gt;
local-branch-name:本地分支名&lt;br /&gt;
&lt;br /&gt;
例如，当你的远程主机名为origin ，本地分支名为master，远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master:master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如，当你的rhost名为origin 本地分支名为master远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
本地和远程分支名相同，上述命令可以简写为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当你的远程版本与本地版本有差异，无法直接push时，你可以使用--force 参数来进行强制推送&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push --force origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--force 此处可以直接简单化为 -f &lt;br /&gt;
&lt;br /&gt;
如果你想要删除主机内的某个分支，你可以使用--delete参数&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin --delete &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git diff ====&lt;br /&gt;
用于比较当前工作区与上一个版本之间的差异&lt;br /&gt;
&lt;br /&gt;
==== git log ====&lt;br /&gt;
用于查看提交的历史&lt;br /&gt;
&lt;br /&gt;
例如当你进行一次提交之后，执行 &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt;终端会输出&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit 3a5b0d12f471418b13f2baf5e9e4c112a5e804a8 (HEAD -&amp;gt; master)&lt;br /&gt;
&lt;br /&gt;
Author: luluzzy &amp;lt;1054438588@qq.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Date:   Thu Feb 15 21:28:47 2024 +0800&lt;br /&gt;
&lt;br /&gt;
    initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些输出分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit sha1 hash:   针对你这个提交的 commit id&lt;br /&gt;
Author: commit      作者名称   &amp;lt;you@example.com&amp;gt;&lt;br /&gt;
Date: commit        日期&lt;br /&gt;
commit:             名称&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
关于sha1_hash的介绍请看这里&amp;lt;ref&amp;gt;生成这个hash值，它是对那个commit是Git仓库中内容和头信息Header的一个校验和checksum。Linux kernel开创者和Git的开发者——Linus说，Git使用了sha1并非是为了安全性，而是为了数据的完整性；它可以保证，在很多年后，你重新checkout某个commit时，一定是它多年前的当时的状态，完全一摸一样，完全值得信任。在Git中，根据commit的sha1值40个十六进制数字进行了简单的划分目录，以前2位数字作为目录名，其下面是剩余38位数字组成的一个文件名&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当有多次提交之后，如果我们想要翻之前的提交历史，难免会因为终端输出的内容过多而难以查看翻阅&lt;br /&gt;
&lt;br /&gt;
此时我们可以使用&amp;lt;code&amp;gt;--online&amp;lt;/code&amp;gt;参数来简化输出，此时仅会输出: sha1哈希值 + commit的名称&lt;br /&gt;
&lt;br /&gt;
例如&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
347595d (HEAD -&amp;gt; master) modify makefile&lt;br /&gt;
&lt;br /&gt;
3a5b0d1 initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
==== 参考资料： ====&lt;br /&gt;
[1] 百度百科-- Git：&amp;lt;nowiki&amp;gt;https://baike.baidu.com/item/GIT/12647237?fr=ge_ala&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[2] 菜鸟教程-- Git基本操作：&amp;lt;nowiki&amp;gt;https://www.runoob.com/git/git-basic-operations.html&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=394</id>
		<title>Git使用教程</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=394"/>
		<updated>2024-02-15T14:57:56Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​/* git config */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Git的由来： ===&lt;br /&gt;
Git是一个开源的分布式版本控制系统，可以有效、高速地处理从很小到非常大的项目版本管理，也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper。&lt;br /&gt;
&lt;br /&gt;
=== 常见的代码托管平台： ===&lt;br /&gt;
[https://github.com Github]&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com Gitlab]&lt;br /&gt;
&lt;br /&gt;
[https://gitee.com Gitee]&lt;br /&gt;
&lt;br /&gt;
=== Git 常见命令: ===&lt;br /&gt;
&lt;br /&gt;
==== git init ====&lt;br /&gt;
在本地目录中初始化一个新的Git仓库&lt;br /&gt;
&lt;br /&gt;
==== git config ====&lt;br /&gt;
用于配置用户的信息以及其他设置,在使用git之前您必须完成以下步骤。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.name &amp;quot;your username&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.email &amp;quot;your email&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git clone ====&lt;br /&gt;
用于将远程仓库的代码克隆到本地&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;url&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆某个地址(url)的仓库，远程仓库的地址可以是本地的目录，也可以是例如github,giteee,gitlab一类的代码托管平台&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--depth=&amp;lt;number&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆仓库并且保留number条提交历史，number在此处即表达我们克隆的深度。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-b &amp;lt;branch&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆指定分支下的仓库内容&lt;br /&gt;
&lt;br /&gt;
==== git add ====&lt;br /&gt;
添加某个文件，或者目录到暂存区，用于告诉git你需要将哪些文件的更改包含在下一次的提交(commit)之中&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
添加一个或者多个文件到暂存区之中&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [file1] [file2]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加指定目录(文件)到暂存区，包括子目录：&lt;br /&gt;
&lt;br /&gt;
添加当前目录下的所有文件到暂存区,包括子目录：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [dir]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加当前目录下的所有文件到暂存区：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git status ====&lt;br /&gt;
查看当前仓库的状态，此时git会在你的终端输出以下内容&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;em style=&amp;quot;color: gray;&amp;quot;&amp;gt;此处演示为英文，如果您的git终端输出为中文也是同理的&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
On branch master&lt;br /&gt;
No commits yet&lt;br /&gt;
Changes to be committed:  &lt;br /&gt;
&lt;br /&gt;
(use “git rm --cached &amp;lt;file&amp;gt;...” to unstage)       &lt;br /&gt;
new file:   makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
输出内容分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
您目前所在的分支&lt;br /&gt;
目前的提交&lt;br /&gt;
需要更改的内容&lt;br /&gt;
新增的文件&lt;br /&gt;
修改的文件&lt;br /&gt;
删除的文件&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git commit ====&lt;br /&gt;
用于将暂存区我们保存的更改文件添加到本地仓库，并且会生成一条提交（commit）&lt;br /&gt;
&lt;br /&gt;
提交暂存区的更改到本地仓库&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;quot;message&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[注] message 可以是你的备注信息&lt;br /&gt;
&lt;br /&gt;
提交暂存区中的指定文件到本地仓库&lt;br /&gt;
&lt;br /&gt;
如果你没有使用上述&amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt;命令暂存你的修改文件，可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
进行直接提交&lt;br /&gt;
&lt;br /&gt;
==== git checkout ====&lt;br /&gt;
&lt;br /&gt;
* 用于分支切换&lt;br /&gt;
&lt;br /&gt;
切换分支：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如在您的仓库中有这几个分支：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-&amp;gt; master (Default)&lt;br /&gt;
   backup&lt;br /&gt;
   test&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
您当前处于 master 分支，如果想要切换到test分支，我们可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 用于检出文件&lt;br /&gt;
将指定的文件恢复到最新的提交状态，撤销你对其的更改&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout -- &amp;lt;file&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git push ====&lt;br /&gt;
用于将本地的分支版本上传到远程仓库并进行合并&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push &amp;lt;remote-host-name&amp;gt; &amp;lt;local-branch-name&amp;gt;:&amp;lt;remote-branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
remote-host-name:远程主机名&lt;br /&gt;
&lt;br /&gt;
local-branch-name:本地分支名&lt;br /&gt;
&lt;br /&gt;
例如，当你的远程主机名为origin ，本地分支名为master，远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master:master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如，当你的rhost名为origin 本地分支名为master远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
本地和远程分支名相同，上述命令可以简写为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当你的远程版本与本地版本有差异，无法直接push时，你可以使用--force 参数来进行强制推送&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push --force origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--force 此处可以直接简单化为 -f &lt;br /&gt;
&lt;br /&gt;
如果你想要删除主机内的某个分支，你可以使用--delete参数&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin --delete &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git diff ====&lt;br /&gt;
用于比较当前工作区与上一个版本之间的差异&lt;br /&gt;
&lt;br /&gt;
==== git log ====&lt;br /&gt;
用于查看提交的历史&lt;br /&gt;
&lt;br /&gt;
例如当你进行一次提交之后，执行 &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt;终端会输出&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit 3a5b0d12f471418b13f2baf5e9e4c112a5e804a8 (HEAD -&amp;gt; master)&lt;br /&gt;
&lt;br /&gt;
Author: luluzzy &amp;lt;1054438588@qq.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Date:   Thu Feb 15 21:28:47 2024 +0800&lt;br /&gt;
&lt;br /&gt;
    initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些输出分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit sha1 hash:   针对你这个提交的 commit id&lt;br /&gt;
Author: commit      作者名称   &amp;lt;you@example.com&amp;gt;&lt;br /&gt;
Date: commit        日期&lt;br /&gt;
commit:             名称&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
关于sha1_hash的介绍请看这里&amp;lt;ref&amp;gt;生成这个hash值，它是对那个commit是Git仓库中内容和头信息Header的一个校验和checksum。Linux kernel开创者和Git的开发者——Linus说，Git使用了sha1并非是为了安全性，而是为了数据的完整性；它可以保证，在很多年后，你重新checkout某个commit时，一定是它多年前的当时的状态，完全一摸一样，完全值得信任。在Git中，根据commit的sha1值40个十六进制数字进行了简单的划分目录，以前2位数字作为目录名，其下面是剩余38位数字组成的一个文件名&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当有多次提交之后，如果我们想要翻之前的提交历史，难免会因为终端输出的内容过多而难以查看翻阅&lt;br /&gt;
&lt;br /&gt;
此时我们可以使用&amp;lt;code&amp;gt;--online&amp;lt;/code&amp;gt;参数来简化输出，此时仅会输出: sha1哈希值 + commit的名称&lt;br /&gt;
&lt;br /&gt;
例如&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
347595d (HEAD -&amp;gt; master) modify makefile&lt;br /&gt;
&lt;br /&gt;
3a5b0d1 initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
==== 参考资料： ====&lt;br /&gt;
[1] 百度百科-- Git：&amp;lt;nowiki&amp;gt;https://baike.baidu.com/item/GIT/12647237?fr=ge_ala&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[2] 菜鸟教程-- Git基本操作：&amp;lt;nowiki&amp;gt;https://www.runoob.com/git/git-basic-operations.html&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
	<entry>
		<id>https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=393</id>
		<title>Git使用教程</title>
		<link rel="alternate" type="text/html" href="https://wiki.uotan.cn/index.php?title=Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=393"/>
		<updated>2024-02-15T14:57:29Z</updated>

		<summary type="html">&lt;p&gt;Luluzzy：​/* git status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Git的由来： ===&lt;br /&gt;
Git是一个开源的分布式版本控制系统，可以有效、高速地处理从很小到非常大的项目版本管理，也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper。&lt;br /&gt;
&lt;br /&gt;
=== 常见的代码托管平台： ===&lt;br /&gt;
[https://github.com Github]&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com Gitlab]&lt;br /&gt;
&lt;br /&gt;
[https://gitee.com Gitee]&lt;br /&gt;
&lt;br /&gt;
=== Git 常见命令: ===&lt;br /&gt;
&lt;br /&gt;
==== git init ====&lt;br /&gt;
在本地目录中初始化一个新的Git仓库&lt;br /&gt;
&lt;br /&gt;
==== git config ====&lt;br /&gt;
用于配置用户的信息以及其他设置,在使用git之前您必须完成以下步骤。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global user.name &amp;quot;your username&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;git config --global user.email &amp;quot;your email&amp;quot;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== git clone ====&lt;br /&gt;
用于将远程仓库的代码克隆到本地&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;url&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆某个地址(url)的仓库，远程仓库的地址可以是本地的目录，也可以是例如github,giteee,gitlab一类的代码托管平台&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--depth=&amp;lt;number&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆仓库并且保留number条提交历史，number在此处即表达我们克隆的深度。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-b &amp;lt;branch&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
克隆指定分支下的仓库内容&lt;br /&gt;
&lt;br /&gt;
==== git add ====&lt;br /&gt;
添加某个文件，或者目录到暂存区，用于告诉git你需要将哪些文件的更改包含在下一次的提交(commit)之中&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
添加一个或者多个文件到暂存区之中&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [file1] [file2]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加指定目录(文件)到暂存区，包括子目录：&lt;br /&gt;
&lt;br /&gt;
添加当前目录下的所有文件到暂存区,包括子目录：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add [dir]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加当前目录下的所有文件到暂存区：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git add .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git status ====&lt;br /&gt;
查看当前仓库的状态，此时git会在你的终端输出以下内容&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;em style=&amp;quot;color: gray;&amp;quot;&amp;gt;此处演示为英文，如果您的git终端输出为中文也是同理的&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
On branch master&lt;br /&gt;
No commits yet&lt;br /&gt;
Changes to be committed:  &lt;br /&gt;
&lt;br /&gt;
(use “git rm --cached &amp;lt;file&amp;gt;...” to unstage)       &lt;br /&gt;
new file:   makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
输出内容分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
您目前所在的分支&lt;br /&gt;
目前的提交&lt;br /&gt;
需要更改的内容&lt;br /&gt;
新增的文件&lt;br /&gt;
修改的文件&lt;br /&gt;
删除的文件&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git commit ====&lt;br /&gt;
用于将暂存区我们保存的更改文件添加到本地仓库，并且会生成一条提交（commit）&lt;br /&gt;
&lt;br /&gt;
提交暂存区的更改到本地仓库&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -m &amp;quot;message&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[注] message 可以是你的备注信息&lt;br /&gt;
&lt;br /&gt;
提交暂存区中的指定文件到本地仓库&lt;br /&gt;
&lt;br /&gt;
如果你没有使用上述&amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt;命令暂存你的修改文件，可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
进行直接提交&lt;br /&gt;
&lt;br /&gt;
==== git checkout ====&lt;br /&gt;
&lt;br /&gt;
* 用于分支切换&lt;br /&gt;
&lt;br /&gt;
切换分支：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如在您的仓库中有这几个分支：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-&amp;gt; master (Default)&lt;br /&gt;
   backup&lt;br /&gt;
   test&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
您当前处于 master 分支，如果想要切换到test分支，我们可以使用&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout test&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 用于检出文件&lt;br /&gt;
将指定的文件恢复到最新的提交状态，撤销你对其的更改&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git checkout -- &amp;lt;file&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git push ====&lt;br /&gt;
用于将本地的分支版本上传到远程仓库并进行合并&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push &amp;lt;remote-host-name&amp;gt; &amp;lt;local-branch-name&amp;gt;:&amp;lt;remote-branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
remote-host-name:远程主机名&lt;br /&gt;
&lt;br /&gt;
local-branch-name:本地分支名&lt;br /&gt;
&lt;br /&gt;
例如，当你的远程主机名为origin ，本地分支名为master，远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master:master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如，当你的rhost名为origin 本地分支名为master远程分支名为master时：&lt;br /&gt;
&lt;br /&gt;
本地和远程分支名相同，上述命令可以简写为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当你的远程版本与本地版本有差异，无法直接push时，你可以使用--force 参数来进行强制推送&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push --force origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--force 此处可以直接简单化为 -f &lt;br /&gt;
&lt;br /&gt;
如果你想要删除主机内的某个分支，你可以使用--delete参数&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git push origin --delete &amp;lt;branch-name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== git diff ====&lt;br /&gt;
用于比较当前工作区与上一个版本之间的差异&lt;br /&gt;
&lt;br /&gt;
==== git log ====&lt;br /&gt;
用于查看提交的历史&lt;br /&gt;
&lt;br /&gt;
例如当你进行一次提交之后，执行 &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt;终端会输出&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit 3a5b0d12f471418b13f2baf5e9e4c112a5e804a8 (HEAD -&amp;gt; master)&lt;br /&gt;
&lt;br /&gt;
Author: luluzzy &amp;lt;1054438588@qq.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Date:   Thu Feb 15 21:28:47 2024 +0800&lt;br /&gt;
&lt;br /&gt;
    initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些输出分别为&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
commit sha1 hash:   针对你这个提交的 commit id&lt;br /&gt;
Author: commit      作者名称   &amp;lt;you@example.com&amp;gt;&lt;br /&gt;
Date: commit        日期&lt;br /&gt;
commit:             名称&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
关于sha1_hash的介绍请看这里&amp;lt;ref&amp;gt;生成这个hash值，它是对那个commit是Git仓库中内容和头信息Header的一个校验和checksum。Linux kernel开创者和Git的开发者——Linus说，Git使用了sha1并非是为了安全性，而是为了数据的完整性；它可以保证，在很多年后，你重新checkout某个commit时，一定是它多年前的当时的状态，完全一摸一样，完全值得信任。在Git中，根据commit的sha1值40个十六进制数字进行了简单的划分目录，以前2位数字作为目录名，其下面是剩余38位数字组成的一个文件名&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当有多次提交之后，如果我们想要翻之前的提交历史，难免会因为终端输出的内容过多而难以查看翻阅&lt;br /&gt;
&lt;br /&gt;
此时我们可以使用&amp;lt;code&amp;gt;--online&amp;lt;/code&amp;gt;参数来简化输出，此时仅会输出: sha1哈希值 + commit的名称&lt;br /&gt;
&lt;br /&gt;
例如&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
347595d (HEAD -&amp;gt; master) modify makefile&lt;br /&gt;
&lt;br /&gt;
3a5b0d1 initial commit: add makefile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
==== 参考资料： ====&lt;br /&gt;
[1] 百度百科-- Git：&amp;lt;nowiki&amp;gt;https://baike.baidu.com/item/GIT/12647237?fr=ge_ala&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[2] 菜鸟教程-- Git基本操作：&amp;lt;nowiki&amp;gt;https://www.runoob.com/git/git-basic-operations.html&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Luluzzy</name></author>
	</entry>
</feed>