再学安卓 - 阅读源码

142 阅读3分钟

4_0.png

前言

个人认为无论从事什么类型开发的程序员都有两部分工作内容:

  • 阅读源码(日常积累)
  • 解决问题(直接的工作成果)

针对这两部分需要在两种思考策略之间切换,发散和聚焦

日常阅读源码属于原始积累阶段,此时很适合适度发散,拓宽知识体系,厘清脉络。而解决问题属于重点攻关阶段,需要快速排除干扰项,聚焦问题,直击要害。如何才能快速聚焦?这得益于日常源码的积累。

综上,本系列主旨在于日常积累,重点在框架脉络,且会适度发散,不局限于与应用开发直接相关的范围。若您有分析定位系统问题或性能优化方面的疑问,建议移步高老师的专栏

Android系统架构

这张图想必大家已经非常熟悉了,官方系统架构图。网上针对这张图的说明文字很多,但看过之后懂的人觉得不痛不痒,不懂的依然不懂。相信看过源码之后再看这个架构图,就会恍然大悟。所以当前我们找到自己熟悉的(或者说负责的业务)属于图中哪个部分就足够了。图中除了最底层的Linux Kernel,其余部分都属于AOSP代码范畴。当然,最上层的System Apps,其代码虽然包含在AOSP仓库中,但通常意义上的AOSP并不包含他们。

4_1.png

认识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环节。