一、简介
Android.mk是GNU Makefile的一小部分,用于对android程序的编译。
1.可将一般的Android程序,编译打包成.apk文件。
2.可将Java类库,编译打包成.jar文件。
3.可编译c\c++应用程序。
4.可编译生成c\c++静态库,并打包成.a文件。
5.可编译生成c\c++共享库(动态库),并打包成.so文件,只有共享库才能被安装/复制到APK包中。
二、语法
一个Android.mk文件中可以定义一个或多个模块,不同的模块可以使用同一个源代码文件。
编译系统会处理许多细节问题。如:在Android.mk中不需要列出头文件和依赖文件,系统会自动处理这些问题。
:= 表示等于,是赋值语句,
+= 表示追加,是赋值语句
$ 表示引用变量值
三、语句
1.LOCAL_PATH := $(call my-dir)
指定当前文件路径,宏函数'my-dir'由系统提供,用于返回当前路径。
一个Android.mk必须在开头定义LOCAL_PATH变量。
2.include $(CLEAR_VARS)
清除除了LOCAL_PATH以外的其他LOCAL_XXX变量(如:LOCAL_MODULE、LOCAL_SRC_FILES等等)。
因为所有的模块都是在同一个GNU MAKE环境中,而每个模块中所有变量都是全局的,所以我们需要先清空这些变量,防止在进入一个模块时,变量已经有初始化值了,这是不安全的。因为LOCAL_PATH总是要求在每个模块中都要进行设置,所以并不需要清空它。
CLEAR_VARS由系统提供(android/build/core/config.mk,CLEAR_VARS:=$(BUILD_SYSTEM)/clear_vars.mk)。
3.LOCAL_MODULE := helloworld
该变量指定生成的so库名称,必须定义,以描述在Android.mk文件中描述的每个模块。名称必须唯一且不含空格汉字等特殊字符。
4.LOCAL_SRC_FILES := helloworld.c
该变量包含所有要打包进模块的c\c++源代码文件。
5.include $(BUILD_SHARED_LIBRARY)
编译动态库。如果想生成静态库则使用BUILD_STATIC_LIBRARY。
四、系统变量
1.LOCAL_PATH
指定当前路径,LOCAL_PATH := $(call my-dir)
2.LOCAL_MODULE
指定模块名,即编译后的生成的文件名。
3.LOCAL_SRC_FILES
要编译的源代码文件列表。
4.LOCAL_CPP_EXTENSION
可选变量,用来指定c++文件的扩展名,默认是cpp。如:LOCAL_CPP_EXTENSION := .cxx,那么c++扩展名就变成了cxx。
5.LOCAL_C_INCLUDES
可选变量,表示头文件搜索路径。默认搜索路径是LOCAL_PATH。
6.LOCAL_CFLAGS
可选变量,指定编译器,在编译c时可用。
7.LOCAL_CXXCFLAGS
可选变量,指定编译器,在编译c++时可用。
8.LOCAL_CPPCFLAGS
可选变量,指定编译器,编译c\c++时都可用。
9.LOCAL_STATIC_LIBRARIES
可选变量,列出该模块需要用到的静态库。
10.LOCAL_SHARED_LIBRARIES
可选变量,列出该模块在运行时需要的动态库,在连接时就需要用到,以便在生成文件时嵌入其相应的信息。
11.LOCAL_LDLIBS
可选变量,编译模块时要使用的附加的连接器选项。这对于使用'-l'前缀传递指定库的名字是有用的。
如:LOCAL_LDLIBS := -lz表示告诉连接器生成的模块要在加载时刻连接到/system/lib/libz.so
12.LOCAL_ALLOW_UNDEFINED_SYMBOLS
可选变量,试图编译一个共享库时,任何未定义的引用将导致一个“未定义的符号”错误。这对于源代码文件中捕捉错误会有很大的帮助。如果不需要启动这项检查,可以把这个变量设为‘true’。
13.LOCAL_ARM_MODE
可选变量,默认情况下ARM目标二进制会以thumb的形式生成(16位),通过设置这个变量为arm改变成32位指令的形式。
LOCAL_ARM_MODE := arm
LOCAL_SRC_FILES := foo.c bar.c.arm 这样就告诉系统将bar.c以arm的模式编译。
14.LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH
可选变量,指定最后的目标安装路径。
TARGET_ROOT_OUT表示根文件系统;
TARGET_OU表示system文件系统;
TARGET_OUT_DATA表示data文件系统;
如:LOCAL_MODULE_PATH := $(TRAGET_ROOT_OUT)
五、宏(函数)
GNU Mark 功能宏,使用'$(call xxx)'来调用,将返回文本化的信息。
1.my-dir
返回当前Android.mk所在的目录的路径
2.all-subdir-makefiles
返回一个相当于当前'my-dir'路径的子目录中所有Android.mk的列表。
include $(call all-subdir-makefiles) 这句话将编译'my-dir'中所有的子目录中的Android.mk
3.this-makefile
返回当前Makefile的路径(即这个函数调用的地方)
4.parent-makefile
返回包含当前Makefile的Makefile路径。
5.grand-parent-makefile
包含包含当前Makefile的Makefile的Makefile路径。无法用言语描述了。