天天看点

Framework 之 内核剖析 读笔

Framework定义了客户端组建和服务端组建功能接口.

Framework框架中主要包含三个部分: 服务端、客户端、Linux.

关于服务端:

  服务端有两个重要的类, WindowManagerService(WMS)、ActivityManagerService(AMS).

  WMS 主要作用是 按照顺序叠放各个窗口.隐藏、显示. 

  AMS  主要作用是管理所有的Activity类.

  除此之外服务端还包含另外两个类:

   KeyQ类:该类为WMS的内部类. 集成于KeyInputQueue类, KeyQ对象一旦创建,就会开启一个线程. 该线程会不断读取UI操作消息,如按键、触屏等等.. 并把这些消息放到消息队列QueueEvent中.

  InputDispatcherThread类:  该类对象一旦创建, 也会启动一个线程, 不断从QueueEvent中获取消息,并进行一定的过滤,最后发送给当前活动的客户端程序中.

关于客户端:客户端主要包含以下类

 ActivityThread类:该类为应用程序主线程,所有APK仅有一个ActivithThread类,程序的入口为该类的 static main()中,ActivityThread类所在线程即为UI线程(主线程)

 Activity类:为APK中最小运行单元(主线程动态加载可执行代码). 一个APK中可以包含多个Activity,ActivityThread会根据用户操作来进行加载

PhoneWindow类: 该类继承于Window类. PhoneWindow内 包含一个DecorView, DecorView继承于FrameLayout.So~,PhoneWindow内含一个View类. 并且提供一组通用窗口API操作

Window类: 该类提供一组通用的窗口(Window)操作API,WMS所管理的窗口并不是 Windows类,而是一个VIEW或者VIEWGROUP,好比PhoneWindow内的DecorView.

DecorView类:该类继承于FrameLayout,Decor 全称 Recoration ,即“修饰”. 该类作用就是给FrameLayout加点修饰,比如添加个titleBar什么的...

ViewRoot类:WMS管理窗口时, 需要通知客户端进行特定操作, 这些操作都是通过IPC调用完成的. 而客户端在收到IPC调用后,都会转换成一个异步调用. 实现的方式就是使用Handler,ViewRoot继承Handler, 其主要作用就是把 IPC 转换成异步调用.

W类: 该类继承于Handler,并且是ViewRoot内部类,Wms通知客户端窗口时,是通过IPC调用,也就是用到该Binder类,然后该类内部处理函数会发送消息给ViewRoot类发送一个Handler消息,以便处理

WindowManager类:客户端需要创建一个窗口,窗口是由WMS完成的, 但是和WMS打交道的就是WindowManager类.有什么需求跟WM说, 由它和WMS进行交互.

Linux驱动:

  Linux驱动在Frameworkd相关主要有两个部分:SurfaceFlingger 和Binder . Binder作用是跨进程通讯

关于APK运行过程

  首先,ActivityThread 从main()开始执行,调用prepareMainLooper() 为UI线程创建一个消息队列(MessageQueue)

   然后创建一个ActivityThread对象,ActivityThread 会在初始化时创建一个 Handler(H) 和ApplicationThreadNative(Binder)对象, binder对象负责远程AMS 的IPC调用, 通过Handler把消息发送到消息队列,UI线程会异步从消息队列将消息去除 执行相应操作,比如 start,pause,destory等. 接着UI线程执行Loop.loop(). 不断从消息队列中取出消息.

    ActivityThread接受到start某个activity时,就会创建指定的Activity,然后创建PhoneWindow->DecorView->相应View或ViewGourp. 创建完成后,Activity需要把创建好的界面显示到屏幕上,这时调用WindowManager类, WM会创建一个ViewRoot对象,内包含W(Handler)类.创建完成后, WM会调用远程 WMS的方法将窗口显示到屏幕上.

  之后用户在屏幕上开始操作, KeyQ类不断收集触碰等信息 存放到QueueEvent中,  InputDispatcherThread不断从QueueEvent中取出消息,然后调用Wms相应函数处理消息.当WMS发现该消息属于客户端某个窗口时,就会被调用相应窗口的W类.

 W类是一个Binder,负责接口WMS的IPC调用,并把消息传递给ViewRoot,ViewRoot把消息传给ActivityThread,ActivityThread接受消息并作出相应处理.在客户端中,DecorView首先处理消息,如果DecorView不想处理,那么会传递给内部包含的View或ViewGroup,如果还没处理,则传给PhoneWindow.最后传递给Activity

继续阅读