Single

[转]Android编译过程及脚本分析

编译内核
lichee文件夹下,有build.sh的脚本,主要内容是对kernel内核的编译,out目录下会产生已选择相应的img,之后在android编译的时候则会直接从中拷贝进行编译。
编译android
编译之前,会执行source build/envsetup.sh和lunch命令,其中lunch会跟一个参数表示产品的型号和eng,userdebug之类。
之后运行extract-bsp:extract-bsp是一个脚本函数,在device/softwinner/common/vendorsetup.sh 他也是在lunch的时候被执行的,也就是说如果先不执行lunch ,extract-bsp是无效的。这个脚本的主要作用是将lichee编译的结果输出到device/softwinner/vendor目录下。
打包IMG:上面的extract-esp执行完之后,则可以运行make -jn(n根据电脑的配置选择,我用的是8),第一次编译的过程非常久,大概1-2个小时左右。编译结束后,会在out文件夹下生成很多的img文件这也是为我们的打包做准备。
最后执行pack命令,进行打包,运行结束之后,最后会在lichee/tools/pack目录下,一般格式是sun8xxx_android_yourname_uart0.img(其中yourname是自己取的名字)。生成的img文件就可以进行固件的烧录了,烧录的方式由硬件商提供。
1. android编译过程
(1) 初始化参数设置(初始化编译环境):执行source build/envsetup.sh(加载指令和分支)
(2) 检查环境变量并配置目标环境:lunch 命令
(3) 选择 lunch:读取目标配置和平台信息
(4) 清空输出目录:out目录清掉才能够重新编译
(5) 执行编译:make -j16或make -j8
(6) 生成升级包:使用打包程序生成升级包

2. 编译过程及脚本分析

(1) .bulid/envsetup.sh 分析

在源码目录下通过. bulid/envsetup.sh或source bulid/envsetup.sh来执行envsetup.sh文件

注意:将 source 替换成 .(一个点)可以省去一些字符,这种简写形式在文档中更为常用。
说明:在源码目录下通过vi bulid/envsetup.sh命令来查看envsetup.sh文件,envsetup.sh文件内容如下(包括各种编译命令)。

备注:只有执行过envsetup.sh文件后才可以把各种编译命令加载到终端上,之后才可以在终端使用各种编译命令。通过make命令可以编译整个android源码;mm指令编译当前目录(单独模块的编译);mmm指令就是用来编译指定目录(单独模块的编译);lunch指令设置编译目标,所谓的编译目标就是生成的镜像要运行在什么样的设备上。
问题:执行.bulid/envsetup.sh命令时,做了什么事情?
回答:执行.bulid/envsetup.sh命令时,做了加载编译命令和加载平台信息(分支)两件事。加载编译命令后则可以在shell中使用envsetup.sh脚本文件中包含的各种编译命令,如下面所示的执行lunch命令获取所有的分支;加载平台信息后则可以获取对应的分支。

(2) lunch 分析

在源码目录下通过lunch命令来获取所有lunch(分支)
获取所有lunch.png
选择lunch(分支)

通过export命令来查看当前环境变量
image.png
问题:lunch做了什么?如何增加和删除一个lunch?
回答:通过修改分支的源码来减少分支,通过复制分支并修改来增加分支。

3. android源码编译
备注:使用make命令make -j16或make -j8进行源码编译。

问题:如何使用android的编译命令编译单独的模块?
回答:通过make命令可以编译整个android源码;mm指令编译当前目录(单独模块的编译);mmm指令就是用来编译指定目录(单独模块的编译)。

作者:瑟闻风倾
链接:https://www.jianshu.com/p/b372c4f35d41
来源:简书

暂无评论

发表评论