android mk常用代码

android mk常用代码

文章目录

  • android mk常用代码
    • Android的[mk](https://developer.android.google.cn/ndk/guides/android_mk)文件
      • Android的mk语法例子
      • 宏方法
      • 变量定义规则
      • 编译类型
      • 赋值运算
    • mk文件中的常用方法
      • 输出log
      • JACK编译器
    • mk变量及宏说明
      • include变量
        • CLEAR_VARS
        • BUILD_EXECUTABLE
        • BUILD_SHARED_LIBRARY
        • BUILD_STATIC_LIBRARY
        • PREBUILT_SHARED_LIBRARY
        • PREBUILT_STATIC_LIBRARY
        • BUILD_PACKAGE
        • BUILD_JAVA_LIBRARY
        • BUILD_STATIC_JAVA_LIBRARY
      • 目标信息变量
        • TARGET_ARCH
        • TARGET_PLATFORM
        • TARGET_ARCH_ABI
      • 模块描述变量
        • LOCAL_PATH
        • LOCAL_MODULE
        • LOCAL_MODULE_FILENAME
        • LOCAL_SRC_FILES
        • LOCAL_CPP_EXTENSION
        • LOCAL_CPP_FEATURES
        • LOCAL_C_INCLUDES
        • LOCAL_CFLAGS
        • LOCAL_CPPFLAGS
        • LOCAL_STATIC_LIBRARIES
        • LOCAL_SHARED_LIBRARIES
        • LOCAL_WHOLE_STATIC_LIBRARIES
        • LOCAL_LDLIBS
        • LOCAL_LDFLAGS
        • LOCAL_ALLOW_UNDEFINED_SYMBOLS
        • LOCAL_ARM_MODE
        • LOCAL_DISABLE_FORMAT_STRING_CHECKS
        • LOCAL_EXPORT_CFLAGS
        • LOCAL_EXPORT_CPPFLAGS
        • LOCAL_EXPORT_C_INCLUDES
        • LOCAL_EXPORT_LDLIBS
        • LOCAL_SHORT_COMMANDS
        • LOCAL_FILTER_ASM
        • LOCAL_CC
        • LOCAL_CXX
        • LOCAL_JAVA_LIBRARIES
        • LOCAL_SHARED_ANDROID_LIBRARIES
        • LOCAL_AAPT_FLAGS
        • LOCAL_STATIC_JAVA_LIBRARIES
        • LOCAL_RESOURCE_DIR
        • LOCAL_MANIFEST_FILE
        • LOCAL_PACKAGE_NAME
        • LOCAL_CERTIFICATE
        • LOCAL_PROGUARD_ENABLED
        • LOCAL_PROGUARD_FLAG_FILES
        • LOCAL_MODULE_TAGS
        • LOCAL_SDK_VERSION
        • LOCAL_PRIVATE_PLATFORM_APIS
        • LOCAL_OVERRIDES_PACKAGES
        • LOCAL_DEX_PREOPT
        • LOCAL_REQUIRED_MODULES
        • LOCAL_JNI_SHARED_LIBRARIES
        • LOCAL_PROPRIETARY_MODULE
        • LOCAL_MODULE_INCLUDE_LIBRARY
      • 函数宏
        • my-dir
        • all-subdir-makefiles
        • this-makefile
        • parent-makefile
        • grand-parent-makefile
        • import-module
        • warning
        • error
        • all-java-files-under
        • all-c-files-under
        • all-cpp-files-under
        • all-Iaidl-files-under

Android的mk文件

Android早期使用makefile来编译系统源码,在一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,也可以执行操作系统的命令。

make是一个命令工具,它解释Makefile 中的指令。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

Android.mk文件用来告知Build系统关于Source的信息。 Android.mk将是GNU Makefile的一部分,且将被Build System解析一次或多次。

Android的mk语法例子

一个简单的例子

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中。

常用的宏定义

  • my-dir

这个宏返回最后包括的 makefile 的路径,通常是当前 Android.mk 的目录。

LOCAL_PATH:= $(call my-dir)
  • all-makefiles-under

这个宏返回位于当前 my-dir 路径所有子目录中的 Android.mk 文件列表。

include $(call all-makefiles-under,$(LOCAL_PATH)) 

变量定义规则

Android.mk文件中自定义变量要遵守以下规则:

  1. 不能以LOCAL_开头(例如:LOCAL_path);

  2. 不能以PRIVATE_NDK_APP_开头

  3. 不能全用小写字母(例如:my-dir)

  4. 最重要是不能与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文件中这个几个赋值运算都有着不同的意思

运算符 操作
= 基本的赋值
:= 覆盖之前的值
?= 如果没有被赋值过就赋予=后面的值
+= 添加等号后面的值,等价于字符串添加,中间以空格分开

mk文件中的常用方法

输出log

在makefile中打印输出信息的方法是:

如果是$(error xxxxx)将会停止编译

$(warning xxxxx)或者$(error xxxxx)
输出变量方式为:$(warning  $(XXX))

JACK编译器

Android M开始,google默认使用JACK编译器,默认JACK编译器模式是full模式
这个变量可以禁止使用Jack编译工具链编译该模块。

LOCAL_JACK_ENABLED := disabled
JACK编译器有三种模式:

  • disabled 指关闭JACK编译,
  • full 指全部编译,即每次编译,都会将所有的code全部编译
  • incremental 指增量编译,即只会编译修改的代码。incremental模式默认是关闭的,需要设置

中间产物的路径: out/target/obj/JAVA_LIBRARIES/frameworks_intermedias/classes.jar

mk变量及宏说明

makefile的文件默认配置在build/make目录下,其中主要的变量及宏定义在如下三个文件中

build/make/core/config.mk

build/make/core/envsetup.mk

build/make/core/definitions.mk

include变量

include变量基本都指向一个特殊的makefile文件。用include引用指定变量。大多变量定义在build/make/core/config.mk文件中

CLEAR_VARS

CLEAR_VARS 变量指向一个特殊的 GNU Makefile,后者会清除许多 LOCAL_XXX 变量,例如 LOCAL_MODULELOCAL_SRC_FILESLOCAL_STATIC_LIBRARIES。 **GNU Makefile 不会清除 LOCAL_PATH。**此变量必须保留其值,因为系统在单一 GNU Make 执行上下文(其中的所有变量都是全局变量)中解析所有构建控制文件。在描述每个模块之前,必须声明(重新声明)此变量。

include $(CLEAR_VARS)

BUILD_EXECUTABLE

此变量指向的构建脚本会收集您在 LOCAL_XXX 变量中提供的模块的所有相关信息,以及确定如何根据列出的源文件构建目标可执行文件。请注意,使用此脚本要求至少已经为 LOCAL_MODULELOCAL_SRC_FILES 赋值

大多数 Android 应用不包含可执行文件,但它们对于创建单元测试和其他调试工具很有用。

include $(BUILD_EXECUTABLE)

BUILD_SHARED_LIBRARY

此变量指向的构建脚本会收集您在 LOCAL_XXX 变量中提供的模块的所有相关信息,以及确定如何根据列出的源文件构建目标共享库。请注意,使用此脚本要求至少已经为 LOCAL_MODULELOCAL_SRC_FILES 赋值。

共享库变量会导致构建系统生成扩展名为 .so 的库文件。

include $(BUILD_SHARED_LIBRARY)

BUILD_STATIC_LIBRARY

用于构建静态库的 BUILD_SHARED_LIBRARY 的变体。构建系统不会将静态库复制到项目/软件包中,但可以使用静态库构建共享库(请参阅下文的 LOCAL_STATIC_LIBRARIESLOCAL_WHOLE_STATIC_LIBRARIES)。

静态库变量会导致构建系统生成扩展名为 .a 的库

include $(BUILD_STATIC_LIBRARY)

PREBUILT_SHARED_LIBRARY

指向用于指定预构建共享库的构建脚本。与 BUILD_SHARED_LIBRARYBUILD_STATIC_LIBRARY 的情况不同,这里的 LOCAL_SRC_FILES 值不能是源文件,而必须是指向预构建共享库的单一路径,例如 foo/libfoo.so

也可以使用 LOCAL_PREBUILTS 变量引用另一个模块中的预构建库。

include $(PREBUILT_SHARED_LIBRARY)

PREBUILT_STATIC_LIBRARY

PREBUILT_SHARED_LIBRARY 相同,但用于预构建静态库

include $(PREBUILT_STATIC_LIBRARY)

BUILD_PACKAGE

构建APK应用程序

include $(BUILD_PACKAGE)

BUILD_JAVA_LIBRARY

构建java库,文件后缀为.jar

include $(BUILD_JAVA_LIBRARY)

BUILD_STATIC_JAVA_LIBRARY

构建静态java库,文件后缀为.jar,可以参与其它模块的编译。

include $(BUILD_STATIC_JAVA_LIBRARY)

目标信息变量

构建系统会根据 APP_ABI 变量所指定的每个 ABI 分别解析 Android.mk 一次,该变量通常在 Application.mk 文件中定义。如果 APP_ABIall,构建系统会根据 NDK 支持的每个 ABI 分别解析 Android.mk 一次。

TARGET_ARCH

构建系统解析此 Android.mk 文件时指向的 CPU 系列。此变量将是下列其中一项:armarm64x86x86_64

ifeq ($(TARGET_ARCH),x86_64)
    # ... do something ...
endif

TARGET_PLATFORM

构建系统解析此 Android.mk 文件时指向的 Android API 级别号。例如,Android 5.1 系统映像对应于 Android API 级别 22:android-22。

ifeq ($(TARGET_PLATFORM),android-22)
    # ... do something ...
endif

TARGET_ARCH_ABI

构建系统解析此 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

模块描述变量

LOCAL_PATH

此变量用于指定当前文件的路径。必须在 Android.mk 文件开头定义此变量。构建系统提供的宏函数 my-dir 将返回当前目录(Android.mk 文件本身所在的目录)的路径。

LOCAL_PATH := $(call my-dir)

LOCAL_MODULE

此变量用于存储模块名称。指定的名称在所有模块名称中必须唯一,并且不得包含任何空格。必须先定义该名称,然后才能添加任何脚本(CLEAR_VARS 的脚本除外)。无需添加 lib 前缀或 .so.a 文件扩展名;构建系统会自动执行这些修改。

LOCAL_MODULE := "HelloWorld"

LOCAL_MODULE_FILENAME

此可选变量能够替换构建系统为其生成的文件默认使用的名称。例如,如果 LOCAL_MODULE 的名称为 foo,可以强制系统将其生成的文件命名为 libnewfoo

对于共享库模块,此示例将生成一个名为 libnewfoo.so 的文件。

无法替换文件路径或文件扩展名。

LOCAL_MODULE := foo
LOCAL_MODULE_FILENAME := libnewfoo

LOCAL_SRC_FILES

此变量包含构建系统生成模块时所用的源文件列表。只列出构建系统实际传递到编译器的文件,因为构建系统会自动计算所有相关的依赖项。请注意,可以使用相对(相对于 LOCAL_PATH)和绝对文件路径。

避免使用绝对文件路径;相对路径可以提高 Android.mk 文件的移植性。

务必在构建文件中使用 Unix 样式的正斜杠 (/)。构建系统无法正确处理 Windows 样式的反斜杠 ()。

LOCAL_SRC_FILES := hello-jni.c

LOCAL_CPP_EXTENSION

可以使用此可选变量为 C++ 源文件指定 .cpp 以外的文件扩展名。例如,以下行将扩展名更改为 .cxx(设置必须包含点)。

LOCAL_CPP_EXTENSION := .cxx

可以使用此变量指定多个扩展名。例如:

LOCAL_CPP_EXTENSION := .cxx .cpp .cc

LOCAL_CPP_FEATURES

**可使用此可选变量指明代码依赖于特定 C++ 功能。**它会在构建过程中启用正确的编译器标记和链接器标记。对于预构建的二进制文件,此变量还会声明二进制文件依赖于哪些功能,从而确保最终链接正常运行。建议使用此变量,而不要直接在 LOCAL_CPPFLAGS 定义中启用 -frtti-fexceptions

使用此变量可让构建系统对每个模块使用适当的标记。使用 LOCAL_CPPFLAGS 会导致编译器将所有指定的标记用于所有模块,而不管实际需求如何。描述值的顺序无关紧要。

例如,如需指明代码使用 RTTI(运行时类型信息),请写入:

LOCAL_CPP_FEATURES := rtti

如需指明您的代码使用 C++ 异常,请输入:

LOCAL_CPP_FEATURES := exceptions

还可以为此变量指定多个值。例如:

LOCAL_CPP_FEATURES := rtti features

LOCAL_C_INCLUDES

可使用此可选变量指定相对于 NDK root 目录的路径列表,以便在编译所有源文件(C、C++ 和 Assembly)时添加到 include 搜索路径中。

LOCAL_C_INCLUDES := sources/foo

或者

LOCAL_C_INCLUDES := $(LOCAL_PATH)/<subdirectory>/foo

需要在通过 LOCAL_CFLAGSLOCAL_CPPFLAGS 设置任何对应的包含标记前定义此变量。

在使用 ndk-gdb 启动原生调试时,构建系统也会自动使用 LOCAL_C_INCLUDES 路径。

LOCAL_CFLAGS

此可选变量用于设置在构建 C 和 C++ 源文件时构建系统要传递的编译器标记。这样就可以指定额外的宏定义或编译选项。可以使用 LOCAL_CPPFLAGS 仅为 C++ 指定标记。

请勿尝试在 Android.mk 文件中更改优化/调试级别。构建系统可以使用 Application.mk 文件中的相关信息自动处理此设置。这样,构建系统就可以生成供调试期间使用的有用数据文件。

可通过输入以下代码指定额外的 include 路径:但是,最好使用 LOCAL_C_INCLUDES,因为这样也可以使用可用于 ndk-gdb 原生调试的路径。

LOCAL_CFLAGS += -I<path>,

LOCAL_CPPFLAGS

只构建 C++ 源文件时将传递的一组可选编译器标记。它们将出现在编译器命令行中的 LOCAL_CFLAGS 后面。使用 LOCAL_CFLAGS 为 C 和 C++ 指定标记。

LOCAL_CPPFLAGS := -Wall -Werror

LOCAL_STATIC_LIBRARIES

此变量用于存储当前模块依赖的静态库模块列表。

如果当前模块是共享库或可执行文件,此变量将强制这些库链接到生成的二进制文件。

如果当前模块是静态库,此变量只是指出依赖于当前模块的其他模块也会依赖于列出的库。

LOCAL_STATIC_LIBRARIES := libjpeg_static_ndk

LOCAL_SHARED_LIBRARIES

此变量会列出此模块在运行时依赖的共享库模块。此信息是链接时必需的信息,用于将相应的信息嵌入到生成的文件中。

LOCAL_SHARED_LIBRARIES := liblog libnativehelper

LOCAL_WHOLE_STATIC_LIBRARIES

此变量是 LOCAL_STATIC_LIBRARIES 的变体,表示链接器应将相关的库模块视为完整归档。

多个静态库之间存在循环依赖关系时,此变量十分有用。使用此变量构建共享库时,它将强制构建系统将静态库中的所有对象文件添加到最终二进制文件。但是,生成可执行文件时不会发生这种情况。

LOCAL_WHOLE_STATIC_LIBRARIES := libadbd

LOCAL_LDLIBS

此变量列出了在构建共享库或可执行文件时使用的额外链接器标记。利用此变量,您可使用 -l 前缀传递特定系统库的名称。

如果为静态库定义此变量,构建系统会忽略此变量,并且 ndk-build 显示一则警告。

例如,以下示例指示链接器生成在加载时链接到 /system/lib/libz.so 的模块:

LOCAL_LDLIBS := -lz

LOCAL_LDFLAGS

此变量列出了构建系统在构建共享库或可执行文件时使用的其他链接器标记。

如果为静态库定义此变量,构建系统会忽略此变量,并且 ndk-build 会显示一则警告。

例如,若要在 ARM/X86 上使用 ld.bfd 链接器:

LOCAL_LDFLAGS += -fuse-ld=bfd

LOCAL_ALLOW_UNDEFINED_SYMBOLS

默认情况下,如果构建系统在尝试构建共享库时遇到未定义的引用,将会抛出“未定义的符号”错误。此错误可帮助捕获源代码中的错误。

如果为静态库定义此变量,构建系统会忽略此变量,并且 ndk-build 会显示一则警告。

如需停用此检查,请将此变量设置为 true。请注意,此设置可能会导致共享库在运行时加载。

LOCAL_ARM_MODE

默认情况下,构建系统会以 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

LOCAL_DISABLE_FORMAT_STRING_CHECKS

默认情况下,构建系统会在编译代码时保护格式字符串。这样的话,如果 printf 样式的函数中使用了非常量格式的字符串,就会强制引发编译器错误。此保护默认启用,但也可通过将此变量的值设置为 true 将其停用。如果没有必要的原因,不建议停用。

LOCAL_DISABLE_FORMAT_STRING_CHECKS=true

LOCAL_EXPORT_CFLAGS

此变量用于记录一组 C/C++ 编译器标记,这些标记将添加到通过 LOCAL_STATIC_LIBRARIES 或 LOCAL_SHARED_LIBRARIES 变量使用此模块的任何其他模块的 LOCAL_CFLAGS 定义中。

LOCAL_EXPORT_CFLAGS := -Idevelopment/host/windows/usb/api

LOCAL_EXPORT_CPPFLAGS

此变量与 LOCAL_EXPORT_CFLAGS 相同,但仅适用于 C++ 标记。

LOCAL_EXPORT_CPPFLAGS:=-std=c++11

LOCAL_EXPORT_C_INCLUDES

此变量与 LOCAL_EXPORT_CFLAGS 相同,但适用于 C include 路径。

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)

