酷安APP 发现科技新生活

关于安卓内核特别基础的知识

久心ぅ

2024-09-02 iQOO Z9 Turbo

提前声明:不是开发者也不是大佬,就是喜欢看看内核的知识玩儿。

1.ACK内核
我们都知道,安卓内核是基于上游的Linux内核开发而来,那谷歌肯定不是傻子,人家Linux内核还搁那继续改呢,然后直接拿来下发,那是不行的。所以肯定要等Linux那边内核稳当了,它才敢下发。

Linux内核官网

不会英语没关系,你可以搜,
mainline指由Linus Torvalds(没错,这是个人,Linux之父,就是这大佬竖中指,然后so nvidia f**k you受虐滑稽)亲自制作的内核发布版,是官方当前最新版本的kernel source。

就是这张图

在Torvalds对所有其他程序员所做出的重大变化进行整合,并且对先前版本的bug进行几轮修复之后,大约每十周正式发布一个新版本。mainline事实上代表着一个linux kernel分支,这个分支有另一个名称,叫做vanilla。
说大白话就是啥意思呢,mainline就是他们正在搁那天天捣鼓的内核,有事没事就得改一下。

stable顾名思义 稳定版。

longterm,是Long Term Support的缩写,长期维护的意思。咱们可以简称为LTS,这个吧,就是这内核相当稳当了,但是我还不能给你扔一边去,有人报告了bug啥的,我得给你修啊,所以才叫长期支持嘛不。

所以你应该可以看得出来,LTS内核是最稳当的那个。

谷歌把Linux内核加上安卓专用的补丁,这么一结合,哎,就是安卓的通用内核了,也可以说是AOSP通用内核或者ACK内核。
所以ACK内核是Linux内核的下游。
ACK内核的主要开发分支,叫做android-mainline,没错,这也是有mainline这一分支的,只不过这是一直在开发的状态,肯定不能给用户用就是了。并且你肯定要知道的是,android-mainline是属于Linux内核的一个分支,谷歌是要向Linux社区提交代码的,它要不断的与Linux内核主线同步,这个分支非常活跃。

android-mainline图

看图,你就知道了,原来每过一段时间,就会有一个内核从android-mainline分离出来(可以这么理解)。而且每个内核版本都是两个内核基础。而从2024年开始,每个内核版本只对应一个内核基础。

使用底层探测器,你可以看到现在最新的LTS内核是哪些,同时还在开发的mainline是什么版本。不用下载软件,你可以在手机的设置,关于手机中,找到你的手机使用的内核版本。

然后Linux内核这玩意吧,它得合并设备的驱动代码才行,不是说我想往里加,直接对接啥的就行,具体为啥呢,AI搜一下

可以看得出来,为了保证与内核的兼容性,稳定性,统一维护更新,甚至关于安全问题,Linux内核只能这样做。

但是这玩意要是安卓内核,那成啥了啊。而且内核是啥玩意,那玩意巨复杂一个。针对手机,肯定要有手机用的。

这个图可以在:查看链接
这个链接中看到,并且可以点击,但你相信我,你不用点了,点了你也看不懂,除非你是大佬受虐滑稽,你想看你就看吧,一看一个迷糊。

按照谷歌的说法,LTS内核收到反馈,发现一些需要修改的地方之后,Linux社区对LTS内核进行了修复修补,然后接着发布。

然后谷歌再把LTS内核合并成ACK内核,然后这个内核给到SOC供应商,供应商再往里加代码,然后再给到手机厂商(OEM厂商),手机厂商还得往里加设备驱动和一些自定义代码。

那这么一直下去的话,也太累了,然后手机外围硬件驱动或者内核来点bug啥的,厂商还得修,再加上谷歌还得修呢,你看这内核图也知道,牵一发而动全身,整不好就嘎,说实在的,那到时候还修个毛啊,就放那,能用就得了。
要不谷歌怎么说妨碍升级呢。

————————————————————

2.GKI项目

前面说到,如此混乱的局面,令人头大,谷歌多个毛,它也得服啊,不服不行。但肯定不能一直这么下去,所以,通用内核映像(GKI)项目就应运而生。

这玩意就是在ACK的基础上,把供应商那些驱动啥的都整出去,让内核本身干干净净的,该修复修复,该合并新代码就合并新代码。然后在ACK这内核上,整个独立的接口,这个接口专门用来把各个驱动接入,就像USB,DP口之类的,可以统一接入外围的东西,而不影响其本身,哪怕外围驱动更新了,也不该内核的事儿。

然后内核版本在5.4以上的,属于比较新的内核,这些内核都是GKI项目里的,所以也就叫GKI内核了。看下图

