android底层编译过程详解二_第1页
android底层编译过程详解二_第2页
android底层编译过程详解二_第3页
android底层编译过程详解二_第4页
android底层编译过程详解二_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、呵呵,看到上面 的内容,都会笑,这是我见过最简单的Makefile 了,再看下16 SRC_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 build/core/mak在 mak 里,定义了变量 TOPDIR,TOP 为当前目录,BUILD_

2、SYSTEM 为 build/core目录。在49行,包含了 build/core/config.mk 文件。后面的代码是 check 环境 变量,所有的 Makefile 都通过 build/core/ma k 这个文件组织在一起,它定义了一个默认 goals:droid,当 在TOP 目录下,敲Make 实际上就等同于 执行make droid。当 Make include 所有的文件,完成对所有 make 我文件的 以后就会寻找生成 droid 的规则,依次生成它的依赖,直到所有满足的模块被编译好,然后使用相应的工具打包成相应的 img。这儿不是 的重点,不再多说。2. build/co

3、re/config.mk该文件被mak 包含。定义了以下环境变量:1 # DO NOT EDIT THIS FILE #2 include build/core/mak3 # DO NOT EDIT THIS FILE #Android 编译过程详解(二)通过上篇文章,分析了编译 android 时 source build/envsetup.sh 和ch 命令,在执行完上述两个命令后,就可以进行编译 android 了。1. make执行 make 命令的结果就是去执行当前目录下的 Makefile 文件,来看下它的内容:上述命令变量其实是对应的mk 文件名,所有的 Android.mk 文

4、件里基本上都包含上述命令 109 # 110 # Define most of the global variables. These are the onest 111 # are specific to the users build configuration.变量,如: CLEAR_VARS:用来清除之前定义的环境变量 BUILD_SHARED_LIBRARY:用来指定编译动态库过程43 CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk44 BUILD_HOST_SIC_LIBRARY:= $(BUILD_SYSTEM)/host_sic_libra

5、ry.mk45 BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk46 BUILD_SIC_LIBRARY:= $(BUILD_SYSTEM)/sic_library.mk47 BUILD_RAW_SIC_LIBRARY := $(BUILD_SYSTEM)/raw_sic_library.mk48 BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk49 BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk5

6、0 BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk51 BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk52 BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk53 BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk54 BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk55 BUILD_MULTI_PREBUILT:= $(BUIL

7、D_SYSTEM)/multi_prebuilt.mk56 BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk57 BUILD_SIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/sic_java_library.mk58 BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk59 BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk60 BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/co

8、py_headers.mk61 BUILD_KEY_CHAR_MAP := $(BUILD_SYSTEM)/key_char_map.mk然后定义了下面几个重要的编译命令 22$(TOPDIR)frameworks/base/include 23$(TOPDIR)frameworks/base/opengl/include 24$(TOPDIR)external/skia/include 25 SRC_HOST_HEADERS:=$(TOPDIR)tools/include 26 SRC_LIBRARIES:= $(TOPDIR)libs 27 SRC_SERVERS:= $(TOPDIR)s

9、ervers 28 SRC_DIR := $(TOPDIR)build/ 29 SRC_API_DIR := $(TOPDIR)frameworks/base/api第25行,判断_PRODUCT 是否为空,根据上一节分析可知,_PRODUCT=fs10034 # the variant - the set of filest are included for a build35 ifeq ($(strip $(_BUILD_VARIANT),)36_BUILD_VARIANT := eng 25 ifeq ($(_PRODUCT),)#判断_PRODUCT 是否为空, 26 ifeq ($(

10、_SIMULATOR),true) 27_PRODUCT := sim 28 else 29_PRODUCT := generic 30 endif 31 endif112行又包含了另外一个重要的mk 文件 envsetup.mk,来看一下。3. envsetup.mk 112 include $(BUILD_SYSTEM)/envsetup.mk 113 114 # Boards may be defined under $(SRC_DIR)/board/$(_DEVICE) 115 # or under vendor/*/$(_DEVICE). Search in both pla, bu

