1 ........ 2 # 测试device是否存在且是一个目录 而且 只查找device目录4层以上的子目录,名字为vendorsetup.sh 而且 将命令执行的错误报告直接送往回收站 不显示在屏幕上 3 # 测试vendor是否存在且是一个目录 而且 只查找vendor目录4层以上的子目录,名字为vendorsetup.sh 而且 将命令执行的错误报告直接送往回收站 不显示在屏幕上 4 for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null` \ 5 `test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null` 6 do 7 # 打印包含这些vendorsetup.sh 并 执行这些vendorsetup.sh 8 echo "including $f" 9 . $f 10 done 11 unset f 12 ........
↑第一步:build/envsetup.sh中vendrosetup.sh脚本执行java
1 root@book-virtual-machine:/work/android-5.0.2# source build/envsetup.sh 2 including device/asus/deb/vendorsetup.sh 3 including device/asus/fugu/vendorsetup.sh 4 including device/asus/tilapia/vendorsetup.sh 5 including device/asus/flo/vendorsetup.sh 6 including device/asus/grouper/vendorsetup.sh 7 including device/samsung/manta/vendorsetup.sh 8 including device/friendly-arm/tiny4412/vendorsetup.sh 9 including device/lge/mako/vendorsetup.sh 10 including device/lge/hammerhead/vendorsetup.sh 11 including device/moto/shamu/vendorsetup.sh 12 including device/generic/mini-emulator-mips/vendorsetup.sh 13 including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh 14 including device/generic/mini-emulator-arm64/vendorsetup.sh 15 including device/generic/mini-emulator-x86/vendorsetup.sh 16 including device/generic/mini-emulator-x86_64/vendorsetup.sh 17 including sdk/bash_completion/adb.bash
↑第二步:build/envsetup.sh中vendrosetup.sh脚本执行部分的执行效果android
1 add_lunch_combo full_tiny4412-userdebug 2 add_lunch_combo full_tiny4412-eng api
↑第三步:举例:including device/friendly-arm/tiny4412/vendorsetup.sh内容数组
1 # 清空LUNCH_MENU_CHOICES 2 unset LUNCH_MENU_CHOICES 3 function add_lunch_combo() 4 { 5 # new_combo局部变量化,且赋值为add_lunch_combo的参数 6 # 即add_lunch_combo full_tiny4412-userdebug的full_tiny4412-userdebug 7 # 局部变量化c 8 local new_combo=$1 9 local c 10 # 若是LUNCH_MENU_CHOICES有参数 11 for c in ${LUNCH_MENU_CHOICES[@]} ; do 12 # 若是add_lunch_combo参数1存在于LUNCH_MENU_CHOICES中 则返回 13 if [ "$new_combo" = "$c" ] ; then 14 return 15 fi 16 done 17 # 若是LUNCH_MENU_CHOICES无参数,则将add_lunch_combo的参数1放入LUNCH_MENU_CHOICES 18 LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo) 19 }
↑第四步:build/envsetup.sh中add_lunch_combo功能函数bash
1 function lunch() 2 { 3 # answer局部变量化 4 local answer 5 # lunch若是有参数则answer=参数1 6 if [ "$1" ] ; then 7 answer=$1 8 else 9 # 若是没有参数则打印lunch目录 10 print_lunch_menu 11 ....... 12 }
↑第五步:build/envsetup.sh中lunch功能函数的第一步,打印选项架构
1 function print_lunch_menu() 2 { 3 # 系统名称局部变量化,并打印帮助信息 4 local uname=$(uname) 5 echo 6 echo "You're building on" $uname 7 echo 8 echo "Lunch menu... pick a combo:" 9 # 初始化局部变量i=1,这个是索引编号 10 local i=1 11 # 初始化局部变量,这个是用户输入编号或选项英文 12 local choice 13 # 从LUNCH_MENU_CHOICES中取出放到choice中 14 # 并打印 “编号.LUNCH_MENU_CHOICE中的英文选项” 15 # 编号i累加 16 for choice in ${LUNCH_MENU_CHOICES[@]} 17 do 18 echo " $i. $choice" 19 i=$(($i+1)) 20 done 21 22 echo 23 }
↑第六步:build/envsetup.sh中print_lunch_menu功能函数app
1 ......#接上面打印菜单 2 echo -n "Which would you like? [aosp_arm-eng] " 3 # 读取用户输入的编号或者英文选项 4 read answer 5 fi 6 7 local selection= 8 # 若是没有输入编号或者英文选项,则默认选择了aosp_arm-eng 9 if [ -z "$answer" ] 10 then 11 selection=aosp_arm-eng 12 # 若是输入信息为数字,且数字小于LUNCH_MENU_CHOICES个数 13 elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$") 14 then 15 if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ] 16 # 将输入编号-1的英文选项放入selection(由于数组是从0开始,0对应索引1) 17 then 18 selection=${LUNCH_MENU_CHOICES[$(($answer-1))]} 19 fi 20 # 若是输入信息为具备-符号的则为英文 直接放入selection 21 elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$") 22 then 23 selection=$answer 24 fi 25 # 若是此时selection依旧为0,则打印无效lunch combo:输入值 26 if [ -z "$selection" ] 27 then 28 echo 29 echo "Invalid lunch combo: $answer" 30 return 1 31 fi 32 # 导出编译使用的环境变量 33 export TARGET_BUILD_APPS= 34 # 提取"-"位置之前的字符串放入product,好比“full_tiny4412” 35 local product=$(echo -n $selection | sed -e "s/-.*$//") 36 check_product $product 37 if [ $? -ne 0 ] 38 then 39 echo 40 echo "** Don't have a product spec for: '$product'" 41 echo "** Do you have the right repo manifest?" 42 product= 43 fi 44 # 提取"-"位置之后的字符串放入variant,好比“userdebug” 45 local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//") 46 check_variant $variant 47 if [ $? -ne 0 ] 48 then 49 echo 50 echo "** Invalid variant: '$variant'" 51 echo "** Must be one of ${VARIANT_CHOICES[@]}" 52 variant= 53 fi 54 # 若是product、variant为空则返回1 55 if [ -z "$product" -o -z "$variant" ] 56 then 57 echo 58 return 1 59 fi 60 # 导出TARGET_PRODUCT=刚刚获得的product 61 # 导出TARGET_BUILD_VARIANT=刚刚获得的variant 62 # 导出TARGET_BUILD_TYPE=release 63 64 export TARGET_PRODUCT=$product 65 export TARGET_BUILD_VARIANT=$variant 66 export TARGET_BUILD_TYPE=release 67 68 echo 69 # 设置编译相关的环境功能函数 70 set_stuff_for_environment 71 # 后面会调用get_build_var report_config 72 # 里面会执行make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-$1 73 # 即 编译config.mk 74 printconfig 75 }
↑第七步:build/envsetup.sh中lunch功能函数函数
1 function set_stuff_for_environment() 2 { 3 # 设置名称变量,好比架构、产品、主板、应用、命令行提示符 4 settitle 5 # 设置JAVA jdk环境变量 6 set_java_home 7 # 设置Android PATH、ANDROID_TOOLCHAIN、ANDROID_KERNEL_TOOLCHAIN_PATH、ANDROID_EMULATOR_PREBUILTS等路径 8 setpaths 9 # 设置BUILD_ENV_SEQUENCE_NUMBER 10 set_sequence_number 11 12 export ANDROID_BUILD_TOP=$(gettop) 13 # 设置gcc的警告和错误能够彩色显示 14 export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' 15 }
↑第八步:build/envsetup.sh中set_stuff_for_environment功能函数测试
1 function settitle() 2 { 3 if [ "$STAY_OFF_MY_LAWN" = "" ]; then 4 local arch=$(gettargetarch) 5 local product=$TARGET_PRODUCT 6 local variant=$TARGET_BUILD_VARIANT 7 local apps=$TARGET_BUILD_APPS 8 # 导出PROMPT_COMMAND,配合HISTORY_FILE设置的文件,进行记录什么用户,在什么时间,作了什么操做。 9 # PROMPT_COMMAND主要是设置打印信息格式 10 if [ -z "$apps" ]; then 11 export PROMPT_COMMAND="echo -ne \"\033]0;[${arch}-${product}-${variant}] ${USER}@${HOSTNAME}: ${PWD}\007\"" 12 else 13 export PROMPT_COMMAND="echo -ne \"\033]0;[$arch $apps $variant] ${USER}@${HOSTNAME}: ${PWD}\007\"" 14 fi 15 fi 16 }
↑第九步:build/envsetup.sh中settitle功能函数ui
关于set_java_home setpaths set_sequence_number设置函数不在赘述,同类方法
1 function printconfig() 2 { 3 T=$(gettop) 4 if [ ! "$T" ]; then 5 echo "Couldn't locate the top of the tree. Try setting TOP." >&2 6 return 7 fi 8 # 这里继续调用get_build_var report_config 9 # get_build_var会编译config.mk详见hmm笔记 10 # report_config做为dumpvar-report_config 11 # dumpvar.mk中ifneq ($(dumpvar_goals),report_config)中会将PRINT_BUILD_CONFIG置空 12 # ifneq ($(PRINT_BUILD_CONFIG),) :PRINT_BUILD_CONFIG为空则执行打印描述编译环境配置的变量信息 13 get_build_var report_config 14 }
↑第十步:build/envsetup.sh中printconfig功能函数与build/core/dumpvar.mk中打印编译环境配置
最后编译config.mk,config.mk内容见config.mk笔记