本文按照Android编译三部曲(source,lunch和make)的步骤来分析查看每个环节的主要流程,由于编译系统太过庞大,这里只是从关键的主干流程上做一个分析,不可能做到每个细节都剖析清楚,由于水平有限,如果有描述不够正确的地方,欢迎大家毫无保留的指正错误,在此先谢过。
1,source流程
当我们在终端执行命令source build/envsetup.sh时,其实是完整的加载了脚本envsetup.sh中的变量和方法,其中最重要的函数比如lunch就是在这一步加载到shell环境变量中去的,比较常用的函数有:
croot |
切换到源码树的根目录 |
lunch |
选择编译板型 |
m |
在源码树的根目录执行 make |
mm |
build 当前目录下的模块 |
mmm |
build 指定目录下的模块 |
cgrep |
在所有 C/C++ 文件上执行 grep |
jgrep |
在所有 Java 文件上执行 grep |
resgrep |
在所有 res/*.xml 文件上执行 grep |
godir |
转到包含某个文件的目录路径 |
printconfig |
显示当前 Build 的配置信息 |
add_lunch_combo |
在 lunch 函数的菜单中添加一个条目 |
除了加载上述函数,还执行了以下初始化和动作:
1> 提前定义3种编译模式,供后面使用:
139 VARIANT_CHOICES=(user userdebug eng)
说明:数字139是这行代码在文件中的行号,下面的也是如此。
2> 使用变量LUNCH_MENU_CHOICES之前,先将它清空:
503 unset LUNCH_MENU_CHOICES
3> 默认会加载如下6个板型选项,这样后续的lunch菜单中就可以看到这几个板型:
517 add_lunch_combo aosp_arm-eng
518 add_lunch_combo aosp_arm64-eng
519 add_lunch_combo aosp_mips-eng
520 add_lunch_combo aosp_mips64-eng
521 add_lunch_combo aosp_x86-eng
522 add_lunch_combo aosp_x86_64-eng
下面就看看函数add_lunch_combo的实现:
504 function add_lunch_combo()
505 {
506 local new_combo=$1
507 local c
508 for c in ${LUNCH_MENU_CHOICES[@]} ; do
509 if [ "$new_combo" = "$c" ] ; then
510 return
511 fi
512 done
513 LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo) //这里把板型添加到数组中去了
514 }
处理逻辑就是先从LUNCH_MENU_CHOICES中循环查找,看存不存在要添加的板型,如果存在就直接返回,如果不存在就添加到LUNCH_MENU_CHOICES中;除了上述添加的aosp的6个板型外,在device/actions/目录中还有大量的add_lunch_combo的调用,部分摘录如下:
./device/actions/s900_evb/vendorsetup.sh:add_lunch_combo s900_evb-eng
./device/actions/s900_evb/vendorsetup.sh:add_lunch_combo s900_evb-userdebug
./device/actions/s900_evb/vendorsetup.sh:add_lunch_combo s900_evb-user
./device/actions/v700_gb7_nibiru/vendorsetup.sh:add_lunch_combo v700_gb7_nibiru-eng
./device/actions/v700_gb7_nibiru/vendorsetup.sh:add_lunch_combo v700_gb7_nibiru-userdebug
./device/actions/v700_gb7_nibiru/vendorsetup.sh:add_lunch_combo v700_gb7_nibiru-user
./device/actions/v700_cxvr/vendorsetup.sh:add_lunch_combo v700_cxvr-eng
./device/actions/v700_cxvr/vendorsetup.sh:add_lunch_combo v700_cxvr-userdebug
./device/actions/v700_cxvr/vendorsetup.sh:add_lunch_combo v700_cxvr-user
./device/actions/s900_96board/vendorsetup.sh:add_lunch_combo s900_96board-eng
./device/actions/s900_96board/vendorsetup.sh:add_lunch_combo s900_96board-userdebug
./device/actions/s900_96board/vendorsetup.sh:add_lunch_combo s900_96board-user
这些全部都是在板型目录中的vendorsetup.sh脚本中写明的,脚本何时被调用的呢?【留个问题在此】
4> 下面这行的意思是,当敲入lunch命令后用Tab键进行补全时,会执行_lunch()函数:
630 complete -F _lunch lunch
马上实践一下,发现敲完lunch后按Tab键补全果然会有东西打印出来:
aosp_angler-userdebug gt9_ebox-user s900_96board_sd0_boot-eng s900_evb_sd0_boot-eng s900vr_ys_2k-eng
aosp_arm-eng gt9_ebox-userdebug s900_96board_sd0_boot-user s900_evb_sd0_boot-user s900vr_ys_2k-user
aosp_arm64-eng hikey-userdebug s900_96board_sd0_boot-userdebug s900_evb_sd0_boot-userdebug s900vr_ys_2k-userdebug
aosp_bullhead-userdebug m_e_arm-userdebug s900_RY_VR-eng s900_qcb-eng v700_cxvr-eng
aosp_dragon-eng m_e_mips-userdebug s900_RY_VR-user s900_qcb-user v700_cxvr-user
aosp_dragon-userdebug m_e_mips64-eng s900_RY_VR-userdebug s900_qcb-userdebug v700_cxvr-userdebug
aosp_flounder-userdebug mini_emulator_arm64-userdebug s900_evb-eng s900_tpe-eng v700_gb7_nibiru-eng
那就看看函数_lunch的实现:
<