11、t 116 # make sure only one exists. 117 # Real boards should always be assoted win OEM vendor. 118 board_config_mk := 119$(strip $(wildcard 120$(SRC_DIR)/board/$(_DEVICE)/BoardConfig.mk 121vendor/*/$(_DEVICE)/BoardConfig.mk 122) 123 ifeq ($(board_config_mk),) 124$(error No config file found for_DEVIC

12、E $(_DEVICE) 125 endif 126 ifneq ($(words $(board_config_mk),1) 127$(error Multipoard config files for_DEVICE $(_DEVICE):$(board_config_mk) 128 endif 129 include $(board_config_mk) 130_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk) 131 board_config_mk := 148 # 149 # figure out the output dir

13、ectories 150 151 ifeq (,$(strip $(OUT_DIR) 152 OUT_DIR := $(TOPDIR)out 153 endif 154 155 DEBUG_OUT_DIR := $(OUT_DIR)/debug 156 157 # Move the host orunder the debug/ directory 158 # if nesary. 159_OUT_ROOT_release := $(OUT_DIR)/ 160_OUT_ROOT_debug := $(DEBUG_OUT_DIR)/ 161_OUT_ROOT := $(_OUT_ROOT_$(_

14、BUILD_TYPE) 162 . 184 PRODUCT_OUT := $(_PRODUCT_OUT_ROOT)/$(_DEVICE) 187 188 HOST_OUT_EXECUTABLES:= $(HOST_OUT)/bin 189 HOST_OUT_SHARED_LIBRARIES:= $(HOST_OUT)/lib 190 HOST_OUT_JAVA_LIBRARIES:= $(HOST_OUT)/framework 191 HOST_OUT_SDK_ADDON := $(HOST_OUT)/sdk_addon . 200_OUT_ERMEDIATES := $(PRODUCT_OU

15、T)/obj 201_OUT_HEADERS:= $(_OUT_ERMEDIATES)/include 202_OUT_ERMEDIATE_LIBRARIES := $(_OUT_ERMEDIATES)/lib 203MON_ERMEDIATES := $(MON_OUT_ROOT)/obj 204 205_OUT := $(PRODUCT_OUT)/system 206_OUT_EXECUTABLES:= $(_OUT)/bin 207_OUT_OPTIONAL_EXECUTABLES:= $(_OUT)/xbin 208_OUT_SHARED_LIBRARIES:= $(_OUT)/lib

16、 209_OUT_JAVA_LIBRARIES:= $(_OUT)/framework 210_OUT_APPS:= $(_OUT)/app 211_OUT_KEYLAYOUT := $(_OUT)/usr/keylayout在41行又包含了 product_config.mk 文件,等会再分析它,先看下面的 37 endif 38 39 # Read the product specs so we an get_DEVICE and other 40 # variablest we need in order to locate the output files. 41 include $(

17、BUILD_SYSTEM)/product_config.mk $(_OUT_UNSTRIPPED)/system/lib上面的代码是指定了目标输出代码的位置和主机输出代码的位置,重要的几个如下:230_ROOT_OUT_UNSTRIPPED := $(_OUT_UNSTRIPPED) 231_ROOT_OUT_SBIN_UNSTRIPPED := $(_OUT_UNSTRIPPED)/sbin232_ROOT_OUT_BIN_UNSTRIPPED := $(_OUT_UNSTRIPPED)/bin 233234_ROOT_OUT := $(PRODUCT_OUT)/root 235_ROOT

18、_OUT_BIN := $(_ROOT_OUT)/bin236_ROOT_OUT_SBIN := $(_ROOT_OUT)/sbin 237_ROOT_OUT_ETC := $(_ROOT_OUT)/etc238_ROOT_OUT_USR := $(_ROOT_OUT)/usr 239240_RECOVERY_OUT := $(PRODUCT_OUT)/recovery 241_RECOVERY_ROOT_OUT := $(_RECOVERY_OUT)/root 242 243_SYSLOADER_OUT := $(PRODUCT_OUT)/sysloader244_SYSLOADER_ROO

19、T_OUT := $(_SYSLOADER_OUT)/root 245_SYSLOADER_SYSTEM_OUT := $(_SYSLOADER_OUT)/root/system 246 247_INSTALLER_OUT := $(PRODUCT_OUT)/installer248_INSTALLER_DATA_OUT := $(_INSTALLER_OUT)/data 249_INSTALLER_ROOT_OUT := $(_INSTALLER_OUT)/root250_INSTALLER_SYSTEM_OUT := $(_INSTALLER_OUT)/root/system212_OUT

20、_KEYCHARS := $(_OUT)/usr/keychars 213_OUT_ETC := $(_OUT)/etc214_OUT_SIC_LIBRARIES:= $(_OUT_ERMEDIATES)/lib 215_OUT_NOTICE_FILES:=$(_OUT_ERMEDIATES)/NOTICE_FILES 216 217_OUT_DATA := $(PRODUCT_OUT)/data218_OUT_DATA_EXECUTABLES:= $(_OUT_EXECUTABLES) 219_OUT_DATA_SHARED_LIBRARIES:= $(_OUT_SHARED_LIBRARI

21、ES)220_OUT_DATA_JAVA_LIBRARIES:= $(_OUT_JAVA_LIBRARIES) 221_OUT_DATA_APPS:= $(_OUT_DATA)/app222_OUT_DATA_KEYLAYOUT := $(_OUT_KEYLAYOUT) 223_OUT_DATA_KEYCHARS := $(_OUT_KEYCHARS)224_OUT_DATA_ETC := $(_OUT_ETC) 225_OUT_DATA_SIC_LIBRARIES:= $(_OUT_SIC_LIBRARIES) 226 227_OUT_UNSTRIPPED := $(PRODUCT_OUT)

22、/symbols228_OUT_EXECUTABLES_UNSTRIPPED := $(_OUT_UNSTRIPPED)/system/bin 229_OUT_SHARED_LIBRARIES_UNSTRIPPED := 157 include $(BUILD_SYSTEM)/product.mk . 160 # Read in all of the product definitions specified by the AndroidProducts.mk 161 # fileshe tree. 162 # 163 #TODO: when we start allowing direct

23、poers to product files, 164 #guaranteet theyrehis list. 165 $(call import-products, $(get-all-product-makefiles) 166 $(check-all-products) . 170 # Convert a short name like soonero the path to the product 171 # file definingt product. 172 # 173ERNAL_PRODUCT := $(call resolve-short-product-name, $(_P

24、RODUCT) . 176 # Find the devicet this product maps to. 177_DEVICE := $(PRODUCTS.$(ERNAL_PRODUCT).PRODUCT_DEVICE) PRODUCT_OUT = 这个的结果要根据product_config.mk 文件内容来决定,其实是out/product/fs100/_OUT = $(PRODUCT_OUT)/system_OUT_EXECUTABLES = $(PRODUCT_OUT)/system/bin_OUT_SHARED_LIBRARIES = $(PRODUCT_OUT)/system/