LOCAL_EXPORT_LDLIBS

此变量与 LOCAL_EXPORT_CFLAGS 相同,用于指示构建系统将特定系统库的名称传递到编译器。

LOCAL_EXPORT_LDLIBS := -llog -lgcc

LOCAL_SHORT_COMMANDS

当模块有很多源文件和/或依赖的静态或共享库时,请将此变量设置为 true。这样会强制构建系统将 @ 语法用于包含中间对象文件或链接库的归档。

此功能在 Windows 上可能很有用,在 Windows 上,命令行最多只接受 8191 个字符,这对于复杂的项目来说可能太少。它还会影响个别源文件的编译,而且将几乎所有编译器标记都放在列表文件内。

不建议默认启用此功能,因为它会减慢构建速度。

在非静态库模块或预构建的静态库模块中,将会忽略此变量。

LOCAL_FILTER_ASM

将此变量定义为一个 shell 命令,供构建系统用于过滤根据 LOCAL_SRC_FILES 指定的文件提取或生成的汇编文件。

LOCAL_CC

指定C编译器

LOCAL_CXX

指定C++编译器





Application编译常用

LOCAL_JAVA_LIBRARIES

此变量用于指定依赖的java动态库。指明依赖的共享Jar包, 共享jar包参与编译不会打到apk中

