一、Android.mk

Android.mk文件是Android开发中的一个重要编译脚本文件,它用于描述和管理项目的编译过程。以下是关于Android.mk文件的详细解释:

1.1、Android.mk文件的基本作用

Android.mk文件是一个Makefile文件,它使用GNU Make语法编写,定义了项目中的模块和编译规则。每个模块都有一个对应的Android.mk文件,用于指定编译参数、依赖关系和生成的目标文件等。通过编写Android.mk文件,开发者可以方便地管理和组织项目的代码和资源。

1.2、Android.mk文件的主要内容

模块定义

在Android.mk文件中,可以定义多个模块,每个模块都有一个唯一的模块名。

模块可以是可执行文件、静态库、共享库等。

通过LOCAL_MODULE变量来指定模块名。

源文件定义

使用LOCAL_SRC_FILES变量来指定模块的源文件。

可以使用通配符来匹配多个文件,如*.cpp表示所有的cpp文件。

编译选项

可以指定编译选项,如指定编译器、编译标志等。

通过LOCAL_CFLAGS、LOCAL_CPPFLAGS、LOCAL_LDFLAGS等变量来设置。

依赖关系

可以指定模块的依赖关系,即一个模块依赖于其他模块。

通过LOCAL_STATIC_LIBRARIES、LOCAL_SHARED_LIBRARIES等变量来指定依赖的静态库或共享库。

目标文件生成

可以指定生成的目标文件的名称和路径。

通过LOCAL_MODULE_FILENAME、LOCAL_MODULE_PATH等变量来设置。

1.3、Android.mk文件的常用变量和指令

LOCAL_PATH:指定Android.mk文件所在的目录。

include $(CLEAR_VARS):清空之前定义的所有变量(除了LOCAL_PATH),为定义新的模块做准备。

LOCAL_MODULE:指定模块名。

LOCAL_SRC_FILES:指定模块的源文件。

LOCAL_CFLAGS、LOCAL_CPPFLAGS、LOCAL_LDFLAGS:设置编译选项。

LOCAL_STATIC_LIBRARIES、LOCAL_SHARED_LIBRARIES:指定依赖的静态库或共享库。

include $(BUILD_XXX):指定模块的编译类型,如BUILD_EXECUTABLE表示编译为可执行文件,BUILD_SHARED_LIBRARY表示编译为共享库。

1.4、Android.mk文件的示例

以下是一个简单的Android.mk文件示例,用于编译一个名为hello的可执行文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := hello

LOCAL_SRC_FILES := hello.c

include $(BUILD_EXECUTABLE)

在这个示例中:

LOCAL_PATH指定了Android.mk文件所在的目录。

include $(CLEAR_VARS)清空了之前定义的所有变量。

LOCAL_MODULE指定了模块名为hello。

LOCAL_SRC_FILES指定了源文件为hello.c。

include $(BUILD_EXECUTABLE)指定了模块的编译类型为可执行文件。

1.5、注意事项

Android.mk文件通常位于应用程序或库模块的根目录下,并与其他源代码文件一起提交到版本控制系统中。

在编写Android.mk文件时,需要注意变量的作用域和依赖关系的正确性。

Android.mk文件是Android构建系统的一部分,它依赖于Android的构建工具和NDK(Native Development Kit)来编译和构建项目。

综上所述,Android.mk文件是Android开发中一个非常重要的编译脚本文件,通过编写Android.mk文件,开发者可以灵活地定义和管理项目的编译过程

 二、Application.mk

Application.mk文件在Android开发中扮演着关键角色,它主要用于描述整个应用程序在编译时的相关信息。以下是关于Application.mk文件的详细解释:

2.1、Application.mk文件的基本作用

Application.mk文件是一个编译配置文件,它允许开发者指定一些全局的编译选项和设置。这些设置包括目标平台、ABI(Application Binary Interface)类型、编译模式(Release或Debug)、C/C++标准库的选择等。通过配置Application.mk文件,开发者可以确保应用程序在不同平台和设备上的正确编译和运行。

2.2、Application.mk文件的主要内容

目标平台

使用APP_PLATFORM变量来指定目标Android平台的名称,如android-26表示目标平台为Android 8.0(Oreo)。

ABI类型

使用APP_ABI变量来指定支持的ABI平台,如armeabi-v7a、arm64-v8a、x86、x86_64等。也可以指定all来表示支持所有平台。

