出厂安卓11的机型之VAB架构的详细分析

在安卓11上,谷歌又研究出了个新玩法:VAB架构(又称虚拟AB分区),而出厂安卓11的新机型,几乎都是VAB架构,似乎是谷歌强制要求的。本帖的目的是,分享我所学习、了解、熟悉到的VAB架构,分享给大家,让各位机友在玩机路上尽量少走弯路、少跑没必要的售后一日游。本帖可能需要一定的玩机知识及经验,如果你看不太懂的话,说明你暂时可能还不会遇到这些问题。好了,废话不多说,我们分析VAB架构之前,我们先来了解一下安卓分区架构历年的发展。先看一张图:

 由上图可知,安卓分区架构发展史为:onlyA,AB,onlyA动态分区,AB动态分区,VAB架构。
所谓的VAB架构,其实就是AB分区,套上了动态分区,再解决了AB分区的空间占用问题。上图中,我列举了一些,刷机时经常会刷写的分区(system,vendor,boot,recovery等等)。userdata分区就是用户分区,格式化data就是格式化的这个分区。需要注意的是,格式化data和清空data,是两个不同的概念,经常会有小白把这两个概念搞混淆。格式化data就是把userdata的分区进行格式化操作,就像你格式化U盘一样,是格式化操作。而清空data,是删除data分区的所有文件及文件夹。当你遇到data挂载不上时,你清空data是没有效果的,这个时候,你需要进行格式化data操作,才能挂载data,所以,这两个不要搞混淆了。

然后,我们继续说。在上面的图片中,我们可以发现:AB的动态分区架构和VAB架构,似乎很相似?有没有?
从图片上来看,的确很相似,我刚开始接触VAB的时候,也被这个现象给欺骗了,以为VAB和AB的动态分区架构基本一致,但实际上,差别太大了,变砖了很多次,终于摸索出来了,卧槽

 

 看起来相似,那是因为这两种架构模式,分区名基本一致,所以让人产生了这种错觉。

我们再来看一张图:

仔细一点,不难看出,AB的动态分区架构,和VAB架构的不同点有两处:一是VAB架构的逻辑分区中多了两个【system_ext_a】和【system_ext_b】;
二是VAB架构中的【system_b】、【vendor_b】、【odm_b】、【product_b】、【system_ext_b】都不是真实存在的。什么意思呢?意思就是说,不管你使用A分区,还是B分区,在挂载系统的时候,逻辑分区里面,都是挂载的_a,而不会挂载_b。是不是有点难于理解?不急,我们继续。
AB的的动态分区架构中,逻辑分区里面,不管是system_a还是system_b,都是可以刷写img镜像文件的,是真实存在的,有空间大小的AB分区来回切换的时候,system_a和system_b就会被来回切换着挂载到根目录
而VAB架构呢?system_a是有空间大小的,但是system_b是没有分配空间大小的(空间占用0字节)。不管你切换到A分区,还是切换到B分区,它都只会挂载system_a。这个system_b不会被使用。具体它是怎么挂载的呢,我也说不清楚,谷歌开发者文档中也没有太多的介绍,我目前是按照我自己的刷机知识及经验推论出来的,不保证是100%正确,如果有大佬指出我的错误,那简直是雪中送炭:
1、A分区时,挂载system_a,并使用所有的_a分区。
2、B分区时,将system_a重命名为system_b,同时0字节大小的system_b也重命名为system_a,挂载重命名后的system_b,并使用所有的_b分区。
3、在系统内OTA更新时(假设当前是处于A分区,更新成功后为切换到B分区),需要更新的系统补丁包,解压后存放在data分区,复制一份system_a,并重命名为system_b_tmp,放到data分区的某个隐藏目录中,将下载好的系统更新包,整合进复制出来的system_b_tmp,得到更新完整包system_b_tmp,重启手机,如果成功挂载system_b_tmp,那么就把system_b_tmp替换掉动态分区的system_a,并重命名为system_b,原本0字节的system_b重命名为system_a,并切换至b分区。更新完成。如果system_b_tmp更新失败,则不会动原有的分区,system_a分区依然原样。 

 这个VAB架构有点不太好解释,它其实和AB分区类似,有两套完整的A和B,但是在动态分区的super分区中,system,vendor等这种逻辑分区,却不像AB那样有两套,
VAB它只有一套,
VAB它只有一套,
VAB它只有一套,
VAB它只有一套,
VAB它只有一套,
VAB它只有一套,切换分区时,就是那一套在不断的重命名分区名而已(谷歌觉得这样能更节省空间),这样理解就容易多了。所以,用上所述,VAB架构,不能像AB那样玩。AB分区的可以,一个A分区坏了,切换到B分区继续用。而VAB分区的话,一个A分区坏了,切换到B分区也不能继续用,因为system,vendor等这几个重要的逻辑分区,还是使用的同一个。恕我直言,谷歌搞这个VAB架构,不如直接AB分区,刷机对于熟练度不高的人来说,基本就是天天玄学变砖。
所以,对于VAB架构的机型来说,不要试图随便玩,因为一个分区坏了,另一个分区也是坏的!!!

 我们再来聊点儿VAB架构中的recovery问题。在VAB架构中,大多数机型
