1、一个简单的Android.mk介绍
在android/external目录下新建test目录,编写test.c和Android.mk文件。Android.mk如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := test.c
include $(BUILD_EXECUTABLE)
如上就是一个简单的Android.mk文件,它将test.c编译成可执行文件test,下面介绍每一行代表的意思。
LOCAL_PATH := $(call my-dir)
定义了当前模块的相对路径,表示调用my-dir函数的结果赋值给LOCAL_PATH变量,my-dir函数在build/core/definitions.mk文件中,他返回返回当前文件夹路径,内容如下
# Figure out where we are.
define my-dir
$(strip \
$(eval LOCAL_MODULE_MAKEFILE := $$(lastword $$(MAKEFILE_LIST))) \
$(if $(filter $(BUILD_SYSTEM)/% $(OUT_DIR)/%,$(LOCAL_MODULE_MAKEFILE)), \
$(error my-dir must be called before including any other makefile.) \
, \
$(patsubst %/,%,$(dir $(LOCAL_MODULE_MAKEFILE))) \
) \
)
endef
它先将MAKEFILE_LIST的最后一个赋值给LOCAL_MODULE_MAKEFILE变量,MAKEFILE_LIST是当前文件夹下的所有mk文件,然后判断LOCAL_MODULE_MAKEFILE中如果包含BUILD_SYSTEM或者OUT_DIR变量就报错my-dir must be called before including any other makefile.,其中BUILD_SYSTEM是编译系统目录即build/core,OUT_DIR是输出目录,最后通过patsubst %/,%,$(dir $(LOCAL_MODULE_MAKEFILE))返回当前文件夹路径.
例子:假设MAKEFILE_LIST中最后一个mk是external/test/Android.mk,即LOCAL_MODULE_MAKEFILE=external/test/Android.mk,显然它并不包含BUILD_SYSTEM和OUT_DIR,而
dir $(LOCAL_MODULE_MAKEFILE)
返回的是文件夹路径即external/test/,最后的patsubst %/ %会将它转换成external/test,所以LOCAL_PATH=external/test。
验证一下,在mk中的LOCAL_PATH那行下添加
$(warning "the local_path is $(LOCAL_PATH)")
使用mmm external/test/编译
输出如下信息:
external/test/Android.mk:2: warning: “the local_path is external/test”
学习下上面的几个在mk中使用的命令
#过滤掉变量VARIANTS中除了word1和word2的其他词
$(filter word1 word2,$(VARIANTS))
#将text中符合pattern的部分替换成replacement,pattern和replacement中可以使用通配符,列如上面的%表示任意长度的字串
$(patsubst <pattern>,<replacement>,<text> )
#打印输出xxxxx,可以使用error替换warning
$(warning "xxxxx")
include $(CLEAR_VARS)
清除掉当前的环境变量,具体是哪些环境变量在build/core/clear_vars.mk中,LOCAL_PATH变量不在其中所以不会被清除。
LOCAL_MODULE := test
指定生成的模块名称,这里为test
LOCAL_SRC_FILES := test.c
指定参与编译的源文件,这里只使用test.c文件
在definitions.mk中还定义了很多方便使用的函数
获取指定目录下所有的java文件 | all-java-files-under |
获取指定目录下所有的c文件 | all-c-files-under |
获取指定目录下所有的cpp文件 | all-c-cpp-files-under |
获取指定目录下所有的aidl文件 | all-Iaidl-files-under |
其他的一些函数:参考博客链接
include $(BUILD_EXECUTABLE)
编译所生成的目标文件格式为可执行文件。
编译其他格式:
编译生成动态库 | BUILD_SHARED_LIBRARY |
编译生成静态库 | BUILD_STATIC_LIBRARY |
编译生成APK | BUILD_PACKAGE |
编译生成静态jar包 | BUILD_STATIC_JAVA_LIBRARY |
编译生成共享jar包 | BUILD_JAVA_LIBRARY |
预编译 | BUILD_PREBUILT |
2、其他的一些变量的介绍
LOCAL_MODULE_PATH
指定编译后输出的目录
LOCAL_SHARED_LIBRARIES += libxxxx
添加系统库libxxxx参与编译
LOCAL_C_INCLUDES := path
指定参与编译文件中所使用的头文件路径
LOCAL_LDFLAGS := -L/path -lxxx
引入第三方库文件
BUILD_PACKAGE_NAME : packageName
编译生成的apk名字
LOCAL_MODULE_TAGS := optional
LOCAL_SDK_VERSION := current
指定所使用的sdk版本
LOCAL_STATIC_JAVA_LIBRARIES := static-library
引用静态jar包
LOCAL_JAVA_LIBRARIES := share-library
引用动态jar包
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
指定编译生成文件类型为动态jar包(dex归档文件)
LOCAL_MODULE_CLASS用于预编译中指定编译生成文件格式,有以下几种可选:
dex归档文件 | JAVA_LIBRARIES |
动态库文件 | SHARED_LIBRARIES |
二进制文件 | EXECUTABLES |
其他文件格式 | ETC |
3、判断语句
#ifeq判断括号中的两个值是否相等,ifneq是判断不相等
ifeq ($(VALUE),x)
...
else
...
endif