build/envsetup.sh内lunch解析
........
# 测试device是否存在且是一个目录 并且 只查找device目录4层以上的子目录,名字为vendorsetup.sh 并且 将命令执行的错误报告直接送往回收站 不显示在屏幕上
# 测试vendor是否存在且是一个目录 并且 只查找vendor目录4层以上的子目录,名字为vendorsetup.sh 并且 将命令执行的错误报告直接送往回收站 不显示在屏幕上
for f in `test -d device && find -L device -maxdepth -name 'vendorsetup.sh' > /dev/null` \
`test -d vendor && find -L vendor -maxdepth -name 'vendorsetup.sh' > /dev/null`
do
# 打印包含这些vendorsetup.sh 并 执行这些vendorsetup.sh
echo "including $f"
. $f
done
unset f
........
↑第一步:build/envsetup.sh中vendrosetup.sh脚本执行
root@book-virtual-machine:/work/android-5.0.# source build/envsetup.sh
including device/asus/deb/vendorsetup.sh
including device/asus/fugu/vendorsetup.sh
including device/asus/tilapia/vendorsetup.sh
including device/asus/flo/vendorsetup.sh
including device/asus/grouper/vendorsetup.sh
including device/samsung/manta/vendorsetup.sh
including device/friendly-arm/tiny4412/vendorsetup.sh
including device/lge/mako/vendorsetup.sh
including device/lge/hammerhead/vendorsetup.sh
including device/moto/shamu/vendorsetup.sh
including device/generic/mini-emulator-mips/vendorsetup.sh
including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh
including device/generic/mini-emulator-arm64/vendorsetup.sh
including device/generic/mini-emulator-x86/vendorsetup.sh
including device/generic/mini-emulator-x86_64/vendorsetup.sh
including sdk/bash_completion/adb.bash
↑第二步:build/envsetup.sh中vendrosetup.sh脚本执行部分的执行效果
add_lunch_combo full_tiny4412-userdebug add_lunch_combo full_tiny4412-eng
↑第三步:举例:including device/friendly-arm/tiny4412/vendorsetup.sh内容
# 清空LUNCH_MENU_CHOICES
unset LUNCH_MENU_CHOICES
function add_lunch_combo()
{
# new_combo局部变量化,且赋值为add_lunch_combo的参数
# 即add_lunch_combo full_tiny4412-userdebug的full_tiny4412-userdebug
# 局部变量化c
local new_combo=$
local c
# 如果LUNCH_MENU_CHOICES有参数
for c in ${LUNCH_MENU_CHOICES[@]} ; do
# 如果add_lunch_combo参数1存在于LUNCH_MENU_CHOICES中 则返回
if [ "$new_combo" = "$c" ] ; then
return
fi
done
# 如果LUNCH_MENU_CHOICES无参数,则将add_lunch_combo的参数1放入LUNCH_MENU_CHOICES
LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)
}
↑第四步:build/envsetup.sh中add_lunch_combo功能函数
function lunch()
{
# answer局部变量化
local answer
# lunch如果有参数则answer=参数1
if [ "$1" ] ; then
answer=$
else
# 如果没有参数则打印lunch目录
print_lunch_menu
.......
}
↑第五步:build/envsetup.sh中lunch功能函数的第一步,打印选项
function print_lunch_menu()
{
# 系统名称局部变量化,并打印帮助信息
local uname=$(uname)
echo
echo "You're building on" $uname
echo
echo "Lunch menu... pick a combo:"
# 初始化局部变量i=,这个是索引编号
local i=
# 初始化局部变量,这个是用户输入编号或选项英文
local choice
# 从LUNCH_MENU_CHOICES中取出放到choice中
# 并打印 “编号.LUNCH_MENU_CHOICE中的英文选项”
# 编号i累加
for choice in ${LUNCH_MENU_CHOICES[@]}
do
echo " $i. $choice"
i=$(($i+))
done echo
}
↑第六步:build/envsetup.sh中print_lunch_menu功能函数
......#接上面打印菜单
echo -n "Which would you like? [aosp_arm-eng] "
# 读取用户输入的编号或者英文选项
read answer
fi local selection=
# 如果没有输入编号或者英文选项,则默认选择了aosp_arm-eng
if [ -z "$answer" ]
then
selection=aosp_arm-eng
# 如果输入信息为数字,且数字小于LUNCH_MENU_CHOICES个数
elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")
then
if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]
# 将输入编号-1的英文选项放入selection(因为数组是从0开始,0对应索引1)
then
selection=${LUNCH_MENU_CHOICES[$(($answer-))]}
fi
# 如果输入信息为具有-符号的则为英文 直接放入selection
elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$")
then
selection=$answer
fi
# 如果此时selection依旧为0,则打印无效lunch combo:输入值
if [ -z "$selection" ]
then
echo
echo "Invalid lunch combo: $answer"
return
fi
# 导出编译使用的环境变量
export TARGET_BUILD_APPS=
# 提取"-"位置以前的字符串放入product,比如“full_tiny4412”
local product=$(echo -n $selection | sed -e "s/-.*$//")
check_product $product
if [ $? -ne ]
then
echo
echo "** Don't have a product spec for: '$product'"
echo "** Do you have the right repo manifest?"
product=
fi
# 提取"-"位置以后的字符串放入variant,比如“userdebug”
local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")
check_variant $variant
if [ $? -ne ]
then
echo
echo "** Invalid variant: '$variant'"
echo "** Must be one of ${VARIANT_CHOICES[@]}"
variant=
fi
# 如果product、variant为空则返回1
if [ -z "$product" -o -z "$variant" ]
then
echo
return
fi
# 导出TARGET_PRODUCT=刚刚得到的product
# 导出TARGET_BUILD_VARIANT=刚刚得到的variant
# 导出TARGET_BUILD_TYPE=release export TARGET_PRODUCT=$product
export TARGET_BUILD_VARIANT=$variant
export TARGET_BUILD_TYPE=release echo
# 设置编译相关的环境功能函数
set_stuff_for_environment
# 后面会调用get_build_var report_config
# 里面会执行make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-$
# 即 编译config.mk
printconfig
}
↑第七步:build/envsetup.sh中lunch功能函数
function set_stuff_for_environment()
{
# 设置名称变量,比如架构、产品、主板、应用、命令行提示符
settitle
# 设置JAVA jdk环境变量
set_java_home
# 设置Android PATH、ANDROID_TOOLCHAIN、ANDROID_KERNEL_TOOLCHAIN_PATH、ANDROID_EMULATOR_PREBUILTS等路径
setpaths
# 设置BUILD_ENV_SEQUENCE_NUMBER
set_sequence_number export ANDROID_BUILD_TOP=$(gettop)
# 设置gcc的警告和错误可以彩色显示
export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
}
↑第八步:build/envsetup.sh中set_stuff_for_environment功能函数
function settitle()
{
if [ "$STAY_OFF_MY_LAWN" = "" ]; then
local arch=$(gettargetarch)
local product=$TARGET_PRODUCT
local variant=$TARGET_BUILD_VARIANT
local apps=$TARGET_BUILD_APPS
# 导出PROMPT_COMMAND,配合HISTORY_FILE设置的文件,进行记录什么用户,在什么时间,做了什么操作。
# PROMPT_COMMAND主要是设置打印信息格式
if [ -z "$apps" ]; then
export PROMPT_COMMAND="echo -ne \"\033]0;[${arch}-${product}-${variant}] ${USER}@${HOSTNAME}: ${PWD}\007\""
else
export PROMPT_COMMAND="echo -ne \"\033]0;[$arch $apps $variant] ${USER}@${HOSTNAME}: ${PWD}\007\""
fi
fi
}
↑第九步:build/envsetup.sh中settitle功能函数
关于set_java_home setpaths set_sequence_number设置函数不在赘述,同类方法
function printconfig()
{
T=$(gettop)
if [ ! "$T" ]; then
echo "Couldn't locate the top of the tree. Try setting TOP." >&
return
fi
# 这里继续调用get_build_var report_config
# get_build_var会编译config.mk详见hmm笔记
# report_config作为dumpvar-report_config
# dumpvar.mk中ifneq ($(dumpvar_goals),report_config)中会将PRINT_BUILD_CONFIG置空
# ifneq ($(PRINT_BUILD_CONFIG),) :PRINT_BUILD_CONFIG为空则执行打印描述编译环境配置的变量信息
get_build_var report_config
}
↑第十步:build/envsetup.sh中printconfig功能函数与build/core/dumpvar.mk中打印编译环境配置
最后编译config.mk,config.mk内容见config.mk笔记
build/envsetup.sh内lunch解析的更多相关文章
- build/envsetup.sh中hmm、get_abs_build_var、get_build_var解析
function hmm() { # 打印帮助信息 cat <<EOF Invoke ". build/envsetup.sh" from your shell to ...
- build/envsetup.sh 生成的命令详解表
参考: https://wiki.cyanogenmod.org/w/Envsetup_help 它是一个.sh文件,用source后就生成android编译相关函数,具体如下. 速查 Invokin ...
- 【转】Android source build/envsetup.sh学习笔记
原文网址:http://blog.csdn.net/mliubing2532/article/details/7567164 如果你只需要修改某一个模块的内容,但是却每次都要执行make, 最后等待很 ...
- 【转】Android编译系统详解(一)——build/envsetup.sh
出处 http://www.cloudchou.com/android/post-134.html 本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接 准备好编译环境后,编译Rom的 ...
- 【Android】在build/envsetup.sh中添加自己的命令(函数)
由于测试的需要,经常需要手动刷入boot.img和system.img,把它写到envsetup.sh就可以每次使用一行命令来代替了: function flashtestimage(){ if [[ ...
- [转载]Android 编译环境 build/envsetup.sh分析
2013-12-23 11:28:40 转载自: http://blog.csdn.net/evilcode/article/details/7005757 请到转载地址阅读原文, 转载以备查询.
- m mm等和envsetup.sh
envsetup.sh简介: Android 完成编译的时候先执行 source build/envsetup.sh.在这个shell 脚本中定义了 help, croot, m, mm, mmm 等 ...
- Android编译执行envsetup.sh,产生工具命令m、mm、mmm、mmma、tapas 、croot、cgrep、jgrep、 resgrep、godir
一般来说编译一个sdk或者一个比较大的工程项目,第一步都是执行 envsetup.sh这个脚本,比如编译android,qt源码以及其他一些嵌入式的sdk. 而且执行的时候需要特别注意使用 sourc ...
- envsetup.sh 与 choosecombo
choose: 来定义编译选项, choosecombo 将会一步一步提示你输入相应的编译参数 https://blog.csdn.net/kickxxx/article/details/692518 ...
随机推荐
- 【HDOJ】1983 Kaitou Kid - The Phantom Thief (2)
不仅仅是DFS,还需要考虑可以走到终点.同时,需要进行预处理.至多封闭点数为起点和终点的非墙壁点的最小值. #include <iostream> #include <cstdio& ...
- 查看本机上的端口使用情况netstat -an
1.查找本机上的端口使用情况 netstat -an 2.查找指定端口的使用情况 C:\Windows\System32>netstat -ano | find "8002" ...
- Python爬虫处理抓取数据中文乱码问题
乱码原因:因为你的文件声明为utf-8,并且也应该是用utf-8的编码保存的源文件.但是windows的本地默认编码是cp936,也就是gbk编码,所以在控制台直接打印utf-8的字符串当然是乱码了. ...
- 将eclipse新建项目的默认编码GBK改为UTF-8
在eclipse下: 新建项目默认编码设置:Window->Preferences->General->Workspace->Text file encoding 将其改为UF ...
- 在Code First中使用Migrations对实体类和数据库做出变更
在Code First中使用Migrations对实体类和数据库做出变更,Mirgration包含一系列命令. 工具--库程序包管理器--程序包管理器控制台 运行命令:Enable-Migration ...
- zoj 3620 Escape Time II
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4744 Escape Time II Time Limit: 2 Seconds ...
- Windows 8 Hyper-V虚拟机功能(转载)
刚才看见一兄弟w500折腾win8 hyper-v功能,普及下吧,欢迎各位斧正 Windows 8 中 Hyper-V 3.0 的 CPU 支持说明 Windows 8 将直接内置 Hyper-V 3 ...
- Windows 10 录音上的一个问题
最近升级到了Windows 10,结果在开发程序时发现,无论采用什么方法,都无法正常录制单声道的声音,虽然有迂回的方法解决问题,
- Bzoj 1901: Zju2112 Dynamic Rankings 树套树,线段树,平衡树,Treap
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6471 Solved: 2697[Su ...
- 普通Windows控制台窗口运行nmake编译VC
我的GDAL编译都是在VS2012提供的prompt windows里面运行nmake完成的.但是如果想将编译自动化,放到Jenkins里面怎么办呢?首先没有VS2012的工程,也不想费力去生成一个, ...