Android.mk基础知识
Android.mk用于构建系统描述源文件和共享库,它实际上是一个微小的GNU makefile片段,构建系统会将其解析一次或多次。
1. AOSP示例
我们以hello-jni开始熟悉Android.mk,位于Android源码的/development/ndk/samples/hello-jni/jni/Android.mk,此示例代码在Android 7.1之后就删除了,但仍然是一个不错的例子。
1 LOCAL_PATH := $(call my-dir) 2 3 include $(CLEAR_VARS) 4 5 LOCAL_MODULE := hello-jni 6 LOCAL_SRC_FILES := hello-jni.c 7 8 include $(BUILD_SHARED_LIBRARY)
- 第1行,表示源文件在开发树中的位置;
- 第3行,指向一个特殊的GNU Makefile,清除除第1行变量外的其他LOCAL_XXX变量;
- 第5行,要构建的模块的名称;
- 第6行,表示要构建到模块中的C/C++源文件列表。
- 第8行,指向一个GNU Makefile,此脚本确定要构建的内容及构建方式,此处位构建共享库。
2. include变量
2.1 CLEAR_VARS
此变量指向的构建脚本用于取消定义下文“开发者定义的变量”部分中列出的几乎所有 LOCAL_XXX 变量。在描述新模块之前,请使用此变量来包含此脚本。使用它的语法为:
include $(CLEAR_VARS)
2.2 BUILD_EXECUTABLE
此变量指向的构建脚本会收集您在 LOCAL_XXX 变量中提供的模块的所有相关信息,以及确定如何根据您列出的源文件构建目标可执行文件。请注意,使用此脚本要求您至少已经为 LOCAL_MODULE 和 LOCAL_SRC_FILES 赋值。使用此变量的语法为:
include $(BUILD_EXECUTABLE)
2.3 BUILD_SHARED_LIBRARY
此变量指向的构建脚本会收集您在 LOCAL_XXX 变量中提供的模块的所有相关信息,以及确定如何根据您列出的源文件构建目标共享库。请注意,使用此脚本要求您至少已经为LOCAL_MODULE和LOCAL_SRC_FILES赋值。使用此变量的语法为:
include $(BUILD_SHARED_LIBRARY)
2.4 BUILD_STATIC_LIBRARY
用于构建静态库的 BUILD_SHARED_LIBRARY 的变体。构建系统不会将静态库复制到您的项目/软件包中,但可以使用静态库构建共享库。使用此变量的语法为:
include $(BUILD_STATIC_LIBRARY)
2.5 PREBUILT_SHARED_LIBRARY
指向用于指定预构建共享库的构建脚本。与BUILD_SHARED_LIBRARY和BUILD_STATIC_LIBRARY的情况不同,这里的 LOCAL_SRC_FILES 值不能是源文件,而必须是指向预构建共享库的单一路径。使用此变量的语法为:
include $(PREBUILT_SHARED_LIBRARY)
2.6 PREBUILT_STATIC_LIBRARY
与PREBUILT_SHARED_LIBRARY相同,但用于预构建静态库。使用此变量的语法为:
include $(PREBUILT_STATIC_LIBRARY)
3. 目标信息变量
名称 | 描述 |
TARGET_ARCH | arm、arm64、x86或x86_64 |
TARGET_PLATFORM |
ifeq ($(TARGET_PLATFORM),android-22) |
TARGET_ARCH_ABI | armeabi-v7a、arm64-v8a、x86或x86_64 |
TARGET_ABI | ifeq ($(TARGET_ABI),android-22-arm64-v8a)
# ... do something ... |
4. 模块描述变量
名称 | 描述 |
LOCAL_PATH | 此变量用于指定当前文件的路径 |
LOCAL_MODULE | 此变量用于存储模块名称 |
LOCAL_MODULE_FILENAME | 此可选变量使您能够替换构建系统为其生成的文件默认使用的名称 |
LOCAL_SRC_FILES | 此变量包含构建系统生成模块时所用的源文件列表 |
LOCAL_CPP_EXTENSION | 可以使用此可选变量为C++源文件指定.cpp以外的文件扩展名 |
LOCAL_CPP_FEATURES | 您可使用此可选变量指明您的代码依赖于特定C++功能 |
LOCAL_C_INCLUDES | 您可使用此可选变量指定相对于NDK root目录的路径列表,以便在编译所有源文件(C、C++ 和 Assembly)时添加到include搜索路径中 |
LOCAL_CFLAGS | 此可选变量用于设置在构建C和C++源文件时构建系统要传递的编译器标记 |
LOCAL_CPPFLAGS | 只构建C++源文件时将传递的一组可选编译器标记 |
LOCAL_STATIC_LIBRARIES | 此变量用于存储当前模块依赖的静态库模块列表 |
LOCAL_SHARED_LIBRARIES | 此变量会列出此模块在运行时依赖的共享库模块 |
LOCAL_WHOLE_STATIC_LIBRARIES | 此变量是LOCAL_STATIC_LIBRARIES的变体,表示链接器应将相关的库模块视为完整归档 |
LOCAL_LDLIBS | 此变量列出了在构建共享库或可执行文件时使用的额外链接器标记 |
LOCAL_LDFLAGS | 此变量列出了构建系统在构建共享库或可执行文件时使用的其他链接器标记 |
LOCAL_ALLOW_UNDEFINED_SYMBOLS | 默认情况下,如果构建系统在尝试构建共享库时遇到未定义的引用,将会抛出“未定义的符号”错误 |
LOCAL_ARM_MODE | 默认情况下,构建系统会以thumb模式生成ARM目标二进制文件,其中每条指令都是16位宽,并与thumb/目录中的STL库链接 |
LOCAL_ARM_NEON | 此变量仅在以armeabi-v7a ABI为目标时才有意义 |
LOCAL_DISABLE_FORMAT_STRING_CHECKS | 默认情况下,构建系统会在编译代码时保护格式字符串 |
LOCAL_EXPORT_CFLAGS | 此变量用于记录一组C/C++编译器标记 |
LOCAL_EXPORT_CPPFLAGS | 此变量与LOCAL_EXPORT_CFLAGS相同,但仅适用于C++标记 |
LOCAL_EXPORT_C_INCLUDES | 此变量与LOCAL_EXPORT_CFLAGS相同,但适用于C include路径 |
LOCAL_EXPORT_LDFLAGS | 此变量与LOCAL_EXPORT_CFLAGS相同,但适用于链接器标记 |
LOCAL_EXPORT_LDLIBS | 此变量与LOCAL_EXPORT_CFLAGS相同,用于指示构建系统将特定系统库的名称传递到编译器 |
LOCAL_SHORT_COMMANDS | 当您的模块有很多源文件和/或依赖的静态或共享库时,请将此变量设置为true |
LOCAL_THIN_ARCHIVE | 构建静态库时,请将此变量设置为true。这样会生成一个瘦归档,即一个库文件,其中不含对象文件,而只包含它通常包含的实际对象的文件路径 |
LOCAL_FILTER_ASM | 请将此变量定义为一个shell命令,供构建系统用于过滤根据您为LOCAL_SRC_FILES指定的文件提取或生成的汇编文件 |
5. 函数宏
名称 | 描述 |
my-dir | 这个宏返回最后包括的makefile的路径,通常是当前Android.mk的目录 |
all-subdir-makefiles | 返回位于当前my-dir路径所有子目录中的Android.mk文件列表 |
this-makefile | 返回当前makefile(构建系统从中调用函数)的路径 |
parent-makefile | 返回包含树中父makefile的路径(包含当前makefile的makefile的路径) |
grand-parent-makefile | 返回包含树中祖父makefile的路径(包含当前父makefile的makefile的路径) |
import-module | 此函数用于按模块名称来查找和包含模块的Android.mk文件 |