makefile文件控制整个工程的编译规则,比如指定需要生成哪些目标文件,指明生成这些目标文件依赖哪些源文件,指明生成的目标文件放在哪个文件夹下等等。而make就是一个命令工具,可以解析makefile文件中的指令的一个命令工具。
android.mk也是一样的功能,只不过它是android编译环境下的一种特殊的“makefile”文件, 它是经过了android编译系统处理的。所谓android编译系统,就是android顶层目录下的build目录里面的一系列编译控制文件,其实就是一系列makefile文件和 *.mk 文件,这些文件才是编译android系统完整的makefile文件.每个模块里的android.mk只不过是被包含进android编译系统的一小部分而已。经过android编译系统的一大堆处理,android.mk的格式就变得非常简单,且与普通的makefile文件书写格式不一样了,但这有利于为Android增加一个新的Component。
关于Android.mk可以参考博客:https://www.cnblogs.com/cj5785/p/9893162.html
常用具体讲解:
1.LOCAL_PATH:= $(call my-dir)
每个Android.mk文件必须定义LOCAL_PATH,它用于在开发tree中查找源文件。宏my-dir则由Build System提供,返回包含Android.mk的目录路径;
2.include $(CLEAR_VARS)
CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx
因系统在单一GNU Make执行环境中解析所有构建控制文件,LOCAL_XXX变量是全局的,所以描述每个模块之前,声明此变量,可以清除关乎所以LOCAL_xx,这样清理避免相互影响。
3.LOCAL_SRC_FILES := ServiceUtilities.cpp
LOCAL_SRC_FILES, 包含要编译到模块中的C或C++源文件列表
4.LOCAL_MODULE := libserviceutility
存储所要编译的模块的名称, 每个模块名称必须唯一,且不含任何空格。编译系统在生成最终共享库文件,会对分配的名称自动添加正确的前缀和后缀
5.include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY,变量指向一个GNU Makefile脚本,该脚本会收集自include依赖在LOCAL_XXX变量中所定义的所有信息。此脚本确定要编译的内容以及编译方式。共享库变量会导致编译系统生成.so的库文件
6.LOCAL_SHARED_LIBRARIES
编译需要的动态库
Android.mk源码参考:
#每个Android.mk文件必须定义LOCAL_PATH,它用于在开发tree中查找源文件。
#宏my-dir则由Build System提供,返回包含Android.mk的目录路径
LOCAL_PATH:= $(call my-dir)
#CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx
#因系统在单一GNU Make执行环境中解析所有构建控制文件,LOCAL_XXX变量是全局的,
#所以描述每个模块之前,声明此变量,可以清除关乎所以LOCAL_xx,这样清理避免相互影响。
include $(CLEAR_VARS)
#包含要编译到模块中的C或C++源文件列表
LOCAL_SRC_FILES := \
ServiceUtilities.cpp
# FIXME Move this library to frameworks/native,存储所要编译的模块的名称
#每个模块名称必须唯一,且不含任何空格。编译系统在生成最终共享库文件,会对分配的名称自动添加正确的前缀和后缀,
LOCAL_MODULE := libserviceutility
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
liblog \
libbinder
LOCAL_CFLAGS := -Wall -Werror
#BUILD_SHARED_LIBRARY,变量指向一个GNU Makefile脚本
#该脚本会收集自include依赖在LOCAL_XXX变量中所定义的所有信息。此脚本确定要编译的内容以及编译方式。
#共享库变量会导致编译系统生成.so的库文件
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
AudioFlinger.cpp \
Threads.cpp \
Tracks.cpp \
AudioHwDevice.cpp \
AudioStreamOut.cpp \
SpdifStreamOut.cpp \
Effects.cpp \
PatchPanel.cpp \
StateQueue.cpp \
BufLog.cpp \
TypedLogger.cpp
LOCAL_C_INCLUDES := \
frameworks/av/services/audiopolicy \
frameworks/av/services/medialog \
$(call include-path-for, audio-utils)
LOCAL_SHARED_LIBRARIES := \
libaudiohal \
libaudioprocessing \
libaudiospdif \
libaudioutils \
libcutils \
libutils \
liblog \
libbinder \
libaudioclient \
libmedialogservice \
libmediautils \
libnbaio \
libnblog \
libpowermanager \
libserviceutility \
libmediautils \
libmemunreachable \
libmedia_helper
LOCAL_STATIC_LIBRARIES := \
libcpustats \
LOCAL_MULTILIB := $(AUDIOSERVER_MULTILIB)
LOCAL_MODULE:= libaudioflinger
LOCAL_SRC_FILES += \
AudioWatchdog.cpp \
FastCapture.cpp \
FastCaptureDumpState.cpp \
FastCaptureState.cpp \
FastMixer.cpp \
FastMixerDumpState.cpp \
FastMixerState.cpp \
FastThread.cpp \
FastThreadDumpState.cpp \
FastThreadState.cpp
LOCAL_CFLAGS += -DSTATE_QUEUE_INSTANTIATIONS='"StateQueueInstantiations.cpp"'
LOCAL_CFLAGS += -fvisibility=hidden
LOCAL_CFLAGS += -Werror -Wall
include $(BUILD_SHARED_LIBRARY)
include $(call all-makefiles-under,$(LOCAL_PATH))