Android编译过程详解.docx
- 文档编号:30727355
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:25
- 大小:26.14KB
Android编译过程详解.docx
《Android编译过程详解.docx》由会员分享,可在线阅读,更多相关《Android编译过程详解.docx(25页珍藏版)》请在冰豆网上搜索。
Android编译过程详解
本文使用Android版本为2.1,采用开发板为华清远见研发的FS_S5PC100A8开发板。
+--------------------------------------------------------------------------------------------------------------------+
1.sourcebuild/envsetup.sh
这个命令是用来将envsetup.sh里的所有用到的命令加载到环境变量里去,我们来分析下它。
envsetup.sh里的主要命令如下:
?
functionhelp() #显示帮助信息
functionget_abs_build_var() #获取绝对变量
functionget_build_var() #获取绝对变量
functioncheck_product() #检查product
functioncheck_variant() #检查变量
functionsetpaths() #设置文件路径
functionprintconfig() #打印配置
functionset_stuff_for_environment() #设置环境变量
functionset_sequence_number() #设置序号
functionsettitle() #设置标题
functionchoosetype() #设置type
functionchooseproduct() #设置product
functionchoosevariant() #设置variant
functiontapas() #功能同choosecombo
functionchoosecombo() #设置编译参数
functionadd_lunch_combo() #添加lunch项目
functionprint_lunch_menu() #打印lunch列表
functionlunch() #配置lunch
functionm() #makefromtop
functionfindmakefile() #查找makefile
functionmm() #makefromcurrentdirectory
functionmmm() #makethesupplieddirectories
functioncroot() #回到根目录
functioncproj()
functionpid()
functionsystemstack()
functiongdbclient()
functionjgrep() #查找java文件
functioncgrep() #查找c/cpp文件
functionresgrep()
functiontracedmdump()
functionrunhat()
functiongetbugreports()
functionstartviewserver()
functionstopviewserver()
functionisviewserverstarted()
functionsmoketest()
functionruntest()
functiongodir() #跳到指定目录
#这是系统自动增加了一个默认的编译项generic-eng
#addthedefaultonehere
add_lunch_combogeneric-eng
#下面的代码很重要,它要从vendor目录下查找vendorsetup.sh文件,如果查到了,就加载它
#Executethecontentsofanyvendorsetup.shfileswecanfind.
forfin`/bin/lsvendor/*/vendorsetup.shvendor/*/build/vendorsetup.sh2>/dev/null`
do
echo"including$f"
.$f
done
根据上面的内容,可以推测出,如果要想定义自己的产品编译项,简单的办法是直接在envsetup.sh最后,添加上add_lunch_combomyProduct-eng,当然这么做,不太符合上面代码最后的本意,我们还是老实的在vendor目录下创建自己公司名字,然后在公司目录下创建一个新的vendorsetup.sh,在里面添加上自己的产品编译项
?
#mkdirvendor/farsight/
#touchvendor/farsight/vendorsetup.sh
#echo"add_lunch_combofs100-eng">vendor/farsight/vendorsetup.sh
这样,当我们在执行sourcebuild/envsetup.sh命令的时候,可以在shell上看到下面的信息:
?
includingvendor/farsight/vendorsetup.sh
2.按照android官网的步骤,开始执行lunchfull-eng
当然如果你按上述命令执行,它编译的还是通用的eng版本系统,不是我们个性系统,我们可以执行lunch命令,它会打印出一个选择菜单,列出可用的编译选项
如果你按照第一步中添加了vendorsetup.sh那么,你的选项中会出现:
?
You'rebuildingonLinux
generic-engsimulatorfs100-eng
Lunchmenu...pickacombo:
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外,另外两个一般不能交给最终用户的,记得m8出来的时候,先放出了一部分eng工程机,然后出来了user机之后,可以用工程机换。
好了,我们来分析下lunch命令干了什么?
?
functionlunch()
{
localanswer
if["$1"];then
#lunch后面直接带参数
answer=$1
else
#lunch后面不带参数,则打印处所有的targetproduct和variant菜单提供用户选择
print_lunch_menu
echo-n"Whichwouldyoulike?
[generic-eng]"
readanswer
fi
localselection=
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]*$")
then
#如果answer是选择菜单的数字,则获取该数字对应的字符串
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"Invalidlunchcombo:
$answer"
return1
fi
#specialcasethesimulator
if["$selection"="simulator"]
then
#模拟器模式
exportTARGET_PRODUCT=sim
exportTARGET_BUILD_VARIANT=eng
exportTARGET_SIMULATOR=true
exportTARGET_BUILD_TYPE=debug
else
#将product-variant模式种的product分离出来
localproduct=$(echo-n$selection|sed-e"s/-.*$//")
#检查之,调用关系check_product()->get_build_var()->build/core/config.mk比较罗嗦,不展开了
check_product$product
if[$?
-ne0]
then
echo
echo"**Don'thaveaproductspecfor:
'$product'"
echo"**Doyouhavetherightrepomanifest?
"
product=
fi
#将product-variant模式种的variant分离出来
localvariant=$(echo-n$selection|sed-e"s/^[^\-]*-//")
#检查之,看看是否在(useruserdebugeng)范围内
check_variant$variant
if[$?
-ne0]
then
echo
echo"**Invalidvariant:
'$variant'"
echo"**Mustbeoneof${VARIANT_CHOICES[@]}"
variant=
fi
if[-z"$product"-o-z"$variant"]
then
echo
return1
fi
# 导出环境变量,这儿很重要,因为后面的编译系统都是依赖于这里定义的几个变量的
exportTARGET_PRODUCT=$product
exportTARGET_BUILD_VARIANT=$variant
exportTARGET_SIMULATOR=false
exportTARGET_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命令可以带参数和不带参数,最终导出一些重要的环境变量,从而影响编译系统的编译结果。
导出的变量如下(以实际运行情况为例)
?
TARGET_PRODUCT=fs100
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=false
TARGET_BUILD_TYPE=release
执行完上述两个步骤,就该执行:
make命令了,下篇来分析。
通过上篇文章,我们分析了编译android时sourcebuild/envsetup.sh和lunch命令,在执行完上述两个命令后,我们就可以进行编译android了。
1.make
执行make命令的结果就是去执行当前目录下的Makefile文件,我们来看下它的内容:
?
###DONOTEDITTHISFILE###
includebuild/core/main.mk
###DONOTEDITTHISFILE###
呵呵,看到上面的内容,我们都会笑,这是我见过最简单的Makefile了,我们再看下build/core/main.mk
在main.mk里,定义了变量TOPDIR,TOP为当前目录,BUILD_SYSTEM为build/core目录。
在49行,包含了build/core/config.mk文件。
后面的代码是check环境变量,所有的Makefile都通过build/core/main.mk这个文件组织在一起,它定义了一个默认goals:
droid,当我们在TOP目录下,敲Make实际上就等同于我们执行makedroid。
当Makeinclude所有的文件,完成对所有make我文件的解析以后就会寻找生成droid的规则,依次生成它的依赖,直到所有满足的模块被编译好,然后使用相应的工具打包成相应的img。
这儿不是我们的重点,不再多说。
2. build/core/config.mk
该文件被main.mk包含。
定义了以下环境变量:
?
16SRC_HEADERS:
=\
17 $(TOPDIR)system/core/include\
18 $(TOPDIR)hardware/libhardware/include\
19 $(TOPDIR)hardware/libhardware_legacy/include\
20 $(TOPDIR)hardware/ril/include\
21 $(TOPDIR)dalvik/libnativehelper/include\
22 $(TOPDIR)frameworks/base/include\
23 $(TOPDIR)frameworks/base/opengl/include\
24 $(TOPDIR)external/skia/include
25SRC_HOST_HEADERS:
=$(TOPDIR)tools/include
26SRC_LIBRARIES:
=$(TOPDIR)libs
27SRC_SERVERS:
=$(TOPDIR)servers
28SRC_TARGET_DIR:
=$(TOPDIR)build/target
29SRC_API_DIR:
=$(TOPDIR)frameworks/base/api
.....然后定义了下面几个重要的编译命令43CLEAR_VARS:
=$(BUILD_SYSTEM)/clear_vars.mk
44BUILD_HOST_STATIC_LIBRARY:
=$(BUILD_SYSTEM)/host_static_library.mk
45BUILD_HOST_SHARED_LIBRARY:
=$(BUILD_SYSTEM)/host_shared_library.mk
46BUILD_STATIC_LIBRARY:
=$(BUILD_SYSTEM)/static_library.mk
47BUILD_RAW_STATIC_LIBRARY:
=$(BUILD_SYSTEM)/raw_static_library.mk
48BUILD_SHARED_LIBRARY:
=$(BUILD_SYSTEM)/shared_library.mk
49BUILD_EXECUTABLE:
=$(BUILD_SYSTEM)/executable.mk
50BUILD_RAW_EXECUTABLE:
=$(BUILD_SYSTEM)/raw_executable.mk
51BUILD_HOST_EXECUTABLE:
=$(BUILD_SYSTEM)/host_executable.mk
52BUILD_PACKAGE:
=$(BUILD_SYSTEM)/package.mk
53BUILD_HOST_PREBUILT:
=$(BUILD_SYSTEM)/host_prebuilt.mk
54BUILD_PREBUILT:
=$(BUILD_SYSTEM)/prebuilt.mk
55BUILD_MULTI_PREBUILT:
=$(BUILD_SYSTEM)/multi_prebuilt.mk
56BUILD_JAVA_LIBRARY:
=$(BUILD_SYSTEM)/java_library.mk
57BUILD_STATIC_JAVA_LIBRARY:
=$(BUILD_SYSTEM)/static_java_library.mk
58BUILD_HOST_JAVA_LIBRARY:
=$(BUILD_SYSTEM)/host_java_library.mk
59BUILD_DROIDDOC:
=$(BUILD_SYSTEM)/droiddoc.mk
60BUILD_COPY_HEADERS:
=$(BUILD_SYSTEM)/copy_headers.mk
61BUILD_KEY_CHAR_MAP:
=$(BUILD_SYSTEM)/key_char_map.mk
上述命令变量其实是对应的mk文件名,所有的Android.mk文件里基本上都包含上述命令变量,如:
CLEAR_VARS:
用来清除之前定义的环境变量
BUILD_SHARED_LIBRARY:
用来指定编译动态库过程
?
109#---------------------------------------------------------------
110#Definemostoftheglobalvariables. Thesearetheonesthat
111#arespecifictotheuser'sbuildconfiguration.
112include$(BUILD_SYSTEM)/envsetup.mk
113
114#Boardsmaybedefinedunder$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)
115#orundervendor/*/$(TARGET_DEVICE). Searchinbothplaces,but
116#makesureonlyoneexists.
117#RealboardsshouldalwaysbeassociatedwithanOEMvendor.
118board_config_mk:
=\
119 $(strip$(wildcard\
120 $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk\
121 vendor/*/$(TARGET_DEVICE)/BoardConfig.mk\
122 ))
123ifeq($(board_config_mk),)
124 $(errorNoconfigfilefoundforTARGET_DEVICE$(TARGET_DEVICE))
125endif
126ifneq($(words$(board_config_mk)),1)
127 $(errorMultipleboardconfigfilesforTA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 编译 过程 详解