Android AOSP项目是如何构建的?
AOSP的所有git项目都由repo工具克隆,该工具读取以下xml: 表示为了构建,我们应该在repo克隆所有存储库的文件夹上运行Android AOSP项目是如何构建的?,android,go,android-source,android-soong,Android,Go,Android Source,Android Soong,AOSP的所有git项目都由repo工具克隆,该工具读取以下xml: 表示为了构建,我们应该在repo克隆所有存储库的文件夹上运行sourcebuild/envsetup.sh。让我们看看清单存储库中default.xml上的platform/build。我们得到 <project path="build/make" name="platform/build" groups="pdk" > <copyfil
sourcebuild/envsetup.sh
。让我们看看清单存储库中default.xml上的platform/build
。我们得到
<project path="build/make" name="platform/build" groups="pdk" >
<copyfile src="core/root.mk" dest="Makefile" />
<linkfile src="CleanSpec.mk" dest="build/CleanSpec.mk" />
<linkfile src="buildspec.mk.default" dest="build/buildspec.mk.default" />
<linkfile src="core" dest="build/core" />
<linkfile src="envsetup.sh" dest="build/envsetup.sh" />
<linkfile src="target" dest="build/target" />
<linkfile src="tools" dest="build/tools" />
</project>
好的,看起来像是build/soong/soong\u ui。bash
是我们运行m
函数时调用的地方,所以这个脚本应该构建所有内容
给你。它源代码source${TOP}/build/soong/scripts/microfactory.bash
,然后调用soong\u-build\u-go-soong\u-ui-android/soong/cmd/soong\u-ui
在这里,我们可以找到函数soong_build_go
soong_build_go
{
BUILDDIR=$(getoutdir) \
SRCDIR=${TOP} \
BLUEPRINTDIR=${TOP}/build/blueprint \
EXTRA_ARGS="-pkg-path android/soong=${TOP}/build/soong -pkg-path github.com/golang/protobuf=${TOP}/external/golang-protobuf" \
build_go $@
}
我们发现build\u go
位于:
看起来所有这些都是为了建设这个项目。我认为这与宋楚瑜的建制有关
我现在迷路了。在建立microfactory.go之后,会发生什么?实际的Android代码是在哪里生成的
microfactory.sh说build_go可以做到这一点:必要时从源代码引导microfactory,并使用它来构建请求的二进制文件。
请求的二进制文件是android/soong/cmd/soong_ui
我试图找到android/soong/cmd/soong_ui,但我不知道它在哪里,但我猜是soong build系统,而不是AOSP项目
更新:
在Song_ui.bash上,我注意到它以
cd ${TOP}
exec "$(getoutdir)/soong_ui" "$@"
请记住,这称为表单envsetup.sh
。嗯,${TOP}
,我想,是回购克隆一切的地方。看起来它正试图使用envsetup.sh
中的参数执行soong_ui
,这些参数是--构建模式--${bc}--dir=“$(pwd)”“$@”
,我猜这$
是所有模块“$@”
我假设宋楚瑜是宋楚瑜的可执行文件。它应该在
${TOP}
上查找Android.bp
,但我认为在repo克隆所有东西的地方没有一个。让我们以make systemimage为例:
调用顺序为:
你已经发现了很多,你正确地使用了从
m
到Song_ui.bash
的链接,然后启动了microfactory
从我对代码的阅读来看,soong\u build\u go
的目的是构建程序包android/soong/cmd/soong\u ui
,其二进制名称为soong\u ui
。正如杨在另一个答案中所说,这将在目录下创建二进制文件Song_ui
,该二进制文件的源代码位于
至于您关于Android.bp
文件的更新问题,它是从运行repo sync
时开始的,但正如您所看到的,该文件是空的
相反,在m
中,它告诉宋楚瑜构建,最终运行另一个名为。根据中的描述,Kati处理GNU makefiles并将其转换为构建文件
在这一点上,我们可以(大部分)假设常规的Make语义,即使底层构建系统实际上是Kati、Ninja和Soong等。由于工作目录是
$TOP
,因此使用根目录下的Makefile
,它是符号链接的。其中包括,然后包括build/make/core/Makefile
。在makefile中,您可以看到不同的.img
文件是如何构建的(例如)。请注意,我上次查看此代码已经有一段时间了,并且系统发生了一些变化,因此您最好仔细检查我上面所说的内容。特别是,我看到最近签入了build/soong/filesystem/filesystem.go
,看起来它可能会替换我上面描述的部分/大部分代码路径。我记得读到过关于Android.bp替换几个makefile的文章,但看起来它几乎没有被使用。宋楚瑜应该建立Android.bp文件,但它所做的只是调用Kati来建立makefile?使用Android.bp文件。从构建系统用户的角度来看,在.bp中定义目标等同于在make中定义目标。如果您查看源代码内部,它会调用许多操作,包括runSoong、runKati、runNinja和runBazel。我(未经验证)的猜测是宋楚瑜将.bp文件转换为忍者,Kati将.mk文件转换为忍者,然后忍者将两者都用于构建输出工件。我不知道巴泽尔适合做什么。
cd ${TOP}
exec "$(getoutdir)/soong_ui" "$@"