`

编译android源码的make命令解析

 
阅读更多

摘要:

 

本文描述了编译android源码时,make命令后面隐藏的玄机,通过一步步的分析,你会发现,实际上不是想象的那么复杂(肯定比编hello world复杂,哈)。

 

正文:

 

最近编译了一下android 1.6,同时也分析了一下android的build system。build system对我来说实在太大,要想了解这个系统的细节不是一两天可以完成的,于是我就退而求其次,去了解编译android源码的命令make。还是那句话,一切都是从编译开始的。

 

1. make命令执行后,编译的入口在哪里?

 

虽然我的最终目的是研究android源码之间的关系,但是,当我编完android源码后,这是我想到的第一个问题。根据makefile的规则,make若不加参数会默认执行目录下的makefile文件,而这里的makefile文件include了main.mk文件。同时,makefile会执行main.mk中的第一条规则。根据这个原则,你会发现main.mk中的第一条规则在main.mk的第45行,但是它什么也不做,目的只是占个位置。

 

# This is the default target.  It must be the first declared target.

DEFAULT_GOAL := droid

$(DEFAULT_GOAL):

真正的定义在第681行,这里的定义覆盖了上面的定义。往下走一步是droidcore规则,它的定义为:

 

.PHONY: droidcore

droidcore: files /

    systemimage /

    $(INSTALLED_BOOTIMAGE_TARGET) /

    $(INSTALLED_RECOVERYIMAGE_TARGET) /

    $(INSTALLED_USERDATAIMAGE_TARGET) /

    $(INTERNAL_DEFAULT_DOCS_TARGETS) /

    $(INSTALLED_FILES_FILE)

这个规则显然是我们想要的,但问题是其中的变量值是多少呢?要解决这个问题也很容易。make在解析makefile文件时,大致流程如下:首先会解析makefile文件,这一步主要是进行规则的展开工作,根据make后面的参数来解析出规则实际要执行的动作(action)。解析完整个文件后,就开始执行指定的规则后面的动作了,此时,就只剩下一个动作列表,挨个执行就可以了。根据这个原则,加上droidcore规则位于文件的末尾,所以我们可以在文件的最后输出这些参数。这里我们要用到makefile的函数info和error,info的作用是在第一遍解析时,输出信息,然后继续解析,error则是输出信息后退出,具体可以参考make的文档。比如,这里我们要查看上面几个变量的值,可以在main.mk的最后添加如下语句。最后一句用来标识main.mk已经解析完。

 

   1: $(info INSTALLED_BOOTIMAGE_TARGET = $(INSTALLED_BOOTIMAGE_TARGET))

   2: $(info INSTALLED_RECOVERYIMAGE_TARGET = $(INSTALLED_RECOVERYIMAGE_TARGET))

   3: $(info INSTALLED_USERDATAIMAGE_TARGET = $(INSTALLED_USERDATAIMAGE_TARGET))

   4: $(info INTERNAL_DEFAULT_DOCS_TARGETS = $(INTERNAL_DEFAULT_DOCS_TARGETS))

   5: $(info INSTALLED_FILES_FILE = $(INSTALLED_FILES_FILE))

   6: $(error >>>>>>> end of the main.mk)

上面几个变量的值实际上是相对于android源码的相对目标文件路径,比如INSTALLED_BOOTIMAGE_TARGET为out/target/product/generic/ramdisk.img。这里我们很容易猜到systemimage的值(out/target/product/generic/system.img)是什么了。

 

到这里,我们可以认为,像out/target/product/generic/ramdisk.img的值,实际上就是一条makefile确定的规则,无论这条规则是怎么来的,使用make out/target/product/generic/ramdisk.img是可以编译ramdisk.img文件的,在后面我们可以看到,知道这一点很重要,android的build system就是靠这一点工作的,我认为是核心。

 

2. droidcore规则完全展开后是什么样子的?

 

有了上面的工作,这个问题就变的容易许多。我本来的目的是想要研究android源代码之间的依赖关系,而这个依赖关系通过makefile中获取,是最直观和可靠的。要想获得droidcore的所有动作列表也不难,make命令有个参数-n,它的目的是“只输出规则下的动作(编译命令)语句,而不执行规则”。比如,要想获得droidcore的所有动作序列,可以使用如下命令:(输出结果太长了,可以将它输出到文件) 

make -n

我将这个命令的结果输出到文件,由于等的时间太长,就放弃了,估计起码有几十兆,几万行命令。

 

也可以用如下命令来获取编译ramdisk.img所需要的命令序列:

 

make -n out/target/product/generic/ramdisk.img

编译ramdisk.img命令大概有5600行。还是有点大,那该如何?这个输出的最后一行你会发现,ramdisk.img是通过将目录out/target/product/generic/root打包而成的。所以,你可以去研究这个包里的每个文件是怎么编出来的。有了上面的例子,应该不难。

 

后面该怎么样进行下去,我还没想好,先研究ramdisk.img下每个文件是怎么来的再说。

分享到:
评论

相关推荐

    如何单独编译Android源代码中的模块

    在 Android 源代码工程中,单独编译某个模块是一件很有必要的事情。尤其是在我们修改了某个模块或新增了自己的模块时,重新编译整个 Android 系统镜像 system.img 是非常耗时的。这时,我们可以使用 Android 提供的...

    编译Android源码全过程

    ### 编译Android源码全过程详解 #### 一、获取Android源代码 在开始编译Android源码之前,首先需要确保获取完整的Android源代码。这一部分将详细介绍如何使用Git和Repo脚本完成这一任务。 ##### Git简介 Git是一...

    Ubuntu_10.04下编译Android源码全过程

    ### Ubuntu 10.04下编译Android源码全过程详解 #### 一、获取Android源代码 在Ubuntu 10.04环境下编译Android源码的第一步是从官方仓库获取完整的源代码。这一过程主要依赖于Git,一种由Linux之父Linus Torvalds...

    Android源码编译

    在编译Android源码之前,需要安装一些必要的软件环境。这些软件环境包括: * build-essential:提供了基本的编译工具链,例如gcc、g++等。 * make:一个自动化构建工具,可以根据Makefile文件自动编译代码。 * gcc...

    android P android9源码编译.ipr.iml文件

    需要注意的是,编译Android源码可能需要大量的计算资源,包括内存和磁盘空间。此外,由于源码的复杂性,可能需要解决依赖问题、编译错误或配置问题。熟悉Android的构建系统,如`build.gradle`文件和`Android.mk`文件...

    Android源码的编译

    这些命令将安装一系列用于编译Android源码的基础工具和库文件,例如`build-essential`包含了构建程序所需要的最基本的工具集,`make`用于管理构建过程,`gcc`和`g++`则是C和C++的编译器等。 ##### 1.2 安装Java环境...

    android 源码的下载,及其编译步骤

    - 在Linux环境下,通过`sudo apt-get install`命令安装一系列软件包,包括git、g++、make等,这些都是编译Android源码所必需的。 - 特别指出的是,对于某些特定命令或工具,如javadoc,需要安装Sun JDK 1.5以确保...

    Android编译过程详解

    Android 编译过程详解 Android 编译过程是 Android 开源项目中的一部分,了解 Android 编译过程对于理解 Android 系统的工作机理和对其进行定制至关重要。 Android 的编译过程可以分为三个阶段:环境变量设置、平台...

    Android 源码编译的jar包

    本文将详细阐述如何编译Android源码以生成`classes.jar`,以及这个过程中的关键知识点。 首先,让我们了解`classes.jar`的作用。它包含了Android系统的Java类库,包含了Android Framework的核心API,开发者可以从中...

    安卓Android源码——Android Launcher 源码修改可编译.zip

    3. **编译Android源码**:要编译Android源码,开发者需要搭建AOSP(Android Open Source Project)环境,安装必要的工具如Repo、JDK、NDK等,并执行make命令来构建系统。 4. **源码修改**:修改Android源码可能包括...

    Ubuntu 8.04下编译Android源码全过程.doc

    ### Ubuntu 8.04下编译Android源码全过程知识点详解 #### 一、获取Android源代码 在本文档中,介绍了如何在Ubuntu 8.04系统环境下获取Android源代码的过程。此过程主要涉及到了Git版本控制系统的使用以及Repo脚本...

    Android 系统 8.1源码

    要编译Android系统的源码,首先需要准备一个合适的开发环境。通常推荐使用64位Linux发行版,如Ubuntu或Fedora等。以下是一些关键步骤: 1. **安装必要的软件包**:确保已安装Git、make、gcc等工具。 2. **配置环境...

    Ubuntu10.04下编译Android源码全过程.pdf

    ### Ubuntu 10.04 下编译 Android 源码全过程详解 #### 一、获取 Android 源代码 **Git与集中式版本控制系统对比** - **Git**:由 Linux Torvalds 开发,是一种分布式版本控制系统。与 Subversion 和 CVS 这样的...

    Ubuntu 64 位编译Android源码出错解决办法

    通过上述步骤,大多数在Ubuntu 64位环境下编译Android源码时遇到的常见错误均可得到妥善解决。然而,鉴于Android源码的复杂性,实际编译过程中可能还会遇到其他类型的错误或警告,开发者应持续关注编译日志,灵活...

    Ubuntu 10.04下编译Android源码全过程

    这些工具对于编译Android源码至关重要,因为它们提供了编译过程中需要的解析器、词法分析器等功能。 一旦所有依赖都已安装,可以在Android源码目录下执行`make`命令开始编译。编译可能需要相当长的时间,具体取决于...

    android源码编译环境搭建方法说明

    **知识点详解:Android源码编译环境搭建方法** 在深入探讨如何搭建Android源码编译环境之前,我们首先需要理解为什么会有这样的需求。对于开发者而言,掌握如何从源码级别构建Android系统,不仅可以帮助他们更好地...

    Android4.0源码编译

    ### Android 4.0 源码编译详解 #### 一、编译环境搭建 在开始Android 4.0的源码编译之前,首先需要准备一个合适的编译环境。根据描述,本文档主要介绍如何在Ubuntu 10.04 LTS下进行Android 4.0源码的编译。 #####...

    android源码的编译.pdf

    编译Android源码之前,需安装一系列基础编译工具和库文件,具体命令如下: ```sh sudo apt-get install build-essential sudo apt-get install make sudo apt-get install gcc sudo apt-get install g++ sudo apt-...

    (修正的)Ubuntu_10.04下编译Android源码全过程.doc

    - 在所有依赖安装完成后,进入到 Android 源码目录,尝试使用 `make` 命令进行编译。需要注意的是,编译过程可能非常耗时,尤其是在较旧的系统或者低性能硬件上。 - 如果在编译过程中遇到其他错误,可以根据错误...

Global site tag (gtag.js) - Google Analytics