25、lib_OUT_JAVA_LIBRARIES = $(PRODUCT_OUT)/system/framework_OUT_APPS = $(PRODUCT_OUT)/system/app_OUT_ETC = $(PRODUCT_OUT)/system/etc_OUT_SIC_LIBRARIES = $(PRODUCT_OUT)/obj/lib_OUT_DATA = $(PRODUCT_OUT)/data_OUT_DATA_APPS = $(PRODUCT_OUT)/data/app_ROOT_OUT = $(PRODUCT_OUT)/root_ROOT_OUT_BIN = $(PRODUCT_

26、OUT)/bin_ROOT_OUT_SBIN = $(PRODUCT_OUT)/system/sbin_ROOT_OUT_ETC = $(PRODUCT_OUT)/system/etc_ROOT_OUT_USR = $(PRODUCT_OUT)/system/usr总结下:envsetup.mk 文件主要包含了 product_config.mk 文件,然后指定了编译时要输出的所有文件的 OUT 目录。4. build/core/product_config.mk 17 # 18 # Functions for including AndroidProducts.mk files 19 # 2

27、0157行,又包含了 product.mk 文件165行,调用函数 import-products, $(get-all-product-makefiles),这儿看上面的注释:Read in all of the product definitions specified by the AndroidProducts.mk fileshetree.TODO: when we start allowing direct poers to product files, guaranteet theyre his list.意思是说:指定的目录下所有的 AndrodProducts.mk 文件中定

