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
本文详细介绍了Android开发过程中envsetup.sh脚本的作用,包括加载基本编译命令、执行vendorsetup.sh以及设置lunch选项。通过实例展示了如何在vendorsetup.sh中添加自定义产品编译选项,并解析了lunch命令的功能,以及envsetup.sh中set_stuff_for_environment和printconfig函数的用途。最后,解释了build/core/config.mk中涉及的配置过程。

3465


被折叠的 条评论
为什么被折叠?



