`

android Makefile

 
阅读更多

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 and build system 分析

    ### Android Makefile与Build System深度解析 #### 一、引言 随着移动互联网技术的快速发展,尤其是近十年间,智能手机已成为人们日常生活中不可或缺的一部分。在众多操作系统中,Google推出的Android系统因其开放...

    Android Makefile_讲解.doc

    ### Android Makefile详解 在Android开发环境中,Makefile扮演着重要的角色,特别是在构建自定义模块时。本篇文章将深入解析Android.mk文件中的关键概念及用法。 #### 1. 定义路径变量 - **LOCAL_PATH**: 此变量...

    nmap-android, 在 Android Makefile/diff/scripts 上使用 Android NDK构建它,Nmap.zip

    nmap-android, 在 Android Makefile/diff/scripts 上使用 Android NDK构建它,Nmap nmapMakefile/diff/scripts 在 Android - 上使用 Android cxf构建它将 android/目录放置到iframe源 root 。转到android目录并说: ...

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

    其中,`Android.mk`文件是Android构建系统的核心部分,它是一个Makefile,用于指导NDK(Native Development Kit)如何处理C/C++代码。本文将深入探讨`Android.mk`文件的写法和关键知识点。 1. **LOCAL_PATH变量的...

    Android编译流程makefile流程[参考].pdf

    Android 编译流程 Makefile 流程详解 Android 编译流程是 Android 系统开发的关键步骤之一,Makefile 是 Android 编译流程的核心组件。本文将详细介绍 Android 编译流程 Makefile 流程,并对其进行详细解释。 一、...

    Android编译流程_makefile流程

    ### Android编译流程详解——Makefile流程 #### 一、引言 对于任何软件系统而言,深入了解其构建机制是至关重要的。特别是在复杂的操作系统如Android中,掌握编译流程能够帮助开发者更好地理解系统的内部结构和...

    android_makefile

    在Android开发过程中,`android_makefile`是构建和编译应用程序或库的关键组成部分。它是一个基于GNU Make的脚本,用于指示系统如何编译源代码并生成可执行文件或库。`makefile`使得开发者能够自动化构建过程,提高...

    Makefile教程,Makefile快速学习资料

    标题中提到的“Makefile教程”是指关于Makefile的学习资料,而“Makefile快速学习资料”说明本资料是为快速掌握Makefile编写的入门级教程。Makefile是Unix系统中的一个工具程序,主要用于软件开发中的自动化编译。它...

    跟我一起写Makefile

    《跟我一起写Makefile》是一本引导读者学习编写Makefile的教程,由陈皓撰写,祝冬华整理。本文将详细解析Makefile的核心概念、作用以及编写规则,帮助你掌握这个强大的自动化构建工具。 首先,我们需要理解Makefile...

    跟我一起写Makefile.pdf

    什么是 makefile?或许很多 Winodws 的程序员都不知道这个东西,因为那些 Windows 的 IDE 都为你做了这个工作,但我觉得要作一个好的和 professional 的程序员,makefile 还是要懂。

    android的MK文件编写规范

    `LOCAL_PATH`变量用于指定当前目录,`$(call my-dir)`用于获取当前Makefile所在的路径。`include $(CLEAR_VARS)`用来清除之前设置的变量,保持构建环境的干净。`LOCAL_PRELINK_MODULE`通常设为`false`,表示不进行预...

    android原生系统签名文件

    压缩包中的`Android.mk`文件是Android Makefile,用于编译和构建Android系统的组件。它定义了如何构建特定模块,包括依赖关系、编译选项等。 综上所述,这些签名文件和Makefile共同构成了Android原生系统签名的核心...

    ffmpeg移植android需要的android.mk

    3. **Android.mk文件**:`Android.mk`是Android Makefile系统的文件,用于描述如何编译和链接本地C/C++代码。在FFmpeg移植过程中,我们需要创建一个自定义的`Android.mk`文件,声明FFmpeg源代码的位置、依赖库、编译...

    android中移植 c c++程序

    在 Android 中编译环境中,Makefile 文件并不是我们熟悉的 Makefile,而是经过了 Android 自身编译系统的很多处理。编写一个新的 Android.mk 来给 Android 增加一个新的 Component 会比较简单。 Android 中移植 C/...

    Android_makefile编译系统_Android.mk_文件语法规范

    `Android.mk`文件本质上是一个简化版的GNU Makefile,它由Android构建系统解析并执行。开发者可以通过此文件来描述项目的源代码结构、模块划分等信息。 1. **模块化**: - `Android.mk`文件支持将源代码组织成不同...

    Android 源码打包 sources.zip

    `mm`对应于Makefile,`mmm`则是对Android Makefile系统的扩展,适用于整个项目或模块。在打包源码之前,可能需要执行这些命令以确保所有源码都是最新且编译通过的。 标签“源码”强调了对Android操作系统内部工作...

    Android_makefile.

    在Android开发中,`makefile`扮演着至关重要的角色,它是构建系统的核心,负责管理项目的编译、链接和打包过程。Android的`makefile`基于GNU Make,遵循特定的语法规则来描述源代码文件之间的依赖关系,以及如何将...

    Android settings源码

    `Android.mk`是Android Makefile,它定义了如何构建应用的源代码,包括编译规则、库依赖等。`CleanSpec.mk`则包含了清理构建产物的规则,确保每次构建都是基于一个干净的工作区进行,这对于持续集成和开发过程中的...

    libusb 源码(可在external中编译,含android.mk)

    在这个目录下,可以找到libusb源码的相关构建脚本和配置文件,如`android.mk`,它是Android Makefile系统的一部分,用于指示如何编译和链接libusb库,使其适应Android平台。 在深入探讨libusb库时,我们需要了解...

    android mupdf

    2. 修改和配置 Android Makefile,指定目标 CPU 架构。 3. 使用 NDK 进行交叉编译,生成对应的 .so 文件。 4. 在实际设备或模拟器上进行测试,确保每个架构的库文件都能正常工作。 **5. 安全性和隐私考虑** 在集成 ...

Global site tag (gtag.js) - Google Analytics