了解一下,Android 10 Build系统

  • 日期:03-06
  • 点击:(1590)


出于工作原因,Source

不得不重新复制安卓源代码,以便开始阅读。这一次,它将是安卓10.0。在将代码导入源代码洞察之后,我深受感动。我曾经觉得我比我的身体更了解助教.毕竟,我已经感觉了9年了。幸运的是,安卓仍在快速发展。例如,仅仅编译一个可以被模拟器加载的镜像,我在这个过程中发现了很多新的东西。因此,我认为可能需要一系列短小精悍的文章,比如“了解安卓10 XXX”,来弥补我内心的不足。

消极痛苦和积极痛苦

从一碗毒性较低的鸡汤开始,至少它对我还有一些影响。最近我读了一本书,提到了王国维的一段话。

王国维认为人类心灵最基本的特征之一是不断运动。你可以思考东方或西方,但不思考任何事情是很难做到的。只有当心脏完全活跃时,它才能获得快乐。一旦它什么都不做,它就会陷入痛苦之中这是一种“消极的痛苦”,即感到厌倦并等待死亡。相反的是“积极的痛苦”。例如,你长期怀有的梦想、努力工作和进步,却没有得到领导的赏识,却遭到同事的憎恨。虽然也很不舒服,但心脏一直在剧烈运动,顺应自然,所以仍然含有幸福的成分。相比之下,“消极的痛苦”更让人无法忍受,因为它侵犯了心灵。为了避免这种痛苦,人们在工作之余发明了各种各样的“消遣”,从而创造了各种各样的爱好。清代诗人项鸿祚在解释他为什么写这首词时说:“如果它不是无用的,为什么你送一个长寿?”

王国维的话来源于他的《人间嗜好之研究》,而这本书的作者将其翻译成了现代汉语。事实上,上面这段话的核心意思是人,不要闲着。无所事事的死亡是最难的部分。似乎我以前说过“我宁愿坐在那里蛋疼也不愿四处走动”是违反人性的。在这种情况下,让我们从安卓10开始,经历一段积极而痛苦的时光。

安卓10构建系统简介

安卓10构建系统有一个名字,它叫宋楚瑜。在宋子文之前,安卓的编译系统也有一个名字,但它更朴实,叫做make意思是基于Makefile文件的编译系统。宋楚瑜也不是陌生人。他可能在安卓7上留下了自己的印记。

宋楚瑜的大目标是杀死Make。但是直到安卓10,这个看似简单的小目标还没有完全实现。为什么?Makefile文件所用的语言属于特定领域的语言(领域语言),在图灵中完成。因此,Makefile可以非常复杂地编写。

AOSP本身是一个非常庞大而复杂的系统。这导致了AOSP成千上万的Makefile文件。各种依赖性、组合等。

OMG.因此,宋子文要迅速杀死Make并不容易。

.继续找。

让我们先看看安卓10源代码中的构建目录。现在看起来是这样的:

有两个更重要的事情要知道:

把原始的制作材料放在制作目录下。为了保护用户免受编译系统切换的影响,envsetup.sh和其他软件仍然存在。

添加了蓝图、kati和soong目录。这三个位(加上一个忍者)一起形成了AOSP新的宋子文编译系统。下图显示了宋子文编译系统的几个重要成员。

对于安卓用户:

使用和以前一样的方法。首先构建/envsetup,引入sh,然后执行m/mm/mmm等命令。但是,当前的m/mm/mmm命令将调用Soong中的相应工具。

宋子文会交出。bp文件到蓝图工具集进行处理。蓝图工具集是用go编写的。官方文件将其描述为:amata-buildsystem。Bp文件。输出为。忍者档案

宋楚瑜。mk/Makefile文件被发送到kati/ckati工具进行处理。kati是用go语言写的,而ckati是用c语言写的,Kati官方文件将其描述为:katis是一个实验?GNU制造克隆人.换句话说,凯蒂相当于发号施令。然而,kati不执行特定的编译工作,而是生成忍者文件。

忍者是一种神奇的东西,意思是忍者桃太郎。忍者本身不是一个编译器,它是一个调用特定编译器的工具。真正的编译工作仍然由编译器来完成,比如gcc、wong、java等等。忍者阅读编译配置文件的末尾。忍者,然后调整相应的编译器。

以上是整个宋子文编译系统的大图。现在我们需要了解一些这些小问题。

什么是忍者?忍者就是忍者桃太郎。它最初来自谷歌铬团队。因为工程师们发现最初的制造系统很慢。因此,它被认为是优化的。另一方面,我仍然钦佩谷歌的工程师文化。很难想象中国哪家公司能允许一个团队优化一个运行良好的编译系统。当时,我当然不知道在最终会实现什么样的优化.

不管怎样,忍者的想法是有远见的。如果在Makefile文件中写了太多的if/else,管理的复杂性(包括修改)将大大增加。实际上,我在自己的工作中发现了这个问题。例如,安卓应用程序编译的梯度文件现在更复杂了。因为不同的通道,调试/发布,像if/else这样的代码语句也出现在梯度文件中。我已经考虑过是否有一个更高级的工具可以专门为调试版本生成梯度文件。这样,调试版本中的gradle文件不需要if/else来区分。

