Android 开发之envsetup.sh配置lunch

来源:互联网 发布:哈尔滨淘宝代卖货 编辑:程序博客网 时间:2024/06/06 10:05

1)source build/envsetup.sh

          前面说过一般envsetup.sh一般做了如下几件事情:

               1)加载编译时我们使用的基本函数命令:help、lunch、m、mm、mmm等。

               2)查找vendor/厂商目录、device/厂商目录下的vendorsetup.sh,加载执行,添加厂商自己定义的产品编译选项。

        3)一般Android原生代码里面可能会添加两个系统的默认选项:

             add_lunch_combo  generic-eng

             add_lunch_combo  simulator

2)查找vendorsetup.sh进行加载

         在envsetup.sh结尾的地方,我们看到:

# Execute the contents of any vendorsetup.sh files we can find.for f in `/bin/ls vendor/*/vendorsetup.sh vendor/*/*/vendorsetup.sh device/*/*/vendorsetup.sh 2> /dev/null`do    echo "including $f"    . $fdoneunset faddcompletions

         查找vendor 以及device目录下的厂商自己 定义的vendorsetup.sh加载执行。所以如果我们自己需要定义自己的产品选项的话,就需要在vendor下创建自己公司的名字,然后新建一个vendorsetup.sh,里面添加上自己的产品编译选项。

       如:我的fsl项目:

      device/fsl/imx6/vendorsetup.sh内容:

                   add_lunch_combo sabresd_6dq-eng

                    add_lunch_combo sabresd_6dq-user

                    add_lunch_hadrware SboxF140AV01

                    add_lunch_hardware SboxF140CV01

add_lunch_project BASE

  add_lunch_prohect Danoo

............

        这里我们先看看函数add_lunch_combo内容:

# Clear this variable.  It will be built up again when the vendorsetup.sh# files are included at the end of this file.unset LUNCH_MENU_CHOICESfunction add_lunch_combo(){    local new_combo=$1    local c    for c in ${LUNCH_MENU_CHOICES[@]} ; do        if [ "$new_combo" = "$c" ] ; then            return// 判断全局数组LUNCH_MENU_CHOICES中如果已经存在添加的选项,则直接返回        fi    done// 否则将添加选项,添加到全局数组LUNCH_MENU_CHOICES中    LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)    echo "${LUNCH_MENU_CHOICES[@]}"}


 

 

3)lunch选择

lunch是envsetup.sh中定义的一个命令,用来让用户选择编译选项,定义自己的product,和一些全局变量的。

下面我们来看看具体lunch内容是什么:

