android中make命令

如果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_TARGETout/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打包而成的。所以,你可以去研究这个包里的每个文件是怎么编出来的。有了上面的例子,应该不难。

转载于:https://www.cnblogs.com/MMLoveMeMM/articles/3673960.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
android make 介绍 Make 文件说明 整个 Build 系统的入口文件是源码树根目录下名称为“Makefile”的文件,当在源代码根目录上调用 make 命令 时,make 命令首先将读取该文件。 Makefile 文件的内容只有一行:“include build/core/main.mk”。该行代码的作用很明显:包含 build/core/main.mk 文 件。在 main.mk 文件又会包含其他的文件,其他文件又会包含更多的文件,这样就引入了整个 Build 系统。 这些 Make 文件间的包含关系是相当复杂的,图 3 描述了这种关系,该图黄色标记的文件(且除了 $开头的文件) 都位于 build/core/ 目录下。 Android 源码包含了许多的模块,模块的类型有很多种,例如:Java 库,C/C++ 库,APK 应用,以及可执行文件 等 。并且,Java 或者 C/C++ 库还可以分为静态的或者动态的,库或可执行文件既可能是针对设备(本文的“设备”指 的是 Android 系统将被安装的设备,例如某个型号的手机或平板)的也可能是针对主机(本文的“主机”指的是开发 Android 系统的机器,例如装有 Ubuntu 操作系统的 PC 机或装有 MacOS 的 iMac 或 Macbook)的。不同类型的模块 的编译步骤和方法是不一样,为了能够一致且方便的执行各种类型模块的编译,在 config.mk 定义了许多的常量, 这其的每个常量描述了一种类型模块的编译方式,这些常量有: BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk BUILD_PHONY_PACKAGE:= $(BUILD_SYSTEM)/phony_package.mk BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk BUILD_HOST_

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值