Android.mk 相当于 Linux 中的 Makefile 文件,用来向安卓系统描述如何编译源代码。该文件会被编译器解析多次,所以尽量减少在 Android.mk 中声明变量。
Android.mk 文件可以将源码打包成模块,模块可以是apk、jar包、c/c++应用程序、静态库(.a文件)和动态库(.so)。
动态库可以被移到应用程序包(apk),静态库可以被链接入动态库。
Android.mk 中可以定义一个或者多个模块,一个源文件也可以打包进多个模块。
1 # Copyright 2006 The Android Open Source Project 2 3 LOCAL_PATH:= $(call my-dir) 4 include $(CLEAR_VARS) 5 6 LOCAL_SRC_FILES:= 7 rild.c 8 9 LOCAL_SHARED_LIBRARIES := 10 liblog 11 libcutils 12 libril 13 libdl 14 15 # temporary hack for broken vendor rils 16 LOCAL_WHOLE_STATIC_LIBRARIES := 17 librilutils_static 18 19 LOCAL_CFLAGS := -DRIL_SHLIB 20 21 ifeq ($(SIM_COUNT), 2) 22 LOCAL_CFLAGS += -DANDROID_SIM_COUNT_2 23 endif 24 25 LOCAL_MODULE:= rild 26 LOCAL_MODULE_TAGS := optional 27 28 include $(BUILD_EXECUTABLE)
在 Android.mk 中,注释以 # 开头,注释此行。
LOCAL_PATH:= $(call my-dir)
指定当前模块的目录。
include $(CLEAR_VARS)
清除 LOCAL_PATH 以外的所有 LOCAL_xxx 变量。
LOCAL_SRC_FILES:=
rild.c
需要编译的源代码文件。
LOCAL_SHARED_LIBRARIES :=
liblog
libcutils
libril
libdl
模块运行时需要依赖的动态库。
LOCAL_WHOLE_STATIC_LIBRARIES :=
librilutils_static
静态库全链接。
LOCAL_CFLAGS := -DRIL_SHLIB
可选的,用来在编译c/c++时附加编译选项。
ifeq ($(SIM_COUNT), 2)
LOCAL_CFLAGS += -DANDROID_SIM_COUNT_2
endif
条件编译,ifeq判断相等。
LOCAL_MODULE:= rild
生成的模块名称,要唯一并且不含空格,系统会自动添加前缀和后缀。
若生成动态库,则生成 librild.so;若名称为 librild,则不会添加前缀,依然是 librild.so。
LOCAL_MODULE_TAGS := optional
该模块在所以版本下都编译。(user版本、eng版本、optional所有版本)
include $(BUILD_EXECUTABLE)
指定编译方法。
BUILD_STATIC_LIBRARY:编译为静态库
BUILD_SHARED_LIBRARY:编译为动态库
BUILD_EXECUTABLE:编译为C可执行程序
BUILD_JAVA_LIBRARY:编译为Java类库
BUILD_PACKAGE:编译为Android应用程序包
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
指定目标文件最终安装位置——out/target/product/rk3288/system/lib/hw
编译变量 | 功能 |
LOCAL_PATH | 指定编译路径 |
LOCAL_MODULE | 指定编译模块名 |
LOCAL_SRC_FILES | 指定编译源码列表 |
LOCAL_SHARED_LIBRARIES | 指定使用的c/c++共享库列表 |
LOCAL_STATIC_LIBRARIES | 指定使用的c/c++静态库列表 |
LOCAL_STATIC_JAVA_LIBRARIES | 指定使用的Java库列表 |
LOCAL_CFLAGS | 指定编译器参数 |
LOCAL_C_INCLUDES | 指定c/c++头文件路径 |
LOCAL_PACKAGE_NAME | 指定Android应用程序名 |
LOCAL_CERTIFICATE | 指定签名认证 |
LOCAL_JAVA_LIBRARIES | 指定使用的Java库列表 |
LOCAL_SDK_VERSION | 指定编译Android应用程序时的SDK版本 |