1 Android系统架构
参考资料:
Android驱动框架介绍
Android驱动开发全过程
Android架构从顶层到底层
(1)Android APP层:所有安装在手机上的系统应用都属于这一层,自己开发的应用也属于这一层
(2)Java API框架层:这一层主要提供了构建应用程序时可能用到的各种API,开发者通过这一层的API构建自己的APP
(3)Android系统运行层:包括Android Runtime和原生态的C/C++库(向上提供JNI接口,向下调用HAL的接口函数),代码在framework目录下
(4)HAL层:硬件抽象层,代码在hardware目录下
(5)kernel层:Linux内核驱动源码,代码在kernel目录下
一些术语理解:
(1)JNI:Java Native Interface,让Java 虚拟机内运行的Java程序可以调用本地C/C++语言的方式,参考https://blog.youkuaiyun.com/mr_raptor/article/details/30115113
(2)HAL:Hardware Abstraction Layer,硬件抽象层,最终编译生成*.so,一种linux动态链接库文件。参考https://blog.youkuaiyun.com/mr_raptor/article/details/8069588
2 Android源码目录
Android8.1源码的根目录结构
根目录 | 描述 |
---|---|
art | 一种App运行模式,区别于传统的Dalvik虚拟机,旨在提高Android系统的流畅性 |
bionic | 基础C库源代码,Android改造的C/C++库 |
bootable | 引导加载器,Android程序启动导引,适合各种bootloader的通用代码,包括一个recovery目录 |
build | 系统编译规则和配置所需要的脚本和工具 |
cts | Android CTS兼容性规范测试用例 |
dalvik | Java虚拟机 |
developers | Android开发者参考文档, |
development | 应用程序开发相关代码 |
device | 厂商定制代码,Android支持的各种设备及相关配置,结构相似 |
docs | 介绍开源的相关文档 |
external | android使用的一些外部开源库 |
frameworks | Android应用程序的核心框架层(java及C++语言) |
hardware | HAL层,一些与硬件相关的库,部分厂家开源的HAL代码 |
kernel | Linux源代码及芯片厂商的驱动代码 |
libcore | 与媒体播放框架代码相关,Android Java核心类库 |
libnativehelper | Android Java类库的native实现助手 |
out | 编译完成后的代码输出在此目录 |
packages | 应用程序包 |
pdk | Plug Development Kit的缩写,是本地开发套件 |
prebuilts | 各种平台编译工具链 |
sdk | SDK及模拟器 |
system | 底层文件系统/库/应用及组件(C语言) |
tools | 工具文件夹 |
vendor | 厂商定制代码 |
Makefile | 全局的Makefile |
3 一些琐碎知识
3.1 整理gcc编译相关知识
参考资料:
韦东山嵌入式Linux教学视频汇总
百问网维基
-
编译知识:
- 交叉编译:RK3399的编译工具在ToolChain(百度云已保存)的文件夹目录下,命令名称为:aarch-linux-gnu-gcc。(电脑Ubuntu下执行gcc编译生成的为x86架构,在Arm板中不能用)
- 头文件:gcc编译时头文件在系统/usr/include中查找。aarch-linux-gnu-gcc在对应目录下的/libc/usr/include中。编译时可以使用-I指定查找头文件的目录j
- 库函数:在编译器对应目录下的/usr/lib或者/lib下。编译时使用-L可以指定库目录,使用-l指定库。
-
关于gcc编译器:
常用选项 描述 -E 预处理,开发过程中想快速确定某个宏可以使用“-E -dM” -c 把预处理、编译、汇编都做了,但是不链接 -o 指定输出文件 -I 指定头文件目录 -L 指定链接时库文件目录 -l 指定链接哪一个库文件
在这里插入图片描述
aarch-linux-gnu-gcc –o hello hello.c
会执行预处理、编译、汇编和链接这4步,后加-v可以显示运行的详细信息
制作动态库:aarch-linux-gnu-gcc –shared –o sublib.so sub.o
链接动态库:aarch-linux-gnu-gcc –o test main.o –lsub –L ./
3.2 Makefile
参考资料:
“嵌入式Linux应用开发基础知识”第三章
视频
-
Makefile规则
一个简单的Makefile文件包含一系列的“规则”,其样式如下:目标(target)…: 依赖(prerequiries)… \<tab>命令(command)
- 目标(target)通常是要生成的文件的名称,可以是可执行文件或OBJ文件,也可以是一个执行的动作名称,诸如
clean
。 - 依赖是用来产生目标的材料(比如源文件),一个目标经常有几个依赖。
- 命令是生成目标时执行的动作,一个规则可以含有几个命令,每个命令占一行。
- 目标(target)通常是要生成的文件的名称,可以是可执行文件或OBJ文件,也可以是一个执行的动作名称,诸如
-
Makefile常用的函数:
- $(foreach var,list,text) 简单地说,就是 for each var in list, change it to text。 对list中的每一个元素,取出来赋给var,然后把var改为text所描述的形式。
- $(wildcard pattern) pattern所列出的文件是否存在,把存在的文件都列出来。
- $(filter pattern…,text) 把text中符合pattern格式的内容,filter(过滤)出来、留下来。
- $(filter-out pattern…,text) 把text中符合pattern格式的内容,filter-out(过滤)出来、扔掉。
- $(patsubst pattern,replacement,text) 寻找
text
中符合格式pattern
的字,用replacement
替换它们。pattern
和replacement
中可以使用通配符。
3.3 一些琐碎知识
(1) 关于 Android 中各种文件简介
- .img:影像文件,通常用于固件映像,如系统、恢复等。
- .ko:Linux 内核模块文件的后缀名,用于加载内核模块(驱动程序等)。
- .o:目标文件,相当于 Windows 中的 .obj 文件,用于连接器的输入。
- .so:共享库(Shared Object),用于动态连接,相当于 Windows 中的 DLL 文件。
- .a:静态库,包含多个 .o 文件,用于静态链接。
- .la:Libtool 自动生成的共享库文件,记录了一些配置信息。
(2) 关于驱动操作命令
- insmod / modprobe:加载驱动模块。
- rmmod:卸载驱动模块。
- lsmod:查看已加载的模块及其依赖关系。
- modinfo:获取模块的详细信息。
- cat /proc/modules:显示驱动模块大小和内核空间地址。
- cat /proc/devices:显示驱动的主设备号,分类显示。
- /sys/modules:包含对应驱动的目录及分段信息。
- chmod 777 /dev/:驱动授权命令。
(3) 关于 ADB logcat
- 格式1:打印默认日志数据
adb logcat
- 格式2:打印详细时间的日志数据
adb logcat -v time
- 格式3:打印级别为 Error 的信息
adb logcat *:E
- 格式4:打印时间和级别是 Error 的信息
adb logcat -v time *:E
- 格式5:将日志保存到指定位置
adb logcat -v time > D:\log.txt
Android 的日志优先级(priority):
- V:Verbose(最低,输出最多)
- D:Debug
- I:Info
- W:Warning
- E:Error
- F:Fatal
- S:Silent(最高,不输出)