# Android mk 文件说明 ## 1.基本语法 注释文本以 # 开头。 ## 2.系统模板 系统模板包含了最经常被使用的功能,使用前需要先 include: ```mk include $(CLEAR_VARS) include $(BUILD_PREBUILT) include $(BUILD_EXECUTABLE) include $(BUILD_SHARED_LIBRARY) ``` ## 3.BOARD 配置 ### 3.1.BOARD_VENDOR_KERNEL_MODULES 指示要编译到 Vendor Image 中的独立内核模块,一般结合 TARGET_KERNEL_MODULES_OUT 宏使用: ```mk BOARD_VENDOR_KERNEL_MODULES += \ $(TARGET_KERNEL_MODULES_OUT)/rmouse.ko ``` ## 4.LOCAL 配置 ### 4.1.LOCAL_MODULE 指定模块的名称: ```mk LOCAL_MODULE := libdemo # 或 LOCAL_MODULE := demo ``` ### 4.2.LOCAL_MODULE_CLASS LOCAL_MODULE_CLASS 用于指定 LOCAL_MODULE_PATH 的路径所在。 如果在 Android.mk 没有直接明确 LOCAL_MODULE_PATH 的话,需要通过以下规则来自动生成 base_rules.mk: ```mk LOCAL_MODULE_PATH := $(strip $(LOCAL_MODULE_PATH)) ifeq ($(LOCAL_MODULE_PATH),) #LOCAL_MODULE_CLASS := LOCAL_MODULE_PATH := $($(my_prefix)OUT$(partition_tag)_$(LOCAL_MODULE_CLASS)) $(info *******//$(LOCAL_MODULE_PATH)) ifeq ($(strip $(LOCAL_MODULE_PATH)),) $(error $(LOCAL_PATH): unhandled LOCAL_MODULE_CLASS "$(LOCAL_MODULE_CLASS)") endif endif ``` 在不同的 Android.mk 文件中,对于模块 include() 不同的编译类型选项,比如对于 Library 或者 app,execut 等在调用对应的处理 mk 文件时,会默认就指定当前的 LOCAL_MODULE_CLASS 的值,比如 EXECUTABLES、SHARED_LIBRARIES 等。所以在自己编写的 Android.mk 可不显示的指定 LOCAL_MODULE_CLASS 的值。 但当遇到 include $(BUILD_PREBUILT) 的预编译选项时不会指定模块模块编译输出的类型 CLASS,需要在自己编写的 Android.mk 中明确指定 LOCAL_MODULE_CLASS 的值如 ETC/APP 等,使其值为非空,从而帮助系统确定 LOCAL_MODULE_PATH 的路径,比如最终编译输出: ```mk LOCAL_MODULE_PATH := $(TARGRT_OUT_ETC) ``` LOCAL_MODULE_CLASS 可以取以下值: * APPS * EXECUTABLES * JAVA_LIBRARIES * SHARED_LIBRARIES * ETC * FIRMWARE ### 4.3.LOCAL_MODULE_TAGS 一般为 optional。 ```mk LOCAL_MODULE_TAGS := optional ``` ### 4.4.LOCAL_VENDOR_MODULE 指定是否为 vendor 模块,取值为 true/false。 ```mk LOCAL_VENDOR_MODULE := true ``` ### 4.5.LOCAL_PRELINK_MODULE 指定是否为 Prelink 模块,利用事先链接代替运行时链接的方法来加速共享库的加载,它不仅可以加快起动速度,还可以减少部分内存开销,取值为 true/false。 ```bash LOCAL_PRELINK_MODULE := false ``` ### 4.6.LOCAL_CFLAGS 添加 C 编译参数。 ```mk LOCAL_CFLAGS := -Wall -O2 -fvisibility=hidden ``` ### 4.7.LOCAL_CPPFLAGS 添加 Cpp 编译参数。 ```mk LOCAL_CPPFLAGS := -Wall -O2 -fvisibility=hidden -fexceptions ``` ### 4.8.LOCAL_LDLIBS LOCAL_LDLIBS :链接的库不产生依赖关系,一般用于不需要重新编译的库,如库不存在,则会报错找不到。且貌似只能链接那些存在于系统目录下本模块需要连接的库。如果某一个库既有动态库又有静态库,那么在默认情况下是链接的动态库而非静态库。 如: ```mk LOCAL_LDLIBS += -lm –lz –lc -lcutils –lutils –llog ``` 如果你的 Android.mk 文件中只有这么一行,那么将会采用动态链接。 注:如果是非系统的第三方库,貌似只能用 LOCAL_LDFLAGS 方式,LOCAL_LDLIBS 方式不行。 ### 4.9.LOCAL_SHARED_LIBRARIES LOCAL_SHARED_LIBRARIES 会生成依赖关系,当库不存在时会去编译这个库。 如: ```mk LOCAL_SHARED_LIBRARIES := libutils libcutils ``` ### 4.10.LOCAL_LDFLAGS LOCAL_LDFLAGS:这个编译变量传递给链接器一个一些额外的参数,比如想传递而外的库和库路径给 ld,或者传递给 ld linker 的一些链接参数,-On,-EL{B}( 大小端字节序 ),那么就要加到这个上面,如: ```mk LOCAL_LDFLAGS += -L$(LOCAL_PATH)/lib/ -lHWrecog –EB{EL} –O{n} … ``` 或者直接加上绝对路径库的全名: ```mk LOCAL_LDFLAGS += $(LOCAL_PATH)/lib/libHWrecog.a –EB{EL} –O{n} ``` ### 4.11.LOCAL_SRC_FILES 指定需要编译的源码文件或在 Prebuilt 时指定 ELF 文件等。 ```mk LOCAL_SRC_FILES := \ demo0.c \ demo1.c ``` ### 4.12.LOCAL_C_INCLUDES 指定 C include path。 ```mk LOCAL_C_INCLUDES := $(LOCAL_PATH) ``` ### 4.13.LOCAL_FORCE_STATIC_EXECUTABLE 如果编译的可执行程序要进行静态链接 ( 执行时不依赖于任何动态库 ),则设置 ```mk LOCAL_FORCE_STATIC_EXECUTABLE = true ``` 目前只有 libc 有静态库形式,这个只有文件系统中 /sbin 目录下的应用程序会用到,这个目录下的应用程序在运行时通常文件系统的其它部分还没有加载,所以必须进行静态链接。 启用该选项后程序将输出到 /sbin 目录下。 ### 4.14.LOCAL_EXPORT_C_INCLUDE_DIRS The LOCAL_EXPORT_C_INCLUDES definition here ensures that any module that depends on the prebuilt one will have its LOCAL_C_INCLUDES automatically prepended with the path to the prebuilt's include directory, and will thus be able to find headers inside that. ```mk LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_C_INCLUDES) ``` ### 4.15.LOCAL_INIT_RC 指定需要编译的 RC 文件。 ```mk LOCAL_INIT_RC := demo.rc ``` ## 5.调试 ### 5.1.增加调试信息 如下方式可在编译时打印调试信息: ```mk $(info a demo string) # 一般打印信息,仅仅是显示调试信息 $(warning a demo string) # 警告级别打印信息,不会停止脚本运行,一般用于严重警告 $(error a demo string) # 错误级别,会停止编译直接退出来 ``` ## 6.参考模板 ### 6.1.Prebuilt ```mk LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libdemo LOCAL_MODULE_SUFFIX := .so LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_MODULE_TAGS := optional LOCAL_VENDOR_MODULE := true LOCAL_MODULE_PATH_32 := $(TARGET_OUT)/lib LOCAL_MODULE_PATH_64 := $(TARGET_OUT)/lib64 LOCAL_MULTILIB := both LOCAL_SRC_FILES_arm := lib/libdemo.so LOCAL_SRC_FILES_arm64 := lib64/libdemo.so include $(BUILD_PREBUILT) include $(CLEAR_VARS) LOCAL_MODULE := demo LOCAL_MODULE_CLASS := EXECUTABLES LOCAL_MODULE_TAGS := optional LOCAL_VENDOR_MODULE := true LOCAL_SRC_FILES := bin/demo LOCAL_INIT_RC := etc/init/demo.rc include $(BUILD_PREBUILT) include $(CLEAR_VARS) LOCAL_MODULE := demo LOCAL_SRC_FILES := demo.apk LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_TAGS := optional LOCAL_CERTIFICATE := platform LOCAL_VENDOR_MODULE := true LOCAL_DEX_PREOPT := false LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) include $(BUILD_PREBUILT) ``` ### 6.2.C Lib and App ```mk LOCAL_PATH := $(call my-dir) # demo lib include $(CLEAR_VARS) LOCAL_MODULE := libdemo LOCAL_MODULE_TAGS := optional LOCAL_VENDOR_MODULE := true LOCAL_PRELINK_MODULE := false LOCAL_CFLAGS := -Wall -O2 -fvisibility=hidden LOCAL_SRC_FILES := demo.cpp LOCAL_C_INCLUDES := $(LOCAL_PATH) LOCAL_SHARED_LIBRARIES := LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_C_INCLUDES) include $(BUILD_SHARED_LIBRARY) # demo app include $(CLEAR_VARS) LOCAL_MODULE := demo LOCAL_MODULE_TAGS := optional LOCAL_VENDOR_MODULE := true LOCAL_CFLAGS := -Wall -O2 LOCAL_SRC_FILES := main.cpp LOCAL_C_INCLUDES := $(LOCAL_PATH) LOCAL_SHARED_LIBRARIES := libdemo LOCAL_INIT_RC := demo.rc include $(BUILD_EXECUTABLE) ``` ### 6.3.Cpp Lib and App ```mk LOCAL_PATH := $(call my-dir) # demo lib include $(CLEAR_VARS) LOCAL_MODULE := libdemo LOCAL_MODULE_TAGS := optional LOCAL_VENDOR_MODULE := true LOCAL_PRELINK_MODULE := false # 使用 try catch 机制需要增加 -fexceptions 否则编译出错:cannot use ‘throw’ with exceptions disabled LOCAL_CPPFLAGS := -Wall -O2 -fvisibility=hidden -fexceptions LOCAL_SRC_FILES := demo.cpp LOCAL_C_INCLUDES := $(LOCAL_PATH) LOCAL_SHARED_LIBRARIES := LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_C_INCLUDES) include $(BUILD_SHARED_LIBRARY) # demo app include $(CLEAR_VARS) LOCAL_MODULE := demo LOCAL_MODULE_TAGS := optional LOCAL_VENDOR_MODULE := true LOCAL_CPPFLAGS := -Wall -O2 LOCAL_SRC_FILES := main.cpp LOCAL_C_INCLUDES := $(LOCAL_PATH) LOCAL_SHARED_LIBRARIES := libdemo LOCAL_INIT_RC := demo.rc include $(BUILD_EXECUTABLE) ```