一、编译
1、**五个阶段**:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成
2、makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
3、makefile文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。
**android.mk与MakeFile的区别**
android.mk是Android操作系统编译的时候使用的编译规则文件。Makefile是Linux操作系统编译的时候使用的编译规则文件。作用是一样的,只是名称不一样。
二、Android MakeFile
1、 **Android.mk基本组成**
1、LOCAL_PATH 定义了当前模块的相对路径,必须出现在所有的编译模块之前 。Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式:LOCAL_PATH:=$(call my-dir)上面的语句的意思是将LOCAL_PATH变量定义为本文件所在目录路径。
2、每个编译模块由include$(CLEAR_VARS) 开始,由include $(BUILD_XXX) 结束 ,include $(CLEAR_VARS)是一个编译模块的开始,它会清空除LOCAL_PATH之外的所有LOCA_XXX变量
3、include $(BUILD_XXX)描述了编译目标
4、LOCAL_SRC_FILES定义了本模块编译使用的源文件,采用的是基于LOCAL_PATH的相对路径
5、 LOCAL_MODULE 定义了本模块的模块名
6、include $(BUILD_SHARED_LIBRARY)表示编译成动态库。
7、 include $(BUILD_EXECUTABLE)表示编译成可执行程序
2、**编译目标**
上面用到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程序
**3、指定相关的变量**
>
LOCAL_ASSET_FILES :在Android.mk文件中编译应用程序(BUILD_PACKAGE)时设置此变量,表示资源文件,通常会定义成LOCAL_ASSET_FILES += $(call find-subdir-assets)
LOC