Android.mk 文件基础2
作用:是 GNU Makefile 的一小部分,用于对 Android 程序进行编译,向构建系统描述源代码和动态库等信息。
变量定义
LOCAL_PATH:必须首先定义该变量,用于指示源文件的路径,通常使用$(call my - dir)宏函数来返回当前目录(即包含 Android.mk 文件本身的目录)。
CLEAR_VARS:由编译系统提供,指向一个特殊的 GNU Makefile,在声明每个模块之前,使用include $(CLEAR_VARS)来清除许多LOCAL_XXX变量,如LOCAL_MODULE、LOCAL_SRC_FILES等,但不清除LOCAL_PATH。
LOCAL_MODULE:用于定义要构建的模块的名称,每个模块名称必须唯一且不包含空格。构建系统最终生成共享库文件时,会自动给名称添加正确的前缀和后缀,如名为hello - jni的模块会生成libhello - jni.so的库。
LOCAL_SRC_FILES:该变量的值为要构建到模块中的一个或多个 C/C++ 源文件,多个文件用空格隔开。
BUILD_SHARED_LIBRARY:指向一个 GNU Makefile 脚本,它从最新包含的信息中收集在LOCAL_XXX变量中定义的所有信息,以决定构建什么以及如何构建。若要生成静态库,则使用BUILD_STATIC_LIBRARY。
构建流程3
环境准备:确保开发环境中安装了 Android NDK 和相应的 SDK。
创建项目目录:创建新的项目目录,用于存放 APK 和构建文件。
编写 Android.mk:根据 APK 的需求编写 Android.mk 文件,定义模块名称、源文件、链接库等信息。
执行 NDK 编译:使用ndk - build命令进行编译,该命令会根据 Android.mk 中的内容执行编译操作。
生成 Makefile:ndk - build执行完成后,构建文件和 APK 将会生成在相应目录下,生成的 APK 通常位于YourAppName/bin下。
运行 APK:将生成的 APK 安装到 Android 设备或模拟器上进行运行和测试。
进阶内容
Android.mk 与 Android.bp 的对比:Android 7.0 引入了 Android Soong 构建系统,使用 Android.bp 作为构建脚本文件。Android.mk 使用 Makefile 风格语法,历史悠久,兼容老项目更好,对熟悉 Makefile 的开发者来说可读性更强;Android.bp 采用 Blueprint 语法(json 风格声明式语法),基于 Soong 构建,具有更好的性能,更适合大型项目和模块化构建。
多模块构建:一个 Android.mk 文件可以编译多个模块,每个模块可以是 APK 程序、JAVA 库、C/C++ 应用程序、C/C++ 静态库、C/C++ 共享库等类型之一。可以在多个模块中使用同一个源代码文件,编译系统会自动处理头文件和依赖文件等细节问题。
自定义变量2:在 Android.mk 中可以定义自己的变量,但应避免与系统保留的变量名重复。建议自定义变量名以MY_开头,例如MY_SOURCES := foo.c,然后可以根据条件追加源文件,如ifneq ((MY_SOURCES)。