`
nfer.zhuang
  • 浏览: 61880 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

深入浅出Android makefile(1)--初探

阅读更多

一、说明
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基本组成

  1. LOCAL_PATH 定义了当前模块的相对路径,必须出现在所有的编译模块之前
  2. 每个编译模块由include $(CLEAR_VARS) 开始,由include $(BUILD_XXX) 结束
  3. include $(CLEAR_VARS) 是一个编译模块的开始,它会清空除LOCAL_PATH之外的所有LOCA_XXX变量
  4. include $(BUILD_XXX) 描述了编译目标
  5. LOCAL_SRC_FILES 定义了本模块编译使用的源文件,采用的是基于LOCAL_PATH的相对路径
  6. 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教程-经典

    什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但...

    跟我一起写Makefile--陈皓

    《跟我一起写Makefile——陈皓》是一本深入浅出介绍Makefile的书籍,由知名IT作者陈皓撰写。本书旨在帮助读者从基础知识到高级应用全面掌握Makefile的编写技巧,提升软件构建与管理的效率。 Makefile是Unix/Linux...

    深入浅出Makefile

    ### 深入浅出Makefile #### 一、从helloworld开始 在开始学习Makefile之前,我们首先通过一个最简单的程序——“helloworld”来熟悉如何使用Makefile进行编译。 1. **创建目录并进入:** ```bash $ mkdir hello...

    android-ndk-r13b-windows-x86-64

    《Android NDK R13B for Windows:深入解析与应用》 Android NDK(Native Development Kit)是Android开发中的一个重要工具集,它允许开发者使用C和C++编写原生代码,以实现高性能、低级别的系统操作。在Android...

    Makefile教程-word版

    ### Makefile教程精要 #### 一、Makefile与自动化构建的重要性 Makefile是一种用于定义项目构建过程的脚本文件,它在软件开发过程中扮演着非常重要的角色,尤其是在Unix/Linux环境下。通过Makefile,开发者可以...

    makefile指南 - 内训版(一)

    Makefile 介绍 Makefile 总述 Android中的makefile分析

    项目实用makefile示例--project-test

    大中型的实用项目中,多人协作开发,除了分层次...linux下开发,makefile树,是一种常用方案。本资源是一个项目目录树和makefile树的简单示例。具体说明参考:http://blog.csdn.net/zhouyulu/article/details/8449263

    Makefile-Demo-Aurix平台

    在这个名为"Makefile-Demo-Aurix平台"的示例中,我们将探讨如何在Aurix微处理器平台上利用Tasking编译器(cctc)通过Makefile进行项目构建。 Aurix是Infineon Technologies推出的一款高性能、多核的32位微控制器...

    GNU Makefile -- E-Book in .doc --

    GNU Makefile 是一个用于自动化构建和管理软件工程的工具,尤其在Linux环境下,它是程序员不可或缺的工具之一。Makefile是一个文本文件,其中包含了构建工程所需的编译和链接规则,使得开发者仅需通过输入一个简单的...

    Uboot顶层Makefile分析-思维导图-MX6U嵌入式linux系统移植学习笔记基于正点原子阿尔法开发板

    Uboot顶层Makefile分析-思维导图-MX6U嵌入式linux系统移植学习笔记基于正点原子阿尔法开发板

    android编译系统makefile(Android.mk)写法

    本文将深入探讨`Android.mk`文件的写法和关键知识点。 1. **LOCAL_PATH变量的设定** `LOCAL_PATH`变量的设定是`Android.mk`文件的起点,它指示了源文件所在的目录。通常,`LOCAL_PATH`会被设置为当前`Android.mk`...

    Makefile文件例程于工程模板

    1. **Makefile基本结构** Makefile通常由目标、依赖项和命令三部分组成。目标是需要生成的文件,依赖项是目标生成所需要的文件,命令则是在依赖项改变时需要执行的操作。例如,一个简单的Makefile可能包含一个目标`...

    android-ndk-r8c

    1. **C/C++支持**:NDK支持使用C和C++语言编写Android应用程序的本地代码部分,通过JNI(Java Native Interface)与Java代码交互。开发者可以利用C++标准库和STL,提升计算密集型任务的效率。 2. **交叉编译**:...

    Makefile-Templates-master.7z

    "Makefile-Templates-master.7z"是一个包含Makefile模板的压缩文件,其中提供了丰富的示例和详细的中文文档,旨在帮助开发者理解和掌握Makefile的编写与应用。 Makefile,顾名思义,是用于管理“make”命令的文件。...

    GNU-Makefile中文手册-Ver3.8.pdf

    1. **Makefile基本知识**: - **概述**:Makefile是描述项目构建规则的文件,通过定义目标、依赖关系和命令,使构建过程自动化。 - **准备知识**:理解Makefile前,需熟悉编译器和链接器的基本用法,以及基本的...

    android ffmpeg-android-java-2a627f6ecd

    1. **Android.mk 和 Application.mk**:FFmpeg的Android编译通常涉及编写这两个Makefile文件,它们定义了编译选项、目标平台、编译器设置等,以生成适用于Android的.so库文件。 2. **JNI(Java Native Interface)*...

    android-ndk-r6b-windows

    1. **NDK概述**:NDK是一系列工具的集合,包括编译器、链接器和其他工具,它们可以帮助开发者在Android平台上构建原生库。这些库可以与Java代码交互,通过JNI(Java Native Interface)调用,实现混合编程。 2. **...

    Android编译流程_makefile流程

    本文将深入探讨Android编译流程的核心组成部分——Makefile流程。 #### 二、Android编译系统概述 Android编译系统主要由一系列的Makefile脚本和配置文件构成,这些文件定义了如何构建整个Android系统。其中,`...

    android-ndk-r4b-linux-x86

    《Android NDK r4b:深入理解与应用》 Android NDK(Native Development Kit)是Google为Android平台提供的一套工具,它允许开发者使用C/C++编写部分应用程序,以利用原生代码的高性能和低级硬件访问能力。本文将...

    obj-c-makefile

    3. `OBJECTS`:列出所有需要编译的源文件,通常是`.m`(Objective-C)和`.c`(C)文件。 4. `EXECUTABLE`:定义最终生成的可执行文件名。 5. `all`:默认目标,负责编译和链接所有的源文件。 6. `clean`:清理目标,...

Global site tag (gtag.js) - Google Analytics