谷歌介绍的KMI,GKI模块,供应商模块

AI介绍的KMI:

懵逼不?我也懵逼捂脸

我换个方式说:
KMI,是内核模块接口,咱们把内核想象成一个人,把各类硬件想象成各种各样的工具,这些工具呢都有自己的说明书,但是这人,他只会汉语,如果开发工具的这人把说明书写成鸟语,谁能看懂啊,所以市场就事先规定了,所有做工具的厂家,你们写说明书都得写中文,其他的不好使。 于是这帮厂家就只能遵守规矩,这样的话无论人怎么变化,还是工具怎么变化,人永远懂中文,工具说明书永远是中文,人就可以用工具。 这说明书就是硬件的驱动程序,市场的这个规定,就是KMI。KMI就是一个规则的集合,它包含了如何编写模块,模块和内核之间怎么通信。也就是说,遵循KMI规则写的驱动程序,就能加载到内核中,跟内核通信协作干活。

而GKI模块与Vendor模块,都是需要遵守KMI的,GKI模块也是驱动程序,但它可以加载到GKI镜像上,这模块是通用的,设计在各种硬件上运行,提供对通用硬件组件的支持,比如通用串行总线,也就是USB;通用时钟,管理时钟信号的;通用中断控制器,管理硬件中断的;通用存储器管理单元,虚拟内存管理的。
Vendor模块是供应商模块,尽管供应商模块是遵守KMI的,可以和内核交互的,但是它是针对特定设备定制的,例如手机的SOC和屏幕驱动之类的,就是供应商模块。

行了差不多就这么着吧,再写我要迷糊了,下一项。

————————————————————

3.ACK KMI 内核分支
它是构建GKI内核的基础,是在原来的ACK内核上发展出来的,可以理解为是一个项目,通过这个分支,在原有ACK内核的基础上,构建了GKI内核,同时定义了KMI。而GKI模块是基于ACK KMI分支中KMI规则构建的,GKI模块是ACK KMI分支的产物。
具体大概是,谷歌内部开发ACK内核,经过一系列新功能添加,bug修复,功能迭代的阶段,稳定了之后,拆成GKI内核和KMI规则,然后分发。

项目开发有三个阶段,开发阶段,稳定阶段,冻结阶段:

开发阶段最活跃,各种加功能和更改,而且代码更改频繁。

稳定阶段,是确保代码稳定和性能优化,重点是bug修复和性能提升。这时候就可以发布了。

冻结阶段,说明代码已经达到预期的稳定状态了,这个时候开发人员对内核更改是受到限制的,除非是必要的安全更新。这阶段是为了防止破坏定义好的KMI规则,所以通过冻结阶段我们知道,KMI这玩意,特别特别的稳定。

是项目,那就有项目周期,这个,称之为ACK KMI分支生命周期。每个内核维护一定的时间,就会EOL(End of Life,生命周期结束)。如果没有生命周期,要维护的越来越多,那可以累死那帮谷歌员工了,而且太老的内核,你维护它也没啥用了。。

打了这么多字,这地方应该能看懂了吧,就是一顿开发,内核稳当了,就可以发布了,新手机搭载了新系统和新内核。然后内核还会维护,这个时候属于冻结阶段,不会动KMI(除非一些涉及到这方面的安全隐患需要更改),想想吧,用户手机都用上了,你要不冻结的话,随意更改KMI,那驱动对不上,手机不成砖头子我都嘎点啥的。
然后维护啊维护,到最后EOL了,也就完事了,哪怕有漏洞,也没人管了。

内核命名

在这个分支中,我们看图,就知道内核原来是这么命名的,这个应该能看懂吧。

————————————————————

4.基于前三点,进行一个梳理总结
否则,别说你们,我也懵了受虐滑稽
Linux kernel:这是Linux内核,其中,它有一个分支,叫mainline,这分支不断的修改,增加功能,集成驱动,修复bug等等。达到稳定了,才能发布stable版本和LTS版本。

Android Kernel:基于Linux Kernel更改而来。

android-mainline:谷歌主导的Linux内核分支,专注于将Android特有的改动和功能集成到Linux内核主线之中。这个分支要与Linux内核的mainline分支保持同步,确保Android的改动能被Linux接受并集成到内核当中,成为Linux的一部分。

ACK内核:基于Linux内核的LTS版本,合入了Android的补丁和改动。虽说android-mainline不等于ACK内核,但ACK内核是要从android-mainline中获取改动和功能的。因为,android-mainline代码合并到Linux内核后,会影响到ACK内核。
简单点说就是—— ACK内核是基于Linux内核的LTS版本,并结合了来自android-mainline分支的改动和特定于Android的补丁。
这是GKI内核的基础,也是设备制造商的内核基础。

