小贴士:
1、vmlinux 编译出来的最原始的内核文件,未压缩。
2、zImage 是vmlinux经过gzip压缩后的文件。
3、bzImage bz表示“big zImage”,不是用bzip2压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage。
4、uImage U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的tag。
5、vmlinuz 是bzImage/zImage文件的拷贝或指向bzImage/zImage的链接。
6、initrd 是“initial ramdisk”的简写。一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态
source build/envsetup.sh lunch 9 extract-bsp make -j8
- 一、 创建目标产品目录
add_lunch_combo crane_mt7332-eng
小贴士:
* Installs modules tagged with: eng, debug, user, and/or development.
* Installs non-APK modules that have no tags specified.
* Installs APKs according to the product definition files, in addition to tagged APKs.
* ro.secure=0
* ro.debuggable=1
* ro.kernel.android.checkjni=1
* adb is enabled by default.
* Setupwizard is optional
user make user
This is the flavor intended to be the final release bits.
* Installs modules tagged with user.
* Installs non-APK modules that have no tags specified.
* Installs APKs according to the product definition files; tags are ignored for APK modules.
* ro.secure=1
* ro.debuggable=0
* adb is disabled by default.
* Enable dex pre-optimization for all TARGET projects in default to speed up device first boot-up
userdebug make userdebug
The same as user, except:
* Also installs modules tagged with debug.
* ro.debuggable=1
* adb is enabled by default.
- 二、指定目标产品(target product)
source build/envsetup.sh lunch
小贴士:
source在当前bash环境下执行命令,而scripts是启动一个子shell来执行命令。这样如果把设置环境变量(或alias等等)的命令写进scripts中,就只会影响子shell,无法改变当前的BASH,所以通过文件(命令列)设置环境变量时,要用source 命令。build/envsetup.sh脚本的工作最主要就是要设置环境变量,所以必须带source
function print_lunch_menu() # 打印lunch列表
function lunch() # 配置lunch,选择目标产品
function m() # Android根目录编译, 必须在lunch之后才能使用,用的较少,因为在根目录下编译一般使用make
function findmakefile() # 查找makefile
function mm() # 编译当前目录下的Android.mk, 必须在lunch之后才能使用,用法示例 cd packages/apps/Music && mm
function mmm() # 编译指定目录下Android.mk, 必须在lunch之后才能使用 mmm packages/apps/Music 等用于 cd packages/apps/Music && mm
function lunch() { local answer #如果你明确地知道lunch后的结果可以直接lunch $1 $1代表目标产品的编号 比如我通常就是使用lunch 9 if [ "$1" ] ; then answer=$1 else # 如果不知道是第几个,就调用print_lunch_menu,打印出所有的目标产品,然后read你的输入 print_lunch_menu echo -n "Which would you like? [full-eng] " read answer fi local selection= if [ -z "$answer" ] then selection=full-eng #如果lunch后有输入,只接受前2个字符的数字,忽略后面的字符 elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$") then if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ] then selection=${LUNCH_MENU_CHOICES[$(($answer-1))]} fi # 正则表达式 ^[^\-][^\-]*-[^\-][^\-]*$ 表示 字符串中间只能有一个字符'-' 例如 a-b符合条件, 而-a-b , a-b- a--b这些都不符合条件 elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$") then selection=$answer fi #选择是无效字符 if [ -z "$selection" ] then echo echo "Invalid lunch combo: $answer" return 1 fi export TARGET_BUILD_APPS= # sed -e "s/-.*$//") 是将字符'-'后面的都去掉,剩下前面的内容, 示例:crane_mt7332-eng 通过 sed -e "s/-.*$//"后,变成了crane_mt7332 local product=$(echo -n $selection | sed -e "s/-.*$//") check_product $product if [ $? -ne 0 ] then echo echo "** Don't have a product spec for: '$product'" echo "** Do you have the right repo manifest?" product= fi # sed -e "s/^[^\-]*-// 表示将字符 '-'之前的内容都去掉,只剩下后面的编译版本,示例:crane_mt7332-eng 通过 sed -e "s/-.*$//"后,变成了eng local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//") check_variant $variant if [ $? -ne 0 ] then echo echo "** Invalid variant: '$variant'" echo "** Must be one of ${VARIANT_CHOICES[@]}" variant= fi if [ -z "$product" -o -z "$variant" ] then echo return 1 fi # 将获取的目标产品,VARIANT和类型写入到环境变量 export TARGET_PRODUCT=$product export TARGET_BUILD_VARIANT=$variant export TARGET_BUILD_TYPE=release echo set_stuff_for_environment printconfig }
实际过程如下:
$ source build/envsetup.sh
- 三、 extract-bsp
extract-bsp是一个脚本函数,在device/softwinner/common/vendorsetup.sh 他也是在lunch的时候被执行的,也就是说如果先不执行lunch ,extract-bsp是无效的
让我们来看看extract-bsp
function lunch() { local answer #如果你明确地知道lunch后的结果可以直接lunch $1 $1代表目标产品的编号 比如我通常就是使用lunch 9 if [ "$1" ] ; then answer=$1 else # 如果不知道是第几个,就调用print_lunch_menu,打印出所有的目标产品,然后read你的输入 print_lunch_menu echo -n "Which would you like? [full-eng] " read answer fi local selection= if [ -z "$answer" ] then selection=full-eng #如果lunch后有输入,只接受前2个字符的数字,忽略后面的字符 elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$") then if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ] then selection=${LUNCH_MENU_CHOICES[$(($answer-1))]} fi # 正则表达式 ^[^\-][^\-]*-[^\-][^\-]*$ 表示 字符串中间只能有一个字符'-' 例如 a-b符合条件, 而-a-b , a-b- a--b这些都不符合条件 elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$") then selection=$answer fi #选择是无效字符 if [ -z "$selection" ] then echo echo "Invalid lunch combo: $answer" return 1 fi export TARGET_BUILD_APPS= # sed -e "s/-.*$//") 是将字符'-'后面的都去掉,剩下前面的内容, 示例:crane_mt7332-eng 通过 sed -e "s/-.*$//"后,变成了crane_mt7332 local product=$(echo -n $selection | sed -e "s/-.*$//") check_product $product if [ $? -ne 0 ] then echo echo "** Don't have a product spec for: '$product'" echo "** Do you have the right repo manifest?" product= fi # sed -e "s/^[^\-]*-// 表示将字符 '-'之前的内容都去掉,只剩下后面的编译版本,示例:crane_mt7332-eng 通过 sed -e "s/-.*$//"后,变成了eng local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//") check_variant $variant if [ $? -ne 0 ] then echo echo "** Invalid variant: '$variant'" echo "** Must be one of ${VARIANT_CHOICES[@]}" variant= fi if [ -z "$product" -o -z "$variant" ] then echo return 1 fi # 将获取的目标产品,VARIANT和类型写入到环境变量 export TARGET_PRODUCT=$product export TARGET_BUILD_VARIANT=$variant export TARGET_BUILD_TYPE=release echo set_stuff_for_environment printconfig }
总的来说,经行分析extract-bsp脚本发现,其实就是将lichee编译的结果输出到device/softwinner/vendor目录下,其实这个过程是为了android的编译在做准备。而Android的编译过程非常复杂,因为我们是要沿着Lichee这条主线继续走下去,但是不对Android的编译过程以及目标产品的概念进行简单地分析,又不能充分了解到function extract-bsp()这个函数的用处,实际上本文的真正用意就是要了解extract-bsp的过程和背景,这个函数也是联系Lichee和Android之间的纽带。本文在这个系列中第一次提到了Android BSP相关的知识,可能理解起来就有点困难了,Android的BSP是后面的重中之重,到时候可能还会花大力气分析本文已经提到的一些内容(比如目标目录的创建),这里也就简单带过了。