Android 8.0编译过程初步分析
Posted Welljia
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 8.0编译过程初步分析相关的知识,希望对你有一定的参考价值。
android 8.0编译过程分析
概述
要想知道编译的过程,其实看编译的脚本,以及编译时产生的log是比较快的方法。
编译相关的核心文件位于build/core下,而生成的文件在out/soong下,里面有编译过程中产生的编译相关文件。
在编译过程中,首先将所有的android.bp文件收集成out/soong/build.ninja.d,然后以此为基础生成out/soong/build.ninja规则。而Android.mk收集后生成的是build-aosp_arm.jinja文件。
soong处理后的bp文件生成build.ninja的同时还包含out/soong/Android-aosp_arm.mk,这个文件是编译完成后模块的安装脚本,负责将模块安装到对应位置。
在out/soong目录下有两个文件.minibootstrap/build.ninja 和.bootstrap/build.ninja两个目录。.minibootstrap/build.ninja 主要是用来编译blueprint和生成.bootstrap/build.ninja。而.bootstrap/build.ninja主要是生成 soong相关工具和out/soong/build.ninja文件。
编译步骤
-
source build/envsetup.sh:加载命令
-
lunch:选择平台编译选项
-
make:执行编译
source build/envsetup.sh
把 envsetup.sh 加载到当前 shell,里面提供了很多编译时需要的命令,即把命令加载到环境变量中。
加载后,我们常用的主要命令如下:
像lunch,croot,mm等,都是常用的命令,如果没有加载envsetup.sh,使用这些命令就会失败。
这里需要注意一下的是add_lunch_combo函数,这个函数会被多次调用,用来添加Android编译选项的。
另外就是vendorsetup,用来加载厂商自己定义的编译选项的。
综上,envsetup.sh主要的作用如下:
- 加载了编译时使用到的函数命令,如:lunch,m,mm,mmm等
- 添加编译选项
- 查找厂商目录下的vendorsetup.sh,如果存在的话,加载执行它,添加厂商自己定义产品的编译选项
上述第3条是向编译系统添加了厂商自己定义产品的编译选项,里面的代码就是:add_lunch_combo xxx-xxx。
这样要想定义自己平台的产口编译项,就可以在envsetup.sh里添加上add_lunch_combo xxxproject,当然标准的作法是根据脚本的规则,在vendor目录下创建自己公司项目名字,然后新建一个vendorsetup.sh,在里面添加上自己的产品编译项。
这样在加载envsetup.sh时,就会有类似如下的信息:
lunch
lunch是envsetup.sh里定义的一个命令,用来让用户选择编译项,来定义Product和编译过程中用到的全局变量。
当你输入lunch后,会出现如下信息供你选择:
这就是用来选择的编译选项,除了eng,还有user,userdebug等,这个与编译时Android.mk中的LOCAL_MODULE_TAGS有关,用来区分给用户的版本和测试用的版本。
lunch中比较重要的是如下几行语句,是用来导出环境变量的,后面编译系统会依赖这里定义的变量。
make
make就是去执行makefile的,源码目录下有个Makefile,打开后内容如下:
make后是去调用了build/core/main.mk,里面定义了整个Android的编译关系,具体比较复杂,后续再学习。
以上是关于Android 8.0编译过程初步分析的主要内容,如果未能解决你的问题,请参考以下文章