编译模式

使用APP_OPTIM变量来指定编译模式,如release表示发布模式,会对代码进行深度优化并去除调试信息;debug表示调试模式,不会对代码进行优化并保留调试信息。

C/C++标准库

使用APP_STL变量来选择C/C++标准库的实现,如stlport_static、gnustl_static等。不同的标准库实现支持不同的C++特性和性能优化。

模块列表

使用APP_MODULES变量来指定要编译的模块列表。如果未指定此变量,NDK将编译在Android.mk文件中定义的所有模块。

编译参数

可以使用APP_CFLAGS和APP_CPPFLAGS变量来指定传递给C或C++编译器的编译参数。这些参数可以包括预处理选项、编译器标志等。

2.3、Application.mk文件的示例

以下是一个简单的Application.mk文件示例:

APP_PLATFORM := android-26

APP_ABI := armeabi-v7a arm64-v8a

APP_OPTIM := release

APP_STL := stlport_static

在这个示例中:

APP_PLATFORM指定了目标平台为Android 8.0(Oreo)。

APP_ABI指定了支持的ABI平台为armeabi-v7a和arm64-v8a。

APP_OPTIM指定了编译模式为发布模式。

APP_STL选择了stlport_static作为C++标准库的实现。

2.4、注意事项

Application.mk文件通常位于项目的jni目录下,以便NDK构建系统可以自动搜索到它。

在编写Application.mk文件时,需要注意变量的命名和赋值方式,确保它们符合NDK的语法规范。

Application.mk文件是可选的,但如果不提供该文件,NDK将使用默认的编译选项和设置来构建项目。因此,为了获得更好的编译效果和性能优化,建议根据项目需求自定义Application.mk文件。

综上所述,Application.mk文件在Android开发中起着至关重要的作用,它允许开发者根据项目的需求自定义编译选项和设置。通过合理配置Application.mk文件,可以确保应用程序在不同平台和设备上的正确编译和运行。

 三、Android.mk与Application.mk联系与区别

Android.mk与Application.mk都是Android NDK(Native Development Kit)构建系统中使用的关键文件,它们各自承担着不同的职责,但又相互关联。以下是它们的联系与区别的详细解释:

3.1 联系

共同目标:两者都是为了描述和管理Android NDK项目的编译过程,确保本地代码能够被正确地编译成适用于Android平台的二进制文件。

文件位置:通常,Android.mk和Application.mk都会放在项目的jni目录下。这是NDK构建系统搜索这些文件的默认位置。

使用NDK构建:无论是Android.mk还是Application.mk,都需要通过NDK提供的构建工具(如ndk-build)来执行编译过程。

3.2 区别

职责不同

Android.mk:主要负责描述项目中某个具体模块的编译规则。它包含了模块的源文件、编译选项、依赖关系等信息。每个模块都可以有一个对应的Android.mk文件。

Application.mk:则是对整个项目的全局性描述。它包含了项目的编译平台、编译优化选项、目标ABI(Application Binary Interface)等全局性设置。这些信息将影响项目中所有模块的编译过程。

内容差异

Android.mk

使用GNU make语法编写。

定义了模块的名称(LOCAL_MODULE)、源文件(LOCAL_SRC_FILES)、编译选项(如LOCAL_CFLAGS、LOCAL_CPPFLAGS等)以及依赖关系(如LOCAL_STATIC_LIBRARIES、LOCAL_SHARED_LIBRARIES等)。

Application.mk

通常包含较少的配置选项。

定义了项目的编译平台(APP_PLATFORM)、ABI(APP_ABI)、编译优化选项(APP_OPTIM)以及C++标准库的实现(APP_STL)等全局性设置。

作用范围

Android.mk:作用于单个模块,每个模块可以有自己的Android.mk文件。

Application.mk:作用于整个项目,全局性地影响所有模块的编译过程。

可选性

Android.mk:对于需要编译本地代码的项目来说是必需的,因为每个模块都需要一个Android.mk文件来描述其编译规则。

Application.mk:则是可选的。如果NDK构建系统找不到Application.mk文件,它将使用默认的全局设置来编译项目。然而,为了更精确地控制编译过程,建议为项目提供一个Application.mk文件。

综上所述,Android.mk和Application.mk在Android NDK构建系统中扮演着不同的角色,但它们共同协作以确保本地代码能够被正确地编译成适用于Android平台的二进制文件。