Android 8.0编译过程初步分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013483704/article/details/88543353

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文件。

编译步骤

  1. source build/envsetup.sh:加载命令

  2. lunch:选择平台编译选项

  3. make:执行编译

source build/envsetup.sh

envsetup.sh 加载到当前 shell,里面提供了很多编译时需要的命令,即把命令加载到环境变量中。

加载后,我们常用的主要命令如下:
在这里插入图片描述
像lunch,croot,mm等,都是常用的命令,如果没有加载envsetup.sh,使用这些命令就会失败。

这里需要注意一下的是add_lunch_combo函数,这个函数会被多次调用,用来添加Android编译选项的。
在这里插入图片描述
另外就是vendorsetup,用来加载厂商自己定义的编译选项的。
在这里插入图片描述
综上,envsetup.sh主要的作用如下:

  1. 加载了编译时使用到的函数命令,如:lunch,m,mm,mmm等
  2. 添加编译选项
  3. 查找厂商目录下的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的编译关系,具体比较复杂,后续再学习。

猜你喜欢

转载自blog.csdn.net/u013483704/article/details/88543353