在开始之前我们先了解一下Andriod的系统架构和Framework所处的位置
从上到下依次分为六层:(有的地方是分五层的,不包含进程通信层)
- 应用框架层
- 进程通信层
- 系统服务层
- Android运行时层
- 硬件抽象层
- Linux内核层
而我们通常所说的Framework层就是系统服务层
Framework定义了客户端组件和服务端组件功能及接口。包含3个主要部分:服务端,客户端和Linux驱动
一:服务端
服务端主要包含两个重要类,分别是WindowManagerService(WMS)和ActivityManagerService(AMS)。
WMS的作用是为所有的应用程序分配窗口,并管理这些窗口。包括分配窗口大小,调节各窗口的叠放次序,隐藏或显示窗口。
AMS的作用是管理所有应用程序中的Activity。
二:客户端
客户端主要包括以下重要类:
1)ActivityThread类:
该类为应用程序的主线程类,也就是我们通常所指的UI线程,所有的Apk程序有且只有一个ActivityThread类,安卓应用程序的入口为该类中的
public static void main(String[] args)函数。
2)Activity类:
该类为APK程序的一个最小运行单元,一个APK程序中可以包含多个Activity对象,ActivityThread主类会根据用户操作选择运行哪个Activity对象。
3)PhoneWindow类:
该类是Window抽象类的唯一实现类,同时,PhoneWindow类内部包含了一个DecorView对象。简而言之,PhoneWindow是把一个FrameLayout进行了一定的包装,并提供了一组通用的窗口操作接口。
4)Window类:
该类提供了一组通用的窗口(Window)操作API, 这里的窗口仅仅是程序层面上的,WMS所管理的窗口并不是Window类,而是一个View或者ViewGroup类,一般就是指DecorView类,即一个DecorView就是Wms所有管理的一个窗口。Window是一个abstract类型。
5)DecorView类:
该类是一个FrameLayout的子类,并且是PhoneWindow中的一个内部类。DecorView是整个ViewTree的最顶层View,代表了整个应用的界面。在该布局下面,有TitleView和ContentViews这两个子元素,DecorView就是对普通的FrameLayout进行了一定的修饰,比如添加一个通用的TitleBar, 并响应特定的按键消息等。
6)ViewRoot类:
ViewRoot对应ViewRootImpl类,它是连接WindowManagerService和DecorView的纽带,View的三大流程(测量(measure),布局(layout),绘制(draw))均通过ViewRoot来完成。ViewRoot在本质上一个Handler。
ViewRoot垂直关系:WindowManagerService—PhoneWindowManager—–WindowManagerGlobal—ViewRoot
ViewRoot作为桥梁,很好的承接了管理View树的工作。
7)W类: 该类继承于Binder, 并且是ViewRoot的一个内部类。
8)WindowManager类:
客户端要申请创建一个窗口,而具体创建窗口的任务是由Wms完成的,WindowManager类就像是一个部门经理,谁有什么需求就告诉它,由它和Wms进行交互,客户端不能直接和Wms进行交互。WindowManager 是一个接口,它继承自只有三个方法的 ViewManager 接口:
这三个方法其实就是 WindowManager 对外提供的主要功能,即添加 View、更新 View 和删除 View。
关系图:
三:Linux驱动
Linux驱动和Framework相关的主要包含两部分,分别是SurfaceFlingger(SF)和Binder。每一个窗口都对应一个Surface, SF驱动的作用是把各个Surface显示在同一屏幕上。Binder驱动的作用是提供跨进程(IPC)的消息传递机制。