安卓底层开发学习经验第四期

这一期呢主要讲的是如何编写自己的 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 的基本认识了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值