zoukankan      html  css  js  c++  java
  • build/envsetup.sh内lunch解析

     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脚本执行

     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脚本执行部分的执行效果

     1 add_lunch_combo full_tiny4412-userdebug 2 add_lunch_combo full_tiny4412-eng 

    ↑第三步:举例: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功能函数

     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功能函数

     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 "33]0;[${arch}-${product}-${variant}] ${USER}@${HOSTNAME}: ${PWD}07""
    12         else
    13             export PROMPT_COMMAND="echo -ne "33]0;[$arch $apps $variant] ${USER}@${HOSTNAME}: ${PWD}07""
    14         fi
    15     fi
    16 }

     ↑第九步:build/envsetup.sh中settitle功能函数

    关于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笔记

  • 相关阅读:
    QT信号槽传递自定义结构体
    Qt5MVC模式(一)
    深层次理解MVC
    代码重构与单元测试——测试项目(二)
    代码重构与单元测试(一)
    在Visual Studio 中使用git——同步到远程服务器-下(十二)
    在Visual Studio 中使用git——同步到远程服务器-上(十一)
    在Visual Studio 中使用git——标记(Tag)管理(十)
    在Visual Studio 中使用git——分支管理-下(九)
    在Visual Studio 中使用git——分支管理-上(八)
  • 原文地址:https://www.cnblogs.com/pokerface/p/5763641.html
Copyright © 2011-2022 走看看