Android.mk的理解

网友投稿 870 2022-05-29

什么是Android.mk?

Android.mk文件在你项目的jni/目录下,它向构建系统描述源代码和动态库,它其实是GNU makefile的简化版,用来给构建系统一次或多次分析使用.Application.mk、构建系统、你的环境变量未定义时,Android.mk文件对于定义项目范围的设置非常有用.它还可以重写特定模块的项目范围设置.

Android.mk用于向编译系统描述源文件和共享库,Android N版本之后使用Android.bp替代Android.mk

常用语法

:=定义变量

$()读取变量

include对mk文件、变量、模块的调用

操作

对Android.mk的理解

对于使用者来说,只要按照清除旧变量、设置新变量、调用编译函数这三步进行操作就可以了。

//读取当前路径 LOCAL_PATH:= $(call my-dir) //1.清除旧变量 include $(CLEAR_VARS) //2.设置新变量 LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := AlarmClock //3.调用编译函数 include $(BUILD_PACKAGE)

1

2

3

4

5

6

7

8

9

10

11

12

编译函数(实际上是mk文件)根据设置的变量来确定编译所需要的配置信息,由于Android.mk中所有变量都是全局的,为了防止编译函数调用错误的变量,每次设置变量之前先清除原先变量的值。分成三个步骤:

清除旧变量,是因为Android.mk中所有的变量都是全局的,编译函数在编译时会调用这些变量。为了防止编译函数使用了编译其它模 块时设置的变量,每次开始编译一个新的模块时清除所有的变量是个好习惯。

设置新变量就是把本次编译时用到的源码地址,包名等设置好。

调用编译函数其实就是include一个固定的mk文件,这个mk文件会根据设置的变量提取出编译模块需要的target,Command等信息并 执行固定的编译命令。

举例

要编译java模块,编译函数build_apk.mk描述如下

name := AlarmClock target := $(name).apk source := $(name).java commnd := / javac $(name).java/ java $(name).class

1

2

3

4

5

6

7

8

现在要编译Contacts模块,可以这么做:

name := Contacts include $(BUILD_PACKAGES)

1

2

定义一个专门用来清除变量的clear_vars.mk里面的内容如下:

name := target := source := command :=

1

2

3

4

现在按照清除旧变量、设置新变量、调用编译函数这三步进行,可以这么做:

include $(CLEAR_VARS) name := Contacts include $(BUILD_PACKAGES)

1

2

3

其他

在Android源码的build/core/目录下。先看其中的main.mk,config.mk这两个文件

main.mk里面是具体的脚本,在这里控制编译模块。

config.mk中定义了下面这样的文件调用:

CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk

1

2

做为单独的功能模块抽象出来的 mk文件都在build/core/目录下,而函数的定义全部在definitions.mk中。

参考文档:

Android.mk文件分析

Android

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:“主动刷脸”完成打卡 无感人脸考勤就这么简单!
下一篇:[跟着官方文档学JUnit5][四][WritingTests][学习笔记]
相关文章