Android等大型系统的编译前流程,核心正是通过一系列标准化的命令和脚本,来回答 “在哪编译”、“用什么编译”和“编译什么” 这三个问题。
在Android开源项目(AOSP)中,这个流程主要分为两步:环境准备和目标设定。
在哪编译:指定编译发生的“地点”
这个“地点”并非指物理位置,而是指编译发生的上下文环境。它通过source build/envsetup.sh命令完成。
这个脚本会加载大量编译所需的函数(如lunch、m、mm)和变量到当前终端会话中,完成以下关键配置:
-
设置关键路径:配置
PATH环境变量,确保编译工具链(如make、gcc、adb)可被直接调用。 -
定义输出目录:指定编译结果(如镜像文件、库文件)的存放位置(通常是
out/目录)。 -
加载产品配置:它会扫描
vendor/和device/等目录下的vendorsetup.sh脚本,将不同厂商或设备的编译选项加载进来。
用什么编译:准备编译所需的“工具”
环境准备也在为“用什么编译”奠定基础。envsetup.sh脚本会确保编译系统能够找到并使用正确的工具链,包括:
-
交叉编译工具链:Android设备通常基于ARM架构,而开发机是x86架构,因此需要使用交叉编译工具链(如
aarch64-linux-android-gcc)在x86机器上编译出ARM架构的程序。 -
构建工具:确保
make、ninja等核心构建工具可用。 -
编程语言环境:配置好Java、C++等语言的编译器及运行时环境。
编译什么:明确编译的“目标”
这是最核心的一步,通过lunch命令来完成。lunch命令会设置一系列环境变量,精确描述你要构建的系统。
它的标准格式是:lunch [product_name]-[release_config]-[build_variant]。
-
product_name(产品名):决定了“为哪个设备而编译”。例如:-
aosp_arm:为ARM架构的模拟器编译。 -
aosp_cf_x86_64_only_phone:为Cuttlefish模拟器中的x86_64手机编译。 -
aosp_husky:为特定硬件(如Pixel 8 Pro)编译。
-
-
release_config(发布配置):控制特定功能开关的集合。 -
build_variant(构建变体):决定了编译出的系统镜像的用途和调试能力。-
eng(工程版):为开发人员设计,编译速度快,包含大量调试工具,但系统性能未优化。 -
userdebug(用户调试版):类似user版,但拥有root权限和调试功能,是调试时的首选。 -
user(用户版):为最终用户设计,权限受限,系统经过优化,适合生产环境。
-
如果只输入lunch而不带参数,系统会列出所有可用的目标配置供你选择。
总结
Android编译前的准备工作可以清晰地划分为几个步骤:
-
准备“地点”:执行
source build/envsetup.sh,在当前终端加载所有编译所需的函数和变量,设定好编译发生的“上下文环境”。 -
准备“工具”:
envsetup.sh脚本会自动配置好交叉编译工具链、构建工具和语言环境等。 -
明确“目标”:执行
lunch [目标配置],通过产品名-发布配置-构建变体的格式,精确指定“为谁而编”和“编成什么样”。
完成这三步,编译系统就获得了所有必要的信息,接下来执行 make 或 m 命令即可开始编译。

298

被折叠的 条评论
为什么被折叠?



