Android lunch分析以及产品分支构建
一、背景
随着Android应用范围越来越广泛,用户对Android的需求也越来越趋于复杂,在开发Android应用以及底层产品驱动时,往往两套产品所需要的硬件平台就大不相同,而软件功能却相差不大。在这种纷繁的情况下,是否每种产品就需要一套源代码来维护。如果真这么做的话,那工作量就太大了。所以提出了产品分支的概念。在Android源码中提供了这么一种强大的功能。
公司正在Android上针对硬件平台做调整和开发,手上现有多种方案,有的需要无线wifi,有的底层芯片不一致。在这种情况下,公司使用Android lunch的方式使用一套源代码维护多种方案。
二、文档目的
当前网络上没有成体系的对Android lunch调用关系的研究,所以将Android lunch分析以及产品分支构建这份文档共享出来以帮助对此过程不了解的开发者。如有疑问和建议,请留言。
三、Android lunch调用关系
1. 调用流程图:
2. 调用关系分析
在编译Android产品的时候我们首先会导入. build/envsetup.sh ,然后lunch,这时候我们可以看到几个基本的产品版本。
从现象回推,首先查看envsetup.sh文件中的lunch函数:
具体分析见:lunch函数分析
在envsetup.sh中,有几个比较重要的函数。Lunch(),check_product(),print_lunch_menu(),get_build_var(),gettop,add_lunch_combo(),set_stuff_for_environment(),set_java_home(),findmakefile()。
1) lunch
- functionlunch()
- {
- local answer
- if [ "$1" ] ; then
- # lunch后面直接带参数
- answer=$1
- else
- # lunch后面不带参数,则打印处所有的target product和variant菜单提供用户选择
- print_lunch_menu
- echo -n "Which would you like?[generic-eng] "
- read answer
- fi
- local selection=
- if [ -z "$answer" ]
- then
- # 如果用户在菜单中没有选择,直接回车,则为系统缺省的generic-eng
- selection=generic-eng
- elif [ "$answer" ="simulator" ]
- then
- # 如果是模拟器
- selection=simulator
- elif(echo -n $answer | grep -q -e "^[0-9][0-9]*{1}quot;)
- then
- # 如果answer是选择菜单的数字,则获取该数字对应的字符串
- if [ $answer -le${#LUNCH_MENU_CHOICES[@]} ]
- then
- selection=${LUNCH_MENU_CHOICES[$(($answer-$_arrayoffset))]}
- fi
- # 如果 answer字符串匹配 *-*模式(*的开头不能为-)
- elif (echo -n $answer | grep -q -e"^[^\-][^\-]*-[^\-][^\-]*{1}quot;)
- then
- selection=$answer
- fi
- if [ -z "$selection" ]
- then
- echo
- echo "Invalid lunch combo:$answer"
- return 1
- fi
- # special case the simulator
- if [ "$selection" ="simulator" ]
- then
- # 模拟器模式
- export TARGET_PRODUCT=sim
- export TARGET_BUILD_VARIANT=eng
- export TARGET_SIMULATOR=true
- export TARGET_BUILD_TYPE=debug
- else
- # 将 product-variant模式种的product分离出来
- local product=$(echo -n $selection |sed -e "s/-.*$//")
- # 检查product,调用关系 check_product()->get_build_var()->build/core/config.mk
- check_product $product
- if [ $? -ne 0 ]
- then
- echo
- echo "** Don't have a productspec for: '$product'"