一、Android.mk文件的作用

Android.mk是Android工程办理文件,类似于编译文件的说明书,用来向编译体系描述源代码,并将源文件分组为模块(包含静态库、同享库、独立可履行文件)。Android.mk会被编译体系解析一次或屡次,能够在每一个Android.mk文件中界说一个或多个模块,也能够多个模块运用同一个 .mk 文件。

二、简略示例

#源文件在开发树中的方位
LOCAL_PATH := $(call my-dir)
#清除LOCAL_PATH变量之外的LOCAL_XXX变量
include $(CLEAR_VARS)
#需求编译的文件
LOCAL_SRC_FILES :=$(call all-subdir-java-files)
#生成的模块称号
LOCAL_MODULE := TestMK
#编译的标签
LOCAL_MODULE_TAGS := optional
#指定签名
LOCAL_CERTIFICATE := platform
#引证静态jar
LOCAL_STATIC_JAVA_LIBRARIES := jar1 jar2
#编译apk
include $(BUILD_PACKAGE)
#需求进行预编译的库
include $(CLEAR_VARS)  
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := jar1:path1 \
										jar2:path2
include $(BUILD_MULTI_PREBUILT) 

三、详细解析

1. 界说当时模块的方位

LOCAL_PATH := $(call my-dir)

LOCAL_PATH 是表明当时模块方位的变量,my-dir 是由体系提供的宏函数,回来当时文件地点的途径,$(call my-dir) 表明调用这个函数。

2. 清除LOCAL_XXX变量

include $(CLEAR_VARS)

这句代码清除了 LOCAL_PATH 变量之外的 LOCAL_XXX 变量。一切的编译控制文件都在同一个GNU MAKE履行环境中,一切的变量都是大局的,在编译该模块之前或许编译过其他模块,产生了大量变量,会被体系误认为是属于该模块的,或许产生不行预知的过错。

3. 需求编译的文件

LOCAL_SRC_FILES :=$(call all-subdir-java-files)

LOCAL_SRC_FILES 变量代表需求编译的文件,all-subdir-java-files 函数回来LOCAL_PATH 子目录的一切java文件。也能够直接写出需求编译的文件途径:

LOCAL_SRC_FILES :=src/com/example/test/MainActivity.java \
                  src/com/example/test/Demo1.java \
                  src/com/example/test/Demo2.java 

但要留意,在文件最后面加上以下语句,指明 LOCAL_PATH 目录。

include $ (call all-makefiles-under,$(LOCAL_PATH))

或许在每个文件途径下都加上 LOCAL_PATH :

LOCAL_SRC_FILES :=$(LOCAL_PATH)/src/com/example/test/MainActivity.java \
                  $(LOCAL_PATH)/src/com/example/test/Demo1.java \
                  $(LOCAL_PATH) /src/com/example/test/Demo2.java 

几个常用的获取源文件的方法:
$(call all-java-files-under, src) :获取指定目录下的一切 Java 文件。
$(call all-c-files-under, src) :获取指定目录下的一切 C 言语文件。
$(call all-Iaidl-files-under, src) :获取指定目录下的一切 AIDL 文件。
$(call all-makefiles-under, folder):获取指定目录下的一切 Make 文件。

4. 界说编译生成的模块称号

LOCAL_MODULE := TestMK

LOCAL_MODULE 变量必须界说且仅有,作为模块的标识,编译体系会主动产生适宜的前缀和后缀。

5. 编译的标签

LOCAL_MODULE_TAGS := optional

常用的有:debug, eng, user,development 或许 optional(默认)。

5. 签名特点

LOCAL_CERTIFICATE := platform

常用的有:
platform:该 APK 完结一些体系的中心功能。经过对体系中存在的文件夹的访问测验。
shared:该APK需求和 home/contacts 进程同享数据。
media:该APK是 media/download 体系中的一环。

6. 引证静态jar库

LOCAL_STATIC_JAVA_LIBRARIES := jar1 jar2

jar1、jar2 是第三方 Java 包的别号,需求界说,见后文。
LOCAL_JAVA_LIBRARIES 用于引证动态jar。

7. 编译成apk

include $(BUILD_PACKAGE)

include $(BUILD_STATIC_LIBRARY) :编译成静态库
include $(BUILD_SHARED_LIBRARY) :编译成动态库
include $(BUILD_EXECUTABLE) :编译成可履行程序
include $(BUILD_STATIC_JAVA_LIBRARY) :编译成Java静态库

8. 需求进行预编译的库

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := jar1:path1 \
										jar2:path2

jar1、jar2 界说静态库别号,path1、path2 是静态库的途径,留意要一向写到后缀 .jar.。

9. 拷贝到本地编译

include $(BUILD_MULTI_PREBUILT)

将 prebuild 界说的库拷到本地进行编译。

10. 指定生成目录

经过 LOCAL_MODULE_PATH 变量,能够指定生成的 apk 目录:

LOCAL_MODULE_PATH := $(TARGET_OUT)/

$(TARGET_OUT) 代表 /system ,后续路劲按需求弥补完整

$(TARGET_OUT_DATA_APPS) 代表 data/app 目录

主要参考博文:
Android mk 引证 jar 包、so 库、aar 包,体系签名
Android.mk入门
Android.mk文件学习,将工程编译到体系中(实践篇)