LOCAL_JAVA_LIBRARIES += \
    androidx.annotation_annotation

LOCAL_SHARED_ANDROID_LIBRARIES

此变量用于指定依赖的android共享库

LOCAL_SHARED_ANDROID_LIBRARIES := \
	androidx.appcompat_appcompat \

LOCAL_AAPT_FLAGS

此变量用于指定aapt规则

LOCAL_AAPT_FLAGS += \
	--auto-add-overlay \
	--extra-packages androidx.appcompat \

LOCAL_STATIC_JAVA_LIBRARIES

此变量用于指定静态JAVA库。 静态jar包参与编译并打到apk中

LOCAL_STATIC_JAVA_LIBRARIES := \
		androidx.annotation_annotation \

LOCAL_RESOURCE_DIR

此变量用于指定资源文件的列表

LOCAL_RESOURCE_DIR := frameworks/support/v7/appcompat/res

LOCAL_MANIFEST_FILE

此变量用于指定AndroidManifest.xml清单文件

LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml

LOCAL_PACKAGE_NAME

此变量用于指定Application的模块名称,打包文件以.apk结尾。

LOCAL_PACKAGE_NAME := MyApp

LOCAL_CERTIFICATE

此变量用于指定前面类型

LOCAL_CERTIFICATE := platform

