RK3399--知识整理(源码结构总结)

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.csdn.net/mr_raptor/article/details/30115113
(2)HAL:Hardware Abstraction Layer,硬件抽象层,最终编译生成*.so,一种linux动态链接库文件。参考https://blog.csdn.net/mr_raptor/article/details/8069588

2 Android源码目录

参考资料:
Android 8.0.0-r4源码目录结构详解
Android8.1源码结构分析
Android框架理解

Android8.1源码的根目录结构

根目录描述
art一种App运行模式,区别于传统的Dalvik虚拟机,旨在提高Android系统的流畅性
bionic基础C库源代码,Android改造的C/C++库
bootable引导加载器,Android程序启动导引,适合各种bootloader的通用代码,包括一个recovery目录
build系统编译规则和配置所需要的脚本和工具
ctsAndroid CTS兼容性规范测试用例
dalvikJava虚拟机
developersAndroid开发者参考文档,
development应用程序开发相关代码
device厂商定制代码,Android支持的各种设备及相关配置,结构相似
docs介绍开源的相关文档
externalandroid使用的一些外部开源库
frameworksAndroid应用程序的核心框架层(java及C++语言)
hardwareHAL层,一些与硬件相关的库,部分厂家开源的HAL代码
kernelLinux源代码及芯片厂商的驱动代码
libcore与媒体播放框架代码相关,Android Java核心类库
libnativehelperAndroid Java类库的native实现助手
out编译完成后的代码输出在此目录
packages应用程序包
pdkPlug Development Kit的缩写,是本地开发套件
prebuilts各种平台编译工具链
sdkSDK及模拟器
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
    • 依赖是用来产生目标的材料(比如源文件),一个目标经常有几个依赖。
    • 命令是生成目标时执行的动作,一个规则可以含有几个命令,每个命令占一行。
  • 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替换它们。patternreplacement中可以使用通配符。

3.3 一些琐碎知识

(1) 关于 Android 中各种文件简介
  • .img:影像文件,通常用于固件映像,如系统、恢复等。
  • .ko:Linux 内核模块文件的后缀名,用于加载内核模块(驱动程序等)。
  • .o:目标文件,相当于 Windows 中的 .obj 文件,用于连接器的输入。
  • .so:共享库(Shared Object),用于动态连接,相当于 Windows 中的 DLL 文件。
  • .a:静态库,包含多个 .o 文件,用于静态链接。
  • .la:Libtool 自动生成的共享库文件,记录了一些配置信息。

参考:Android 文件格式简介

(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(最高,不输出)

参考:ADB logcat 使用指南

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌梦之旅:小城开发者的笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值