## 源码包编译流程梳理 教程都是先执行这个 ``` 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" ```