现在的位置: 首页 > 综合 > 正文

Android lunch分析以及产品分支构建

2013年05月10日 ⁄ 综合 ⁄ 共 2441字 ⁄ 字号 评论关闭

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

[plain] view
plain
copy

  1. functionlunch()  
  2. {  
  3.     local answer  
  4.     if [ "$1" ] ; then  
  5.        # lunch后面直接带参数  
  6.         answer=$1  
  7.     else  
  8.        # lunch后面不带参数,则打印处所有的target product和variant菜单提供用户选择  
  9.         print_lunch_menu    
  10.         echo -n "Which would you like?[generic-eng] "  
  11.         read answer  
  12.     fi  
  13.     local selection=  
  14.     if [ -z "$answer" ]  
  15.     then  
  16.            # 如果用户在菜单中没有选择,直接回车,则为系统缺省的generic-eng  
  17.         selection=generic-eng  
  18.     elif [ "$answer" ="simulator" ]  
  19.     then  
  20.         # 如果是模拟器  
  21.         selection=simulator  
  22.     elif(echo -n $answer | grep -q -e "^[0-9][0-9]*{1}quot;)  
  23.     then  
  24.         # 如果answer是选择菜单的数字,则获取该数字对应的字符串  
  25.         if [ $answer -le${#LUNCH_MENU_CHOICES[@]} ]  
  26.         then  
  27.            selection=${LUNCH_MENU_CHOICES[$(($answer-$_arrayoffset))]}  
  28.         fi  
  29.         # 如果 answer字符串匹配 *-*模式(*的开头不能为-)  
  30.     elif (echo -n $answer | grep -q -e"^[^\-][^\-]*-[^\-][^\-]*{1}quot;)  
  31.   
  32.     then  
  33.         selection=$answer  
  34.     fi  
  35.    
  36.     if [ -z "$selection" ]  
  37.     then  
  38.         echo  
  39.         echo "Invalid lunch combo:$answer"  
  40.         return 1  
  41.     fi  
  42.    
  43.     # special case the simulator  
  44.     if [ "$selection" ="simulator" ]  
  45.     then  
  46.         # 模拟器模式  
  47.         export TARGET_PRODUCT=sim  
  48.         export TARGET_BUILD_VARIANT=eng  
  49.         export TARGET_SIMULATOR=true  
  50.         export TARGET_BUILD_TYPE=debug  
  51.     else  
  52.    
  53.         # 将 product-variant模式种的product分离出来  
  54.         local product=$(echo -n $selection |sed -e "s/-.*$//")  
  55.    
  56.         # 检查product,调用关系 check_product()->get_build_var()->build/core/config.mk  
  57.         check_product $product  
  58.         if [ $? -ne 0 ]  
  59.         then  
  60.             echo  
  61.             echo "** Don't have a productspec for: '$product'"  

抱歉!评论已关闭.