Android早期使用makefile来编译系统源码,在一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,也可以执行操作系统的命令。
make是一个命令工具,它解释Makefile 中的指令。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
Android.mk
文件用来告知Build系统关于Source的信息。 Android.mk
将是GNU Makefile的一部分,且将被Build System解析一次或多次。
一个简单的例子
LOCAL_PATH:= $(call my-dir) #设置当前文件路径
include $(CLEAR_VARS) #清除环境变量
LOCAL_MODULE_TAGS := optional #参与编译类型
LOCAL_SRC_FILES := $(call all-java-files-under, src) #配置代码源文件
LOCAL_PACKAGE_NAME := Gallery #模块名称
LOCAL_PRIVATE_PLATFORM_APIS := true #设置后,会使用sdk的hide的api來编译
#在Android.mk中如果有LOCAL_SDK_VERSION 这个编译配置,就会使编译的应用不能访问hide的api,
#有时一些系统的class被import后编译时说找不到这个类,就是这个原因造成的。LOCAL_SDK_VERSION := current 意思是编译时忽略系统隐藏类(@hide)
LOCAL_CERTIFICATE := media #签名方式
LOCAL_PROGUARD_ENABLED := full #混淆方式
LOCAL_PROGUARD_FLAG_FILES := proguard.flags #混淆规则文件
include $(BUILD_PACKAGE) #编译出apk
# Use the following include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH)) #导入子目录的makefile文件
一个复杂的例子
# 变量 源码 编译配置 生成配置 编译特性 生成特性
LOCAL_PATH:= $(call my-dir) #指定到当前目录
include $(CLEAR_VARS) #清除环境变量值
LOCAL_PACKAGE_NAME := Browser2 #apk的名称, build apk特有
LOCAL_SRC_FILES := \
$(call all-java-files-under, src) #源文件,src目录下的所有java文件
LOCAL_SRC_FILES += $(call all-java-files-under, src_pd) #追加其它目录下的源文件
LOCAL_SRC_FILES += com/android/activities/ActionBarAdapter.java #追加其它的源文件
LOCAL_RESOURCE_DIR := \
$(LOCAL_PATH)/res #资源文件目录
LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/res_p #追加资源文件
LOCAL_JAVA_LIBRARIES := org.apache.http.legacy #使用外部jar包,不集成进apk
LOCAL_JAVA_LIBRARIES += org.apache.http.legacy #追加使用外部jar包,不集成进apk
LOCAL_STATIC_JAVA_LIBRARIES := junit #使用外部jar包集成到apk中
LOCAL_STATIC_JAVA_LIBRARIES += glide #追加外部jar包集成到apk
LOCAL_STATIC_ANDROID_LIBRARIES := \ #使用android库并集成到apk中
android-support-v13
LOCAL_JNI_SHARED_LIBRARIES := libjni_tinyplanet # 使用jni库
LOCAL_JETIFIER_ENABLED := true #将依赖包升级到androidx
LOCAL_MODULE_TAGS := optional #指定所有版本都需要编译
LOCAL_SDK_VERSION := current #忽略源码隐藏的API
LOCAL_PRIVATE_PLATFORM_APIS := true #使用源码隐藏的API,和LOCAL_SDK_VERSION只能存在一个
LOCAL_MIN_SDK_VERSION = 21 #指定最小的支持版本,默认为1
LOCAL_OVERRIDES_PACKAGES += Launcher2 #替换掉LLauncher2,使其不参与编译
LOCAL_PRIVILEGED_MODULE = true #设置为true编译的app,即ROM中的system/priv-app/下的app,通过PackageManager拿到的ApplicationInfo,其privateFlags字段标志位为ApplicationInfo.PRIVATE_FLAG_PRIVILEGED。也就是说,LOCAL_PRIVILEGED_MODULE为true编译的app即所谓privileged app(特权app)。
LOCAL_UNINSTALLABLE_MODULE := true #表示是否安装进手机
LOCAL_DEX_PREOPT := false #不提前优化生成oat文件
LOCAL_PROGUARD_ENABLED := full #使用混淆, disabled禁用
LOCAL_PROGUARD_FLAG_FILES := proguard.flags #混淆规则文件
LOCAL_CERTIFICATE := platform #使用平台签名
LOCAL_USE_AAPT2 := true #使用aapt编译
LOCAL_AAPT_FLAGS := --auto-add-overlay #使用aapt自动处理资源冲突
LOCAL_AAPT_FLAGS += --extra-packages com.android.ex.chips #引入额外的资源package名
include $(BUILD_PACKAGE) #编译apk
include $(call all-makefiles-under,$(LOCAL_PATH)) #引用当前目录下子目录的mk文件
一个编译共享库的例子
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libsdk_jni #共享库的名称
LOCAL_MODULE_SUFFIX := .so #指定文件后缀 so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES #制定LOCAL_MODULE_PATH的路径所在
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := \ #源码文件
src/com_SdkNative.cpp \
src/sdk.cpp
LOCAL_C_INCLUDES += \ #源码c文件
$(JNI_H_INCLUDE) \ #jni编译的头文件 libnativehelper/include_jni
system/core/include/ \
LOCAL_MULTILIB := 64 #指定编译64位
LOCAL_REQUIRED_MODULES += lib-armeabi-android #依赖模块
LOCAL_LDLIBS := liblog #链接的库不产生依赖关系,一般用于不需要重新编译的库,如库不存在,则会报错找不到
LOCAL_SHARED_LIBRARIES := \ #依赖共享库,当库不存在时,回去编译这个库
liblog \
libbase \
libutils
include $(BUILD_SHARED_LIBRARY) #编译共享库so
#----------------
include $(CLEAR_VARS)
LOCAL_PROPRIETARY_MODULE := true
LOCAL_COPY_HEADERS := ./include/sdk.h ./include/err.h#指定要copy的头文件,把需要暴露给外部的头文件copy到这个路径下
LOCAL_COPY_HEADERS_TO := pkisdk #指定out/target/product/<>/obj/include/ 下的一个目录
include $(BUILD_COPY_HEADERS) #将LOCAL_COPY_HEADERS复制到LOCAL_COPY_HEADERS_TO目录
Make提供了宏方法, 使用时 $(call
返回文本信息
Make系统的宏方法定义在build/make/core/definitions.mk
中。
常用的宏定义
这个宏返回最后包括的 makefile 的路径,通常是当前 Android.mk
的目录。
LOCAL_PATH:= $(call my-dir)
这个宏返回位于当前 my-dir
路径所有子目录中的 Android.mk
文件列表。
include $(call all-makefiles-under,$(LOCAL_PATH))
在Android.mk
文件中自定义变量要遵守以下规则:
不能以LOCAL_
开头(例如:LOCAL_path
);
不能以PRIVATE_
、NDK_
、APP_
开头
不能全用小写字母(例如:my-dir
)
最重要是不能与NDK编译系统保留的变量名一样。
建议在使用自己定义的变量前加上MY_
前缀
make系统使用include $(BUILD_类型)
来指定编译的目标类型.相关定义在build/make/core/config.mk
中
常用的编译类型
BUILD_PACKAGE
编译一个APk
include $(BUILD_PACKAGE)
BUILD_STATIC_LIBRARY
编译一个静态java库
include $(BUILD_STATIC_LIBRARY)
Makefile中我们经常看到 = ,:=, ?=, +=
这几个赋值运算符,特别是Android系统开发时,在mk文件中这个几个赋值运算都有着不同的意思
运算符 | 操作 |
---|---|
= | 基本的赋值 |
:= | 覆盖之前的值 |
?= | 如果没有被赋值过就赋予=后面的值 |
+= | 添加等号后面的值,等价于字符串添加,中间以空格分开 |
在makefile中打印输出信息的方法是:
如果是$(error xxxxx)将会停止编译
$(warning xxxxx)或者$(error xxxxx)
输出变量方式为:$(warning $(XXX))
Android M开始,google默认使用JACK编译器,默认JACK编译器模式是full模式
这个变量可以禁止使用Jack编译工具链编译该模块。
LOCAL_JACK_ENABLED := disabled
JACK编译器有三种模式:
中间产物的路径: out/target/obj/JAVA_LIBRARIES/frameworks_intermedias/classes.jar
makefile的文件默认配置在build/make
目录下,其中主要的变量及宏定义在如下三个文件中
build/make/core/config.mk
build/make/core/envsetup.mk
build/make/core/definitions.mk
include
变量基本都指向一个特殊的makefile
文件。用include
引用指定变量。大多变量定义在build/make/core/config.mk
文件中
CLEAR_VARS
变量指向一个特殊的 GNU Makefile,后者会清除许多 LOCAL_XXX
变量,例如 LOCAL_MODULE
、LOCAL_SRC_FILES
和 LOCAL_STATIC_LIBRARIES
。 **GNU Makefile 不会清除 LOCAL_PATH
。**此变量必须保留其值,因为系统在单一 GNU Make 执行上下文(其中的所有变量都是全局变量)中解析所有构建控制文件。在描述每个模块之前,必须声明(重新声明)此变量。
include $(CLEAR_VARS)
此变量指向的构建脚本会收集您在 LOCAL_XXX
变量中提供的模块的所有相关信息,以及确定如何根据列出的源文件构建目标可执行文件。请注意,使用此脚本要求至少已经为 LOCAL_MODULE
和 LOCAL_SRC_FILES
赋值
大多数 Android 应用不包含可执行文件,但它们对于创建单元测试和其他调试工具很有用。
include $(BUILD_EXECUTABLE)
此变量指向的构建脚本会收集您在 LOCAL_XXX
变量中提供的模块的所有相关信息,以及确定如何根据列出的源文件构建目标共享库。请注意,使用此脚本要求至少已经为 LOCAL_MODULE
和 LOCAL_SRC_FILES
赋值。
共享库变量会导致构建系统生成扩展名为 .so
的库文件。
include $(BUILD_SHARED_LIBRARY)
用于构建静态库的 BUILD_SHARED_LIBRARY
的变体。构建系统不会将静态库复制到项目/软件包中,但可以使用静态库构建共享库(请参阅下文的 LOCAL_STATIC_LIBRARIES
和 LOCAL_WHOLE_STATIC_LIBRARIES
)。
静态库变量会导致构建系统生成扩展名为 .a
的库
include $(BUILD_STATIC_LIBRARY)
指向用于指定预构建共享库的构建脚本。与 BUILD_SHARED_LIBRARY
和 BUILD_STATIC_LIBRARY
的情况不同,这里的 LOCAL_SRC_FILES
值不能是源文件,而必须是指向预构建共享库的单一路径,例如 foo/libfoo.so
。
也可以使用 LOCAL_PREBUILTS
变量引用另一个模块中的预构建库。
include $(PREBUILT_SHARED_LIBRARY)
与 PREBUILT_SHARED_LIBRARY
相同,但用于预构建静态库。
include $(PREBUILT_STATIC_LIBRARY)
构建APK应用程序
include $(BUILD_PACKAGE)
构建java库,文件后缀为.jar
include $(BUILD_JAVA_LIBRARY)
构建静态java库,文件后缀为.jar
,可以参与其它模块的编译。
include $(BUILD_STATIC_JAVA_LIBRARY)
构建系统会根据 APP_ABI
变量所指定的每个 ABI 分别解析 Android.mk
一次,该变量通常在 Application.mk
文件中定义。如果 APP_ABI
为 all
,构建系统会根据 NDK 支持的每个 ABI 分别解析 Android.mk
一次。
构建系统解析此 Android.mk
文件时指向的 CPU 系列。此变量将是下列其中一项:arm
、arm64
、x86
或 x86_64
ifeq ($(TARGET_ARCH),x86_64)
# ... do something ...
endif
构建系统解析此 Android.mk 文件时指向的 Android API 级别号。例如,Android 5.1 系统映像对应于 Android API 级别 22:android-22。
ifeq ($(TARGET_PLATFORM),android-22)
# ... do something ...
endif
构建系统解析此 Android.mk
文件时指向的 ABI。每个受支持 CPU 和架构的 ABI 设置如下。
CPU 和架构 | 设置 | 支持的指令集 |
---|---|---|
ARMv7 | armeabi-v7a | armeabi Thumb-2 VFPv3-D16 |
ARMv8 AArch64 | arm64-v8a | AArch64 |
i686 | x86 | x86 (IA-32) MMX SSE/2/3 SSSE3 |
x86-64 | x86_64 | x86-64 MMX SSE/2/3 SSSE3 SSE4.1、4.2 POPCNT |
ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
# ... do something ...
endif
此变量用于指定当前文件的路径。必须在 Android.mk
文件开头定义此变量。构建系统提供的宏函数 my-dir
将返回当前目录(Android.mk
文件本身所在的目录)的路径。
LOCAL_PATH := $(call my-dir)
此变量用于存储模块名称。指定的名称在所有模块名称中必须唯一,并且不得包含任何空格。必须先定义该名称,然后才能添加任何脚本(CLEAR_VARS
的脚本除外)。无需添加 lib
前缀或 .so
或 .a
文件扩展名;构建系统会自动执行这些修改。
LOCAL_MODULE := "HelloWorld"
此可选变量能够替换构建系统为其生成的文件默认使用的名称。例如,如果 LOCAL_MODULE
的名称为 foo
,可以强制系统将其生成的文件命名为 libnewfoo
。
对于共享库模块,此示例将生成一个名为 libnewfoo.so
的文件。
无法替换文件路径或文件扩展名。
LOCAL_MODULE := foo
LOCAL_MODULE_FILENAME := libnewfoo
此变量包含构建系统生成模块时所用的源文件列表。只列出构建系统实际传递到编译器的文件,因为构建系统会自动计算所有相关的依赖项。请注意,可以使用相对(相对于 LOCAL_PATH
)和绝对文件路径。
避免使用绝对文件路径;相对路径可以提高 Android.mk
文件的移植性。
务必在构建文件中使用 Unix 样式的正斜杠 (/)。构建系统无法正确处理 Windows 样式的反斜杠 ()。
LOCAL_SRC_FILES := hello-jni.c
可以使用此可选变量为 C++ 源文件指定 .cpp 以外的文件扩展名。例如,以下行将扩展名更改为 .cxx(设置必须包含点)。
LOCAL_CPP_EXTENSION := .cxx
可以使用此变量指定多个扩展名。例如:
LOCAL_CPP_EXTENSION := .cxx .cpp .cc
**可使用此可选变量指明代码依赖于特定 C++ 功能。**它会在构建过程中启用正确的编译器标记和链接器标记。对于预构建的二进制文件,此变量还会声明二进制文件依赖于哪些功能,从而确保最终链接正常运行。建议使用此变量,而不要直接在 LOCAL_CPPFLAGS
定义中启用 -frtti
和 -fexceptions
。
使用此变量可让构建系统对每个模块使用适当的标记。使用 LOCAL_CPPFLAGS
会导致编译器将所有指定的标记用于所有模块,而不管实际需求如何。描述值的顺序无关紧要。
例如,如需指明代码使用 RTTI(运行时类型信息),请写入:
LOCAL_CPP_FEATURES := rtti
如需指明您的代码使用 C++ 异常,请输入:
LOCAL_CPP_FEATURES := exceptions
还可以为此变量指定多个值。例如:
LOCAL_CPP_FEATURES := rtti features
可使用此可选变量指定相对于 NDK root
目录的路径列表,以便在编译所有源文件(C、C++ 和 Assembly)时添加到 include 搜索路径中。
LOCAL_C_INCLUDES := sources/foo
或者
LOCAL_C_INCLUDES := $(LOCAL_PATH)/<subdirectory>/foo
需要在通过 LOCAL_CFLAGS
或 LOCAL_CPPFLAGS
设置任何对应的包含标记前定义此变量。
在使用 ndk-gdb 启动原生调试时,构建系统也会自动使用 LOCAL_C_INCLUDES
路径。
此可选变量用于设置在构建 C 和 C++ 源文件时构建系统要传递的编译器标记。这样就可以指定额外的宏定义或编译选项。可以使用 LOCAL_CPPFLAGS
仅为 C++ 指定标记。
请勿尝试在 Android.mk 文件中更改优化/调试级别。构建系统可以使用 Application.mk 文件中的相关信息自动处理此设置。这样,构建系统就可以生成供调试期间使用的有用数据文件。
可通过输入以下代码指定额外的 include 路径:但是,最好使用 LOCAL_C_INCLUDES
,因为这样也可以使用可用于 ndk-gdb 原生调试的路径。
LOCAL_CFLAGS += -I<path>,
只构建 C++ 源文件时将传递的一组可选编译器标记。它们将出现在编译器命令行中的 LOCAL_CFLAGS 后面。使用 LOCAL_CFLAGS 为 C 和 C++ 指定标记。
LOCAL_CPPFLAGS := -Wall -Werror
此变量用于存储当前模块依赖的静态库模块列表。
如果当前模块是共享库或可执行文件,此变量将强制这些库链接到生成的二进制文件。
如果当前模块是静态库,此变量只是指出依赖于当前模块的其他模块也会依赖于列出的库。
LOCAL_STATIC_LIBRARIES := libjpeg_static_ndk
此变量会列出此模块在运行时依赖的共享库模块。此信息是链接时必需的信息,用于将相应的信息嵌入到生成的文件中。
LOCAL_SHARED_LIBRARIES := liblog libnativehelper
此变量是 LOCAL_STATIC_LIBRARIES 的变体,表示链接器应将相关的库模块视为完整归档。
多个静态库之间存在循环依赖关系时,此变量十分有用。使用此变量构建共享库时,它将强制构建系统将静态库中的所有对象文件添加到最终二进制文件。但是,生成可执行文件时不会发生这种情况。
LOCAL_WHOLE_STATIC_LIBRARIES := libadbd
此变量列出了在构建共享库或可执行文件时使用的额外链接器标记。利用此变量,您可使用 -l 前缀传递特定系统库的名称。
如果为静态库定义此变量,构建系统会忽略此变量,并且 ndk-build
显示一则警告。
例如,以下示例指示链接器生成在加载时链接到 /system/lib/libz.so 的模块:
LOCAL_LDLIBS := -lz
此变量列出了构建系统在构建共享库或可执行文件时使用的其他链接器标记。
如果为静态库定义此变量,构建系统会忽略此变量,并且 ndk-build 会显示一则警告。
例如,若要在 ARM/X86 上使用 ld.bfd 链接器:
LOCAL_LDFLAGS += -fuse-ld=bfd
默认情况下,如果构建系统在尝试构建共享库时遇到未定义的引用,将会抛出“未定义的符号”错误。此错误可帮助捕获源代码中的错误。
如果为静态库定义此变量,构建系统会忽略此变量,并且 ndk-build 会显示一则警告。
如需停用此检查,请将此变量设置为 true
。请注意,此设置可能会导致共享库在运行时加载。
默认情况下,构建系统会以 thumb 模式生成 ARM 目标二进制文件,其中每条指令都是 16 位宽,并与 thumb/ 目录中的 STL 库链接。将此变量定义为 arm 会强制构建系统以 32 位 arm 模式生成模块的对象文件。
LOCAL_ARM_MODE := arm
也可以对源文件名附加 .arm
后缀,指示构建系统仅以 arm
模式构建特定的源文件。例如,以下示例指示构建系统始终以 ARM 模式编译 bar.c
,但根据 LOCAL_ARM_MODE
的值构建 foo.c
。
LOCAL_SRC_FILES := foo.c bar.c.arm
也可以在 Application.mk 文件中将 APP_OPTIM
设置为 debug
,强制构建系统生成 ARM 二进制文件。指定 debug
会强制构建 ARM,因为工具链调试程序无法正确处理 Thumb 代码。
LOCAL_ARM_NEON
此变量仅在以 armeabi-v7a ABI 为目标时才有意义。它允许在 C 和 C++ 源文件中使用 ARM Advanced SIMD (NEON) 编译器内建函数,以及在 Assembly 文件中使用 NEON 指令。
LOCAL_ARM_NEON=true
默认情况下,构建系统会在编译代码时保护格式字符串。这样的话,如果 printf 样式的函数中使用了非常量格式的字符串,就会强制引发编译器错误。此保护默认启用,但也可通过将此变量的值设置为 true 将其停用。如果没有必要的原因,不建议停用。
LOCAL_DISABLE_FORMAT_STRING_CHECKS=true
此变量用于记录一组 C/C++ 编译器标记,这些标记将添加到通过 LOCAL_STATIC_LIBRARIES 或 LOCAL_SHARED_LIBRARIES 变量使用此模块的任何其他模块的 LOCAL_CFLAGS 定义中。
LOCAL_EXPORT_CFLAGS := -Idevelopment/host/windows/usb/api
此变量与 LOCAL_EXPORT_CFLAGS 相同,但仅适用于 C++ 标记。
LOCAL_EXPORT_CPPFLAGS:=-std=c++11
此变量与 LOCAL_EXPORT_CFLAGS 相同,但适用于 C include 路径。
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
此变量与 LOCAL_EXPORT_CFLAGS 相同,用于指示构建系统将特定系统库的名称传递到编译器。
LOCAL_EXPORT_LDLIBS := -llog -lgcc
当模块有很多源文件和/或依赖的静态或共享库时,请将此变量设置为 true
。这样会强制构建系统将 @
语法用于包含中间对象文件或链接库的归档。
此功能在 Windows 上可能很有用,在 Windows 上,命令行最多只接受 8191 个字符,这对于复杂的项目来说可能太少。它还会影响个别源文件的编译,而且将几乎所有编译器标记都放在列表文件内。
不建议默认启用此功能,因为它会减慢构建速度。
在非静态库模块或预构建的静态库模块中,将会忽略此变量。
将此变量定义为一个 shell 命令,供构建系统用于过滤根据 LOCAL_SRC_FILES 指定的文件提取或生成的汇编文件。
指定C编译器
指定C++编译器
Application编译常用
此变量用于指定依赖的java动态库。指明依赖的共享Jar包, 共享jar包参与编译不会打到apk中
LOCAL_JAVA_LIBRARIES += \
androidx.annotation_annotation
此变量用于指定依赖的android共享库
LOCAL_SHARED_ANDROID_LIBRARIES := \
androidx.appcompat_appcompat \
此变量用于指定aapt规则
LOCAL_AAPT_FLAGS += \
--auto-add-overlay \
--extra-packages androidx.appcompat \
此变量用于指定静态JAVA库。 静态jar包参与编译并打到apk中
LOCAL_STATIC_JAVA_LIBRARIES := \
androidx.annotation_annotation \
此变量用于指定资源文件的列表
LOCAL_RESOURCE_DIR := frameworks/support/v7/appcompat/res
此变量用于指定AndroidManifest.xml
清单文件
LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml
此变量用于指定Application的模块名称,打包文件以.apk
结尾。
LOCAL_PACKAGE_NAME := MyApp
此变量用于指定前面类型
LOCAL_CERTIFICATE := platform
此变量用于指定是否启用混淆
full 默认, 将该工程代码全部混淆
disabled 禁用混淆
LOCAL_PROGUARD_ENABLED := disabled
此变量用于指定混淆规则的文件
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
此变量用于指定什么版本下编译
LOCAL_MODULE_TAGS := optional
指定编译时的sdk类型
LOCAL_PRIVATE_PLATFORM_APIS
冲突LOCAL_SDK_VERSION := current
设置后,会使用sdk的hide的api來编译
LOCAL_PRIVATE_PLATFORM_APIS := true
如果预置的APK,要覆盖原生apk,则需在android.mk中的添加LOCAL_OVERRIDES_PACKAGES,此变量可以使其他的模块不加入编译。
LOCAL_OVERRIDES_PACKAGES := Settings
这个变量设置为false可以使整个系统使用提前优化的时候,某个app不使用提前优化。在Android.mk中给该变量赋值为false,则编译生成的文件没有oat文件,也就意味着没有被提前优化。
LOCAL_DEX_PREOPT := false
指定模块运行所依赖的模块。当编译整个android源码时,如果模块在编译路径中(即可以编译打包到system.img下),则会自动编译模块,并且打包到system.img
,如果不是编译整个源码,只是mm。则不会编译模块生成相应的文件
LOCAL_REQUIRED_MODULES += android-support-v4
在JNI的编译中,如果你要在你的Java代码中引用JNI中的共享库
控制生成路径到system/vendor/lib
,否则就是system/lib
LOCAL_PROPRIETARY_MODULE = true
so库是否集成进apk
LOCAL_MODULE_INCLUDE_LIBRARY := true
函数通过$(call
调用,获取返回的文本内容。函数宏的定义在build/make/core/definitions.mk
这个宏返回最后包括的 makefile 的路径,通常是当前 Android.mk
的目录。my-dir
可用于在 Android.mk
文件开头定义 LOCAL_PATH
。
由于 GNU Make 的工作方式,这个宏实际返回的是构建系统解析构建脚本时包含的最后一个 makefile 的路径。因此,包括其他文件后就不应调用 my-dir
。
LOCAL_PATH := $(call my-dir)
返回位于当前 my-dir 路径所有子目录中的 Android.mk 文件列表。
利用此函数,可以为构建系统提供深度嵌套的源目录层次结构。默认情况下,NDK 只在 Android.mk
文件所在的目录中查找文件。
返回当前 makefile(构建系统从中调用函数)的路径。
返回包含树中父 makefile 的路径(包含当前 makefile 的 makefile 的路径)。
返回包含树中祖父 makefile 的路径(包含当前父 makefile 的 makefile 的路径)。
此函数用于按模块名称来查找和包含模块的 Android.mk 文件。 构建系统在 NDK_MODULE_PATH
环境变量所引用的目录列表中查找具有
标记的模块,并且自动包括其 Android.mk
文件。
$(call import-module, <name>)
终端打印输出信息
$(warning xxxxx)
终端打印输出信息,会停止编译
$(error xxxxx)
查找命名目录下的所有java文件。
LOCAL_SRC_FILES := $(call all-java-files-under, src)
查找命名目录下的所有c文件
LOCAL_SRC_FILES += $(call all-c-files-under, src)
LOCAL_SRC_FILES += $(call all-cpp-files-under, src)
查找命名目录下的所有aidl文件
LOCAL_SRC_FILES := $(call all-Iaidl-files-under, aidl)