Android Framework 层叫应用程序框架层,为上层应用层提供各种 APIs、组件和服务。
Android Framework 层包含 3 个主要部分:服务端、客户端、Linux 驱动。
服务端(部分)
- ActivityManagerService(AMS):管理Activity;
- WindowManagerService(WMS):控制窗口的显示、隐藏及层序,用来管理窗口;
- KeyQ 类::WMS的内部类,一旦创建就会启动一个新的线程,线程不断接受和读取用户的 UI 操作消息,并把消息存进消息队列 QueueEvent;
- InputDispatcherThread:一旦创建启动一个新的线程,不断地从消息队列 QueueEvent 中读取消息并过滤,并将消息发送到当前活动的客户端中。
客户端(部分)
- ActivityThread:主线程类,即UI线程类,程序入口为 ActivityThread 的 main 函数入口。它根据AMS的要求调度和执行 activites 和其他操作;
- ViewRoot:负责客户端跟 WMS 交互,。内部有 W 类,W类继承于 Binder。当 WMS 与客户端进行通信时调用该类。内部有 ViewRootHandler 类继承于 Handler,所以能在 W 类接收到 Wms 的消息后把消息传递到 UI 线程中。同时,界面绘制的起点也在其中 - performTraversals;
- W 类:ViewRoot 助手,ViewRoot 内部类,主要帮助 ViewRoot 实现把 Wms 的 IPC 调用转换成本地的一个异步调用;
- Activity 类
- PhoneWindow:继承于 Window 类,里面会放一个 DecorView,提供了一组统一窗口操作的 API;
- Window:提供一些通用的窗口操作 API;
- DecorView:这是我们所能看到的 View 的所有,它集成自 FrameLayout,我们写的布局 view 就是放在它里面的;
- ApplicationThread:继承于 Binder,当 AMS 想调用客户端方法时调用;
- Instrumentionn:负责直接与 Ams 对话,所有想调用 Ams 的操作都集中在这里,负责单向调用 Ams;
- WindowManager:客户端与 WindowManagerService 通信使用。
Linux 驱动
Linux 驱动与 Framework 相关的主要有两部分:SurfaceFlingger,Binder。每一个窗口都对应一个画 Surface,SF主要是把各个 Surface 显示到同一屏幕上。Binder 是提供跨进程的消息传递。
Android Framework 三大核心功能
- View.java:View 的工作原理,实现包括绘制view、处理触摸、按键事件等;
- ActivityManagerService.java:管理所有的应用程序的 Activity 等;
- WindowManagerService.java:为所有应用程序分配窗口,并管理这些窗口。