Android.mk用法基础

1.android整个工程只有一个Makefile,听起来似乎是一件很疯狂的事情,因为这个Makefile可能会变得无比庞大和复杂。其实不用担心,我们可以按照模块来将这个Makefile划分成一个个Makefile片段(fragement),然后通过Makefileinclude指令来将这些Makefile片段组装在一个Makefile中。与递归Makefile相比,每一个模块现在拥有的是一个Makefile片段,而不是一个Makefile文件。这正是Android编译系统的设计思想和原则,也就是说,我们平时所编写的Android.mk编译脚本都只不过是整个Android编译系统的一个Makefile片段。

2.LOCAL_XXX变量:LOCAL_XXX变量用于向编译系统描述你的模块中所使用的变量,它们会被include $(CLEAR_VARS)命令来清除,你应该在include $(CLEAR_VARS)和include $(BUILD_XXXXX)语句之间来定义你想要使用的变量。

3.Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件,宏函数’my-dir’, 由编译系统提供。由于一般情况下Android.mk和需要编译的源文件在同一目录下 LOCAL_PATH := $(call my-dir),当然也可以定义到其他目录,如LOCAL_PATH := $(call my-dir)/../../XXX,形式比较自由。

4.include $(CLEAR_VARS):CLEAR_VARS由编译系统提供,指的是clear_vars.mk,指定让GNU MAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。

5.LOCAL_MODULE:=xxx 生成的模块的名称(注意应用程序apkLOCAL_PACKAGE_NAME,而不是LOCAL_MODULE)当编译动态库或者静态库时,此变量标示库名称,注意编译系统会自动产生合适的前缀和后缀一个被命名为“screen”的共享库模块,将会生成“libscreen.so”文如果LOCAL_MODULE变量定义的值可能会被其它module调用时,就要考虑为其变量命名的规范性了。特别是在使用JNI时,既在LOCAL_JNI_SHARED_LIBRARIES变量中定义的值,最好要和LOCAL_MODULE变量定义的值保存一致(具体请参考LOCAL_JNI_SHARED_LIBRARIES变量的使用说明)。这时的LOCAL_MODULE变量的命名最好以lib开头,“libxxx”

6.LOCAL_SRC_FILES:app的所有源码,可以指定具体的文件,如果是java源码的话,可以调用all-java-files-under,如果是C源码的话,调用call subdir-c-files得到---实际测试发现call subdir-c-files存在问题?如果不想一一列举源文件的话可以使用Makefile中的用法。如: LOCAL_SRC_FILES:= \

     $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/*.c*)) 

注意subst在这里的作用是去掉源文件的目录前缀,不去的话就找错地方了。

更加规范的写法为

$(subst $(LOCAL_PATH)/,,$(wildcard *.c $(addsuffix /*.c, $(subst :, , $(LOCAL_PATH)))))

个人觉得后面的substaddsuffix基本没用处,不写也可以。

如果很多文件中有几个不想编译进去,那么可以用filter-out过滤。

LOCAL_SRC_FILES = $(filter-out $(EXCEPT_SRC),$(ALL_SRC))

其中EXCEPT_SRC为不想编译文件的集合,ALL_SRC为wildcard枚举的所有源文件。

7.LOCAL_MODULE_TAGS := user eng tests optional user: 指该模块只在user版本下才编译eng: 指该模块只在eng版本下才编译tests: 指该模块只在tests版本下才编译optional:指该模块在 所有版本下都编译,默认是optional

8.LOCAL_C_INCLUDES:=include 这个是用来指定在编译时即将使用的c头文件的位置,以当前目录为起点。

9.LOCAL_CFLAGS:LOCAL_CFLAGS变量为C/C++编译器定义额外的标志,当编译C/C++源文件时传递一个可选的编译器标志,这对于指定额外的宏定义或编译选项很有用。例如:LOCAL_CFLAGS += -DLIBBUTLES_NATIVE=1

LOCAL_CPPFLAGS:LOCAL_CPPFLAGS变量和LOCAL_CFLAGS变量类似,如果你只想要增加一些标记(flag)在你的C++编译器中,使用LOCAL_CPPFLAGS变量来增加它们,例如:LOCAL_CPPFLAGS += -ffriend-injection

LOCAL_CPPFLAGS必须在LOCAL_CFLAGS变量命令行的后面使用,所以你可以用它来重写你在LOCAL_CFLAGS定义的标记(只针对C++编译器

10.LOCAL_CPP_EXTENSION如果你的C++文件不是以cpp为文件后缀,通过LOCAL_CPP_EXTENSION指定C++文件后缀名例如:LOCAL_CPP_EXTENSION := .cc

需要注意的是在module中给出的所有的C++文件必须具有相同的扩展名,它是不允许混合使用不同扩展名的。

11.LOCAL_LDFLAGSLOCAL_LDLIBS允许你在你编译你的可执行程序或者库的时候,添加一些指定的额外的库。用lxxx的格式来指定你要引用的库,它们会被连接命令行直接解析。例如:LOCAL_LDLIBS += -lcurses -lpthread,可用-L指定目录,如-L$(LOCAL_PATH)/xxx/xx
LOCAL_LDLIBS可以指定链接库路径,而LOCAL_SHARED_LIBRARIES个只在标准目录寻找库。

12.LOCAL_SHARED_LIBRARIES用来列出模块所需的共享库的列表,不需要加上.so后缀。

LOCAL_STATIC_LIBRARIES和LOCAL_SHARED_LIBRARIES类似,用来列出你的模块中所需的静态库的列表,你可以在你的module中包含一些想使用的静态库,通常我们使用共享库,但是有些地方,像在sbin下的可执行程序和主机上的可执行程序我们要使用静态库。

13.LOCAL_MODULE_PATH通知编译系统将module放到其它地方而不是obj目录

14.LOCAL_MODULE_CLASS := ETC #表示放于system/etc目录

LOCAL_MODULE_CLASS := EXECUTABLES  #放/system/bin

LOCAL_MODULE_CLASS := SHARED_LIBRARIES    #放在/system/lib下

15.编译目标指令

include $(BUILD_STATIC_LIBRARY)表示编译成静态库,后缀为.a。
include $(BUILD_SHARED_LIBRARY)表示编译成动态库,用来指示将当前模块编译为共享库,后缀为.so。
include $(BUILD_EXECUTABLE)表示编译成可执行程序

include $(BUILD_PACKAGE)表示生成一个apk安装包

16.all-subdir-makefiles:返回my-dir子目录下的所有Android.mk。例如:

代码的结构如下:

sources/foo/Android.mk

sources/foo/lib1/Android.mk

sources/foo/lib2/Android.mk

如果sources/foo/Android.mk里有这样一行:

include $(call all-subdir-makefiles)

那么,它将会自动地包含sources/foo/lib1/Android.mk和

sources/foo/lib2/Android.mk。这个函数能将深层嵌套的代码文件夹提供给生成系统。

all-subdir-makefiles和all-makefiles-under的区别在于前者深层递归调用mk文件,而后者只包含下一级子目录mk文件。----关于这点实际使用发现都只能包含子目录的mk文件而不能递归包含下去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值