Android.mk常用知识

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
编译生成APKBUILD_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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值