在编译android project时,我们需要使用到makefile文件,通过makefile文件的规则来构建整个project
source build/envsetup.sh
lunch project_name
make -jx
envsetup.sh脚本
先看下source build/envsetup.sh做了哪些工作?
定义函数
在build/envsetup.sh里定义了很多函数
function hmm() //显示帮助信息,列出所有支持的命令,比如lunch、mm、mmm等
function get_abs_build_var() //获取编译时一些变量的绝对路径(比如BUILD_SYSTEM)
function get_build_var() //获取编译时一些变量的路径
function check_product() //检查产品是否支持编译
function check_variant() //检查变量variant是否有效,只能是user、userdebug、eng
function printconfig() //打印配置信息
function choosecombo() //选择编译类型,release和debug中的一个
function add_lunch_combo() //增加lunch命令的选择项
function print_lunch_menu() //打印lunch命令可选择的项目列表
function lunch() //lunch命令的执行逻辑
function gettop //获取Android源码根目录
function m() //m命令的执行逻辑
function findmakefile() //查找当前目录下Android.mk文件路径
function mm() //mm命令的执行逻辑
function mmm() //mmm命令的执行逻辑
function mma()
function mmma()
function croot() //进入Android源码根目录
function ggrep()
function jgrep()
function cgrep()
function resgrep()
function mangrep()
function sepgrep()
function getprebuilt
function smoketest()
function runtest()
function godir()
function make()
envsetup.sh做的第一个工作就是定义了许多函数,方便在编译过程中调用
添加编译参数
旧版本的Android,通过vendorsetup.sh使用add_lunch_comno来创建新项目,现在不使用这种方法了
定义完这些函数之后,在脚本的最后面。source_vendorsetup会遍历源码目录下device和vendor目录,查找
vendorsetup.sh,
fuction source_vendorsetup()
{
for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \
`test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \
`test -d product && find -L product -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort`
do
echo "including $f"
. $f //执行vendorsetup.sh文件
done
unset f
}
source_vendorsetup
addcompletions
addcompletions函数主要是查找sdk/bash_completion目录下所有的.bash文件,找到之后执行这些文件。
先看下vendorsetup.sh
add_lunch_combo aosp_shamu-userdebug # 显然是lunch命令用到的,放到lunch说明
add_lunch_combo aosp_shamu-eng # 这个是我加的
新的Android版本,执行add_lunch_comno会提醒add_lunch_combo is obsolete 废弃
print_lunch_menu函数
打印出全部的lunch-combo
具体是通过调用get_build_var函数来获得
function print_lunch_menu()
{
local uname=$(uname)
echo
echo "You're building on" $uname
echo
echo "Lunch menu... pick a combo:"
local i=1
local choice
for choice in $(TARGET_BUILD_APPS= get_build_var COMMON_LUNCH_CHOICES)
do
echo " $i. $choice"
i=$(($i+1))
done
echo
}
get_build_var函数
此函数通过调用build/soong/soong_ui.bash --dumpvar-mode $1来获取build variable编译变量
关于build/soong/soong_ui.bash的分析,见soong_ui.bash脚本
# Get the exact value of a build variable.
function get_build_var()
{
if [ "$BUILD_VAR_CACHE_READY" = "true" ]
then
eval "echo \"\${var_cache_$1}\""
return
fi
local T=$(gettop)
if [ ! "$T" ]; then
echo "Couldn't locate the top of the tree. Try setting TOP." >&2
return
fi
(\cd $T; build/soong/soong_ui.bash --dumpvar-mode $1)
}
新版本使用AndroidProducts.mk代替
标签:分析,function,vendorsetup,echo,lunch,sh,build,Android,编译系统 From: https://www.cnblogs.com/caseyzq/p/17124317.html