8.5 KiB
Android mk 文件说明
1.基本语法
注释文本以 # 开头。
2.系统模板
系统模板包含了最经常被使用的功能,使用前需要先 include:
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 宏使用:
BOARD_VENDOR_KERNEL_MODULES += \
$(TARGET_KERNEL_MODULES_OUT)/rmouse.ko
4.LOCAL 配置
4.1.LOCAL_MODULE
指定模块的名称:
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:
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 的路径,比如最终编译输出:
LOCAL_MODULE_PATH := $(TARGRT_OUT_ETC)
LOCAL_MODULE_CLASS 可以取以下值:
- APPS
- EXECUTABLES
- JAVA_LIBRARIES
- SHARED_LIBRARIES
- ETC
- FIRMWARE
4.3.LOCAL_MODULE_TAGS
一般为 optional。
LOCAL_MODULE_TAGS := optional
4.4.LOCAL_VENDOR_MODULE
指定是否为 vendor 模块,取值为 true/false。
LOCAL_VENDOR_MODULE := true
4.5.LOCAL_PRELINK_MODULE
指定是否为 Prelink 模块,利用事先链接代替运行时链接的方法来加速共享库的加载,它不仅可以加快起动速度,还可以减少部分内存开销,取值为 true/false。
LOCAL_PRELINK_MODULE := false
4.6.LOCAL_CFLAGS
添加 C 编译参数。
LOCAL_CFLAGS := -Wall -O2 -fvisibility=hidden
4.7.LOCAL_CPPFLAGS
添加 Cpp 编译参数。
LOCAL_CPPFLAGS := -Wall -O2 -fvisibility=hidden -fexceptions
4.8.LOCAL_LDLIBS
LOCAL_LDLIBS :链接的库不产生依赖关系,一般用于不需要重新编译的库,如库不存在,则会报错找不到。且貌似只能链接那些存在于系统目录下本模块需要连接的库。如果某一个库既有动态库又有静态库,那么在默认情况下是链接的动态库而非静态库。
如:
LOCAL_LDLIBS += -lm –lz –lc -lcutils –lutils –llog
如果你的 Android.mk 文件中只有这么一行,那么将会采用动态链接。
注:如果是非系统的第三方库,貌似只能用 LOCAL_LDFLAGS 方式,LOCAL_LDLIBS 方式不行。
4.9.LOCAL_SHARED_LIBRARIES
LOCAL_SHARED_LIBRARIES 会生成依赖关系,当库不存在时会去编译这个库。
如:
LOCAL_SHARED_LIBRARIES := libutils libcutils
4.10.LOCAL_LDFLAGS
LOCAL_LDFLAGS:这个编译变量传递给链接器一个一些额外的参数,比如想传递而外的库和库路径给 ld,或者传递给 ld linker 的一些链接参数,-On,-EL{B}( 大小端字节序 ),那么就要加到这个上面,如:
LOCAL_LDFLAGS += -L$(LOCAL_PATH)/lib/ -lHWrecog –EB{EL} –O{n} …
或者直接加上绝对路径库的全名:
LOCAL_LDFLAGS += $(LOCAL_PATH)/lib/libHWrecog.a –EB{EL} –O{n}
4.11.LOCAL_SRC_FILES
指定需要编译的源码文件或在 Prebuilt 时指定 ELF 文件等。
LOCAL_SRC_FILES := \
demo0.c \
demo1.c
4.12.LOCAL_C_INCLUDES
指定 C include path。
LOCAL_C_INCLUDES := $(LOCAL_PATH)
4.13.LOCAL_FORCE_STATIC_EXECUTABLE
如果编译的可执行程序要进行静态链接 ( 执行时不依赖于任何动态库 ),则设置
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.
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_C_INCLUDES)
4.15.LOCAL_INIT_RC
指定需要编译的 RC 文件。
LOCAL_INIT_RC := demo.rc
5.调试
5.1.增加调试信息
如下方式可在编译时打印调试信息:
$(info a demo string) # 一般打印信息,仅仅是显示调试信息
$(warning a demo string) # 警告级别打印信息,不会停止脚本运行,一般用于严重警告
$(error a demo string) # 错误级别,会停止编译直接退出来
6.参考模板
6.1.Prebuilt
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
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
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)