LOCAL_PROGUARD_ENABLED

此变量用于指定是否启用混淆

  • full 默认, 将该工程代码全部混淆

  • disabled 禁用混淆

LOCAL_PROGUARD_ENABLED := disabled

LOCAL_PROGUARD_FLAG_FILES

此变量用于指定混淆规则的文件

LOCAL_PROGUARD_FLAG_FILES := proguard.flags

LOCAL_MODULE_TAGS

此变量用于指定什么版本下编译

LOCAL_MODULE_TAGS := optional
  • user: 指该模块只在user版本下才编译
  • eng: 指该模块只在eng版本下才编译
  • tests: 指该模块只在tests版本下才编译
  • optional:指该模块在所有版本下都编译

LOCAL_SDK_VERSION

指定编译时的sdk类型

  • current 编译时忽略系统隐藏类(@hide), 如果有这个配置会使得编译的应用不能访问hide的api, 和LOCAL_PRIVATE_PLATFORM_APIS冲突
  • system_current
  • test_current
  • core_current
LOCAL_SDK_VERSION := current

LOCAL_PRIVATE_PLATFORM_APIS

设置后,会使用sdk的hide的api來编译

LOCAL_PRIVATE_PLATFORM_APIS := true

LOCAL_OVERRIDES_PACKAGES