function lunch(){    local answer//声明一个局部变量answer    if [ "$1" ] ; then        answer=$1    else// 如果没有传参数,如:lunch,则打印出所有的target product菜单选项供用户选择        print_lunch_menu        echo -n "Which would you like? [1] "        read answer// 从标准输入获取选项    fi    local selection=    if [ -z "$answer" ]    then    answer=1// 如果用户没有输入任何选项,默认为第一个        selection=${LUNCH_MENU_CHOICES[$(($answer-1))]}    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    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=// 获取selection字符串第一次遇到的-前面内容,如:输入fsl-eng输出fsl    local product=$(echo -n $selection | sed -e "s/-.*$//")    check_product $product// 检查fsl是否有效    if [ $? -ne 0 ]    then        echo        echo "** Don't have a product spec for: '$product'"        echo "** Do you have the right repo manifest?"        product=    fi// 获取selection字符串第一次遇到的-后面内容,如:输入fsl-eng输出eng    local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")    check_variant $variant// 检查eng是否有效    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    if [ "$2" ] ; then        answer=$2    else// 如果用户没有输入第二个参数,打印硬件选项菜单,供用户选择        print_lunch_hardware        echo -n "Which would you like? [1] "        read answer    fi    if [ -z "$answer" ]    then    answer=1        hardware=${LUNCH_HARDWARE_CHOICES[$(($answer-1))]}    elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")    then        if [ $answer -le ${#LUNCH_HARDWARE_CHOICES[@]} ]        then            hardware=${LUNCH_HARDWARE_CHOICES[$(($answer-1))]}        fi    elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$")    then        echo        echo "Invalid lunch STB: $answer"        return 1    fi    if [ "$3" ] ; then        answer=$3    else// 如果用户没有输入第三个参数,打印项目选项菜单,供用户选择        print_lunch_project        echo -n "Which would you like? [1] "        read answer    fi    if [ -z "$answer" ]    then    answer=1        project=${LUNCH_PROJECT_CHOICES[$(($answer-1))]}    elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")    then        if [ $answer -le ${#LUNCH_PROJECT_CHOICES[@]} ]        then            project=${LUNCH_PROJECT_CHOICES[$(($answer-1))]}        fi    elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$")    then        echo        echo "Invalid lunch project: $answer"        return 1    fi    // 最后导出环境变量,后面整个编译系统都会用到这些变量    export TARGET_PRODUCT=$product    export TARGET_BUILD_VARIANT=$variant    export TARGET_BUILD_TYPE=release    export DISPLAY_BUILD_NUMBER=true    export BUILD_ID=$hardware    export BUILD_NAME=$project      echo// 设置环境变量    set_stuff_for_environment// 打印变量    printconfig}

 

 

最后我们来看下:set_stuff_for_environmentprintconfig函数:

function set_stuff_for_environment(){    settitle    set_java_home    setpaths    set_sequence_number    export ANDROID_BUILD_TOP=$(gettop)}

settitle就是export PROMPT_COMMAND="echo -ne [sabresd_6dq-eng] user@hostname: /home/admin/android"

set_jave_home就是:export ${JAVA_HOME}

setpaths 设置一些基本路径

set_sequence_number就是:export BUILD_ENV_SEQUENCE_NUMBER=10

function printconfig(){    T=$(gettop)    if [ ! "$T" ]; then        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2        return    fi    get_build_var report_config}


 

# Get the exact value of a build variable.function get_build_var(){    T=$(gettop)    if [ ! "$T" ]; then        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2        return    fi    CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \      make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-$1}


所以最后调用的是:

make   --no-print-directory

           -C  /home/admin/android

           -f   build/core/config.mk

           dumpvar-report_config

           CALLED_FROM_SETUP=true

           BUILD_SYSTEM=build/core

 下面进入build/core/config.mk里面:

            include $(BUILD_SYSTEM)/envsetup.mk

            include $(BUILD_SYSTEM)/dumpvar.mk          

 

在envsetup.mk里面:

ifeq ($(PRINT_BUILD_CONFIG),)

PRINT_BUILD_CONFIG := true  默认都会true

endif

 

在dumpvar.mk里面:

如果没有dumpvar-report_config则不会PRINT_BUILD_CONFIG内容

ifneq ($(dumpvar_goals),report_config)PRINT_BUILD_CONFIG:=endif
ifneq ($(PRINT_BUILD_CONFIG),)$(info ============================================)$(info   PLATFORM_VERSION_CODENAME=$(PLATFORM_VERSION_CODENAME))$(info   PLATFORM_VERSION=$(PLATFORM_VERSION))$(info   TARGET_PRODUCT=$(TARGET_PRODUCT))$(info   TARGET_BUILD_VARIANT=$(TARGET_BUILD_VARIANT))$(info   TARGET_BUILD_TYPE=$(TARGET_BUILD_TYPE))$(info   TARGET_BUILD_APPS=$(TARGET_BUILD_APPS))$(info   TARGET_ARCH=$(TARGET_ARCH))$(info   TARGET_ARCH_VARIANT=$(TARGET_ARCH_VARIANT))$(info   HOST_ARCH=$(HOST_ARCH))$(info   HOST_OS=$(HOST_OS))$(info   HOST_BUILD_TYPE=$(HOST_BUILD_TYPE))$(info   BUILD_ID=$(BUILD_ID))$(info   BUILD_NAME=$(BUILD_NAME))$(info   BUILD_NUMBER=$(BUILD_NUMBER))$(info   PRE_BUILD_NUMBER=$(PRE_BUILD_NUMBER))$(info   PRE_PRE_BUILD_NUMBER=$(PRE_PRE_BUILD_NUMBER))$(info ============================================)endif



 

原创粉丝点击