`
coolerbaosi
  • 浏览: 728444 次
文章分类
社区版块
存档分类
最新评论

Android编译系统详解(三)

 
阅读更多

前面两节讲解了自定义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/*/fs1 00/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 else

30 # 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 endif

34 endif

35 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/


转载自:http://blog.csdn.net/mr_raptor/article/details/7540730

分享到:
评论

相关推荐

    android编译系统详解

    本文档详细介绍了android编译构建系统的原理和基础的Makefile与脚本语言知识,可以让读者在较短的时间内对android的编译系统有比较全面系统的了解

    Android编译过程详解

    Android的优势就在于其开源,手机和平板生产商可以根据自己的硬件进行个性定制自己的手机产品,如小米,LePhone,M9等,因此,在我们在对Android的源码进行定制的时候,很有必要了解下,Android的编译过程。...

    android编译系统makefile(Android.mk)写法

    android编译系统makefile(Android.mk)写法 Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件。由于一般情况下 Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式: LOCAL_PATH:=$(call my-...

    Android系统定制之Android.mk和Android.bp语法详解(精通版).mp4

    1.Android系统源码定制和编译方法(Android7.0至Android12) 2.Android.mk和Android.bp语法大全及使用方法详解 3.Android.mk或Android.bp中引用Android的第三方(jar、aar、so)、Androidx的类库等的使用方法 4.Android....

    Android系统移植技术详解

    android编译系统makefile(Android.mk)写法 10 Android系统移植(一)-让android系统在目标平台上运行起来 18 Android系统移植(二)-按键移植 20 Android系统移植(三)-按键字符表 25 android启动过程配置文件的解析与...

    android系统原理及开发要点详解

     第2章“Android系统开发综述”,介绍Android系统开发的综述性内容,包括工具使用、获得代码、编译系统、仿真器运行、SDK使用等。  第3章“Android的Linux内核与驱动程序”,介绍Android内核的特点、Android中使用...

    Android.bp文件说明.pdf

    Android.bp 文件首先是 Android 系统的一种编译配置文件,是用来代替原来的 Android.mk 文件的。在 Android7.0 以前,Android 都是使用 make 来组织各模块的编译,对应的编译 配置文件就是 Android.mk。在 Android...

    android系统原理及开发要点详解_韩超_梁泉 4

     第2章“Android系统开发综述”,介绍Android系统开发的综述性内容,包括工具使用、获得代码、编译系统、仿真器运行、SDK使用等。  第3章“Android的Linux内核与驱动程序”,介绍Android内核的特点、Android中使用...

    理解 Android Build 系统

    理解 Android Build 系统,安卓编译的规则原理分析!详解

    android系统原理及开发要点详解_韩超_梁泉 1

     第2章“Android系统开发综述”,介绍Android系统开发的综述性内容,包括工具使用、获得代码、编译系统、仿真器运行、SDK使用等。  第3章“Android的Linux内核与驱动程序”,介绍Android内核的特点、Android中使用...

    下载、编译、运行android 7.1系统详解(ubuntu 16.0.4)

    Android 7的系统版本新增的很多的新功能,本篇文章主要介绍了基于ubuntu 16.0.4环境的下载、编译、运行android 7.1系统,有兴趣的可以了解一下。

    Android底层开发技术实战详解--内核、移植和驱动.(电子工业.王振丽).part3

    书名:《Android底层开发技术实战详解——内核、移植和驱动》(电子工业出版社.王振丽)。本书从底层原理开始讲起,结合真实的案例向读者详细介绍了android内核、移植和驱动开发的整个流程。全书分为19章,依次讲解...

    Make和Makefile详解

    Make和Makefile编译系统的详细讲解和常见的语法,对Android编译系统可以有更基础的了解

    Android智能穿戴设备开发指南

    内容包括Android开发技术基础、搭建Android应用开发环境、获取并编译源码、Android技术核心框架分析、HTTP网络通信、使用Socket实现数据通信、下载远程数据、上传数据、使用URL处理数据、处理XML数据、在穿戴设备中...

    Android传感器开发与智能设备案例实战

    本书主要介绍Android传感器和外设的开发,共29章,主要包括Android开发技术基础、获取并编译源码、Android技术核心框架分析、Android传感器系统分析、使用地图定位、光线传感器详解、接近警报传感器详解、磁场传感器...

    android 完全中文版 开发应用详解

    第1章 android系统概述 1 1.1 基础知识 1 1.1.1 android开发系统的由来 1 1.1.2 移动电话系统开发模式 2 1.1.3 未来移动电话的功能及android的优势 4 1.2 android的开发工作 6 1.2.1 android移植开发 6 1.2.2 ...

    详解安卓系统中的Android.mk文件

     Android.mk文件用来向编译系统描述如何编译你的源代码。更确切地说,该文件其实就是一个小型的Makefile。由于该文件会被NDK的编译工具解析多次,因此应该尽量减少源码中声明变量,因为这些变量可能会被多次定义...

    Android底层开发技术实战详解--内核、移植和驱动.(电子工业.王振丽).part1

    书名:《Android底层开发技术实战详解——内核、移植和驱动》(电子工业出版社.王振丽)。本书从底层原理开始讲起,结合真实的案例向读者详细介绍了android内核、移植和驱动开发的整个流程。全书分为19章,依次讲解...

Global site tag (gtag.js) - Google Analytics