28、义的产品信息其实 get-all-product-makefiles 返回所有的产品文件.mkimport-products 函数去验证这些产品配置文件是否都包含有必须的配置信息,细节后面分析。173行调用了 resolve-short-product-name 函数,它将返回_PRODUCT 产品的配置文件目录,并赋给ERNAL_PRODUCT也就是说:ERNAL_PRODUCT = vendor/farsight/products/fs100.mk_DEVICE = fs100如果调试看其结果,可以在167行,将#$(dump-product)取消注释然后在175行添加: $(info $

29、(ERNAL_PRODUCT)在178行添加: $(info $(_DEVICE ),查看调试结果。总结一下:product_config.mk 主要vendor 目录下不同厂商自己定义的AndrodProducts.mk 文件,从该文件里取得所有产品的配置文件,然后再根据ch 选择的编译项_PRODUCT,找到与之对应的配置文件,然后设置_DEVICE 变量,用于后续编译。5. build/core/product.mk vendor/sample/products/AndroidProduct.mk 21 # 22 # Returns the list of all AndroidProd

30、ucts.mk files. 23 # $(call ) isnt nesary. 24 # 25 define _find-android-products-files 26 $(stest -d vendor & find vendor -maxdepth 6 -name AndroidProducts.mk) 27$(SRC_DIR)/product/AndroidProducts.mk 28 endef 29 30 # 31 # Returns the sorted concatenation of all PRODUCT_MAKEFILES 32 # variables set in

31、 all AndroidProducts.mk files. 33 # $(call ) isnt nesary. 34 # 35 define get-all-product-makefiles 36 $(sort 37$(foreach f,$(_find-android-products-files), 38$(eval PRODUCT_MAKEFILES :=) 39$(eval LOCAL_DIR := $(patsubst %/,%,$(dir $(f) 40$(eval include $(f) 41$(PRODUCT_MAKEFILES) 42) 43$(eval PRODUC

32、T_MAKEFILES :=) 44$(eval LOCAL_DIR :=) 45 ) 46 endef通过注释可知,本文件中主要是一些用来处理 AndroidProduct.mk 的函数_find-android-products-files:用来获得 vendor 目录下,所有名字为 AndroidProduct.mk 的文件列表。get-all-product-makefiles:用来获得所有 AndroidProduct.mk 文件里定义的PRODUCT_MAKEFILES 的值(其实是产品文件路径名)。在 vendor 目录下,每个公司目录下都会存在一个 AndroidProduct

33、.mk 文件,这个文件是用来定义这个公司的产品列表,每个产品用.mk 来表示如 Android 给的示例:上述文件里定义了产品相关个性化信息,如,PRODUCT_PACKAGES 表示要在当前产品里添加一些安装包。由此可见,get-all-product-makefiles 函数,其实就是返回了当前公司里全部的产品对应的mk 文件列表。总结:如果用户想个性定制自己的产品,应该有以程,包含上一节内容:创建公司目录#mkdir vendor/farsight创建一个 vendorsetup.sh 文件,将当前产品编译项添加到ch 里,让ch 能找到用户个性定制编译项#echo bo fs100-eng vendor/farsight/vendorsetup.sh仿着 Android 示例代码,在公司目录下创建 products 目录 1 # List of apps and optional libraries (Java and native) to puthe add-onsystem imag

温馨提示

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

评论

0/150

提交评论