android底层编译过程详解一_第1页
android底层编译过程详解一_第2页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 HYPERLINK /mr_raptor/article/details/7539978 Android编译过程详解(一) Android的优势就在于其开源,手机和平板生产商可以根据自己的硬件进行个性定制自己的手机产品,如小米,LePhone,M9等,因此,在我们在对Android的源码进行定制的时候,很有必要了解下,Android的编译过程。如果你从来没有做过Android代码的编译,那么最官方的编译过程就是查看Android的官方网站: HYPERLINK /source/building.html /source/building.html但是,这儿只是告诉你了如何去编译一个通用的系统

2、,并没有详细告诉你细节,我们跟着编译过程来了解下。+-+ 本文使用Android版本为2.1,采用开发板为华清远见研发的FS_S5PC100 A8开发板。+-+1. source build/envsetup.sh这个命令是用来将envsetup.sh里的所有用到的命令加载到环境变量里去,我们来分析下它。envsetup.sh里的主要命令如下:plain HYPERLINK /mr_raptor/article/details/7539978# view plain HYPERLINK /mr_raptor/article/details/7539978# copyfunction help(

3、) # 显示帮助信息 function get_abs_build_var()# 获取绝对变量 function get_build_var()# 获取绝对变量 function check_product()# 检查product function check_variant()# 检查变量 function setpaths() # 设置文件路径 function printconfig()# 打印配置 function set_stuff_for_environment() # 设置环境变量 function set_sequence_number() # 设置序号 function s

4、ettitle() # 设置标题 function choosetype() # 设置type function chooseproduct() # 设置product function choosevariant() # 设置variant function tapas() # 功能同choosecombo function choosecombo() # 设置编译参数 function add_lunch_combo() # 添加lunch项目 function print_lunch_menu() # 打印lunch列表 function lunch()# 配置lunch functio

5、n m()# make from top function findmakefile() # 查找makefile function mm() # make from current directory function mmm() # make the supplied directories function croot()# 回到根目录 function cproj() function pid() function systemstack() function gdbclient() function jgrep()# 查找java文件 function cgrep() # 查找c/c

6、pp文件 function resgrep() function tracedmdump() function runhat() function getbugreports() function startviewserver() function stopviewserver() function isviewserverstarted() function smoketest() function runtest() function godir () # 跳到指定目录 # 这是系统自动增加了一个默认的编译项 generic-eng # add the default one here

7、add_lunch_combo generic-eng # 下面的代码很重要,它要从vendor目录下查找vendorsetup.sh文件,如果查到了,就加载它 # Execute the contents of any vendorsetup.sh files we can find. for f in /bin/ls vendor/*/vendorsetup.sh vendor/*/build/vendorsetup.sh 2 /dev/null do echo including $f . $f done 根据上面的内容,可以推测出,如果要想定义自己的产品编译项,简单的办法是直接在env

8、setup.sh最后,添加上add_lunch_combo myProduct-eng,当然这么做,不太符合上面代码最后的本意,我们还是老实的在vendor目录下创建自己公司名字,然后在公司目录下创建一个新的vendorsetup.sh,在里面添加上自己的产品编译项plain HYPERLINK /mr_raptor/article/details/7539978# view plain HYPERLINK /mr_raptor/article/details/7539978# copy#mkdir vendor/farsight/ #touch vendor/farsight/vendors

9、etup.sh #echo add_lunch_combo fs100-eng vendor/farsight/vendorsetup.sh 这样,当我们在执行source build/envsetup.sh命令的时候,可以在shell上看到下面的信息:plain HYPERLINK /mr_raptor/article/details/7539978# view plain HYPERLINK /mr_raptor/article/details/7539978# copyincluding vendor/farsight/vendorsetup.sh 2. 按照android官网的步骤,开

10、始执行lunch full-eng当然如果你按上述命令执行,它编译的还是通用的eng版本系统,不是我们个性系统,我们可以执行lunch命令,它会打印出一个选择菜单,列出可用的编译选项如果你按照第一步中添加了vendorsetup.sh那么,你的选项中会出现:plain HYPERLINK /mr_raptor/article/details/7539978# view plain HYPERLINK /mr_raptor/article/details/7539978# copyYoure building on Linux generic-eng simulator fs100-eng Lu

11、nch menu. pick a combo: 1. generic-eng 2. simulator 3. fs100-eng 其中第3项是我们自己添加的编译项。lunch命令是envsetup.sh里定义的一个命令,用来让用户选择编译项,来定义Product和编译过程中用到的全局变量。我们一直没有说明前面的fs100-eng是什么意思,现在来说明下,fs100是我定义的产品的名字,eng是产品的编译类型,除了eng外,还有user, userdebug,分别表示:eng: 工程机,user:最终用户机userdebug:调试测试机由此可见,除了eng和user外,另外两个一般不能交给最终用

12、户的,记得m8出来的时候,先放出了一部分eng工程机,然后出来了user机之后,可以用工程机换。好了,我们来分析下lunch命令干了什么?plain HYPERLINK /mr_raptor/article/details/7539978# view plain HYPERLINK /mr_raptor/article/details/7539978# copyfunction lunch() local answer if $1 ; then # lunch后面直接带参数 answer=$1 else # lunch后面不带参数,则打印处所有的target product和variant菜单

13、提供用户选择 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-90-9*$) then # 如果answer是选择

14、菜单的数字,则获取该数字对应的字符串 if $answer -le $#LUNCH_MENU_CHOICES then selection=$LUNCH_MENU_CHOICES$($answer-$_arrayoffset) fi # 如果 answer字符串匹配 *-*模式(*的开头不能为-) elif (echo -n $answer | grep -q -e -*-*$) then selection=$answer fi if -z $selection then echo echo Invalid lunch combo: $answer return 1 fi # special

15、 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/-.*$/) # 检查之,调用关系 check_product()-get

16、_build_var()-build/core/config.mk比较罗嗦,不展开了 check_product $product if $? -ne 0 then echo echo * Dont have a product spec for: $product echo * Do you have the right repo manifest? product= fi # 将 product-variant模式种的variant分离出来 local variant=$(echo -n $selection | sed -e s/-*-/) # 检查之,看看是否在 (user userd

17、ebug eng) 范围内 check_variant $variant if $? -ne 0 then echo echo * Invalid variant: $variant echo * Must be one of $VARIANT_CHOICES variant= fi if -z $product -o -z $variant then echo return 1 fi # 导出环境变量,这儿很重要,因为后面的编译系统都是依赖于这里定义的几个变量的 export TARGET_PRODUCT=$product export TARGET_BUILD_VARIANT=$variant export TARGET_SIMULATOR=false export TARGET_BUILD_TYPE=release fi # !simulator echo # 设置到环境变量,比较多,不再一一列出,最简单的方法 set env.txt 可获得 set_stuff_for_environment # 打印一些主要的变量, 调用关系 printconfig()-get_build_var()-build/core/config.mk-build/core/envsetup.mk 比较罗嗦,不展开了 printconfig 由上面分析可知,lunch命令可以带参数和不带参数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论