boot 分区的改变——从Android 12到Android 13

查看 211|回复 23
作者:吾吾_official   

在 Android 12 中,通用 boot 映像(boot.img)包含通用的ramdisk(ramdisk.img)和 GKI 内核(kernel.img)。
在Android 13中,有如下两项重要更改:
1对于发布时搭载 Android 13 的设备,通用 ramdisk 将从 boot 映像中移除,并放置在单独的 init_boot 映像中。此更改会使 boot 映像仅保留 GKI 内核。【对于其他旧设备则没有此项更改,即没有没有 init_boot.img。】
2在未使用专用 recovery 分区的设备上,需要将所有恢复位从通用 ramdisk 移至 vendor_boot ramdisk。【在使用了专用 recovery 分区的设备上则没有此项更改。】
根据上述原则,谷歌安卓给出了如下8种架构(有gki的a13/a12&没/ab/有rec 共6种+没有gki的a12&没/有rec 共2种)刷面具时候需要将相应文件刷入对应分区(提醒:特别是新出的手机!!!):
下面是一些名词解释(可以不看)
【ramdisk】
一句话总结ramdisk:简单来说,ramdisk是通过镜像一个“我”解决boot过程中挂载(mount)根文件系统时候出现的“我安装我自己”的问题。
解决方法:在ramdisk包含了所需的驱动和模块的情况下,先让内核将ramdisk当作“根文件系统”来安装,再用这个“根文件系统”上的驱动来安装真正的根文件系统。
这里有个条件:ramdisk和内核可以相互安装彼此。这是由ramdisk自身特点所决定的,ramdisk根文件系统和内核一样,都是由bootloader通过低级的读写命令加载到内存的(而非通过文件系统层提供的高级读写接口),因此内核启动后可以轻松挂载内存中的ramdisk。
ramdisk通用 ramdisk 仅包含第一阶段init以及一个带时间戳信息的属性文件,控制着整个android的启动,ramdisk.img中主要是存放android内核启动后第一个用户进程init可执行文件和init.*.rc等相关启动脚本以及sbin目录下的adbd工具。
【通用内核映像/Generic Kernel Image/GKI】
一句话总结GKI:通过将SoC和device相关的代码从核心内核剥离到可加载模块中,GKI解决了内核碎片化问题,实现了模块和内核可以独立进行更新。
GKI的目标在于消除Android阵营Linux内核(Linux Kernel)的碎片化状态,终极目标是由Google统一发布boot.image镜像给全球用户使用。简单来说,GKI的存在意义是为了解决碎片化的问题(由于Android的固有特性必然存在碎片化问题)。内核碎片化问题有:
1安全更新需要耗费大量人力
所有安全补丁程序必须兼容所有后续内核。由于存在内核碎片化问题,向Android 设备打安全补丁需要大量人力物力进行适配。
2很难合并长期支持的更新
长期支持 (Linux Long Term Supported/LTS) 版本包含安全修复和其他重大问题修复,使用最新的 LTS 版本是提供安全修复的最有效方式。由于存在自定义修改的设备内核中,很难仅将 LTS 修复合并到设备内核中。
3妨碍 Android 平台进行版本升级
由于碎片化问题,Android 框架代码必须假设支持的所有的内核版本,并且没有针对新的平台版本进行任何内核更改。向进行版本升级,特别是增加需要更改内核的 Android 新功能需要很多人力物力进行适配。
4很难将内核更改贡献回上游 Linux
对内核进行完所有更改后,大多数旗舰设备附带的内核版本已经至少存在 18 个月了。例如,kernel.org 于 2017 年 11 月发布了 4.14 版内核,而首批使用 4.14 版内核的 Android 手机于 2019 年春季才发布。上游内核发布与产品发布之间的这种长时间延迟导致 Android 社区很难将所需的功能和驱动程序馈送到上游内核中,因此解决碎片化问题并非易事。
GKI的功能简介:
1 GKI由Google Android Kernel团队负责统一维护,全球厂商通过社区Upstream方式参与合作共同开发。
2 GKI保持Kernel基本接口KMI(Kernel Module Interface)的稳定不变,厂商差异部分通过Kernel Module实现,以此独立更新boot.img。
3 提供Abigail等工具辅助厂商保持驱动代码和KMI保持兼容。
GKI 的特点:
1 基于Android 通用内核 (ACK)来源构建而成。
2 是每个架构和每个 LTS 版本的单内核二进制文件以及关联的可加载模块(如Android11-5.4 和Android12-5.4 的 Arm64)。
3 已经过关联 ACK 支持的所有 Android 平台版本的测试。在 GKI 内核版本的生命周期内不会发生功能弃用。
4 为给定 LTS 中的驱动程序提供了稳定版 KMI——模块和内核可以独立进行更新。
5 不包含 SoC 专用代码或板卡专用代码——解决碎片化问题的关键。
稍微解释一下Android 通用内核 (ACK)
Android 通用内核(ACK)= 长期支持 (LTS)+Android 补丁
GKI = 5.4及以后的ACK——Google在Android 11-5.4分支上开始要求所有下游厂商使用GKI,需要将SoC和device相关的代码从核心内核剥离到可加载模块中(GKI改造)。
目前,GKI从1.0版本逐步迭代为2.0版本。
简单解释一下内核模块接口/Kernel Module Interface/KMI
上文提到GKI 的特点4 :为给定 LTS 中的驱动程序提供了稳定版 KMI——模块和内核可以独立进行更新。因此,版本更新的压力从大量的适配变成了维护内核模块接口 (KMI)。
在将新平台版本推送到 AOSP 之前,ACK KMI 分支会被冻结,并在分支的整个生命周期内保持该状态。这意味着,除非发现严重的安全问题,并且在不影响稳定版 KMI 的情况下无法解决该问题,否则不会接受任何 KMI 破坏性更改。当 ACK KMI 分支被冻结时,可以接受 bug 修复和合作伙伴功能,但前提是不会破坏现有 KMI 通用内核。可以使用新的导出符号扩展 KMI,但前提是不会影响构成当前 KMI 的接口——不能添加字段但可以添加新函数。
举个例子,KMI就像活字印刷的字块一样,在活字排版之前会就行确认。一旦确定了字块以后,在这次的印刷中不会对这些字进行更改。
参考资料
https://source.android.com/docs/core/bootloader/partitions/generic-boot?hl=zh-cn
https://bbs.16rd.com/thread-583693-1-1.html
https://blog.csdn.net/feelabclihu/article/details/113409593
https://adtxl.com/index.php/archives/448.html
https://developer.aliyun.com/article/473348










内核, 版本, 碎片

喂自己袋盐x   
一加11就是这样被我刷坏的[受虐滑稽]
没有新用户666   
这才是酷安该有的样子[坏笑][坏笑]
Rannki   
服了呀,天天改来改去的
Pucket   
天哪,安卓13还能像10那时候一样解锁后一键刷入吗?
tofly   
刷机越来越麻烦了
Rannki   
服了呀,天天改来改去的
see62   
让我想起了那个给米6上了linux5.1的大神[受虐滑稽]
apoc_wudilsr   
酷安现在一堆人甚至连ack是啥都不知道[流汗滑稽]
cyp0633   
谷歌搞来搞去整得碎片化越来越严重了[流汗滑稽]
您需要登录后才可以回帖 登录 | 立即注册

返回顶部