Android AOSP项目是如何构建的?

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

AOSP的所有git项目都由repo工具克隆,该工具读取以下xml:

表示为了构建,我们应该在repo克隆所有存储库的文件夹上运行
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为例:

调用顺序为:

  • prebuilts/build tools/linux-x86/bin/makeparallel--ninja build/soong/soong_ui.bash--make模式为“systemimage”。 $(getoutdir)/soong_ui是由“build_go soong_ui android/soong/cmd/soong_ui”构建的
  • build/soong/cmd/soong_ui/main.go#main()
  • 宋楚瑜/ui/build/build.go#build()

  • 你已经发现了很多,你正确地使用了从
    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" "$@"