build/envsetup.sh 脚本分析 -- lunch函数

原创 2012年03月22日 16:08:27
lunch函数提供了一个菜单让开发人员选择需要编译的目标产品(target product)和变体(variant),并做一些检查,设置环境变量,并打印出主要的环境变量

直接运行lunch(必须先运行 build/envsetup.sh,让lunch函数驻留到环境变量中)

ning@ning-desktop:~/donut-compare/mydroid$ lunch

You're building on Linux

generic-eng simulator aosp_emulator_us-eng aosp_emulator_eu-eng aosp_dream_us-userdebug aosp_dream_eu-userdebug aosp_dream_us-eng aosp_dream_eu-eng aosp_sapphire_us-userdebug aosp_sapphire_eu-userdebug aosp_sapphire_us-eng aosp_sapphire_eu-eng
Lunch menu... pick a combo:
     1. generic-eng
     2. simulator
     3. aosp_emulator_us-eng
     4. aosp_emulator_eu-eng
     5. aosp_dream_us-userdebug
     6. aosp_dream_eu-userdebug
     7. aosp_dream_us-eng
     8. aosp_dream_eu-eng
     9. aosp_sapphire_us-userdebug
     10. aosp_sapphire_eu-userdebug
     11. aosp_sapphire_us-eng
     12. aosp_sapphire_eu-eng

Which would you like? [generic-eng] 7

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=1.6
TARGET_PRODUCT=aosp_dream_us
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=false
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=Donut
============================================

用户也可以直接输入参数,不使用菜单

ning@ning-desktop:~/donut-compare/mydroid$ lunch aosp_dream_us-eng

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=1.6
TARGET_PRODUCT=aosp_dream_us
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=false
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=Donut
============================================

下面是lunch函数源代码,用蓝色添加了一下注释,便于阅读:


function lunch()
{
    local answer

    if [ "$1" ] ; then
       # lunch后面直接带参数
        answer=$1
    else
       # lunch后面不带参数,则打印处所有的target product和variant菜单提供用户选择
        print_lunch_menu   //可以查看这个函数在 build/envsetup.sh
        echo -n "Which would you like? [generic-eng] "
        read answer
    fi

    local selection=

    if [ -z "$answer" ]
    then
           # 如果用户在菜单中没有选择,直接回车,则为系统缺省的generic-eng
        selection=generic-eng
    elif [ "$answer" = "simulator" ]
    then
        # 如果是模拟器
        selection=simulator
    elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")
    then
        # 如果answer是选择菜单的数字,则获取该数字对应的字符串
        if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]
        then
            selection=${LUNCH_MENU_CHOICES[$(($answer-$_arrayoffset))]}
        fi
        # 如果 answer字符串匹配 *-*模式(*的开头不能为-)
    elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$")
    then
        selection=$answer
    fi

    if [ -z "$selection" ]
    then
        echo
        echo "Invalid lunch combo: $answer"
        return 1
    fi

    # special case the simulator
    if [ "$selection" = "simulator" ]
    then
        # 模拟器模式
        export TARGET_PRODUCT=sim
        export TARGET_BUILD_VARIANT=eng
        export TARGET_SIMULATOR=true
        export TARGET_BUILD_TYPE=debug
    else

        # 将 product-variant模式中的product分离出来
        local product=$(echo -n $selection | sed -e "s/-.*$//")

        # 检查之,调用关系 check_product()->get_build_var()->build/core/config.mk比较罗嗦,不展开了
        check_product $product
        if [ $? -ne 0 ]
        then
            echo
            echo "** Don't have a product spec for: '$product'"
            echo "** Do you have the right repo manifest?"
            product=
        fi

        # 将 product-variant模式中的variant分离出来
        local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")

        # 检查之,看看是否在 (user userdebug eng) 范围内
        check_variant $variant
        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

        export TARGET_PRODUCT=$product
        export TARGET_BUILD_VARIANT=$variant
        export TARGET_SIMULATOR=false
        export TARGET_BUILD_TYPE=release
    fi # !simulator

    echo

    # 设置到环境变量,比较多,不再一一列出,最简单的方法 set >env.txt 可获得
    set_stuff_for_environment
    # 打印一些主要的变量, 调用关系 printconfig()->get_build_var()->build/core/config.mk->build/core/envsetup.mk比较罗嗦,不展开了
    printconfig
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Android编译详解之lunch命令

