Android.mk文件使用速通手册
作者:会灰的飞猫
一、Android.mk文件的作用
Android.mk是 Android 工程管理文件,类似于编译文件的说明书,用来向编译系统描述源代码,并将源文件分组为模块(包括静态库、共享库、独立可执行文件)。
Android.mk 会被编译系统解析一次或多次,可以在每一个 Android.mk 文件中定义一个或多个模块,也可以多个模块使用同一个 .mk 文件。
二、简单示例
下面是一个简单的 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)
2.1 定义当前模块的位置
LOCAL_PATH := $(call my-dir)
LOCAL_PATH
是表示当前模块位置的变量,my-dir
是由系统提供的宏函数,返回当前文件所在的路径,$(call my-dir)
表示调用这个函数。
2.2 清除 LOCAL_XXX 变量
include $(CLEAR_VARS)
这句代码清除了 LOCAL_PATH
变量之外的 LOCAL_XXX
变量。因为所有的编译控制文件都在同一个 GNU MAKE 执行环境中,所有的变量都是全局的,在编译该模块之前可能编译过别的模块,产生了大量变量,会被系统误认为是属于该模块的,可能产生不可预知的错误。
2.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 文件。
2.4 定义编译生成的模块名称
LOCAL_MODULE := TestMK
LOCAL_MODULE
变量必须定义且唯一,作为模块的标识,编译系统会自动产生合适的前缀和后缀。
2.5 编译的标签
LOCAL_MODULE_TAGS := optional
常用的有:debug
, eng
, user
, development
或者 optional
(默认)。
2.6 签名属性
LOCAL_CERTIFICATE := platform
常用的有:platform
:该 APK 完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试。shared
:该 APK 需要和 home/contacts 进程共享数据。media
:该 APK 是 media/download 系统中的一环。
2.7 引用静态 jar 库
LOCAL_STATIC_JAVA_LIBRARIES := jar1 jar2
jar1、jar2 是第三方 Java 包的别名,需要定义,见后文 2.9。LOCAL_JAVA_LIBRARIES
用于引用动态jar。
2.8 编译成 apk
include $(BUILD_PACKAGE)
include $(BUILD_STATIC_LIBRARY)
:编译成静态库include $(BUILD_SHARED_LIBRARY)
:编译成动态库include $(BUILD_EXECUTABLE)
:编译成可执行程序include $(BUILD_STATIC_JAVA_LIBRARY)
:编译成 Java 静态库
2.9 需要进行预编译的库
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := jar1:path1 \ jar2:path2
jar1、jar2 定义静态库别名,path1、path2 是静态库的路径,注意要一直写到后缀 .jar。
2.10. 拷贝到本地编译
include $(BUILD_MULTI_PREBUILT)
将 prebuild 定义的库拷到本地进行编译。
2.11. 指定生成目录
通过 LOCAL_MODULE_PATH
变量,可以指定生成的 apk 目录:
LOCAL_MODULE_PATH := $(TARGET_OUT)/xxx
$(TARGET_OUT)
代表 /system, 后续路径按需要补充完整,如这里的 xxx。
$(TARGET_OUT_DATA_APPS)
代表 data/app 目录。
结语
本文给出了一个简单的 Android.mk 文件示例,并逐行解析了一些基础指令,希望对大家有所帮助,更多关于Android.mk文件使用的资料请关注脚本之家其它相关文章!