Android编译过程详解(三)
Android编译过程详解(一):http://www.cnblogs.com/mr-raptor/archive/2012/06/07/2540359.html
Android编译过程详解(二):http://www.cnblogs.com/mr-raptor/archive/2012/06/08/2541571.html
Android编译过程详解(三):http://www.cnblogs.com/mr-raptor/archive/2012/06/12/2547030.html
前面两节讲解了自定义Android编译项和创建Product产品配置文件,除了编译和定义产品相关环境变量外,还需要定义Board相关环境变量。
1. build/core/config.mk
109 # --------------------------------------------------------------- 110 # Define most of the global variables. These are the ones that 111 # are specific to the user's build configuration. 112 include $(BUILD_SYSTEM)/envsetup.mk 113 114 # Boards may be defined under $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE) 115 # or under vendor/*/$(TARGET_DEVICE). Search in both places, but 116 # make sure only one exists. 117 # Real boards should always be associated with an OEM vendor. 118 board_config_mk := \ 119 $(strip $(wildcard \ 120 $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk \ 121 vendor/*/$(TARGET_DEVICE)/BoardConfig.mk \ 122 )) 123 ifeq ($(board_config_mk),) 124 $(error No config file found for TARGET_DEVICE $(TARGET_DEVICE)) 125 endif 126 ifneq ($(words $(board_config_mk)),1) 127 $(error Multiple board config files for TARGET_DEVICE $(TARGET_DEVICE): $(board_config_mk)) 128 endif 129 include $(board_config_mk) 130 TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk))) 131 board_config_mk :=
上述代码在上一节已经见到过,只是分析了112行的envsetup.mk,根据上一节内容可知,envsetup.mk设置了很多OUT变量,最终在build/core/product_config.mk文件里,设置了TARGET_DEVICE = fs100。
我们从114行继续分析。
从114~117行解释大意可知:
Board相关配置文件会存在于$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/或vendor/*/$(TARGET_DEVICE)/目录中,一个Vendor厂商只能有一个对应的Board配置文件。
118行定义board_config_mk变量:
$(wildcard xxx)函数就是找到与xxx的匹配项放到空格列表里,前面定义TARGET_DEVICE变量 = fs100,所以$(SRC_TARGET_DIR)/board/fs100/BoardConfig.mk不存在,必须要存在vendor/*/fs100/BoardConfig.mk文件来定义开发板配置信息。
129行,通过include将vendor/*/fs100/BoardConfig.mk包含进来,
130行,TARGET_DEVICE_DIR为board_config_mk的路径,即:vendor/*/fs100
总结:
一个vendor厂商必须要有一个对应的Board配置文件,即:vendor/*/fs100/BoardConfig.mk
定义了TARGET_DEVICE_DIR变量,为board_config_mk的路径,即:vendor/*/fs100
指定board 相关特性,一定要包含:
TARGET_CPU_ABI := armeabi/...
其他属性参见其他board样例.(build/target/board/XXX
2. build/core/main.mk
141 # Bring in standard build system definitions. 142 include $(BUILD_SYSTEM)/definitions.mk ... 347 ifeq ($(SDK_ONLY),true) 348 349 # ----- SDK for Windows ------ 350 # These configure the build targets that are available for the SDK under Cygwin. 351 # The first section defines all the C/C++ tools that can be compiled under Cygwin, 352 # the second section defines all the Java ones (assuming javac is available.) 353 354 subdirs := \ 355 prebuilt \ 356 build/libs/host \ 357 build/tools/zipalign \ ... 382 # The following can only be built if "javac" is available. 383 # This check is used when building parts of the SDK under Cygwin. 384 ifneq (,$(shell which javac 2>/dev/null)) 385 $(warning sdk-only: javac available.) 386 subdirs += \ 387 build/tools/signapk \ 388 dalvik/dx \ 389 dalvik/libcore \ ... 414 else # !SDK_ONLY 415 ifeq ($(BUILD_TINY_ANDROID), true) 416 417 # TINY_ANDROID is a super-minimal build configuration, handy for board 418 # bringup and very low level debugging 419 420 subdirs := \ 421 bionic \ 422 system/core \ 423 build/libs \ 424 build/target \ ... 433 else # !BUILD_TINY_ANDROID 434 435 # 436 # Typical build; include any Android.mk files we can find. 437 # 438 subdirs := $(TOP) 439 440 FULL_BUILD := true 441 442 endif # !BUILD_TINY_ANDROID 443 444 endif # !SDK_ONLY ... 464 # 465 # Include all of the makefiles in the system 466 # 467 468 # Can't use first-makefiles-under here because 469 # --mindepth=2 makes the prunes not work. 470 subdir_makefiles := \ 471 $(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git $(subdirs) Android.mk) 472 473 include $(subdir_makefiles)
上一节只是讲了main.mk第49行中包含了config.mk,我们继续分析。
142行包含了:build/core/definitions.mk,该文件定义了很多全局变量与函数。
如下列常见函数:
my-dir:返回当前路径
all-java-files-under:获得指定目录及子目录一所有java文件
all-subdir-c-files:获得当前目录下及子目录下所有c文件
354~444行,定义了subdirs变量,依据不同的用户编译条件,而包含Android源码中不同的目录。
470行,定义了subdir_makefile变量,其值为subdirs定义的目录中的Android.mk文件。
473行,将所有编译目录中的Android.mk文件包含进来。
3. build/target/board/Android.mk
26 ifeq (,$(wildcard $(TARGET_DEVICE_DIR)/AndroidBoard.mk))27 ifeq (,$(wildcard $(TARGET_DEVICE_DIR)/Android.mk))28 $(error Missing "$(TARGET_DEVICE_DIR)/AndroidBoard.mk")29 else30 # TODO: Remove this check after people have had a chance to switch,31 # after April 2009.32 $(error Please rename "$(TARGET_DEVICE_DIR)/Android.mk" to "$(TARGET_DEVICE_DIR)/AndroidBoard.mk")33 endif34 endif35 include $(TARGET_DEVICE_DIR)/AndroidBoard.mk
由于将所有目录中Android.mk文件include进来,build/target/board/Android.mk自然被包含进来,根据前面分析,TARGET_DEVICE_DIR = vendor/*/fs100,其中26~35行用来判断对应的产品目录下是否存在AndrodiBoard.mk,如果不存在,提示出错退出,如果存在,将其包含到编译脚本中。
由此可见:我们必须要在产品目录下创建AndrodiBoard.mk文件,来描述开发板相关配置项,我们可以借鉴:build/target/board/generic/AndroidBoard.mk内容,同时根据前面所分析,还要创建BoardConfig.mk文件。
$cp build/target/board/generic/AndroidBoard.mk build/target/board/generic/BoardConfig.mk vendor/farsight/fs100/
至此,自定义Android编译选项基本步骤已经分部分析完,细节还需要针对不同开发板具体分析。
总结:
build/core/main.mk包含了config.mk,它主要定义了编译全部代码的依赖关系
build/core/config.mk 定义了大量的编译脚本命令,编译时用到的环境变量,引入了envsetup.mk 文件,加载board相关配置文件。
build/core/envsetup.mk 定义了编译时用到的大量OUT输出目录,加载product_config.mk文件
build/core/product_config.mk 定义了Vendor目录下Product相关配置文件解析脚本,读取AndrodProducts.mk生成TARGET_DEVICE变量
build/target/product product config
build/target/board board config
build/core/combo build flags config
这里解释下这里的board和product。borad主要是设计到硬件芯片的配置,比如是否提供硬件的某些功能,比如说GPU等等,或者芯片支持浮 点运算等等。product是指针对当前的芯片配置定义你将要生产产品的个性配置,主要是指APK方面的配置,哪些APK会包含在哪个product中, 哪些APK在当前product中是不提供的。
config.mk是一个总括性的东西,它里面定义了各种module编译所需要使用的HOST工具以及如何来编译各种模块,比如说 BUILT_PREBUILT就定义了如何来编译预编译模块。envsetup.mk主要会读取由envsetup.sh写入环境变量中的一些变量来配置编译过程中的输出目录,combo里面主要定义了各种Host和Target结合的编译器和编译选项。
1. 在vendor目录下创建自己公司目录,然后在公司目录下创建一个新的vendorsetup.sh,在里面添加上自己的产品编译项
$mkdir vendor/farsight/ $touch vendor/farsight/vendorsetup.sh $echo "add_lunch_combo fs100-eng" > vendor/farsight/vendorsetup.sh
2. 仿着Android示例代码,在公司目录下创建products目录
$mkdir -p vendor/farsight/products
3. 仿着Android示例代码,在products目录下创建两个mk文件
$touch vendor/farsight/products/AndroidProduct.mk vendor/farsight/products/fs100.mk
在AndroidProduct.mk里添加如下内容:
PRODUCT_MAKEFILES := $(LOCAL_DIR)/fs100.mk
在产品配置文件里添加最基本信息
PRODUCT_PACKAGES := \ IM \ VoiceDialer $(call inherit-product, build/target/product/generic.mk) # Overrides PRODUCT_MANUFACTURER := farsight PRODUCT_NAME := fs100 PRODUCT_DEVICE := fs100
4. 借鉴build/target/board/generic/AndroidBoard.mk和BoardConfig.mk,创建对应文件。
$cp build/target/board/generic/AndroidBoard.mk build/target/board/generic/BoardConfig.mk vendor/farsight/fs100/
转载于:https://www.cnblogs.com/mr-raptor/archive/2012/06/12/2547030.html
Android编译过程详解(三)相关推荐
- Android init.rc文件解析过程详解(三)
Android init.rc文件解析过程详解(三) 三.相关结构体 1.listnode listnode结构体用于建立双向链表,这种结构广泛用于kernel代码中, android源代码中定义了l ...
- Android Studio 插件开发详解三:翻译插件实战
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78113868 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...
- c语言的编译过程详解
c语言的编译过程详解 IDE的使用让很多和我一样的人对C/C++可执行程序的底层生成一知半解,不利于我们深入理解原理.在这里小结一下,望路过的大神指正~ 前言:从一个源文件(.c文件)到可执行程序到底 ...
- uboot配置和编译过程详解
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼ 分享一个大神朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到 ...
- Android 虚拟分区详解(三) 分区状态变化
Android Virtual A/B 系统简称 VAB,我将其称为虚拟分区. 本系列文章基于 Android R(11) 进行分析,如果没有特别说明,均基于代码版本 android-11.0.0_r ...
- 2.4.U-Boot配置和编译过程详解-U-Boot和系统移植第4部分视频课程笔记
目录 2.uboot 主Makefile分析 2.1.Makefile 分析2 2.2.Makefile 分析3 2.3.Makefile 分析4 2.4.链接脚本的定义 2.5.指定链接地址 如果T ...
- 简诉android源代码编译过程,详解Android源码的编译
在这里我们将介绍的是Android源码的编译,主要基于Android 1.0环境下.希望对大家有所帮助. 本文将为大家介绍的是如何设置Android源码的编译环境,包括Linux下的配置.主要基于An ...
- Android WebView 开发详解(三)
转载请注明出处 http://blog.csdn.net/typename/article/details/40302351 powered by miechal zhao 概览 Android ...
- C C++的编译过程详解
C/C++编译过程 C/C++编译过程主要分为4个过程 1) 编译预处理 2) 编译.优化阶段 3) 汇编过程 4) 链接程序 一.编译预处理 (1)宏定义指令,如#define Name Token ...
最新文章
- 【Pytorch】运用英伟达DALI加速技巧可使PyTorch运算速度快4倍
- 特种部队【动态规划】
- CSS三个非常重要的特性分享!
- 小心 HttpClient 中的 FormUrlEncodeContent 的 bug
- quartz cron 每周一_quartz框架和关闭超时订单
- 随想录(qemu仿真linux kernel)
- 微软2010年1月安全公告 Windows2000独领风骚
- 日历插件bootstrap-datetimepicker的使用感悟
- CentOS 7 启用远程连接和使用postgis等客户端连接
- Serv-U和win2003防火墙的设置
- 易语言-VB keypress事件中键盘上每个键的KeyAscii值
- 软件测试项目实战,适合大家练习的实战项目有。
- 文件操作细致详解(下)
- python海龟作图好看图案_编程入门 06:Python 海龟绘图
- python绘制柱状条形图
- [转]python各模块的学习
- 京东云智臻链开源两周年,JD Chain领跑国内自研区块链技术
- 关键词分词工具_关键词在SEO推广中的重要作用
- 使用ESP8266与小爱同学通过Arduino控制舵机
- trim()去除空格