前言
个人认为无论从事什么类型开发的程序员都有两部分工作内容:
- 阅读源码(日常积累)
- 解决问题(直接的工作成果)
针对这两部分需要在两种思考策略之间切换,发散和聚焦。
日常阅读源码属于原始积累阶段,此时很适合适度发散,拓宽知识体系,厘清脉络。而解决问题属于重点攻关阶段,需要快速排除干扰项,聚焦问题,直击要害。如何才能快速聚焦?这得益于日常源码的积累。
综上,本系列主旨在于日常积累,重点在框架脉络,且会适度发散,不局限于与应用开发直接相关的范围。若您有分析定位系统问题或性能优化方面的疑问,建议移步高老师的专栏。
Android系统架构
这张图想必大家已经非常熟悉了,官方系统架构图。网上针对这张图的说明文字很多,但看过之后懂的人觉得不痛不痒,不懂的依然不懂。相信看过源码之后再看这个架构图,就会恍然大悟。所以当前我们找到自己熟悉的(或者说负责的业务)属于图中哪个部分就足够了。图中除了最底层的Linux Kernel,其余部分都属于AOSP代码范畴。当然,最上层的System Apps,其代码虽然包含在AOSP仓库中,但通常意义上的AOSP并不包含他们。
认识AOSP目录
本系列针对Android14(aosp分支android-14.0.0_r28)代码进行梳理。
AOSP是一个巨大的工程,里面包罗万象,先了解目录结构,以免我们在其中迷路,看看我们下载下来且编译过的这一堆文件是些什么玩意儿。
aosp
|--- .repo //仓库文件目录,包含git信息
|--- art //Art虚拟机源码
|--- bionic //符合POSIX标准的库,包含许多系统调用函数的实现或宏定义
|--- build //aosp构建系统(Soong)
|--- frameworks
|--- base //Java层的框架代码,我们常说的三大系统服务AMS、WMS、PMS都在这里
|--- libs
|--- hwui //RenderThread线程、动画渲染等C/C++代码
|--- native //Native层的框架代码
|--- services
|--- inputflinger //输入事件处理进程
|--- surfaceflinger //Android绘制流程中重要一环
|--- kernel //预编译的Android内核,内核源码并不包含在aosp中
|--- libnativehelper //JNI开发相关的公共函数库,例如:映射转换Java和C之间的数据
|--- out //编译过程的中间产物和最终产物
|--- packages //系统上层模块和自带的重要APP,例如:桌面、日历、相机等
|--- system //Android核心系统
|--- core
|--- init //kernel启动的第一个用户空间进程源码,可以称之为元祖进程
|--- tools //工程工具,上一篇我们用到的AIDEGen源码就在这里
|--- vendor //厂商硬件驱动目录
以上就是我所涉猎到的aosp目录,欢迎大家补充。唠唠叨叨了一大堆,下一篇我们开始正式进入RTFSC环节。