Android.mk的GNU make语法
背景
1、安卓系统编译,使用了makefile,所以学习make语法。
2、安卓Build System会收集所有的Android.mk,转换成ninja用于构建。
GNU make语法
接下来的语法,主要讲述Android.mk里怎么使用。
LOCAL_PATH:=$(call my-dir)
调用构建系统 my-dir函数,获取文本所在目录,赋值给LOCAL_PATH。LOCAL_PATH必须位于Android.mk文件最开始
include $(CLEAR_VARS)
CLEAR_VARS由构建系统提供,指的是clear_vars.mk。引用此文件,用于清除除LOCAL_PATH以外的所有LOCAL_XXX变量
LOCAL_MODULE:=xxx
定义模块名称
LOCAL_MODULE_STEM
定义编译产物的文件名,会覆盖LOCAL_MODULE的定义。如果本变量没有定义,则生成的二进制文件名使用LOCAL_MODULE
LOCAL_MODULE_PATH:=odm/etc
定义编译产物的安装路径,这里的路径指的是绝对路径,想放哪放哪。
LOCAL_MODULE_CLASS:=ETC |SHARED_LIBRARIES |APPS |EXECUTABLES
定义编译产物的安装路径,这里的路径是分类好的路径。比如ETC是放到etc目录、SHARED_LIBRARIES放到lib/lib64下、EXECUTABLES放到bin目录。
LOCAL_SRC_FILES=$(call all-subdir-java-files)
定义编译模块,用到的源文件
LOCAL_PACKAGE_NAME=xxx
一般用于表示app的package名称
LOCAL_MODULE_TAGS := user eng tests optional
user: 指该模块只在user版本下才编译
eng: 指该模块只在eng版本下才编译
tests: 指该模块只在tests版本下才编译
optional:指该模块在 所有版本下都编译,默认是optional
LOCAL_CERTIFICATE := platform
指定apk签名的key。platform 是指用platform.pk8和platform.x509.pem两个文件来签名 。用这两个key签名后apk才可以放入系统进程中;
LOCAL_C_INCLUDES:=include
指定编译时即将使用的c头文件的位置,以当前目录为起点。
LOCAL_SHARED_LIBRARIES :=libcutils
表示模块在运行时要依赖的动态库,在链接时就需要,以便在生成文件时嵌入其相应的信息。
LOCAL_CFLAGS += -DXXX
相当于在所有源文件中增加一个宏定义#define XXX,所编译的Cpp中可以使用
LOCAL_VINTF_FRAGMENTS := manifest_foo.xml
在名为 manifest_foo.xml 的文件中,为此模块创建清单
include $(BUILD_STATIC_LIBRARY)
编译成静态库,后缀为.a。
include $(BUILD_SHARED_LIBRARY)
编译成动态库,也叫共享库,前缀为lib,后缀为.so。
include $(BUILD_EXECUTABLE)
编译成可执行程序
include $(call all-subdir-makefiles)
包含所有子目录中的Android.mk文件
include $(BUILD_PREBUILT)
将预编译好的二进制,打进模块
ifeq ($(AUDIO_POLICY_TEST),true)
$(warning “hello android,fuck trump”)
endif
判断相等的if语句
define func1
$(warning “hello android,fuck biden”)
endef
通过define关键字实现自定义函数func1
简单例子
- 编译一个helloworld动态库
- 源码文件如下:
sources/helloworld/helloworld.c
sources/helloworld/Android.mk - 其中Android.mk文件内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := helloworld
LOCAL_SRC_FILES := helloworld.c
include $(BUILD_SHARED_LIBRARY)
- 源码文件如下: