AOSP项目是如何搭建的?
How is the AOSP project built?
AOSP 的所有 git 项目都由 repo 工具克隆,该工具显示为 xml:https://android.googlesource.com/platform/manifest/+/refs/heads/master/default.xml。
AOSP guide 说为了构建,我们应该 运行 source build/envsetup.sh
在 repo 克隆所有存储库的文件夹上。因此,让我们看看清单存储库中 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>
我们确认envsetup.sh is located.,在platform/build
。它定义了根据 AOSP 指南构建整个 AOSP 项目的函数 m
:
function _trigger_build()
(
local -r bc=""; 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
这里是 microfactory.bash,我们在这里找到函数 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 $@
}
我们在microfactory.bash from build/blueprint中找到build_go
:
看起来所有这些都是为了构建 microfactory.go 项目。我觉得跟soong构建系统有关系
我现在迷路了。在构建 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
但我不知道 what/where 它是什么,但我猜是 soong 构建系统,而不是 AOSP 项目。
更新:
在 soong_ui.bash
上,我注意到它以
结尾
cd ${TOP}
exec "$(getoutdir)/soong_ui" "$@"
请记住,这称为表格 envsetup.sh
。好吧,我猜 ${TOP}
是 repo 克隆所有内容的地方。看起来它正在尝试使用来自 envsetup.sh
的参数执行 soong_ui
,我猜这是 --build-mode --${bc} --dir="$(pwd)" "$@"
,其中 $@
是 "all-modules" "$@"
。
我假设 song_ui
是 soong 可执行文件。它应该在 ${TOP}
上寻找 Android.bp
,但我不认为在 repo 克隆所有内容的地方有一个。
我们以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”构建的
- build/soong/cmd/soong_ui/main.go#main()
- soong/ui/build/build.go#Build()
你已经发现了很多,你是对的 link 从 m
到 soong_ui.bash
然后开始 microfactory
.
根据我对代码的阅读,soong_build_go
的目的是使用二进制名称 soong_ui
构建包 android/soong/cmd/soong_ui
。正如 Yong 在另一个答案中所说,这会在目录 $(getoutdir)
, and the source for that binary is located at build/soong/cmd/soong_ui/main.go
.
下创建二进制文件 soong_ui
关于 Android.bp
文件的更新问题,当 repo sync
为 运行 时,它是 symlinked from build/soong/root.bp
,但如您所见,该文件是空的。
相反,在 m
中,它告诉 Soong 构建 all_modules
, which eventually runs another tool called kati
. From the description in https://github.com/google/kati, Kati processes GNU makefiles and turns them into Ninja 个构建文件。
此时我们可以(大部分)假定常规 Make 语义,即使底层构建系统实际上是 Kati、Ninja 和 Soong 等。由于工作目录是 $TOP
,Makefile
在根目录下,由build/make/core/root.mk
is used. Which includes main.mk
which then includes build/make/core/Makefile
. Inside that makefile you can see how the different .img
files are built (e.g. system.img).
symlink编辑
AOSP 的所有 git 项目都由 repo 工具克隆,该工具显示为 xml:https://android.googlesource.com/platform/manifest/+/refs/heads/master/default.xml。
AOSP guide 说为了构建,我们应该 运行 source build/envsetup.sh
在 repo 克隆所有存储库的文件夹上。因此,让我们看看清单存储库中 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>
我们确认envsetup.sh is located.,在platform/build
。它定义了根据 AOSP 指南构建整个 AOSP 项目的函数 m
:
function _trigger_build()
(
local -r bc=""; 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
这里是 microfactory.bash,我们在这里找到函数 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 $@
}
我们在microfactory.bash from build/blueprint中找到build_go
:
看起来所有这些都是为了构建 microfactory.go 项目。我觉得跟soong构建系统有关系
我现在迷路了。在构建 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
但我不知道 what/where 它是什么,但我猜是 soong 构建系统,而不是 AOSP 项目。
更新:
在 soong_ui.bash
上,我注意到它以
cd ${TOP}
exec "$(getoutdir)/soong_ui" "$@"
请记住,这称为表格 envsetup.sh
。好吧,我猜 ${TOP}
是 repo 克隆所有内容的地方。看起来它正在尝试使用来自 envsetup.sh
的参数执行 soong_ui
,我猜这是 --build-mode --${bc} --dir="$(pwd)" "$@"
,其中 $@
是 "all-modules" "$@"
。
我假设 song_ui
是 soong 可执行文件。它应该在 ${TOP}
上寻找 Android.bp
,但我不认为在 repo 克隆所有内容的地方有一个。
我们以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”构建的
- build/soong/cmd/soong_ui/main.go#main()
- soong/ui/build/build.go#Build()
你已经发现了很多,你是对的 link 从 m
到 soong_ui.bash
然后开始 microfactory
.
根据我对代码的阅读,soong_build_go
的目的是使用二进制名称 soong_ui
构建包 android/soong/cmd/soong_ui
。正如 Yong 在另一个答案中所说,这会在目录 $(getoutdir)
, and the source for that binary is located at build/soong/cmd/soong_ui/main.go
.
soong_ui
关于 Android.bp
文件的更新问题,当 repo sync
为 运行 时,它是 symlinked from build/soong/root.bp
,但如您所见,该文件是空的。
相反,在 m
中,它告诉 Soong 构建 all_modules
, which eventually runs another tool called kati
. From the description in https://github.com/google/kati, Kati processes GNU makefiles and turns them into Ninja 个构建文件。
此时我们可以(大部分)假定常规 Make 语义,即使底层构建系统实际上是 Kati、Ninja 和 Soong 等。由于工作目录是 $TOP
,Makefile
在根目录下,由build/make/core/root.mk
is used. Which includes main.mk
which then includes build/make/core/Makefile
. Inside that makefile you can see how the different .img
files are built (e.g. system.img).