我不认为我的想法和忍者的一致。总而言之,忍者的输入文件。ninja)没有if/else那样的分支逻辑。它包含简单的编译规则。至于像调试/发布这样的区别,它是由更高级的工具编写的,比如python和go,它们更便于调试。

所以,这个。忍者文件声称是编译系统中的汇编文件。由于它是一个汇编文件,自然我不希望您修改。忍者文件,但请调整的地方。生成忍者文件。例如,上图中的蓝图或kati。因此,忍者是一个相对低级的东西,应该嵌入到一个大的编译系统中。然后忍者文件由更高级的工具生成并发送给忍者进行处理。这是忍者的逻辑。它在官方网站上的地址是:什么是和蓝图?

宋子文系统使用。作为编译配置文件,替换以前的Makefile文件。与复杂的Makefile相比。bp是一个类似json的文件。Bp是蓝图的缩写。我们稍后将介绍蓝图。

首先,bp在外观上要新鲜得多,即使是gradle也无法与之相比。下面是bp文件的样子。

的内容。英国石油公司的文件显然是指谷歌内部的巴兹尔编译系统。然而。安卓系统中的bp没有完全复制bazel,但是省略了对分支逻辑的支持。

此外,bp的书写相对简单,但由于官方文件的稀缺,正确书写并不容易。例如,上面的整洁支票是什么意思?可以取什么值?人们迫切需要一份正式而严格的文件!

谁来处理。安卓系统中的bp文件?答案是蓝图。蓝图上写着。bp,然后将其转换成忍者文件。蓝图本身是一个相对复杂的工具,是用go语言编写的。我不打算在这里介绍太多,记住我们的目标是“知道一些事情”,它在官方网站上的地址是

卡蒂/卡提。什么是“安卓10”?全部。mk文件尚未转换成。bp文件。因此,需要一个工具来转换。mk/Makefile文件。忍者。这带来了一个新工具,凯蒂。凯蒂的文件更少。要理解这一点,源代码中build/kati下的README.md和INTERNERIES . MD是最好的材料,尤其是INTERNERIES . MD,它无情地打击了go的一面。但是现在它变成了宋子文,所以kati被降级为一个工具,用来将Makefile文件转换成。忍者。正是在凯蒂的文件中,我意识到制作是多么复杂。

kati开始用go写,后来发现速度不好,最后改成了c。所以有两个版本,kati和kati。为什么围棋版的凯蒂不能快一点?作者说主要原因是气相色谱速度慢。AOSP编译系统包含大约100万个变量,不会发布.

当然,打脸一定没有数字,也没有事实:

执行m命令

当我们编译build/envsetup.sh时,我们可以通过m、mm或mmm来编译系统或模块。这个用法和以前一样,只是内部实现切换到了soong。这是一个简短的介绍,说明envsetup.sh是如何和宋楚瑜勾搭上的。主要了解M命令,请看下图。

m是在envsetup.sh中定义的一个函数,它将执行脚本build/song ui . bash。这个song ui . bash的核心如下图:

最后一次处决是宋惠的命令。此宋楚瑜的源代码位于构建/宋楚瑜/cmd/宋楚瑜/main.go中。

在编译系统之前需要午餐。现在不需要午餐了。只要使用m PRODUCT-aosp_x86_64-eng,就可以编译aosp_x86_64-eng的eng系统。

以前,你必须编译一个模块,比如make libart。现在你只需要使用m libart。这似乎更方便。

little tip,您也可以使用vscode来配置go环境,然后调试这个main.go,体验soong.

other content

envsetup.sh提供了更多的命令,hmm可以获得正在执行的所有信息。下图:

例如,

allmod可以获取编译目标下的所有模块

例如,pathmod libart将获取libart所在的源目录。答案是艺术/运行时间。

allmod、pathmod和其他命令实际上是通过调用python的相关工具来解析文件。从这一点上,我们可以看到AOSP编译系统实际上是各种综合技术高度集中的地方,以前编写Makefile是不够的。

此外,《AOSP 10》中的许多编译秘密隐藏在一些秘密生成的文件中,例如out/。下面的module _ paths目录:

编译中遇到的所有mk文件和bp文件信息都存储在相应的。列表。当然,除此之外。moduel _ paths,还有更多的秘密等着被发现。

后续安排

AOSP 10源代码推出约五天,发现有些知识需要知道,如APEX、ART等。接下来,我将对这些事情做一系列的“理解”。我们也欢迎您提供一些目标,以便我们的“了解安卓10”系列能够飞得更远。

最后,最后

我期望的结果不是我的朋友从我的书、文章和博客中学到了什么,而是,神农,我踩了你的肩膀。

我已经讨论完这项研究了。以下公众号码将学习和分享一些基本的和新的技术。我们也欢迎你做出贡献。然而,正如我在公开号码“联系方式”中所说郑在《童话之王》《智齿》中的话给我留下了深刻的印象,大意是“我有权保持沉默,但你所说的一切都可能成为我灵感的源泉”。因此,这种影响不是单向的,我可能会从你身上学到更多。

神农和他的朋友收集作品

龙出版社识别二维码并关注我们