Android.mk是安卓提供的一种makefile配置文件,用来告知GNU Build 系统关于Source的信息,指定诸如编译生成so库名、引用的头文件目录、需要编译的.c/.cpp文件和.a静态库等,生成对应的apk文件。将源文件分组为模块,可以定义一个或多个模块,也可以多个模块中使用同一个源文件。
下面先用一个简单的例子来熟悉一下。
Android.mk文件首先需要定义LOCAL_PATH
变量:
LOCAL_PATH := $(call my-dir)
该变量表示源文件在开发树中的位置。构建系统提供的宏函数 my-dir
将返回当前目录(包含 Android.mk
文件本身的目录)的路径。
include $(CLEAR_VARS)
下一行声明 CLEAR_VARS
变量。其值由构建系统提供,声明一下即可。CLEAR_VARS
变量指向特殊 GNU Makefile,可为您清除许多 LOCAL_XXX
变量,例如 LOCAL_MODULE
、LOCAL_SRC_FILES
和 LOCAL_STATIC_LIBRARIES
。 但是要注意,它不会清除 LOCAL_PATH
。必须保留其值。并且在描述每个模块之前,必须重新声明此变量。
接下来,使用LOCAL_MODULE
变量来存储要构建的模块的名称。
LOCAL_MODULE := CtsCameraUtils
注意每个模块名称必须唯一,且不含任何空格。构建系统在生成最终共享库文件时,会将正确的前缀和后缀自动添加到您分配给 LOCAL_MODULE
的名称。
接下来枚举源文件,可用空格分隔多个文件。
LOCAL_SRC_FILES := \
$(call all-java-files-under, utils/src) \
$(call all-renderscript-files-under, utils/src)
LOCAL_SRC_FILES
变量必须包含要构建到模块中的所有源文件列表。
最后再使用include $(BUILD_SHARED_LIBRARY)帮助系统将所有内容连接到一起,请确保您至少已经为 LOCAL_MODULE
和 LOCAL_SRC_FILES
赋值
include $(BUILD_CTS_PACKAGE)
这样一个简单的Android.mk文件就配置完成了。
模块描述必须遵守以下几个基本流程:
CLEAR_VARS
变量初始化或取消定义与模块相关的变量。BUILD_XXX
变量设置 NDK 构建系统,以便为模块使用适当的构建脚本。还可以配置一个更加复杂的Android.mk文件,以下对一些常用脚本命令进行说明。
LOCAL_PATH
此变量用于指定当前文件的路径。必须在 Android.mk
文件的开头定义它。CLEAR_VARS
指向的脚本不会清除此变量,只需定义它一次。
LOCAL_MODULE
此变量用于存储模块的名称。它在所有模块名称之间必须唯一,并且不得包含任何空格。 必须在包含任何脚本(用于 CLEAR_VARS
的脚本除外)之前定义它。如果希望生成的模块使用 lib
以外的名称和 LOCAL_MODULE
以外的值,可以使用 LOCAL_MODULE_FILENAME
变量为生成的模块指定自己选择的名称。
LOCAL_MODULE_FILENAME
此可选变量可让您覆盖构建系统默认用于其生成的文件的名称。
如以下代码
LOCAL_MODULE := foo LOCAL_MODULE_FILENAME := libnewfoo
强制系统将LOCAL_MODULE生成的文件命名为 libnewfoo。
LOCAL_SRC_FILES
此变量包含构建系统用于生成模块的源文件列表。 只列出构建系统实际传递到编译器的文件,因为构建系统会自动计算所有关联的依赖关系。
请注意,可以使用相对文件路径(指向 LOCAL_PATH
)和绝对文件路径。
建议避免使用绝对文件路径;相对路径会使 Android.mk
文件移植性更强。
BUILD_STATIC_LIBRARY
用于构建静态库的 BUILD_SHARED_LIBRARY
的变体。构建系统不会将静态库复制到您的项目/软件包,但可能使用它们构建共享库(请参阅下面的 LOCAL_STATIC_LIBRARIES
和 LOCAL_WHOLE_STATIC_LIBRARIES
)。 使用此变量的语法为:
include $(BUILD_STATIC_LIBRARY)
LOCAL_STATIC_LIBRARIES
此变量用于存储当前模块依赖的静态库模块列表。
如果当前模块是共享库或可执行文件,此变量将强制这些库链接到生成的二进制文件。
如果当前模块是静态库,此变量只是指示,依赖当前模块的模块也会依赖列出的库。
LOCAL_SHARED_LIBRARIES
此变量是此模块在运行时依赖的共享库模块列表。 此信息在链接时需要,并且会在生成的文件中嵌入相应的信息。
PREBUILT_SHARED_LIBRARY
指向用于指定预建共享库的构建脚本。与 BUILD_SHARED_LIBRARY
和 BUILD_STATIC_LIBRARY
的情况不同,这里的 LOCAL_SRC_FILES
值不能是源文件, 而必须是指向预建共享库的单一路径,例如 foo/libfoo.so
。 使用此变量的语法为:
include $(PREBUILT_SHARED_LIBRARY)
PREBUILT_STATIC_LIBRARY
与 PREBUILT_SHARED_LIBRARY
相同,但用于预构建的静态库。
TARGET_ARCH
Android 开放源代码项目所指定的目标 CPU 架构的名称。此变量的值取自您在 Android.mk
文件中定义的 APP_ABI 变量,系统将在解析 Android.mk
文件前读取其值。
TARGET_PLATFORM
作为构建系统目标的 Android API 级别号。使用语法:
TARGET_PLATFORM := android-22
下面给一个CTS测试中的相机模块的例子:
LOCAL_PATH:= $(call my-dir)
# CtsCameraUtils package
include $(CLEAR_VARS)
LOCAL_STATIC_JAVA_LIBRARIES := compatibility-device-util \
mockito-target-minus-junit4 \
android-ex-camera2
LOCAL_SRC_FILES := \
$(call all-java-files-under, utils/src) \
$(call all-renderscript-files-under, utils/src)
LOCAL_MODULE := CtsCameraUtils
LOCAL_SDK_VERSION := current
-include cts/error_prone_rules_tests.mk
include $(BUILD_STATIC_JAVA_LIBRARY)
# CtsCameraTestCases package
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
# Include both the 32 and 64 bit versions
LOCAL_MULTILIB := both
LOCAL_STATIC_JAVA_LIBRARIES := compatibility-device-util \
ctstestrunner \
mockito-target-minus-junit4 \
android-ex-camera2 \
CtsCameraUtils
LOCAL_JNI_SHARED_LIBRARIES := \
libctscamera2_jni \
libnativehelper_compat_libc++
LOCAL_NDK_STL_VARIANT := c++_shared
LOCAL_SRC_FILES := \
$(call all-java-files-under, src) \
$(call all-renderscript-files-under, src)
# Tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts vts general-tests
LOCAL_PACKAGE_NAME := CtsCameraTestCases
LOCAL_SDK_VERSION := test_current
LOCAL_JAVA_LIBRARIES := android.test.runner
cts_runtime_hint := 120
include $(BUILD_CTS_PACKAGE)
include $(call all-makefiles-under,$(LOCAL_PATH))
多余的我就不一一列举了,可以参考Google官方的说明文档https://developer.android.google.cn/ndk/guides/android_mk。