Android.mk 编辑脚本

437 阅读2分钟

Android.mk 文件基础概念和结构

Android.mk 文件是Android构建系统中定义构建规则的配置文件,主要用来描述哪些文件需要编译,以及如何编译。

1、常见的Android.mk文件结构:

一些基础的文件结构,正常项目会复杂很多。

1.1、编译动态库、静态库、可执行文件

# 指定当前模块路径,通常使用$(call my-dir)
LOCAL_PATH := $(call my-dir)
# 清除之前定义的所有LOCAL_变量,确保不会影响当前模块
include $(CLEAR_VARS)

# 定义模块名称
LOCAL_MODULE := my_module_name
# 定义模块的源文件
LOCAL_SRC_FILES := my_source_file.c executable.cpp 
# 或者
LOCAL_SRC_FILES := my_source_file.c \
				   executable.cpp
# 表示编译为动态库(共享库)
include $(BUILD_SHARED_LIBRARY)
# 表示编译为静态库
include $(BUILD_STATIC_LIBRARY)
# 编译可执行文件
include $(BUILD_EXECUTABLE)
常见编译目标
  • include $(BUILD_SHARED_LIBRARY): 编译动态共享库(.so)
  • include $(BUILD_STATIC_LIBRARY): 编译静态库(.a)
  • include $(BUILD_EXECUTABLE): 编译可执行文件

1.2、模块依赖

模块间的依赖关系可通过LOCAL_SHARED_LIBRARIES 或者 LOCAL_STATIC_LIBRARIES 实现。

# 依赖动态库
LOCAL_SHARED_LIBRARIES := lib_name
# 追加
LOCAL_SHARED_LIBRARIES += lib_name
# 依赖静态库
LOCAL_STATIC_LIBRARIES := lib_name
# 追加
LOCAL_STATIC_LIBRARIES += lib_name

1.3、多文件编译

1.3.1、在LOCAL_SRC_FILES中可以指定多个源文件编译,分行书写(\)或者以空格隔开
LOCAL_SRC_FILES := source1.cpp source2.cpp source3.cpp

LOCAL_SRC_FILES := source1.cpp \
				   source2.cpp \
				   source3.cpp
1.3.1、使用 Makefile 通配符
# 编译当前目录下所有 .cpp 文件
LOCAL_SRC_FILES := $(wildcard *.cpp)

# 编译多个目录下的文件
LOCAL_SRC_FILES := $(wildcard src/*.cpp) $(wildcard utils/*.cpp)

# 编译特定扩展名的文件
LOCAL_SRC_FILES := $(wildcard *.c) $(wildcard *.cpp)

1.3.3、排除特定文件
# 先获取所有文件,然后排除不需要的
ALL_SRCS := $(wildcard *.cpp)
EXCLUDE_SRCS := test.cpp deprecated.cpp
LOCAL_SRC_FILES := $(filter-out $(EXCLUDE_SRCS), $(ALL_SRCS))

1.4、预编译处理

通过LOCAL_CFLAGS 和 LOCAL_CPPFLAGS 添加编译时的预处理宏,优化选项或告警级别

LOCAL_CFLAGS := -Wall -O2
LOCAL_CPPLAGS := -DDEBUG=1

1.5、子目录中的Android.mk

如果你的项目有多个子目录,可以在顶级Android.mk 文件中使用$(call all-subdir-makefiles) 来包含子目录中的Android.mk

include $(call all-subdir-makefiles)

1.6、源码中编译APK

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Myapp

# 指定编译范围(user/eng/tests/optional)
LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(LOCAL_MODULE).apk

# 说明模块类型(APPS/JAVA_LIBRARIES/SHARED_LIBRARIES/EXECUTABLES)
LOCAL_MODULE_CLASS := APPS 
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

# 可选:platform/shared/PRESIGNED
# platform: 平台签名, PRESIGNED: 预签名, shared: 共享签名
LOCAL_CERTIFICATE:= platform 

# 决定了模块的安装位置和权限级别。 true 放入 /system/priv-app,false 放入 /system/app
LOCAL_PRIVILEGED_MODULE := true  

# 在 AOSP 编译过程中,我们可以 控制模块安装位置、屏幕适配、依赖关系 等。以下是常见的配置:
# 影响模块的安装位置
# LOCAL_SYSTEM_MODULE := true    # 安装在 /system/app
# LOCAL_SYSTEM_EXT_MODULE := true # 安装在 /system_ext/app
# LOCAL_PRODUCT_MODULE := true    # 安装在 /product/app
# LOCAL_VENDOR_MODULE := true     # 安装在 /vendor/app
# /system/priv-app 目录下的应用具有 更高的权限,可以使用受限 API。
# /system/app 目录下的应用则是 普通系统应用。
# false 存放在 /system,true 存放在 /system_ext
LOCAL_SYSTEM_EXT_MODULE := false 
include $(BUILD_PREBUILT)

1.7、常用变量

  • LOCAL_MODULE: 定义模块的名称,即生成的目标文件(例如.so文件或者可执行文件)
  • LOCAL_SRC_FILES: 指定要编译的源码文件列表,支持 .c、.cpp、.java 等文件
  • LOCAL_C_INCLUDES: 指定C/C++头文件路径(包括目录)
  • LOCAL_LDLIBS: 指定链接时使用的库(例如 -llog 表示链接 liblog.so)
  • LOCAL_STATIC_LIBRARIES: 指定静态链接的库
  • LOCAL_OVERRIDES_PACKAGES: 让其他模块不参与编译 (LOCAL_OVERRIDES_PACKAGES := messaging Mms Messages)
  • LOCAL_OPTIONAL_USES_LIBRARIES:指定库依赖(LOCAL_OPTIONAL_USES_LIBRARIES := org.apache.http.legacy androidx.window.extensions)
  • LOCAL_DPI_VARIANTS: 适配不同分辨率 (LOCAL_DPI_VARIANTS := xxxhdpi xxhdpi xhdpi hdpi mdpi)