重庆生活网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 生活 重庆
查看: 1142|回复: 1
打印 上一主题 下一主题

安卓底層开发学习經验第四期

[复制链接]
跳转到指定楼层
楼主
发表于 2020-3-13 16:28:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    最近在学习安卓,我所使用的是芯灵思的开发板,核心板是全志的A31S,感觉首先呢,我们来看一下Android.mk的作用,如果我们想要在Andro这些Android.mk的编写都是我们基于Android.mk的基本语法首先进入安卓源码目录,然后看一下external/test/目录,可以看我们可以看到,其实就是把test.c编译生成了一个可执行文件test,最下面我们来分析一下,第一行是拿到了一个环境变量,它所取的是我们的MAKE第二行,会首先判断这个环境变量中是否包含这个文件,如果有,我们会认为这个我们可以看到,我们的CLEAR_VARS就是BUILD_SYSTEM下面可以看到在build/core/mAIn.mk中它的定义是在build/如果我们想改一下我们生成的位置,我们可以加一下LOCAL_MODULE_我们需要把它也编译进去,我们需要改一下Android.mk,在LOCAL




最近在学習安卓,我所使用的是芯灵思的开发板,核心板是全志的A31S,感觉性能挺好,而且老板还給了很多的资料,而且还带學习的視频,下面是我在學习完第四期之后的一個经验,希望能跟大家分享一下,也希望各位大神能多多的帮助小弟,小弟在此谢过了。有兴趣的朋友可以去芯灵思官网看一下。
这一期呢主要讲的是如何编写自己的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的基本认識了

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
回复

使用道具 举报

沙发
发表于 2020-3-13 16:29:02 | 只看该作者
作为小白  观摩觀摩
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|联系我们|重庆生活网

GMT+8, 2024-4-30 20:38 , Processed in 0.187500 second(s), 16 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表