如果android的source在android21文件夹(即Makefile文件的目录)下,先执行cd android21,
然后可以执行下面的命令;
1、make Settings 生成Settings.apk的文件
2、 make snod 等同于make droid
该命令生成一个新的系统映像system.img,速度比make快很多,但不稳定(有的时候不好用)
将这个系统映像拷贝至sdk下
cp out/target/product/generic/system.img \
out/host/linux-x86/sdk/android-sdk_eng.justin_linux-x86/tools/lib/images/
删除程序遗留的数据:
out/host/linux-x86/sdk/android-sdk_eng.justin_linux-x86/tools/emulator -wipe-data
3、make 映像编译成功后会在目录
~/android/src/out/target/product/generic
下产生一些image文件
ramdisk.img system.img userdata.img
4、make sdk 注意:如果需要build SDK,需要安装sun-java5-jdk, 而不是sun-java6-jdk
sdk编译成功后会在~/android/src /o ut/host/linux-x86/sdk/ 生成sdk的文件目录和压缩包:
android-sdk_eng.justin_linux-x86
android-sdk_eng.justin_linux-x86.zip
并在~/android/src /out/target/product/generic(generic是默认的产品名)下打包所有的映像文件:
generic-img-eng.justin.zip
最近编译了一下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: droidcoredroidcore: 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打包而成的。所以,你可以去研究这个包里的每个文件是怎么编出来的。有了上面的例子,应该不难。
分享到:
相关推荐
编译Android源码时,make命令可能会报错,提示您使用了错误的Java版本。解决方法是下载Java SE 1.6的Development Kit,安装并配置环境变量。 首先,下载Java SE 1.6 Update 45的安装包,移到/usr/lib/java目录下,...
在Android系统中,终端命令是一种强大的工具,它允许用户通过文本界面执行各种操作,而无需图形用户界面。这种技术尤其适用于开发者、高级用户或者在没有GUI环境下的设备上。本篇将详细介绍Android终端中的一些常见...
android make 介绍 Make 文件说明 整个 Build 系统的入口文件是源码树根目录下名称为“Makefile”的文件,当在源代码根目录上调用 make 命令 时,make 命令首先将读取该文件。 Makefile 文件的内容只有一行:...
在Android系统开发中,构建system.img文件是一项核心任务,它是Android系统的核心组成部分,包含了操作系统、应用程序框架以及预装应用等关键元素。本教程将详细讲解如何在Linux环境下,利用`make_ext4fs`工具为...
### Android源码编译make的错误处理 #### 一、概览 在进行Android源码编译的过程中,可能会遇到各种各样的错误。本文主要针对在Linux环境下编译Android 4.0.1版本源码时遇到的一些典型问题,提供详细的解决方案。 ...
`make_ext4fs`是Android系统中用于创建ext4文件系统映像的命令行工具,它能够将指定的目录结构转换为一个可引导的ext4文件系统镜像。这个工具在Linux环境中广泛使用,但为了满足Windows用户的需求,也有其Windows...
这个命令通常是在Android源码编译过程中的一部分,用于自动构建system.img文件。 #### 四、总结 综上所述,在不同的Android版本或系统配置下,生成system.img的方法有所不同。对于早期版本,可以使用`mkyaffs2...
以下是 Linux 中的一些常用命令: 1. 启动、关机、登录、登出相关命令:<login> 登录、<logout> 登出、<exit> 登出、<shutdown> 停止系统、<halt> 停止系统、<reboot> 重启动、<poweroff> 切断电源、<sync> 把内存...
在 Android 源代码工程中,单独编译某个模块是一件很有必要的事情。尤其是在我们修改了某个模块或新增了自己的模块时,重新编译整个 Android 系统镜像 system.img 是非常耗时的。这时,我们可以使用 Android 提供的...
在Android项目中,make命令用于根据Makefile文件中定义的规则来编译项目。Makefile是一个文本文件,它定义了哪些文件需要被编译、依赖关系以及如何编译它们。 通常,在Android项目中使用make命令有以下步骤: 1. ...
5. 运行编译命令:执行`./configure`和`make`命令,编译源代码生成二进制文件。 6. 安装到设备:将编译好的`wget-binary`复制到Android设备的适当位置,通常是 `/data/local/bin` 或者 `/system/bin` 目录下,然后...
11. **显示命令**:如果 `MAKECMDGOALS` 只包含 `showcommands` 或 `checkbuild`,则设置默认目标,以便在构建过程中显示所有的命令。 12. **模块编译**:如果 `MAKECMDGOALS` 不包含特定的清理目标,`main.mk` 将...
在Android系统中,对设备进行刷机或者系统更新时,经常需要处理ext4文件系统。本文将深入探讨如何使用`ext4-utils`工具集来创建`make_ext4fs`和`simg2img`这两个关键工具,这对于理解Android系统底层工作原理以及...
这通常涉及使用AOSP(Android Open Source Project)的源码树,并运行“source build/envsetup.sh”和“make”命令来构建。 - Android SDK:开发者需要安装Android SDK来编译和测试Android应用。SDK包含了工具、平台...
除了`reboot`和`mount`,Android shell中还有许多其他命令,如`ls`、`cd`、`pwd`、`cp`、`mv`、`rm`等基本文件管理命令,以及`ifconfig`、`netstat`等网络相关命令,它们共同构成了Android系统维护和调试的基础工具...
在这个场景中,我们关注的是`make3.8.1`的修正版,这是一个用于自动化编译过程的构建工具。在Cygwin环境下,`make`是构建项目的关键部分,它读取名为`Makefile`的文件,根据其中的规则执行编译、链接等任务。 标题...
在本教程中,我们将使用Git软件库下载Qt for Android的源代码,并编译和安装它。然后,我们将使用Qt Creator开发和测试Android应用程序。 Android NDK的安装 在开始开发Qt for Android应用程序之前,需要先安装...
接下来,描述中的`make_android_src.py`脚本可能是用于自动化打包源码的工具。在Android开发中,Python常被用于构建自动化任务,如构建脚本、测试框架等。这个脚本可能执行以下操作: 1. 获取源码:通过调用Git或...
通过以上内容,我们可以看到在Android系统中使用超级终端时,`free`命令可以有效地监控内存使用情况;BusyBox则提供了一个强大的工具集合,能够满足基本的命令需求;而`reboot`命令则是系统管理员重启设备的重要手段...