没有recovery分区!比如小米11。(不过有少部分机型有recovery分区,比如一加9R)
不要试图使用命令【fastboot flash recovery twrp.img】来刷写twrp,没有任何效果的。
那么既然没有rec分区,那么官方是如何在rec中更新系统的呢?答:recovery分区,被合并到了boot分区中,所以其实还是可以用rec来更新系统的。不过,我们先来讲讲boot.img包含哪些东西:
一个完整的boot.img,它和这几个分区是一套的:
boot(linux内核存放分区),
dtbo(屏幕刷新率,GPU频率表,内核温控等),
recovery(小型恢复系统分区)。
而这三个,在安卓11以前,都是的分别的三个不同分区,其实都是boot.img拆分出来的,被分成了3份。

而到安卓11的时候,boot.img,里面包含了一个Linux内核【Kernel】,一个小型恢复系统【ramdisk】。但是,在这个Liunx内核中,部分配置文件又被从Kernel中,分离出来,变成了一个全新的分区【vendor_boot】,也就是说,安卓11的时候,一个完整的boot.img,变成了这几个分区:
boot(linux内核存放分区),
dtbo(屏幕刷新率,内核温控等),
vendor_boot(Linux内核中的部分配置文件,GPU频率表)

 是不是发现,没有recovery分区了?其实,它被合并到了boot分区中。说白了,twrp.img它即是boot也是recovery。也就是说,boot分区里面有两个东西:一个是Linux内核【Kernel】,一个是小型恢复系统【ramdisk】。当我们进入rec时,就是启动的【ramdisk】,当我们开机进入桌面时,就是启动的【Kernel】。
所以说,【fastboot flash recovery twrp.img】来刷写twrp,没有任何效果的。要刷twrp,是要刷进boot分区的。即:【fastboot flash boot twrp.img】

 但是,你以为这就完了吗?你要是真把twrp.img刷进boot分区,那么恭喜你,成功把手机刷砖了
为啥呢?不要急,先喝杯水,听我继续慢慢道来。
前面说到了,一个VAB架构的boot.img,包含两个东西:Kernel和ramdisk,其中,ramdisk就是rec,Kernel就是内核。(注意ramdisk是需要Kernel来引导它启动的)
而Kernel和你当前的系统,还有dtbo,vendor_boot,是配套存在的,它们之前必须要配套,不配套可能有BUG(比如wifi打不开,蓝牙没声音等等),或者直接无法开机。
而twrp.img呢,它里面也是有一个Kernel和ramdisk的,说白了,twrp.img它即是boot也是recovery。刷进boot分区,相当于你同时刷了内核Kernel和小型恢复系统ramdisk。所以,你要刷rec,不能将rec刷进boot分区。
你要刷rec,不能将rec刷进boot分区。
你要刷rec,不能将rec刷进boot分区。
你要刷rec,不能将rec刷进boot分区。
你要刷rec,不能将rec刷进boot分区。

 那么,twrp的正确安装原理是什么呢?
看下面:
1、首先,一个twrp.img包含:Kernel和ramdisk。
2、其次,一个boot.img包含:Kernel和ramdisk。
3、将twrp.img中的ramdisk,替换进boot分区,覆盖掉boot分区中的ramdisk。

这就是正确的安装twrp方式。说人话:
在fastboot中,临时加载twrp,然后就进入rec了,这个时候的boot分区并没有被刷写,所以叫做临时加载。在rec的高级中,点击安装twrp,它就会把rec中的ramdisk替换掉boot分区中的ramdisk,然后,安装完成。

对于红米k40机型,你可以使用我双系统相关文件中的【rec_install_tools.zip】,来进行对boot.img打补丁,打的补丁是给boot中的ramdisk进行替换操作,将twrp.img中的ramdisk替换进boot.img中,(就像面具修补boot一样),打好rec补丁的boot.img,就可以直接刷进boot分区了,然后rec就可以正常使用了。这样就不需要用电脑来临时加载rec,再安装rec了。

VAB架构机型的通用rec安装工具:【rec_install_tools.zip】(里面的ramdisk文件,是红米k40的)
下载链接:百度网盘 请输入提取码
提取码:0sfr

使用方法:
解压,得到这么一个文件夹:(注:请解压到/data/rec_install_tools,并设置所有文件夹及文件权限为0777,不然会报错:没有权限)

 将你要安装的twrp.img,复制到这里,文件名一定要是【twrp.img】

 安装个MT管理器,以root方式执行【解包twrp.sh】。
解包出来的ramdisk便是解包出来的ramdisk文件。将你解包出来的ramdisk文件,替换到这里:

将你要打补丁的内核boot.img,复制到input/boot.img(名字一定要叫boot.img),如图

 安装个MT管理器,以root的方式执行【给boot安装rec.sh】。
等待几秒,打好rec补丁的内核,会生成在output/new_boot.img。
然后内核打rec补丁就完成了,将其刷入手机boot分区即可。

好了,本次玩机分享就到这里,希望各位机友在玩机路上少走弯路。不懂的可以在评论区留言,我懂的都尽量回答。