在阅读Android系统源码时,经常会看到很多目录下都有着android.mk文件。这个文件用于描述如何编译和构建 Android 项目的 Makefile 文件。
下面是该文件中常见的几个变量:
LOCAL_MODULE:用于指定当前编译模块的名称。在 Android 编译系统中,每个模块都需要有一个唯一的名称,该名称将用于生成最终的目标文件。例如:LOCAL_MODULE := my_libraryLOCAL_CLANG:使用 Clang 编译器来编译当前模块的 C 和 C++ 源文件。LOCAL_CLANG := true。LOCAL_ADDITIONAL_DEPENDENCIE:指定额外的依赖文件。LOCAL_SRC_FILES:指定需要编译的源文件。LOCAL_CFLAGS:用于指定 C 源文件的编译选项。
构建类型相关变量:
BUILD_SHARED_LIBRARY:指定将当前模块编译为共享库
BUILD_STATIC_LIBRARY:指定将当前模块编译为静态库
BUILD_EXECUTABLE:指定将当前模块编译为可执行文件
用法:
include $(BUILD_SHARED_LIBRARY)
include $(BUILD_STATIC_LIBRARY)
include $(BUILD_EXECUTABLE)
文件内多个LOCAL_MODULE变量
有时候会发现一个Android.mk文件有着多个LOCAL_MODULE变量,这通常是构建多个相互独立的可执行文件、共享库或静态库时,就会在同一个 Android.mk 文件中定义多个LOCAL_MODULE变量。每个 LOCAL_MODULE 对应一个独立的构建目标,它们在功能和用途上可能是相互独立的。
通常在构建下一个模块时,会使用include $(CLEAR_VARS)清除当前所有的 LOCAL_XXX 变量。
# 构建共享库 my_library
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := my_library
LOCAL_SRC_FILES := library_source.c
include $(BUILD_SHARED_LIBRARY)
# 构建可执行文件 my_app
include $(CLEAR_VARS)
LOCAL_MODULE := my_app
LOCAL_SRC_FILES := app_source.c
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog -lmy_library
include $(BUILD_EXECUTABLE)
Android.mk文件示例
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CLANG := true
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
LOCAL_SRC_FILES := \
Client.cpp \
DisplayDevice.cpp \
DispSync.cpp \
EventControlThread.cpp \
StartPropertySetThread.cpp \
EventThread.cpp \
FrameTracker.cpp \
GpuService.cpp \
Layer.cpp \
LayerDim.cpp \
LayerRejecter.cpp \
LayerVector.cpp \
MessageQueue.cpp \
MonitoredProducer.cpp \
SurfaceFlingerConsumer.cpp \
SurfaceInterceptor.cpp \
Transform.cpp \
DisplayHardware/ComposerHal.cpp \
DisplayHardware/FramebufferSurface.cpp \
DisplayHardware/HWC2.cpp \
DisplayHardware/HWComposerBufferCache.cpp \
DisplayHardware/PowerHAL.cpp \
DisplayHardware/VirtualDisplaySurface.cpp \
Effects/Daltonizer.cpp \
EventLog/EventLogTags.logtags \
EventLog/EventLog.cpp \
RenderEngine/Description.cpp \
RenderEngine/Mesh.cpp \
RenderEngine/Program.cpp \
RenderEngine/ProgramCache.cpp \
RenderEngine/GLExtensions.cpp \
RenderEngine/RenderEngine.cpp \
RenderEngine/Texture.cpp \
RenderEngine/GLES20RenderEngine.cpp \
LOCAL_MODULE := libsurfaceflinger
LOCAL_C_INCLUDES := \
frameworks/native/vulkan/include \
external/vulkan-validation-layers/libs/vkjson \
system/libhwbinder/fast_msgq/include \
LOCAL_CFLAGS := -DLOG_TAG=\"SurfaceFlinger\"
LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES
ifeq ($(TARGET_USES_HWC2),true)
LOCAL_CFLAGS += -DUSE_HWC2
LOCAL_SRC_FILES += \
SurfaceFlinger.cpp \
DisplayHardware/HWComposer.cpp
else
LOCAL_SRC_FILES += \
SurfaceFlinger_hwc1.cpp \
DisplayHardware/HWComposer_hwc1.cpp
endif
LOCAL_CFLAGS += -fvisibility=hidden -Werror=format
LOCAL_STATIC_LIBRARIES := \
libhwcomposer-command-buffer \
libtrace_proto \
libvkjson \
libvr_manager \
libvrflinger
LOCAL_SHARED_LIBRARIES := \
android.frameworks.vr.composer@1.0 \
android.hardware.graphics.allocator@2.0 \
android.hardware.graphics.composer@2.1 \
android.hardware.configstore@1.0 \
android.hardware.configstore-utils \
libcutils \
liblog \
libdl \
libfmq \
libhardware \
libhidlbase \
libhidltransport \
libhwbinder \
libutils \
libEGL \
libGLESv1_CM \
libGLESv2 \
libbinder \
libui \
libgui \
libpowermanager \
libvulkan \
libsync \
libprotobuf-cpp-lite \
libbase \
android.hardware.power@1.0
LOCAL_EXPORT_SHARED_LIBRARY_HEADERS := \
android.hardware.graphics.allocator@2.0 \
android.hardware.graphics.composer@2.1 \
libhidlbase \
libhidltransport \
libhwbinder
LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code -std=c++1z
include $(BUILD_SHARED_LIBRARY)
###############################################################
# build surfaceflinger's executable
include $(CLEAR_VARS)
LOCAL_CLANG := true
LOCAL_LDFLAGS_32 := -Wl,--version-script,art/sigchainlib/version-script32.txt -Wl,--export-dynamic
LOCAL_LDFLAGS_64 := -Wl,--version-script,art/sigchainlib/version-script64.txt -Wl,--export-dynamic
LOCAL_CFLAGS := -DLOG_TAG=\"SurfaceFlinger\"
LOCAL_INIT_RC := surfaceflinger.rc
ifeq ($(TARGET_USES_HWC2),true)
LOCAL_CFLAGS += -DUSE_HWC2
endif
LOCAL_SRC_FILES := \
main_surfaceflinger.cpp
LOCAL_SHARED_LIBRARIES := \
android.frameworks.displayservice@1.0 \
android.hardware.configstore@1.0 \
android.hardware.configstore-utils \
android.hardware.graphics.allocator@2.0 \
libsurfaceflinger \
libcutils \
libdisplayservicehidl \
liblog \
libbinder \
libhidlbase \
libhidltransport \
libutils \
libui \
libgui \
libdl
LOCAL_WHOLE_STATIC_LIBRARIES := libsigchain
LOCAL_STATIC_LIBRARIES := libtrace_proto
LOCAL_MODULE := surfaceflinger
ifdef TARGET_32_BIT_SURFACEFLINGER
LOCAL_32_BIT_ONLY := true
endif
LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
include $(BUILD_EXECUTABLE)
###############################################################
# uses jni which may not be available in PDK
ifneq ($(wildcard libnativehelper/include),)
include $(CLEAR_VARS)
LOCAL_CLANG := true
LOCAL_CFLAGS := -DLOG_TAG=\"SurfaceFlinger\"
LOCAL_SRC_FILES := \
DdmConnection.cpp
LOCAL_SHARED_LIBRARIES := \
libcutils \
liblog \
libdl
LOCAL_MODULE := libsurfaceflinger_ddmconnection
LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
include $(BUILD_SHARED_LIBRARY)
endif # libnativehelper
include $(call first-makefiles-under,$(LOCAL_PATH))