ACK KMI分支:是构建GKI内核的分支,它专注于定义通用内核模块接口(KMI)。这个分支会经历开发、稳定和冻结三个阶段,而KMI是特别稳定的。这个分支确保了内核模块(包括GKI模块和Vendor模块)能够与内核核心稳定地交互,而不会因为内核的更新而需要频繁修改。

GKI内核:基于ACK内核构建的,旨在解决Android设备内核碎片化问题。GKI内核提供了一个稳定的核心,而驱动程序(GKI和Vendor)可以独立于内核去更新。该内核是上面所说的ACK KMI分支所构建的。

————————————————————

5.功能内核,启动内核,支持用于升级的内核
(到这里就比上面好理解多了受虐滑稽

就是说一个新设备,你用啥内核才能启动它呢?那顾名思义,启动内核就可以启动呗。。。
而功能内核,它的意思就是和新安卓版本搭配起来,可以使用特有的最新功能,属于完美搭配。
启动内核有的版本虽然低,但是能启动,只是无法使用那些特有的新功能。具体描述看图,我觉得这段谷歌写的也挺好的。

支持用于升级的内核:更简单,就是老手机中,哪些内核可以升级到新的安卓版本。也就是说,平台版本的更新,是不强制要求内核更新的。
支持用于发布的内核:新手机搭载新系统发布,就要用这个内核。
那大家伙有没有想过一个问题,既然KMI这么稳定,也就是说内核版本可以随意更新咯?那这帮做手机的怎么不给我更新?哪怕旗舰机,那么贵的机器,凭啥不给更?我5.多的内核,不能给我升级到6.1吗?

其实,不是厂商不给更,是没法更。
因为不同的Android内核版本,KMI是不同的,就比如android14-6.1和android15-6.6,那就是俩KMI,即便KMI再稳定,这KMI一个是UFO,一个是KFC,怎么整它也不是一个东西啊。如果强行更新,那费那功夫,可老多了。。。没必要。
并且非常重要的一点,GKI内核仅在其初始版本和后续版本受支持,这是什么意思呢?其实就是向后兼容,新的内核可以向后兼容旧的那些。但GKI内核可不是向前兼容啊,图中已经说的很清楚了,搭载安卓14的设备,不支持android15-6.6的内核。
看图,学习一下内核之间的兼容性。

关于图中GKI内核要做的VTS和CTS测试,在这浅说一下:
VTS是针对设备制造商(Vendor)提供的硬件和软件组件的测试套件。它专注于测试设备特定的驱动程序、系统服务和硬件抽象层(HAL)等。VTS是确保设备制造商提供的组件与Android平台兼容,并且满足性能和功能上的要求的测试。它帮助制造商发现和修复与硬件相关的兼容性问题。
CTS是针对所有Android设备的测试套件,它包括一系列自动化测试,用于验证设备是否符合Android平台的兼容性要求。CTS是确保设备能够运行Android操作系统,并且应用程序能够在设备上正常运行的测试。它帮助确保设备制造商遵循Android平台的开发标准和接口。

简单总结就是:VTS是测供应商硬件和驱动的;CTS是测造出来的手机能正常运行系统,程序可以正常在系统上运行的。

————————————————————

6.内核的生命周期和安全补丁程序

这个没有太多可说的了,就是每个内核什么时候出的,什么时候EOL。
同时我们也应该知道,厂商给更新内核,不会更新内核版本,而是将该内核版本的补丁合入。
值得注意的是,从android15-6.6开始,支持的生命周期变为4年了。(无伤大雅,国内有几个安卓机能维护超过4年的,能维护4年就不错了)

根据上面所说的知识,大家一定也知道,为什么图中写的是ACK分支了吧~

————————————————————

本来吧,我就保存了不几张图,想着发个差不多的就得了,突然就是来感觉了受虐滑稽,直接一边搜一边反复确认一边写,写了好几个小时,擦。有点浪费时间,但是我觉得值了,咱也是萌新,大家共同学习受虐滑稽。如果有写的不对的地方,一定要指出来!

写了这么多,就一个小小小小的要求,搭载Android15的新机出来之后,发个评论让我看看各家的内核版本呗皱眉,我想看看谁家比较给力,上了6.6,谁家不行,上6.1挑眉坏笑

————————————————————
本文可以随意搬运二创,但是要标明出处,谢谢!

#Android15# #HyperOS# #OriginOS4#