Android.mk 配置教程及语法详解

        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_MODULELOCAL_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文件就配置完成了。 

模块描述必须遵守以下几个基本流程:

  1. 使用 CLEAR_VARS 变量初始化或取消定义与模块相关的变量。
  2. 为用于描述模块的变量赋值。
  3. 使用 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。

 

 

 

你可能感兴趣的:(android)