4. Android编译过程及脚本分析
2019-10-28 本文已影响0人
瑟闻风倾
- 编译内核
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. 编译过程及脚本分析
编译过程简单脚本分析.png(1) .bulid/envsetup.sh 分析
- 在源码目录下通过
. bulid/envsetup.sh
或source bulid/envsetup.sh
来执行envsetup.sh文件
执行.png
注意:将 source 替换成 .(一个点)可以省去一些字符,这种简写形式在文档中更为常用。
说明:在源码目录下通过vi bulid/envsetup.sh
命令来查看envsetup.sh文件,envsetup.sh文件内容如下(包括各种编译命令)。
各种编译命令.png
备注:只有执行过envsetup.sh文件后才可以把各种编译命令加载到终端上,之后才可以在终端使用各种编译命令。通过make命令可以编译整个android源码;mm指令编译当前目录(单独模块的编译);mmm指令就是用来编译指定目录(单独模块的编译);lunch指令设置编译目标,所谓的编译目标就是生成的镜像要运行在什么样的设备上。
问题:执行
.bulid/envsetup.sh
命令时,做了什么事情?
回答:执行.bulid/envsetup.sh
命令时,做了加载编译命令和加载平台信息(分支)两件事。加载编译命令后则可以在shell中使用envsetup.sh脚本文件中包含的各种编译命令,如下面所示的执行lunch
命令获取所有的分支;加载平台信息后则可以获取对应的分支。
(2) lunch 分析
- 在源码目录下通过
lunch
命令来获取所有lunch(分支)
获取所有lunch.png -
选择lunch(分支)
选择并获取平台信息.png - 通过
export
命令来查看当前环境变量
image.png
问题:lunch做了什么?如何增加和删除一个lunch?
回答:通过修改分支的源码来减少分支,通过复制分支并修改来增加分支。
3. android源码编译
备注:使用make命令make -j16
或make -j8
进行源码编译。
问题:如何使用android的编译命令编译单独的模块?
回答:通过make命令可以编译整个android源码;mm指令编译当前目录(单独模块的编译);mmm指令就是用来编译指定目录(单独模块的编译)。