Android Makefile 分析之 (buildenvsetup.sh)

    技术2022-05-19  21

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

     

    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   

            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

    }

     

     

    转自:http://www.lupaworld.com/home.php?mod=space&uid=131820&do=blog&id=149462


    最新回复(0)