学习.md 5.3 KB

源码包编译流程梳理

教程都是先执行这个

    source ./build/envsetup.sh
    lunch WW_Tinker_Board_2-userdebug
    ./build.sh

备注:build.sh代码第一行会自动source /build/envsetup.sh 因为lunch是在envsetup.sh中定义所以第一次不能省略source ./build/envsetup.sh

  1. envsetup.sh 这个envsetup.sh中定义了很多环境设置环境变量的工具和函数 包含lunch mmm等函数

  2. lunch WW_Tinker_Board_2-userdebug lunch的代码

    function lunch()
    {
        local answer
    
        if [ "$1" ] ; then
            answer=$1
        else
            print_lunch_menu
            echo -n "Which would you like? [aosp_arm-eng] "
            read answer
        fi
    
        local selection=
    
        if [ -z "$answer" ]
        then
            selection=aosp_arm-eng
        elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")
        then
            local choices=($(TARGET_BUILD_APPS= get_build_var COMMON_LUNCH_CHOICES))
            if [ $answer -le ${#choices[@]} ]
            then
                # array in zsh starts from 1 instead of 0.
                if [ -n "$ZSH_VERSION" ]
                then
                    selection=${choices[$(($answer))]}
                else
                    selection=${choices[$(($answer-1))]}
                fi
            fi
        else
            selection=$answer
        fi
    
        export TARGET_BUILD_APPS=
    
        local product variant_and_version variant version
    
        product=${selection%%-*} # Trim everything after first dash
        variant_and_version=${selection#*-} # Trim everything up to first dash
        if [ "$variant_and_version" != "$selection" ]; then
            variant=${variant_and_version%%-*}
            if [ "$variant" != "$variant_and_version" ]; then
                version=${variant_and_version#*-}
            fi
        fi
    
        if [ -z "$product" ]
        then
            echo
            echo "Invalid lunch combo: $selection"
            return 1
        fi
    
        TARGET_PRODUCT=$product \
        TARGET_BUILD_VARIANT=$variant \
        TARGET_PLATFORM_VERSION=$version \
        build_build_var_cache
        if [ $? -ne 0 ]
        then
            return 1
        fi
    
        export TARGET_PRODUCT=$(get_build_var TARGET_PRODUCT)
        export TARGET_BUILD_VARIANT=$(get_build_var TARGET_BUILD_VARIANT)
        if [ -n "$version" ]; then
        export TARGET_PLATFORM_VERSION=$(get_build_var TARGET_PLATFORM_VERSION)
        else
        unset TARGET_PLATFORM_VERSION
        fi
        export TARGET_BUILD_TYPE=release
    
        echo
    
        set_stuff_for_environment
        printconfig
        destroy_build_var_cache
    }
    

    lunch看起来就是根据给定的参数定义 三个环境变量

    TARGET_PRODUCT=$product \
    TARGET_BUILD_VARIANT=$variant \
    TARGET_PLATFORM_VERSION=$version \
    

    问题:参数传进来再哪里用 如果build.sh没有直接调用 要找到在哪调用了 全局搜索示例传入的参数获取一些信息 后再分析build.sh 竟然后26个文件7000多出有 写死的WW_Tinker_Board_2 的定义 看似不合理 应该是替换的原版android的某个名称 达到自定义名称的目的 否则这么一个一开始就需要全局引入的参数 应该是用变量实现 全局环境变量都有了 应该是调用 当然为这个配置项写死的配置应该很多 那应该以文件为单位 不应该出现一个文件多出该变量定义

  3. build.sh 发现build.sh脚本中依然有写死的WW_Tinker_Board_2

        usage()
        {
        echo "USAGE: [-U] [-CK] [-A] [-p] [-o] [-u] [-v VERSION_NAME] [-n BUILD_NUMBER]"
            echo "No ARGS means use default build option                  "
            echo "WHERE: -U = build uboot                                 "
            echo "       -C = build kernel with Clang                     "
            echo "       -K = build kernel                                "
            echo "       -A = build android                               "
            echo "       -p = will build packaging in IMAGE      "
            echo "       -o = build OTA package                           "
            echo "       -u = build update.img                            "
            echo "       -v = build android with 'user' or 'userdebug'    "
            echo "       -n = set build number    "
            echo "       -r = pack the release    "
            echo "       -d = huild kernel dts name    "
            echo "       -V = build version    "
            echo "       -J = build jobs    "
            exit 1
        }
    

    支持的参数 不用解释 看说明就行

    source build/envsetup.sh >/dev/null
    BUILD_UBOOT=false
    BUILD_KERNEL_WITH_CLANG=false
    BUILD_KERNEL=false
    BUILD_ANDROID=false
    BUILD_AB_IMAGE=false
    BUILD_UPDATE_IMG=false
    BUILD_OTA=false
    BUILD_PACKING=false
    BUILD_VARIANT=`get_build_var TARGET_BUILD_VARIANT`
    KERNEL_DTS=""
    #BUILD_VERSION=""
    BUILD_JOBS=16
    PACK_RELEASE=false
    
    BUILD_NUMBER="eng"-"$USER"-"$(date  +%Y%m%d.%H%M)"
    RELEASE_NAME=Tinker_Board_2-Android11-"$BUILD_NUMBER"