偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.
全部博文(1748)
分类: Android平台
2014-05-15 09:03:51
转自:http://blog.csdn.net/generalizesoft/article/details/7253901
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
2) Check_product:
3) Print_lunch_menu()
4) Get_build_var()
5) Gettop()
6) Add_lunch_combo()
7) Set_stuff_for_environment()
8) Set_java_home
9) findmakefile
这段代码寻找vendor,build,device指定目录下的vendorsetup.sh。在vendorsetup.sh中定义了各版本的产品。
注:/dev/null 是 Unix/Linux 里的【无底洞】,任何的 output 送去了【无底洞】就再也没了,一般情况下,要是你不想看到 output 或者output 太多太大了,有可能把硬碟给挤爆了的时候,程序的设计就会考虑把 output 送到 /dev/null 了
四、Android lunch产品分支构建
背景:南京广义软件有限公司英文名generalizesoft,所以此处使用generalize来命名总的产品目录。其中 generalizex和genx则是对公司产品共性的描述。每套产品将差异性的部分定义在自己产品当中。再调用共性的部分,形成一个完整的产品。这样做 日后需要维护所有产品的时候只需要维护一套代码,而不是每套产品有一套代码,修改的内容页不方便管理。
1. 目录结构:
2. 搭建步骤
1) 在device目录下创建一个名为generalize的文件夹
2) 对其中的文件分别进行编辑。generalize.mk 对应我们第一套产品的mk文件,这是差异性文件。不同的产品需要不同的mk文件。而generalizex.mk是无差异文件,意为产品的共性。所以在 generalize.mk中定义如下,它需要引用generalizex.mk中定义的部分。这样做方便以后的产品差异性对比。同样 的,BoardConfigCommon.mk定义了generalize一系列产品板文件的共性。在调用关系中可以看出它们之间的关系
3) Vendorsetup文件是定义lunch内容的文件。在其中加上我们产品。
4) 上述步骤处理完之后。运行envsetup.sh:
. build/envsetup.sh
之后再使用lunch,就可以看到基础效果图:
5) 编译android