Android的优势就在于其开源,手机和平板生产商可以根据自己的硬件进行个性定制自己的手机产品,如小米,LePhone,M9等,因此,在我们在对Android的源码进行定制的时候,很有必要了解下,An...
  • wang92453
  • wang92453
  • 2014年03月24日 15:59
  • 15441

build/envsetup.sh 脚本分析 -- lunch函数

lunch函数提供了一个菜单,让开发人员选择需要编译的目标产品(target product)和变体(variant),并做一些检查,设置环境变量,并打印出主要的环境变量。 直接运行lunch(...
  • wh_19910525
  • wh_19910525
  • 2012年03月22日 16:08
  • 2052

source /build/envsetup.sh和lunch)

提醒:想要研究安卓编译系统,必须对bash shell和GUN make非常熟悉,不然会看的云里雾里,没有这个背景的可以先补充知识。1.source ./build/envsetup.sh 主要是加...
  • GetNextWindow
  • GetNextWindow
  • 2015年09月01日 17:18
  • 1152

android编译系统分析一:source build/envsetup.sh与lunch

虽然已经有很多人分析过android的编译系统的代码了,我也看过他们的博客,也学到了不少知识,但单纯的看别人分析,终究还是理解的不深入,所以,我还是要自己再认真的分析一遍。 1. source bui...
  • u011913612
  • u011913612
  • 2016年08月01日 11:56
  • 4000

Android编译详解之lunch命令

Android的优势就在于其开源,手机和平板生产商可以根据自己的硬件进行个性定制自己的手机产品, 如小米,LePhone,M9等,因此,在我们在对Android的源码进行定制的时候,很有必要...
  • zmnqazqaz
  • zmnqazqaz
  • 2014年07月08日 09:54
  • 16589

Android编译详解之lunch命令

Android的优势就在于其开源,手机和平板生产商可以根据自己的硬件进行个性定制自己的手机产品, 如小米,LePhone,M9等,因此,在我们在对Android的源码进行定制的时候,很有必要了解下,...
  • bdhk6688
  • bdhk6688
  • 2016年09月18日 14:55
  • 407

Android build/envsetup.sh 脚本分析(lunch函数)

wll@wll:/var/data/wll/project/8825_0108/SC8825$ . build/envsetup.sh including device/moto/sting...
  • hlglinglong
  • hlglinglong
  • 2013年01月23日 14:57
  • 644

build/envsetup.sh 脚本分析(lunch函数)

lunch函数提供了一个菜单,让开发人员选择需要编译的目标产品(target product)和变体(variant),并做一些检查,设置环境变量,并打印出主要的环境变量。 直接运行lunch(...
  • hong19860320
  • hong19860320
  • 2011年11月16日 10:25
  • 725

build/envsetup.sh分析

通常我们是编译Android源码前要先执行 $ source build/envsetup.sh 该脚本执行后,我们就可以执行lunch等命令。怎么会这么神奇,执行了shell脚本就可以多出来几个命令...
  • daoshuti
  • daoshuti
  • 2017年05月17日 17:59
  • 372

Android lunch分析以及产品分支构建

转自:http://blog.csdn.net/generalizesoft/article/details/7253901 Android lunch分析以及产品分支构建 一、背景 随着A...
  • gchww
  • gchww
  • 2012年08月07日 14:13
  • 6549
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:build/envsetup.sh 脚本分析 -- lunch函数
举报原因:
原因补充:

(最多只允许输入30个字)