如果预置的APK,要覆盖原生apk,则需在android.mk中的添加LOCAL_OVERRIDES_PACKAGES,此变量可以使其他的模块不加入编译。

LOCAL_OVERRIDES_PACKAGES := Settings

LOCAL_DEX_PREOPT

这个变量设置为false可以使整个系统使用提前优化的时候,某个app不使用提前优化。在Android.mk中给该变量赋值为false,则编译生成的文件没有oat文件,也就意味着没有被提前优化。

LOCAL_DEX_PREOPT := false

LOCAL_REQUIRED_MODULES

指定模块运行所依赖的模块。当编译整个android源码时,如果模块在编译路径中(即可以编译打包到system.img下),则会自动编译模块,并且打包到system.img,如果不是编译整个源码,只是mm。则不会编译模块生成相应的文件

LOCAL_REQUIRED_MODULES += android-support-v4

LOCAL_JNI_SHARED_LIBRARIES

在JNI的编译中,如果你要在你的Java代码中引用JNI中的共享库

LOCAL_PROPRIETARY_MODULE

控制生成路径到system/vendor/lib,否则就是system/lib

LOCAL_PROPRIETARY_MODULE = true

LOCAL_MODULE_INCLUDE_LIBRARY

so库是否集成进apk

LOCAL_MODULE_INCLUDE_LIBRARY := true

