当前位置:文档之家› Android编译过程详解

Android编译过程详解

本文使用Android版本为2.1,采用开发板为华清远见研发的FS_S5PC100 A8开发板。

+--------------------------------------------------------------------------------------------------------------------+1. source build/envsetup.sh这个命令是用来将envsetup.sh里的所有用到的命令加载到环境变量里去,我们来分析下它。

envsetup.sh里的主要命令如下:?根据上面的内容,可以推测出,如果要想定义自己的产品编译项,简单的办法是直接在envset up.sh最后,添加上add_lunch_combo myProduct-eng,当然这么做,不太符合上面代码最后的本意,我们还是老实的在vendor目录下创建自己公司名字,然后在公司目录下创建一个新的vendorsetup.sh,在里面添加上自己的产品编译项?这样,当我们在执行source build/envsetup.sh命令的时候,可以在shell上看到下面的信息:?2. 按照android官网的步骤,开始执行lunch full-eng当然如果你按上述命令执行,它编译的还是通用的eng版本系统,不是我们个性系统,我们可以执行lunch命令,它会打印出一个选择菜单,列出可用的编译选项如果你按照第一步中添加了vendorsetup.sh那么,你的选项中会出现:?其中第3项是我们自己添加的编译项。

lunch命令是envsetup.sh里定义的一个命令,用来让用户选择编译项,来定义Product和编译过程中用到的全局变量。

我们一直没有说明前面的fs100-eng是什么意思,现在来说明下,fs100是我定义的产品的名字,eng是产品的编译类型,除了eng外,还有user,userdebug,分别表示:eng: 工程机,user:最终用户机userdebug:调试测试机由此可见,除了eng和user外,另外两个一般不能交给最终用户的,记得m8出来的时候,先放出了一部分eng工程机,然后出来了user机之后,可以用工程机换。

好了,我们来分析下lunch命令干了什么??由上面分析可知,lunch命令可以带参数和不带参数,最终导出一些重要的环境变量,从而影响编译系统的编译结果。

导出的变量如下(以实际运行情况为例)?执行完上述两个步骤,就该执行:make命令了,下篇来分析。

通过上篇文章,我们分析了编译android时source build/envsetup.sh和lunch命令,在执行完上述两个命令后,我们就可以进行编译android了。

1. make执行make命令的结果就是去执行当前目录下的Makefile文件,我们来看下它的内容:?呵呵,看到上面的内容,我们都会笑,这是我见过最简单的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目录下,敲M ake实际上就等同于我们执行make droid。

当Make include所有的文件,完成对所有make我文件的解析以后就会寻找生成droid的规则,依次生成它的依赖,直到所有满足的模块被编译好,然后使用相应的工具打包成相应的img。

这儿不是我们的重点,不再多说。

2. build/core/config.mk该文件被main.mk包含。

定义了以下环境变量:?上述命令变量其实是对应的mk文件名,所有的Android.mk文件里基本上都包含上述命令变量,如:CLEAR_VARS:用来清除之前定义的环境变量BUILD_SHARED_LIBRARY:用来指定编译动态库过程?112行又包含了另外一个重要的mk文件envsetup.mk,我们来看一下。

