• android mk常用代码


    android mk常用代码

    文章目录

    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文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    一个复杂的例子

    # 变量 源码 编译配置 生成配置 编译特性 生成特性
    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文件
    
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    一个编译共享库的例子

    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目录
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    宏方法

    Make提供了宏方法, 使用时 $(call ) 返回文本信息

    Make系统的宏方法定义在build/make/core/definitions.mk中。

    常用的宏定义

    • my-dir

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

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

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

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

    变量定义规则

    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)
      
      • 1
    • BUILD_STATIC_LIBRARY
      编译一个静态java库

      include $(BUILD_STATIC_LIBRARY)
      
      • 1

    赋值运算

    Makefile中我们经常看到 = ,:=, ?=, +=这几个赋值运算符,特别是Android系统开发时,在mk文件中这个几个赋值运算都有着不同的意思

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

    mk文件中的常用方法

    输出log

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

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

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

    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)
    
    • 1
    BUILD_EXECUTABLE

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

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

    include $(BUILD_EXECUTABLE)
    
    • 1
    BUILD_SHARED_LIBRARY

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

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

    include $(BUILD_SHARED_LIBRARY)
    
    • 1
    BUILD_STATIC_LIBRARY

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

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

    include $(BUILD_STATIC_LIBRARY)
    
    • 1
    PREBUILT_SHARED_LIBRARY

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

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

    include $(PREBUILT_SHARED_LIBRARY)
    
    • 1
    PREBUILT_STATIC_LIBRARY

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

    include $(PREBUILT_STATIC_LIBRARY)
    
    • 1
    BUILD_PACKAGE

    构建APK应用程序

    include $(BUILD_PACKAGE)
    
    • 1
    BUILD_JAVA_LIBRARY

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

    include $(BUILD_JAVA_LIBRARY)
    
    • 1
    BUILD_STATIC_JAVA_LIBRARY

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

    include $(BUILD_STATIC_JAVA_LIBRARY)
    
    • 1

    目标信息变量

    构建系统会根据 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
    
    • 1
    • 2
    • 3
    TARGET_PLATFORM

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

    ifeq ($(TARGET_PLATFORM),android-22)
        # ... do something ...
    endif
    
    • 1
    • 2
    • 3
    TARGET_ARCH_ABI

    构建系统解析此 Android.mk 文件时指向的 ABI。每个受支持 CPU 和架构的 ABI 设置如下。

    CPU 和架构设置支持的指令集
    ARMv7armeabi-v7aarmeabi
    Thumb-2
    VFPv3-D16
    ARMv8 AArch64arm64-v8aAArch64
    i686x86x86 (IA-32)
    MMX
    SSE/2/3
    SSSE3
    x86-64x86_64x86-64
    MMX
    SSE/2/3
    SSSE3
    SSE4.1、4.2
    POPCNT
    ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
      # ... do something ...
    endif
    
    • 1
    • 2
    • 3

    模块描述变量

    LOCAL_PATH

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

    LOCAL_PATH := $(call my-dir)
    
    • 1
    LOCAL_MODULE

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

    LOCAL_MODULE := "HelloWorld"
    
    • 1
    LOCAL_MODULE_FILENAME

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

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

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

    LOCAL_MODULE := foo
    LOCAL_MODULE_FILENAME := libnewfoo
    
    • 1
    • 2
    LOCAL_SRC_FILES

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

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

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

    LOCAL_SRC_FILES := hello-jni.c
    
    • 1
    LOCAL_CPP_EXTENSION

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

    LOCAL_CPP_EXTENSION := .cxx
    
    • 1

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

    LOCAL_CPP_EXTENSION := .cxx .cpp .cc
    
    • 1
    LOCAL_CPP_FEATURES

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

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

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

    LOCAL_CPP_FEATURES := rtti
    
    • 1

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

    LOCAL_CPP_FEATURES := exceptions
    
    • 1

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

    LOCAL_CPP_FEATURES := rtti features
    
    • 1
    LOCAL_C_INCLUDES

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

    LOCAL_C_INCLUDES := sources/foo
    
    • 1

    或者

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

    需要在通过 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>,
    
    • 1
    LOCAL_CPPFLAGS

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

    LOCAL_CPPFLAGS := -Wall -Werror
    
    • 1
    LOCAL_STATIC_LIBRARIES

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

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

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

    LOCAL_STATIC_LIBRARIES := libjpeg_static_ndk
    
    • 1
    LOCAL_SHARED_LIBRARIES

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

    LOCAL_SHARED_LIBRARIES := liblog libnativehelper
    
    • 1
    LOCAL_WHOLE_STATIC_LIBRARIES

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

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

    LOCAL_WHOLE_STATIC_LIBRARIES := libadbd
    
    • 1
    LOCAL_LDLIBS

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

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

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

    LOCAL_LDLIBS := -lz
    
    • 1
    LOCAL_LDFLAGS

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

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

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

    LOCAL_LDFLAGS += -fuse-ld=bfd
    
    • 1
    LOCAL_ALLOW_UNDEFINED_SYMBOLS

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

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

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

    LOCAL_ARM_MODE

    默认情况下,构建系统会以 thumb 模式生成 ARM 目标二进制文件,其中每条指令都是 16 位宽,并与 thumb/ 目录中的 STL 库链接。将此变量定义为 arm 会强制构建系统以 32 位 arm 模式生成模块的对象文件。

    LOCAL_ARM_MODE := arm
    
    • 1

    也可以对源文件名附加 .arm 后缀,指示构建系统仅以 arm 模式构建特定的源文件。例如,以下示例指示构建系统始终以 ARM 模式编译 bar.c,但根据 LOCAL_ARM_MODE 的值构建 foo.c

    LOCAL_SRC_FILES := foo.c bar.c.arm
    
    • 1

    也可以在 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
    
    • 1
    LOCAL_DISABLE_FORMAT_STRING_CHECKS

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

    LOCAL_DISABLE_FORMAT_STRING_CHECKS=true
    
    • 1
    LOCAL_EXPORT_CFLAGS

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

    LOCAL_EXPORT_CFLAGS := -Idevelopment/host/windows/usb/api
    
    • 1
    LOCAL_EXPORT_CPPFLAGS

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

    LOCAL_EXPORT_CPPFLAGS:=-std=c++11
    
    • 1
    LOCAL_EXPORT_C_INCLUDES

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

    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
    
    • 1
    LOCAL_EXPORT_LDLIBS

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

    LOCAL_EXPORT_LDLIBS := -llog -lgcc
    
    • 1
    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
    
    • 1
    • 2
    LOCAL_SHARED_ANDROID_LIBRARIES

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

    LOCAL_SHARED_ANDROID_LIBRARIES := \
    	androidx.appcompat_appcompat \
    
    • 1
    • 2
    LOCAL_AAPT_FLAGS

    此变量用于指定aapt规则

    LOCAL_AAPT_FLAGS += \
    	--auto-add-overlay \
    	--extra-packages androidx.appcompat \
    
    • 1
    • 2
    • 3
    LOCAL_STATIC_JAVA_LIBRARIES

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

    LOCAL_STATIC_JAVA_LIBRARIES := \
    		androidx.annotation_annotation \
    
    • 1
    • 2
    LOCAL_RESOURCE_DIR

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

    LOCAL_RESOURCE_DIR := frameworks/support/v7/appcompat/res
    
    • 1
    LOCAL_MANIFEST_FILE

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

    LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml
    
    • 1
    LOCAL_PACKAGE_NAME

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

    LOCAL_PACKAGE_NAME := MyApp
    
    • 1
    LOCAL_CERTIFICATE

    此变量用于指定前面类型

    LOCAL_CERTIFICATE := platform
    
    • 1
    LOCAL_PROGUARD_ENABLED

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

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

    • disabled 禁用混淆

    LOCAL_PROGUARD_ENABLED := disabled
    
    • 1
    LOCAL_PROGUARD_FLAG_FILES

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

    LOCAL_PROGUARD_FLAG_FILES := proguard.flags
    
    • 1
    LOCAL_MODULE_TAGS

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

    LOCAL_MODULE_TAGS := optional
    
    • 1
    • 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
    
    • 1
    LOCAL_PRIVATE_PLATFORM_APIS

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

    LOCAL_PRIVATE_PLATFORM_APIS := true
    
    • 1
    LOCAL_OVERRIDES_PACKAGES

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

    LOCAL_OVERRIDES_PACKAGES := Settings
    
    • 1
    LOCAL_DEX_PREOPT

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

    LOCAL_DEX_PREOPT := false
    
    • 1
    LOCAL_REQUIRED_MODULES

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

    LOCAL_REQUIRED_MODULES += android-support-v4
    
    • 1
    LOCAL_JNI_SHARED_LIBRARIES

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

    LOCAL_PROPRIETARY_MODULE

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

    LOCAL_PROPRIETARY_MODULE = true
    
    • 1
    LOCAL_MODULE_INCLUDE_LIBRARY

    so库是否集成进apk

    LOCAL_MODULE_INCLUDE_LIBRARY := true
    
    • 1

    函数宏

    函数通过$(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)
    
    • 1
    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>)
    
    • 1
    warning

    终端打印输出信息

    $(warning xxxxx)
    
    • 1
    error

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

    $(error xxxxx)
    
    • 1
    all-java-files-under

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

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

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

    LOCAL_SRC_FILES += $(call all-c-files-under, src)
    
    • 1
    all-cpp-files-under
    LOCAL_SRC_FILES += $(call all-cpp-files-under, src)
    
    • 1
    all-Iaidl-files-under

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

    LOCAL_SRC_FILES := $(call all-Iaidl-files-under, aidl)
    
    • 1
  • 相关阅读:
    .NET轻松实现支付宝服务窗网页授权并获取用户相关信息
    Android Kotlin 基础详解
    Python读写文件代码
    selenium-wire兼容selenium和requests
    微服务网关 —— SpringCloud Gateway
    剪辑的视频太大怎么办?一分钟学会压缩视频
    初入自媒体短视频行业,有什么需要注意的?怎么快速入行?
    matplotlib图表常用设置(四)
    Python——实现微博评论情绪分析(生成情绪时空分布地图(pyecharts))
    Netty 4.1.98.Final 发布
  • 原文地址:https://blog.csdn.net/Jun_P/article/details/126818739