资讯详情

Android.mk解析与使用

Android.mk解析与使用

  • 一、Android.mk文件的作用
  • 二、简单示例
  • 三、详细分析
    • 1. 定义当前模块的位置
    • 2. 清除LOCAL_XXX变量
    • 3. 需要编译的文件
    • 4. 定义编译生成的模块名
    • 5. 编译的标签
    • 5. 签名属性
    • 6. 引用静态jar库
    • 7. 编译成apk
    • 8. 需要预编译的库
    • 9. 复制到本地编译
    • 10. 指定生成目录
  • 结语

一、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文件学习,将工程编译到系统中(实践篇)

标签: 集成电路mk41s80x

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台