Android.mk文件使用速通手册

 更新时间:2023年08月16日 09:46:20   作者:会灰的飞猫  
本文将简要介绍 Android.mk 的使用,看完本文,你将学会如何将自己的代码通过 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

常用的有:debugenguserdevelopment 或者 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文件使用的资料请关注脚本之家其它相关文章!

相关文章

  • Android Bitmap的截取及状态栏的隐藏和显示功能

    Android Bitmap的截取及状态栏的隐藏和显示功能

    Bitmap是Android系统中的图像处理中最重要类之一。Bitmap可以获取图像文件信息,对图像进行剪切、旋转、缩放,压缩等操作,并可以以指定格式保存图像文件。这篇文章主要介绍了Android Bitmap的截取及状态栏的隐藏和显示功能,需要的朋友可以参考下
    2017-11-11
  • android AlertDialog的简单使用实例

    android AlertDialog的简单使用实例

    本篇文章主要介绍了android AlertDialog的简单使用实例,具有一定的参考价值,有兴趣的可以了解一下。
    2017-01-01
  • Android中Listview下拉刷新和上拉加载更多的多种实现方案

    Android中Listview下拉刷新和上拉加载更多的多种实现方案

    本文大概通过三种方案给大家介绍了Android中Listview下拉刷新和上拉加载更多知识,非常不错,具有参考借鉴价值,需要的朋友参考下
    2016-12-12
  • 控制Android LED灯颜色的代码实例

    控制Android LED灯颜色的代码实例

    控制Android LED灯颜色的代码实例,需要的朋友可以参考一下
    2013-05-05
  • Android动态绘制饼状图的示例代码

    Android动态绘制饼状图的示例代码

    这篇文章主要介绍了Android动态绘制饼状图的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • SharedPreference引发ANR原理详解

    SharedPreference引发ANR原理详解

    这篇文章主要为大家介绍了SharedPreference引发ANR原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Android Studio配合WampServer完成本地Web服务器访问的问题

    Android Studio配合WampServer完成本地Web服务器访问的问题

    这篇文章主要介绍了Android Studio配合WampServer完成本地Web服务器访问,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Android实现全局悬浮框

    Android实现全局悬浮框

    这篇文章主要为大家详细介绍了Android实现全局悬浮框,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • Android 中 FrameLayout 布局及属性的使用详解

    Android 中 FrameLayout 布局及属性的使用详解

    这篇文章主要介绍了Android 中 FrameLayout 布局及属性的使用,FrameLayout 在实现简单布局时非常方便,特别适用于叠加式布局,如显示叠加的图层或浮动按钮等,需要的朋友可以参考下
    2024-03-03
  • 一些有效的Android启动优化策略分享

    一些有效的Android启动优化策略分享

    在当今激烈竞争的移动应用市场,应用的启动速度直接影响着用户的第一印象和满意度,Android的启动优化是开发者必须关注的关键领域,本文将详细介绍一些强大有效的Android启动优化策略,帮助你优化应用的启动过程,为用户创造更出色的体验,需要的朋友可以参考下
    2023-08-08

最新评论