一、说明
android build system是一个非常庞大的系统,要编译Android工程、修改或新增Android模块都需要对这个编译系统有一定的了解。但是由于它实在是太庞大了,大家往往是不知道从哪里切入进去,对Android的编译系统进行一个系统的学习。
下面我们尝试从一个小模块逐步对android build system做一个深入剖析。选择的这个模块名字叫做acp ,源码位于build\tools\acp目录。
后续很多模块的编译都需要使用到acp,根据编译依赖一般会先编译本模块。当然它也需要依赖到其他文件,需要的时候我们再进行阐述。
二、acp Android.mk初探
acp的Android.mk比较简单,去掉的无用代码后,如下面所示:
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := acp.c LOCAL_STATIC_LIBRARIES := libhost LOCAL_C_INCLUDES := build/libs/host/include LOCAL_MODULE := acp LOCAL_ACP_UNAVAILABLE := true include $(BUILD_HOST_EXECUTABLE)
上面的语句大致的意思就是,使用当前路径下的acp.c源码,引用的include和链接的library都是host模块,最终编译生成一个可在当前主机运行的可执行文件,名字为acp(linux环境)。。
这里我们先不谈每一个变量的具体含义和使用,我们先大概看一下一个Android.mk的基本组成。
三、 Android.mk基本组成
- LOCAL_PATH 定义了当前模块的相对路径,必须出现在所有的编译模块之前
- 每个编译模块由include $(CLEAR_VARS) 开始,由include $(BUILD_XXX) 结束
- include $(CLEAR_VARS) 是一个编译模块的开始,它会清空除LOCAL_PATH之外的所有LOCA_XXX变量
- include $(BUILD_XXX) 描述了编译目标
- LOCAL_SRC_FILES 定义了本模块编译使用的源文件,采用的是基于LOCAL_PATH的相对路径
- LOCAL_MODULE 定义了本模块的模块名
编译acp还需要了几个可选的变量:
- LOCAL_STATIC_LIBRARIES 表示编译本模块时需要链接的静态库
- LOCAL_C_INCLUDES 表示了本模块需要引用的include文件
- LOCAL_ACP_UNAVAILABLE 表示是否支持acp,如果支持acp,则使用acp进行拷贝,否则使用linux cp拷贝,本模块编译acp,当然是不支持acp了
四、编译目标
上面我们用到include $(CLEAR_VARS)和include $(BUILD_HOST_EXECUTABLE),那么他们是在哪里定义的呢?除了BUILD_HOST_EXECUTABLE还有哪些BUILD_XXX目标呢?
它们的定义位于build/core/config.mk文件,当然config.mk文件定义的编译目标也很多,下面列举几个常用的目标:
编译目标 | 说明 |
BUILD_HOST_STATIC_LIBRARY | 主机上的静态库 |
BUILD_HOST_SHARED_LIBRARY | 主机上的动态库 |
BUILD_HOST_EXECUTABLE | 主机上的可执行文件 |
BUILD_STATIC_LIBRARY | 目标设备上的静态库 |
BUILD_SHARED_LIBRARY |
目标设备上的动态库
|
BUILD_EXECUTABLE |
目标设备上的可执行文件
|
BUILD_JAVA_LIBRARY | JAVA库 |
BUILD_STATIC_JAVA_LIBRARY | 静态JAVA库 |
BUILD_HOST_JAVA_LIBRARY | 主机上的JAVA库 |
BUILD_PACKAGE | APK程序 |
具体的每一个目标,等我们遇到的时候我们再详细进行讲解。
相关推荐
什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但...
跟我一起写Makefile--陈皓 基础到高级用法
Makefile 介绍 Makefile 总述 Android中的makefile分析
linux系统makefile简析-PPT课件.ppt
大中型的实用项目中,多人协作开发,除了分层次...linux下开发,makefile树,是一种常用方案。本资源是一个项目目录树和makefile树的简单示例。具体说明参考:http://blog.csdn.net/zhouyulu/article/details/8449263
一.从helloworld开始 2 二.多个文件编译 2 三.批量生产工具Makefile 3 例一: 3 四.带变量的Makefile 3 例二: 3 特殊变量: 4 五.Makefile的扩展 5 例三: 5 总结: 6 六....七.Makefile与pkg-config 9
Makefile的电子书,平时还真能用上,如果你希望有一个Makefile模版的话,一个开源项目可以推荐你下载: https://sourceforge.net/projects/ok2makefile/
MakeFile-基于tasking平台,cctc命令。make命令即可。
android编译系统makefile(Android.mk)写法 Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件。由于一般情况下 Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式: LOCAL_PATH:=$(call my-...
一份讲解的比较细的Makefile教程,通俗易懂,word版本,原文系“陈皓”作品,本人简单整理了一下,修改了一些明显的错误,并生成了必要的“文档结构图”,方便阅读!
设计模式精解-GOF23种设计模式解析(VS2012重写实现包含Linux-Makefile)-代码和原文档已插入本文档.pdf
包含6个Makefile工程的例程,从最简单的Makefile编写到通用模板。可以直接执行make来测试工程的编译
Makefile文件arm-none-linux-gnueabi-gcc编译文件,linux下多个.C文件统一使用make文件进行编译
obj-c, win 环境下的 makefile 和简单的程序,自己用的
makefile编写介绍
本资源包含两个样例框架makefile+CMakefile: 已经写好了初始化的makefile和CMakeLists.txt文件,只需要在框架的基础上添加自己的需求就可以了,但是最基础的make和cmake的语法还是需要懂的,才能写好框架,提高自己...
深入浅出嵌入式Linux应用程序开发MP4视频. 嵌入式系统概述。 Linux系统体验。 shell编程基础-变量详解。 shell编程基础-语句详解。 shell编程基础-函数详解。 shell编程实例分析。 linux应用程序设计基础-GCC编译器...
r16_project_ov2640_20160120不能编译uboot_验证版本parrotv1.0_20170302_1418没有外层目录.7z 开发板:SC3817。全志R16平台点亮OV2640。 切记:一定不要编译uboot。否则,你的LCD没有显示!哈哈哈……
Android编译流程_makefile流程
nmap-android, 在 Android Makefile/diff/scripts 上使用 Android NDK构建它,Nmap nmapMakefile/diff/scripts 在 Android - 上使用 Android cxf构建它将 android/目录放置到iframe源 root 。转到android目录并说: ...