android Makefile 收藏
今天有时间小看一下Android 的Makefile, 终于稍有明白Android 编译系统是如何通过环境变量 TARGET_PRODUCT 来决定编译定制product.
首先, 编译Android 代码 通常情况下使用:
# make showcommands
这实际上等价于下面的完整命令 (具体参见 build/core/envsetup.mk )
# TARGET_ARCH=arm TARGET_PRODUCT=generic TARGET_BUILD_TYPE=release make showcommands
可见,默认情况下编译系统认为TARGET_PRODUCT 是generic 的
那如何编译特定产品的Android呢?
这就需要查看Android Makefile是如何解析环境变量TARGET_PRODUCT的。
Android Makefile 的引用关系是这样的
Makefile -> build/core/main.mk -> build/core/config.mk -> build/core/envsetup.mk -> build/core/product_config.mk
在build/core/product_config.mk 中编译系统首先调用 build/core/product.mk中定义的函数get-all-product-makefiles ,来
遍历整个vendor 的子目录, 找到vendor下所有的 AndroidProducts.mk, 不同子目录下的AndroidProducts.mk 中定义了不同的 PRODUCT_NAME, PRODUCT_DEVICE 等信息,(我们也可以通过 打开build/core/product_config.mk 中的#$(dump-products) 语句使控制台编译的时候输出所有product 的信息) , 接着build/core/product_config.mk 会调用resolve-short-product-name 将TARGET_PRODUCT匹配的AndroidProducts.mk 中定义的 PRODUCT_DEVICE 赋值给TARGET_DEVICE。
有了这个TARGET_DEVICE, 再回到 build/core/config.mk,
会include $(TARGET_DEVCIE)/BoardConfig.mk
board_config_mk :=
$(strip $(wildcard
$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk
vendor/*/$(TARGET_DEVICE)/BoardConfig.mk
))
include $(board_config_mk)
而这个配置文件BoardConfig.mk 决定了目标系统编译属性,比如使用ALSA还是不是 GENERIC_AUDIO 等等
另外在这里TARGET_DEVICE 宏也决定了TARGET_DEVICE_DIR, 因为TARGET_DEVICE_DIR 取的是上面提到的BoardConfig.mk 的路径。
TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk)))
当然Android 的Ob目标输出也是由TARGET_DEVICE决定,见build/core/envsetup.mk
TARGET_OUT_ROOT_release := $(OUT_DIR)/target
TARGET_OUT_ROOT_debug := $(DEBUG_OUT_DIR)/target
TARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))
TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/product
PRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)
再回到 build/core/main.mk, 编译系统接着做的一个件事情是,遍历所有字目录,找到所有Android.mk文件,并将这些Android.mk文件include 进来
#
# Typical build; include any Android.mk files we can find.
#
subdir_makefiles :=
$(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git $(subdirs) Android.mk)
include $(subdir_makefiles)
我们再来看其中的
./build/target/board/Android.mk
,对了它引用了
include $(TARGET_DEVICE_DIR)/AndroidBoard.mk
由上面TARGET_DEVICE_DIR的定义,这下又进入了
vendor 下TARGET_DEVICE指向的目录了,这个mk文件中定义了特定Product需要编译和安装app 和 script.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yangzhu1982/archive/2010/09/10/5875416.aspx
分享到:
相关推荐
### Android Makefile与Build System深度解析 #### 一、引言 随着移动互联网技术的快速发展,尤其是近十年间,智能手机已成为人们日常生活中不可或缺的一部分。在众多操作系统中,Google推出的Android系统因其开放...
### Android Makefile详解 在Android开发环境中,Makefile扮演着重要的角色,特别是在构建自定义模块时。本篇文章将深入解析Android.mk文件中的关键概念及用法。 #### 1. 定义路径变量 - **LOCAL_PATH**: 此变量...
nmap-android, 在 Android Makefile/diff/scripts 上使用 Android NDK构建它,Nmap nmapMakefile/diff/scripts 在 Android - 上使用 Android cxf构建它将 android/目录放置到iframe源 root 。转到android目录并说: ...
其中,`Android.mk`文件是Android构建系统的核心部分,它是一个Makefile,用于指导NDK(Native Development Kit)如何处理C/C++代码。本文将深入探讨`Android.mk`文件的写法和关键知识点。 1. **LOCAL_PATH变量的...
Android 编译流程 Makefile 流程详解 Android 编译流程是 Android 系统开发的关键步骤之一,Makefile 是 Android 编译流程的核心组件。本文将详细介绍 Android 编译流程 Makefile 流程,并对其进行详细解释。 一、...
### Android编译流程详解——Makefile流程 #### 一、引言 对于任何软件系统而言,深入了解其构建机制是至关重要的。特别是在复杂的操作系统如Android中,掌握编译流程能够帮助开发者更好地理解系统的内部结构和...
在Android开发过程中,`android_makefile`是构建和编译应用程序或库的关键组成部分。它是一个基于GNU Make的脚本,用于指示系统如何编译源代码并生成可执行文件或库。`makefile`使得开发者能够自动化构建过程,提高...
标题中提到的“Makefile教程”是指关于Makefile的学习资料,而“Makefile快速学习资料”说明本资料是为快速掌握Makefile编写的入门级教程。Makefile是Unix系统中的一个工具程序,主要用于软件开发中的自动化编译。它...
《跟我一起写Makefile》是一本引导读者学习编写Makefile的教程,由陈皓撰写,祝冬华整理。本文将详细解析Makefile的核心概念、作用以及编写规则,帮助你掌握这个强大的自动化构建工具。 首先,我们需要理解Makefile...
什么是 makefile?或许很多 Winodws 的程序员都不知道这个东西,因为那些 Windows 的 IDE 都为你做了这个工作,但我觉得要作一个好的和 professional 的程序员,makefile 还是要懂。
`LOCAL_PATH`变量用于指定当前目录,`$(call my-dir)`用于获取当前Makefile所在的路径。`include $(CLEAR_VARS)`用来清除之前设置的变量,保持构建环境的干净。`LOCAL_PRELINK_MODULE`通常设为`false`,表示不进行预...
压缩包中的`Android.mk`文件是Android Makefile,用于编译和构建Android系统的组件。它定义了如何构建特定模块,包括依赖关系、编译选项等。 综上所述,这些签名文件和Makefile共同构成了Android原生系统签名的核心...
3. **Android.mk文件**:`Android.mk`是Android Makefile系统的文件,用于描述如何编译和链接本地C/C++代码。在FFmpeg移植过程中,我们需要创建一个自定义的`Android.mk`文件,声明FFmpeg源代码的位置、依赖库、编译...
在 Android 中编译环境中,Makefile 文件并不是我们熟悉的 Makefile,而是经过了 Android 自身编译系统的很多处理。编写一个新的 Android.mk 来给 Android 增加一个新的 Component 会比较简单。 Android 中移植 C/...
`Android.mk`文件本质上是一个简化版的GNU Makefile,它由Android构建系统解析并执行。开发者可以通过此文件来描述项目的源代码结构、模块划分等信息。 1. **模块化**: - `Android.mk`文件支持将源代码组织成不同...
`mm`对应于Makefile,`mmm`则是对Android Makefile系统的扩展,适用于整个项目或模块。在打包源码之前,可能需要执行这些命令以确保所有源码都是最新且编译通过的。 标签“源码”强调了对Android操作系统内部工作...
在Android开发中,`makefile`扮演着至关重要的角色,它是构建系统的核心,负责管理项目的编译、链接和打包过程。Android的`makefile`基于GNU Make,遵循特定的语法规则来描述源代码文件之间的依赖关系,以及如何将...
`Android.mk`是Android Makefile,它定义了如何构建应用的源代码,包括编译规则、库依赖等。`CleanSpec.mk`则包含了清理构建产物的规则,确保每次构建都是基于一个干净的工作区进行,这对于持续集成和开发过程中的...
在这个目录下,可以找到libusb源码的相关构建脚本和配置文件,如`android.mk`,它是Android Makefile系统的一部分,用于指示如何编译和链接libusb库,使其适应Android平台。 在深入探讨libusb库时,我们需要了解...
2. 修改和配置 Android Makefile,指定目标 CPU 架构。 3. 使用 NDK 进行交叉编译,生成对应的 .so 文件。 4. 在实际设备或模拟器上进行测试,确保每个架构的库文件都能正常工作。 **5. 安全性和隐私考虑** 在集成 ...