前言:预计未来一致两年内移动互联网将会有很大的发展,必将孕育很多的机会,而
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
的类脚本语言,也可写出如此之架构。设计的思想在于人,而不取决于他所用的工具。
分享到:
相关推荐
### Android Makefile与Build System深度解析 #### 一、引言 随着移动互联网技术的快速发展,尤其是近十年间,智能手机已成为人们日常生活中不可或缺的一部分。在众多操作系统中,Google推出的Android系统因其开放...
其中,`Android.mk`文件是Android构建系统的核心部分,它是一个Makefile,用于指导NDK(Native Development Kit)如何处理C/C++代码。本文将深入探讨`Android.mk`文件的写法和关键知识点。 1. **LOCAL_PATH变量的...
4. **AOSP构建系统**:在Android开源项目(AOSP)中,构建系统基于makefile,使用称为mm(module makefile)的脚本来编译单个模块。虽然与Gradle不同,但两者有交互,AOSP的`build/make`目录包含了整个系统的构建...
* BUILD_TINY_ANDROID:是一个 makefile 变量,用于生成一个简单的 image,以测试硬件的可用度。 五、Makefile 的使用方法 Makefile 的使用方法有多种,例如: * 使用 droid goal,编译整个 Android 系统,包括 ...
### Android编译流程详解——Makefile流程 #### 一、引言 对于任何软件系统而言,深入了解其构建机制是至关重要的。特别是在复杂的操作系统如Android中,掌握编译流程能够帮助开发者更好地理解系统的内部结构和...
### Android Makefile详解 在Android开发环境中,Makefile扮演着重要的角色,特别是在构建自定义模块时。本篇文章将深入解析Android.mk文件中的关键概念及用法。 #### 1. 定义路径变量 - **LOCAL_PATH**: 此变量...
本篇内容将详细介绍Makefile文件的分析和编写,包括Makefile的基本规则、变量使用、规则的书写、命令的书写、条件判断、函数使用、Makefile的运行方式、隐含规则以及更新函数库文件的有关知识。 首先,Makefile文件...
nmap-android, 在 Android Makefile/diff/scripts 上使用 Android NDK构建它,Nmap nmapMakefile/diff/scripts 在 Android - 上使用 Android cxf构建它将 android/目录放置到iframe源 root 。转到android目录并说: ...
非常清晰简单的make and makefile入门ppt教程,而且是原创,ppt模版也非常简约大方漂亮,如果有人正想入门学习make and makefile,这将会是一个很好的资源,它提纲挈领,又不乏范例。
GNU配置与构建系统是一个广泛使用于开源项目中的构建系统,它提供了一种简便的方式来配置、编译和安装软件包。该系统主要由几个组件构成,包括autoconf、automake、libtool和make工具。autoconf用来生成配置脚本,...
### Android build.prop生成过程源码分析 #### 一、概览 `build.prop`是Android系统中的一个关键配置文件,它记录了系统构建时的重要属性信息,如屏幕密度(LCD density)、默认语言设置、编译时间等。这些信息对于...
标题中提到的“Makefile教程”是指关于Makefile的学习资料,而“Makefile快速学习资料”说明本资料是为快速掌握Makefile编写的入门级教程。Makefile是Unix系统中的一个工具程序,主要用于软件开发中的自动化编译。它...
本文将深入探讨如何编写一个通用的Makefile,包括顶层目录下的Makefile、子目录下的Makefile以及Makefile.build的用法。 1. **顶层Makefile**: 顶层Makefile通常负责整体项目的构建流程,它会调用子目录中的...
8. **编译构建系统**:Android使用Build System,如`build`目录下的Makefile和Gradle脚本,来编译和打包整个系统。理解这个构建过程对于定制系统或者开发自定义模块至关重要。 9. **安全与权限管理**:Android的...
规则是Makefile的基础,它们描述了目标文件与依赖文件之间的关系以及如何更新目标。规则通常由目标、依赖项和命令三部分组成。例如,`program: program.o util.o`表示`program`依赖于`program.o`和`util.o`,后面...
Android的构建系统基于Makefile系统,尤其是使用了GNU Make工具,使得开发者能够高效地管理和构建项目。 在Android构建过程中,`mm`是一个非常重要的宏命令,通常在`envsetup.sh`脚本中定义。`mm`的作用是在当前...
`phell`是一个专门用于分析Makefile变量的工具,对于理解和调试复杂的Makefile项目非常有帮助。 `phell`的主要功能在于帮助开发者可视化Makefile中的变量及其关系。通过这个工具,我们可以更清晰地看到Makefile中...
此外,Android的编译系统(Build System)也是一个重要的研究领域,它由Makefile和Gradle构建脚本组成,负责整个系统的编译、打包和签名过程。掌握这部分知识可以帮助开发者高效地构建和调试系统。 在学习过程中,...
### openSBI的Makefile文件分析 #### 一、概述 `openSBI`作为一款开源的Supervisor Binary Interface (SBI)实现,主要用于RISC-V架构下的引导加载程序及运行时服务支持。其Makefile文件是整个项目构建流程的核心...