这一期呢主要讲的是如何编写自己的
Android.mk
首先呢,我们来看一下
Android.mk
的作用,如果我们想要在
Android
的环境下编译生成自己想要的文件,我们可以生成二进制的可执行文件,可以生成动态库、静态库,这是对于
C
、
C++
层来说,那么对于我们得
java
层来说,
Android.mk
编译生成
jar
包或者
Android.apk
这些
Android.mk
的编写都是我们基于
Android.mk
的基本语法来实现的,如果我们想在
Android
目录下来编写自己的项目,那我们就必须学会
Android.mk
的编写。
下面我们来分析一个最基础的
Android.mk
,一个最简单的
Android.mk
有下面几行就足够了
下面我们来介绍一下每一行都是干什么的:
LOCAL PATH:=$(call my-dir)
定义了当前模块的相对路径
include $(CLEAR_VARS)
清空当前环境变量
LOCAL_MODULE:=test
编译生成的目标名称
LOCAL_SRC_FILES:=test.c
编译该模块需要的源文件
include $(BUILD_EXECUTABLE)
编译所生成的目标文件格式
下面我们看一下编译的过程
首先进入安卓源码目录,然后看一下
external/test/
目录,可以看到这个目录下有两个文件,一个是
Android.mk
,一个是
test.c
,接下来我们先来配置一下环境变量
.build/envsetup.sh
然后选择我们的lunch
,我们在这里依然选择的是
19. fiber_a31st-eng
然后我们来看一下我们的源代码
cat external/test/test.c
这个呢就是一个很普通的c
文件,打印了一条“
Hello Android
”
然后我们再来看一下
Android.mk
,可以看到他和我们上边所说的是一样的
我们再来编译一下这个项目
我们可以看到,其实就是把test.c
编译生成了一个可执行文件
test
,最后把这个文件放在了
out/target/product/fiber-a31st/system/bin/test/
这里
我们可以用
file
命令来看一下它的格式,他是一个
32
位的在
ARM
上运行的二进制文件
接下来我们使用命令
vi external/text/Android.mk
来看一下它的
Android.mk
首先是一个环境变量,配置了我们的LOCAL_PATH
,我们来找一下我们的
LOCAL_PATH
是在哪里定义的
我们可以看到,我们的
my_dir
它是在
build/core/definitions.mk
里边定义的
下面我们来分析一下,第一行是拿到了一个环境变量,它所取的是我们的MAKEFILE_LIST
里边的最后一行,我们这个
MAKEFILE_LIST
是在我们做编译的时候,当前目录下的
Android.mk
会被加载到这个里边,而
lastWord
是取最后一个
makefile
第二行,会首先判断这个环境变量中是否包含这个文件,如果有,我们会认为这个
Android.mk
是有问题的,然后打印出一行代码,如果没错误,我们就会把
Android.mk
所在的目录给返回去,所以我们能得到我们的
LOCAL_PATH
,也就是
android.mk
所在的目录
我们再来看一下里边的
CLEAR_VARS
是在哪里定义的,我们看一下这个
build/core/config.mk
,然后查找一下他是在哪里定义的
我们可以看到,我们的CLEAR_VARS
就是
BUILD_SYSTEM
下面的
clear_vars.mk
,那我们再来看一下这个
BUILD_SYSTEM
,他是在哪里定义的,我们再使用
sp
命令打开一个终端
可以看到在build/core/main.mk
中它的定义是在
build/core
目录下定义的,那我们切换到
build/core
下的
clear_vars.mk
可以看到他所做的事情就是把我们这些变量全部清空,其实这个LOCAL_PATH
是不清除的,
所以我们的
clear.vars
所做的事就是清除除
LOCAL_PATH
以外的所有环境变量
然后我们切换到
Android.mk
中,我们把
LOCAL_PATH
放到
CLEAR_VARS
下边进行编译
mmm external/test
然后就会看到会报一个错误
第三行就是我们编译生成模块的名称
第四行就是我们的源文件,最后一行就是我们要生成文件的格式
如果我们想改一下我们生成的位置,我们可以加一下
LOCAL_MODULE_PATH:=$(LOCAL_PATH)
这样我们就能在当前目录下生成我们的
test
首先touch
一下我们的
external/test/test.c
然后进行编译
我们可以看到他的目录进行了改变所以说这个LOCAL_MODULE_PATH
指定我们的目标文件所生成的目录
如果说我们的源码文件不只是有一个,而是有多个那我们应该如何来添加源文件
首先我们进入到
test
目录下,新建一个
test1.c
,我们不做任何事情,就写一个空的
我们需要把它也编译进去,我们需要改一下Android.mk
,在
LOCAL_SRC_FILES
中使用连接符来连接文件,这样我们就能把两个文件都编译上
接下来我们使用mm
进行编译,这样就把
test1.c
也就编译进来了
所以我们再来简单总结一下我们刚才学到的语法
LOCAL PATH:=$(call my-dir)
定义了当前模块的相对路径
include $(CLEAR_VARS)
清空当前环境变量,除了
LOCAL_PATH
LOCAL_MODULE:=test
编译生成的目标名称
LOCAL_SRC_FILES:=test.c
编译该模块需要的源文件
include $(BUILD_EXECUTABLE)
编译所生成的目标文件格式
这些就是对
Android.mk
的基本认识了