Android Makefile and build system 分析 收藏
前言之前言:之前此文发表在eoeandroid,但没有贴图。然后被一些网站转载,也没有贴图,给阅读本文带来一些不便。在此附上贴图,转载请注明来自csdn 博客。作者邮箱:hongjie.career@gmail.com
前言:预计未来一致两年内移动互联网将会有很大的发展,必将孕育很多的机会,而Google 推出的Android 手机操作系统无疑将是移动互联网中的明星。由于其是开源系统,很有必要对此进行深入研究。
工欲善其事,必先利其器。Makefile无疑是打开系统架构的一扇窗户。但因Android的Makefile (build system)文件众多,架构复杂,分析起来较为困难。本文梳理了build system的大致脉络,希望对build system感兴趣的同学们有所帮助。
1. Android Makefile & build system 概述
Makefile文件用来告诉make命令需要怎么样的去编译和链接程序。在编译时,需要根据编译环境和编译目标选择编译工具,编译参数,以及选择编译安装哪些模块。同时Makefile 指定了构建目标所需的依赖性以及生成规则。 在Android中,主要的Makefile文件存在于build/core/目录下,它的表现形式为多个后缀为mk的文件组成,也称为build system。Android build system 主要有两大部分构成:配置部分,目标构建部分。Build system的主流程文件为build/core/main.mk文件。
Android build system在设计中考虑了如下方面,具有良好的扩展性。
a) 增添子模块编译
b) 多CPU架构 – ARM/PPC(maybe)/X86(maybe)
c) 多语言编译 – C/C++/Java
d) 多目标 – static lib/share lib/execute/Java/Java library
e) 多发布版本
本文也将就围绕这些特性做进一步分析。
2. Build system 配置部分
配置部分主要完成以下几个工作:
a) 基于Android 产品的配置(product config):选择构建安装的运行程序 (user package)
b) 设置target 等相关变量TARGET_ARCH, TARGET_OS, TARGET_BUILD_TYPE, TARGET_PREBUILT_TAG
c) 根据编译环境设置host等相关变量 HOST_OS, HOST_ARCH, HOST_BUILD_TYPE, HOST_PREBUILT_TAG
d) 编译target上运行程序所需的工具链及编译参数设置,如linux-arm-cc,cflag,include目录等。
e) 编译host上运行程序所需的工具链及编译参数设置。
下图简要介绍了Android build system的配置部分的主要构成及相互关系。
多发布版本的支持
Android 会被不同的厂商所采用,他们内置的packages(应用程序)相应也会有差别。AndroidProducts.mk文件即为Android build system提供给厂商的接口文件。通过此文件即可定义所需编译和安装的packages(也即应用程序)。缺省选项是generic。为了更容易的扩展,Android定义了基本package(core.mk)和通用package(generic.mk),通用package包含基本package。同时Android还实现了一个继承函数(inherit-product)。通过继承通用package,可以很容易的配置所需编译和安装的package。
多CPU架构的扩展
Config.mk文件中会设置combo_target为不同的变量,然后include select.mk文件。在select.mk文件中,会根据OS和CPU架构选择相应的mk文件,在这些相应的mk文件中,又定义了编译目标程序所需的工具链及编译参数。目前从combo目录下看,target上不支持PPC架构。但如果要想支持PPC架构的话,只需在combo目录下创建PPC的mk文件,在其中定义工具链和参数即可。
3. build system 目标构建部分
目标构建部分的主要工作就是选择所需构建的目标,确定它们所需依赖的目标,然后根据规则来构建最终的目标。说起来简单,可是在实际中就需要考虑很多问题了。
a) 作为一个设计优秀的Framework,如何方便的添加子模块?
b) 在Android系统中,有多种编程语言的存在,它们的编译工具各不相同。即使同一种语言,如C语言,也存在host 和target的差别,编译器也不同。如何选择不同的工具进行模块的构建?
c) 在Android系统中,存在不同种类的构建目标:有可执行文件,static library, dynamic library,java library,java。如何构建这些不同的目标?
下图简要介绍了Android build system的构建部分的主要构成及相互关系
在main.mk中,非常关键的一个步骤就是找到TOP目录下所有Android.mk文件,并include 它们。在Include的过程中,就会确定子模块的构建目标,类型,和规则。
Android.mk就是build system提供给子模块的借口文件。Android.mk有下面几个关键词:
LOCAL_SRC_FILES – 指定模块的源文件
LOCAL_MODULE – 指定所需构建的目标名
include 构建类型对应的文件 – 例如想构建在target上运行的可执行文件,那就执行语句include $(BUILD_EXECUTABLE)。通过此语句可有如下结果:a) 指定构建目标的类型 b)确定构建此类型所需的工具及参数。
通过定义自己的Android.mk文件,再修改上述等变量,即可轻松的把自身模块放入至build system中。
Main.mk 文件471行: include $(subdir_makefiles)
subdir_makefiles为TOP目录下所有Android.mk文件的集合。语句虽短,可确是整个build system中最为重要的一条语句。无论有多少子模块,无论构建模块的目标类型,无论它是什么语言所写,就这一条语句,完成了这些纷繁复杂的工作。
是否似曾相识?Android.mk 就类似于build system提供的基类,LOCAL_MODULE,LOCAL_SRC_FILES,include构建类型文件等类似于基类提供的虚函数。通过继承基类(Android.mk),重写虚函数(重新定义LOCAL_等变量),遍历子类集合调用虚函数(include $(subdir_makefiles)),完美的解决了本节开头的问题。为Android build system提供了良好的可扩展性。
后记:
设计模式,架构并不仅存于OO的语言中(Java/C++)。即便如Makefile的类脚本语言,也可写出如此之架构。设计的思想在于人,而不取决于他所用的工具。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yangzhu1982/archive/2010/09/05/5865029.aspx
分享到:
相关推荐
### Android Makefile与Build System深度解析 #### 一、引言 随着移动互联网技术的快速发展,尤其是近十年间,智能手机已成为人们日常生活中不可或缺的一部分。在众多操作系统中,Google推出的Android系统因其开放...
4. **AOSP构建系统**:在Android开源项目(AOSP)中,构建系统基于makefile,使用称为mm(module makefile)的脚本来编译单个模块。虽然与Gradle不同,但两者有交互,AOSP的`build/make`目录包含了整个系统的构建...
- `platform`: 适用于使用`android.uid.system`的APK。 - `shared`: 适用于使用`android.uid.shared`的APK。 - `media`: 适用于使用`android.media`的APK。 ```make LOCAL_CERTIFICATE := platform ``` #### ...
Android的构建系统基于Makefile系统,尤其是使用了GNU Make工具,使得开发者能够高效地管理和构建项目。 在Android构建过程中,`mm`是一个非常重要的宏命令,通常在`envsetup.sh`脚本中定义。`mm`的作用是在当前...
- 在194行中,Makefile进一步将`$(TARGET_DEVICE_DIR)/system.prop`文件的内容追加到`build.prop`中。 - `system.prop`文件通常包含了一些特定于目标设备的属性,如屏幕分辨率、硬件特性等。 3. **收集和添加额外...
整个 Build 系统的入口文件是源码树根目录下名称为“Makefile”的文件,当在源代码根目录上调用 make 命令 时,make 命令首先将读取该文件。 Makefile 文件的内容只有一行:“include build/core/main.mk”。该行...
本示例"Android 使用ndk-build和cmake构建JNI程序 demo"将向你展示如何在Android项目中集成原生代码。Android NDK(Native Development Kit)提供了一种方式,让开发者可以使用这些本地语言编写应用的一部分,然后在...
本文将深入探讨“Android源码编译参考文档”中的关键知识点,包括高通编译参考和Android Build System。 首先,我们关注的是“高通编译参考文档”。高通是Android设备中广泛使用的芯片制造商,其编译过程涉及到特定...
Android.mk 文件是一个微型的 GNU Makefile 片段,由 build system 解析一次或者多次。该文件用于描述 build system 的配置,定义了编译过程中的变量和依赖关系。 Android.mk 文件的基本语法结构如下: 1. LOCAL_...
NDK MakeFile是Android开发中的一个重要概念,它涉及到Android Native Development Kit(NDK)的构建系统。NDK允许开发者在Android应用中使用C或C++编写原生代码,以提高性能或利用现有的C/C++库。这个压缩包...
Android.mk是Android的旧版构建系统,名为“Build System for Android”(BSA)或“legacy build system”的一部分。它基于Makefile,用于描述如何构建特定的Android模块。在Android 10之前,它是主要的构建方式。通过...
6. **Build System(构建系统)**:如Build.gradle和Makefile,用于编译和打包整个Android系统,开发者可以定制自己的ROM。 接下来,我们重点关注几个关键的模块: **Dalvik和ART**:两者都是Android的运行时环境...
本教程将详细介绍如何使用NDK-Build的方式在Android项目中调用C/C++代码。 首先,理解NDK-Build。NDK是Android Native Development Kit的缩写,它是一组工具,开发者可以使用这些工具编写和编译原生代码,然后将其...
这个过程中,Makefile从build/core/main.mk获取指令,并且设置了特定的构建变量,如TARGET_ARCH和TARGET_PRODUCT,以适应x86架构和特定的产品配置。 在Android系统移植到真实设备的过程中,ramdisk.img、system.img...
#### 一、Android Makefile & Build System 概述 Android的构建系统是一个复杂而强大的框架,旨在支持各种设备和配置的需求。该系统主要由多个`.mk`文件组成,位于`build/core/`目录下。整个构建系统被划分为两个...
例如,对于Android平台的目标编译,可以使用`BUILD_EXECUTABLE`、`BUILD_SHARED_LIBRARY`和`BUILD_STATIC_LIBRARY`等宏;而对于主机编译,则可以使用`BUILD_HOST_EXECUTABLE`、`BUILD_HOST_SHARED_LIBRARY`和`BUILD_...
将编译签名后的APK复制到Android源码的`system/app`或`system/priv-app`目录下,具体取决于你的应用是否需要系统级别的权限。如果你的应用只是普通用户应用,放在`system/app`即可;如果是需要特殊权限的,应放入`...
14. system:Android 的底层的一些库,提供了 Android 底层的支持。 bionic 目录展开一个级别的目录: * bionic/Android.mk:提供了 bionic 的 Makefile 文件。 * libc:提供了 C 语言标准库的实现。 * libdl:...