猿问

AOSP项目是如何构建的?

AOSP 的所有 git 项目都由 repo 工具克隆,该工具读取以下 xml:https ://android.googlesource.com/platform/manifest/+/refs/heads/master/default.xml 。


AOSP 指南说,为了构建,我们应该source build/envsetup.sh在 repo 克隆所有存储库的文件夹上运行。因此,让我们看看platform/build清单存储库中的 default.xml。我们得到


  <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>

我们确认envsetup.sh 所在的位置。, 它在platform/build. 它定义了m根据 AOSP 指南构建整个 AOSP 项目的功能:


function _trigger_build()

(

    local -r bc="$1"; shift

    if T="$(gettop)"; then

      _wrap_build "$T/build/soong/soong_ui.bash" --build-mode --${bc} --dir="$(pwd)" "$@"

    else

      echo "Couldn't locate the top of the tree. Try setting TOP."

    fi

)

function m()

(

    _trigger_build "all-modules" "$@"

)

好的,看起来build/soong/soong_ui.bash是我们运行m函数时调用的地方,所以这个脚本应该构建所有内容。


这是soong_ui.bash。它来源source ${TOP}/build/soong/scripts/microfactory.bash然后调用soong_build_go soong_ui android/soong/cmd/soong_ui


我们build_go在build/blueprint 的 microfactory.bash 中找到:


看起来所有这些都是为了构建microfactory.go项目。我认为这与宋构建系统有关。


我现在迷路了。构建 microfactory.go 后,会发生什么?实际的 Android 代码在哪里构建?


microfactory.sh 说 build_go 这样做:Bootstrap microfactory from source if necessary and use it to build the requested binary.请求的二进制文件是android/soong/cmd/soong_ui


我正在尝试查找android/soong/cmd/soong_ui,但我不知道它是什么/在哪里,但我猜是很快的构建系统,而不是 AOSP 项目。

我假设song_ui是很快的可执行文件。它应该在Android.bp上查找${TOP},但我认为在 repo 克隆所有内容的地方没有。


宝慕林4294392
浏览 239回答 2
2回答

喵喵时光机

你已经发现了很多,你是对的链接 from&nbsp;mtosoong_ui.bash然后开始microfactory。从我对代码的阅读来看, 的目的是使用二进制名称soong_build_go构建包。就像 Yong 在另一个答案中所说的那样,这会在目录下创建二进制文件,并且该二进制文件的源位于.android/soong/cmd/soong_uisoong_uisoong_ui$(getoutdir)build/soong/cmd/soong_ui/main.go至于您更新的关于Android.bp文件的问题,它是从运行时开始符号链接的,但正如您所看到的,该文件是空的。build/soong/root.bprepo sync相反,m它告诉 Soong 构建all_modules,最终运行另一个名为kati.&nbsp;根据https://github.com/google/kati中的描述,Kati 处理 GNU makefile 并将它们转换为Ninja构建文件。在这一点上,我们可以(大部分)假设常规的 Make 语义,即使底层构建系统实际上是 Kati 和 Ninja 和 Soong 等。由于工作目录是$TOP,因此使用符号Makefile链接的根目录build/make/core/root.mk。其中包括main.mk然后包括build/make/core/Makefile。在该 makefile 中,您可以看到不同.img文件是如何构建的(例如system.img)。

慕仙森

我们以 make systemimage 为例:调用顺序为:prebuilts/build-tools/linux-x86/bin/makeparallel --ninja build/soong/soong_ui.bash --make-mode "systemimage"。$(getoutdir)/soong_ui 是由“build_go soong_ui android/soong/cmd/soong_ui”构建的构建/soong/cmd/soong_ui/main.go#main()宋/ui/build/build.go#Build()
随时随地看视频慕课网APP

相关分类

Go
我要回答