函数宏

函数通过$(call )调用,获取返回的文本内容。函数宏的定义在build/make/core/definitions.mk

my-dir

这个宏返回最后包括的 makefile 的路径,通常是当前 Android.mk 的目录。my-dir 可用于在 Android.mk 文件开头定义 LOCAL_PATH

由于 GNU Make 的工作方式,这个宏实际返回的是构建系统解析构建脚本时包含的最后一个 makefile 的路径。因此,包括其他文件后就不应调用 my-dir

LOCAL_PATH := $(call my-dir)

all-subdir-makefiles

返回位于当前 my-dir 路径所有子目录中的 Android.mk 文件列表。

利用此函数,可以为构建系统提供深度嵌套的源目录层次结构。默认情况下,NDK 只在 Android.mk 文件所在的目录中查找文件。

this-makefile

返回当前 makefile(构建系统从中调用函数)的路径。

parent-makefile

返回包含树中父 makefile 的路径(包含当前 makefile 的 makefile 的路径)。

grand-parent-makefile

返回包含树中祖父 makefile 的路径(包含当前父 makefile 的 makefile 的路径)。

import-module

此函数用于按模块名称来查找和包含模块的 Android.mk 文件。 构建系统在 NDK_MODULE_PATH 环境变量所引用的目录列表中查找具有 标记的模块,并且自动包括其 Android.mk 文件。

$(call import-module, <name>)

warning

终端打印输出信息

$(warning xxxxx)

error

终端打印输出信息,会停止编译

$(error xxxxx)

all-java-files-under

查找命名目录下的所有java文件。

LOCAL_SRC_FILES := $(call all-java-files-under, src)

all-c-files-under

查找命名目录下的所有c文件

LOCAL_SRC_FILES += $(call all-c-files-under, src)

all-cpp-files-under

LOCAL_SRC_FILES += $(call all-cpp-files-under, src)

all-Iaidl-files-under

查找命名目录下的所有aidl文件

LOCAL_SRC_FILES := $(call all-Iaidl-files-under, aidl)

你可能感兴趣的:(Android开发,android,android,studio,ide)