现在的位置: 首页 > 移动开发 > 正文

Android 开发之envsetup.sh配置lunch

2019年09月05日 移动开发 ⁄ 共 5900字 ⁄ 字号 评论关闭

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"
    . $f
done
unset f

addcompletions

         查找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_CHOICES
function 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_environment
printconfig函数:

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

 

抱歉!评论已关闭.