3. envsetup.mk25 ifeq ($(TARGET_PRODUCT),) #判断TARGET_PRODUCT是否为空,26 ifeq ($(TARGET_SIMULATOR),true)27 TARGET_PRODUCT := sim28else29 TARGET_PRODUCT := generic30 endif31 endif第25行,判断TARGET_PRODUCT是否为空,根据上一节分析可知,TARGET_PRODUCT=fs1 0034 # the variant -- the set of files that are included for a build35 ifeq ($(strip $(TARGET_BUILD_VARIANT)),)36 TARGET_BUILD_VARIANT := eng37 endif3839 # Read the product specs so we an get TARGET_DEVICE and other40 # variables that we need in order to locate the output files.41 include $(BUILD_SYSTEM)/product_config.mk在41行又包含了product_config.mk文件,等会我们再分析它,先看下面的148 # ---------------------------------------------------------------149 # figure out the output directories150151 ifeq (,$(strip $(OUT_DIR)))152 OUT_DIR := $(TOPDIR)out153 endif154155 DEBUG_OUT_DIR := $(OUT_DIR)/debug156157 # Move the host or target under the debug/ directory158 # if necessary.159 TARGET_OUT_ROOT_release := $(OUT_DIR)/target160 TARGET_OUT_ROOT_debug := $(DEBUG_OUT_DIR)/target161 TARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))162...184 PRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)187188 HOST_OUT_EXECUTABLES:= $(HOST_OUT)/bin189 HOST_OUT_SHARED_LIBRARIES:= $(HOST_OUT)/lib190 HOST_OUT_JAVA_LIBRARIES:= $(HOST_OUT)/framework191 HOST_OUT_SDK_ADDON := $(HOST_OUT)/sdk_addon...200 TARGET_OUT_INTERMEDIATES := $(PRODUCT_OUT)/obj201 TARGET_OUT_HEADERS:= $(TARGET_OUT_INTERMEDIATES)/include202 TARGET_OUT_INTERMEDIATE_LIBRARIES := $(TARGET_OUT_INTERMEDIATES)/lib 203 TARGET_OUT_COMMON_INTERMEDIATES := $(TARGET_COMMON_OUT_ROOT)/obj204205 TARGET_OUT := $(PRODUCT_OUT)/system206 TARGET_OUT_EXECUTABLES:= $(TARGET_OUT)/bin207 TARGET_OUT_OPTIONAL_EXECUTABLES:= $(TARGET_OUT)/xbin208 TARGET_OUT_SHARED_LIBRARIES:= $(TARGET_OUT)/lib209 TARGET_OUT_JAVA_LIBRARIES:= $(TARGET_OUT)/framework210 TARGET_OUT_APPS:= $(TARGET_OUT)/app211 TARGET_OUT_KEYLAYOUT := $(TARGET_OUT)/usr/keylayout212 TARGET_OUT_KEYCHARS := $(TARGET_OUT)/usr/keychars213 TARGET_OUT_ETC := $(TARGET_OUT)/etc214 TARGET_OUT_STATIC_LIBRARIES:= $(TARGET_OUT_INTERMEDIATES)/lib215 TARGET_OUT_NOTICE_FILES:=$(TARGET_OUT_INTERMEDIATES)/NOTICE_FILES 216217 TARGET_OUT_DATA := $(PRODUCT_OUT)/data218 TARGET_OUT_DATA_EXECUTABLES:= $(TARGET_OUT_EXECUTABLES)219 TARGET_OUT_DATA_SHARED_LIBRARIES:= $(TARGET_OUT_SHARED_LIBRARIES) 220 TARGET_OUT_DATA_JAVA_LIBRARIES:= $(TARGET_OUT_JAVA_LIBRARIES)221 TARGET_OUT_DATA_APPS:= $(TARGET_OUT_DATA)/app222 TARGET_OUT_DATA_KEYLAYOUT := $(TARGET_OUT_KEYLAYOUT)223 TARGET_OUT_DATA_KEYCHARS := $(TARGET_OUT_KEYCHARS)224 TARGET_OUT_DATA_ETC := $(TARGET_OUT_ETC)225 TARGET_OUT_DATA_STATIC_LIBRARIES:= $(TARGET_OUT_STATIC_LIBRARIES)226227 TARGET_OUT_UNSTRIPPED := $(PRODUCT_OUT)/symbols228 TARGET_OUT_EXECUTABLES_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)/system/bin 229 TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)/system /lib230 TARGET_ROOT_OUT_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)231 TARGET_ROOT_OUT_SBIN_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)/sbin232 TARGET_ROOT_OUT_BIN_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)/bin233234 TARGET_ROOT_OUT := $(PRODUCT_OUT)/root235 TARGET_ROOT_OUT_BIN := $(TARGET_ROOT_OUT)/bin236 TARGET_ROOT_OUT_SBIN := $(TARGET_ROOT_OUT)/sbin237 TARGET_ROOT_OUT_ETC := $(TARGET_ROOT_OUT)/etc238 TARGET_ROOT_OUT_USR := $(TARGET_ROOT_OUT)/usr239240 TARGET_RECOVERY_OUT := $(PRODUCT_OUT)/recovery241 TARGET_RECOVERY_ROOT_OUT := $(TARGET_RECOVERY_OUT)/root242243 TARGET_SYSLOADER_OUT := $(PRODUCT_OUT)/sysloader244 TARGET_SYSLOADER_ROOT_OUT := $(TARGET_SYSLOADER_OUT)/root245 TARGET_SYSLOADER_SYSTEM_OUT := $(TARGET_SYSLOADER_OUT)/root/system246247 TARGET_INSTALLER_OUT := $(PRODUCT_OUT)/installer248 TARGET_INSTALLER_DATA_OUT := $(TARGET_INSTALLER_OUT)/data249 TARGET_INSTALLER_ROOT_OUT := $(TARGET_INSTALLER_OUT)/root250 TARGET_INSTALLER_SYSTEM_OUT := $(TARGET_INSTALLER_OUT)/root/system上面的代码是指定了目标输出代码的位置和主机输出代码的位置,重要的几个如下:PRODUCT_OUT = 这个的结果要根据product_config.mk文件内容来决定,其实是out/target/pr oduct/fs100/TARGET_OUT = $(PRODUCT_OUT)/systemTARGET_OUT_EXECUTABLES = $(PRODUCT_OUT)/system/binTARGET_OUT_SHARED_LIBRARIES = $(PRODUCT_OUT)/system/libTARGET_OUT_JAVA_LIBRARIES = $(PRODUCT_OUT)/system/frameworkTARGET_OUT_APPS = $(PRODUCT_OUT)/system/appTARGET_OUT_ETC = $(PRODUCT_OUT)/system/etcTARGET_OUT_STATIC_LIBRARIES = $(PRODUCT_OUT)/obj/libTARGET_OUT_DATA = $(PRODUCT_OUT)/dataTARGET_OUT_DATA_APPS = $(PRODUCT_OUT)/data/appTARGET_ROOT_OUT = $(PRODUCT_OUT)/rootTARGET_ROOT_OUT_BIN = $(PRODUCT_OUT)/binTARGET_ROOT_OUT_SBIN = $(PRODUCT_OUT)/system/sbinTARGET_ROOT_OUT_ETC = $(PRODUCT_OUT)/system/etcTARGET_ROOT_OUT_USR = $(PRODUCT_OUT)/system/usr总结下:envsetup.mk文件主要包含了product_config.mk文件,然后指定了编译时要输出的所有文件的OUT目录。

相关主题