打印
[资料分享]

芯灵思开发板安卓底层开发学习经验第四期

[复制链接]
1906|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 xiaohai8856 于 2015-8-28 16:00 编辑

最近在学习安卓,我所使用的是芯灵思的开发板,核心板是全志的A31S,感觉性能挺好,而且老板还给了很多的资料,而且还带学习的视频,下面是我在学习完第四期之后的一个经验,希望能跟大家分享一下,也希望各位大神能多多的帮助小弟,小弟在此谢过了。有兴趣的朋友可以去芯灵思官网看一下。
这一期呢主要讲的是如何编写自己的Android.mk
首先呢,我们来看一下Android.mk的作用,如果我们想要在Android的环境下编译生成自己想要的文件,我们可以生成二进制的可执行文件,可以生成动态库、静态库,这是对于CC++层来说,那么对于我们得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的基本认识了

相关帖子

沙发
ach_dmatek| | 2015-8-18 09:10 | 只看该作者
不错,一个小例子。

使用特权

评论回复
板凳
mini1986| | 2015-8-19 09:12 | 只看该作者
学习一下......

使用特权

评论回复
地板
colin2135| | 2015-12-11 10:25 | 只看该作者
请问一下楼主,按照你的教程。
mmm external/test/
然后提示:
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.4.2
TARGET_PRODUCT=mars_a31s
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
TARGET_CPU_VARIANT=cortex-a7
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.13.0-71-generic-x86_64-with-Ubuntu-14.04-trusty
HOST_BUILD_TYPE=release
BUILD_ID=KOT49H
OUT_DIR=out
============================================
/bin/bash: out/target/product/mars-a31s/previous_build_config.mk: Permission denied
touch: cannot touch ‘out/target/common/obj/APPS/current_overlays.txt’: Permission denied
/bin/bash: out/target/common/obj/APPS/current_packages.txt: Permission denied
Traceback (most recent call last):
  File "build/tools/diff_package_overlays.py", line 91, in <module>
    main(sys.argv)
  File "build/tools/diff_package_overlays.py", line 60, in main
    current_overlays = load_overlay_config(argv[2])
  File "build/tools/diff_package_overlays.py", line 49, in load_overlay_config
    f = open(filename)
IOError: [Errno 2] No such file or directory: 'out/target/common/obj/APPS/current_overlays.txt'
mv: cannot stat ‘out/target/common/obj/APPS/current_overlays.txt’: No such file or directory
No private recovery resources for TARGET_DEVICE mars-a31s
make: Entering directory `/home/idata/work/BPI-M2-Android4.4/android'
Import includes file: out/target/product/mars-a31s/obj/EXECUTABLES/test_intermediates/import_includes
mkdir: cannot create directory ‘out/target/product/mars-a31s/obj/EXECUTABLES/test_intermediates/’: Permission denied
make: *** [out/target/product/mars-a31s/obj/EXECUTABLES/test_intermediates/import_includes] Error 1
make: Leaving directory `/home/idata/work/BPI-M2-Android4.4/android'


提示:Permission denied
所以我改成 sudo mmm external/test/
但又提示找不到命令,请问这是什么情况?

使用特权

评论回复
5
xiaohai8856|  楼主 | 2015-12-11 14:54 | 只看该作者
前边几期做了没?是不是找不到mmm命令啊,你可以尝试一下source build/envsetup.sh 看能解决吗

使用特权

评论回复
6
xiaohai8856|  楼主 | 2015-12-11 14:55 | 只看该作者
colin2135 发表于 2015-12-11 10:25
请问一下楼主,按照你的教程。
mmm external/test/
然后提示:


前边几期做了没?是不是找不到mmm命令啊,你可以尝试一下source build/envsetup.sh 看能解决吗

使用特权

评论回复
7
colin2135| | 2015-12-11 15:42 | 只看该作者
xiaohai8856 发表于 2015-12-11 14:55
前边几期做了没?是不是找不到mmm命令啊,你可以尝试一下source build/envsetup.sh 看能解决吗 ...

能找到mmm命令,就是权限不够,使用sudo提示command not found。改用su获得root权限就可以使用了。

使用特权

评论回复
8
xiaohai8856|  楼主 | 2015-12-11 17:20 | 只看该作者
colin2135 发表于 2015-12-11 15:42
能找到mmm命令,就是权限不够,使用sudo提示command not found。改用su获得root权限就可以使用了。
...

现在没问题了吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

315

帖子

16

粉丝