Android内核剖析读书笔记(1)—Framework概述

一、Framework组成


1.服务端组成

a.WindowManagerService
    决定各窗口的叠放次序、隐藏或者显示窗口
b.ActivityManagerService
  管理应用程序中所有的activity
c.KeyQ
  Wms内部类,继承于KeyInputQueue,一旦创建就会立即启动一个线程负责读取用户的UI相关操作,如,按键、触摸屏等,并把消息放到QueueEvent类中
d.InputDispatcherThread
  一旦创建立即启动一个线程从QueueEvent读取用户消息,并进行过滤,然后发给当前活动的客户端程序

2.客户端组成

a.ActivityThread
     应用程序主线程类,所有APK程序有且仅有一个ActivityThread类,该类所在线程即为UI线程或主线程
b.Activity
     主线程动态加载可执行代码的最小单元,一个APK程序可包含多个Activity类,ActivityThread类会根据用户操作选择加载哪一个Activity
c.DectorView
     FrameLayout的子类,对FrameLayout进行一定的修饰
d.Window
     提供一组通用窗口操作的API,Wms管理的不是该window,而是View或ViewGroup,也就PhoneWindow内部包含的DectorView
e.PhoneWindow
     继承于Window,内部包含一个DectorView
f.ViewRoot
     继承于Handler,把Wms的IPC调用转化为本地的一个异步调用;因为Wms在管理客户端窗口时,会通过IPC调用通知客户端进行某种操作,而客户端收到IPC调用请求后就会通过Handler转化为本地的一个异步调用
g.W类
     继承于Binder类,并且是ViewRoot的内部类,Wms通知客户端窗口时,通过IPC调用,也就是调用到该Binder对象,然后该Binder会对该类所在的ViewRoot对象发送一个Handler消息,以便进行异步处理
h.WindowManager
     负责客户端申请创建窗口的任务,与Wms进行交互,客户端就不用与Wms进行交互


3.Linux驱动

a.SurfaceFlingger(SF)
 对应每一个窗口,把各个Surface显示在同一个屏幕上
b.Binder
  提供跨进程的消息传递

二、APK程序的运行过程


a.ActivityThread.main()----->ActivityThread.prepareMainLoper(),为UI线程创建一个消息队列

b.创建ActivityThread对象----->创建一个Handler和ApplicationThread(Binder,负责接收远程Ams的IPC调用,通过前面创建的Handler把消息发送到消息队列中,UI线程异步取出消息并执行相关操作)

c.Ams.startActivity--->ActivityThread创建指定的Activity---->Activity创建PhoneWindow类--->DectorView--->View或者ViewGroup---->调用WindowManager创建ViewRoot并调用Wms的远程接口完成添加一个创建并显示在屏幕上

d.KeyQ接受用户的操作并存储到QueueEvent队列中,InputdispatcherThread线程逐个取出消息,调用Wms中的相应函数进行处理,Wms调用相应窗口的W接口

e.W类接受Wms的IPC调用--->把消息传递给ViewRoot---->Viewroot传递给UI线程ActivityThread-->ActivityThread解析该消息并作相应处理

三、客户端中的线程

1.Android APK程序都有哪些进程?

如图所示,共有三个线程,一个Main线程外加两个Binder线程(对应ActivityThread创建的ViewRoot.W和ApplicationThread,负责接收Linux驱动发送的IPC调用)

2.什么是UI线程?

负责处理所有的用户消息以及绘制界面

3.自定义Thread与UI Thread的区别?

UI线程在ActivityThread中运行,已经为其创建了消息队列,用户可直接在UI线程中使用Handler,而自定义线程是一个裸线程,不能直接使用Handler,需创建消息队列和消息循环,即:
new Thread(new Runnable() {
    public void run() {
        Looper.prerpareLooper();
        //处理业务逻辑
        Looper.loop();
    }
}).start();


四、几个常见问题?

1.Activity如何传递消息?

  a.利用Application共享,每个Activity对应的Application是唯一的
  b.Intent
  c.利用SharedPreference、文件、数据库进行

2.窗口的相关概念
 a.窗口(非Window类):
     程序员或用户看到屏幕上的一个独立界面,如Activity、对话框、菜单等.对于Wms,窗口是接收用户消息的最小单元,添加一个窗口就是添加一个View,Wms判断消息来自哪个View,然后通过IPC调用把这个消息传递给客户端的ViewRoot.W子类
 b.Window类:
     一个抽象类,抽象了客户端窗口的基本操作,并定义了一组Callback接口,Activity就是通过此接口来获得对消息的处理机会

c.ViewRoot类:
     客户端(WindowManager)创建窗口时的一个代理,用来和Wms进行交互,通过其内部的W类.Wms管理的每个窗口都会对应一个ViewRoot类
d.W类
     ViewRoot的一个内部类,继承与Binder,用于向Wms提供一个IPC接口,从而让Wms控制窗口客户端的行为

原文地址:https://www.cnblogs.com/zsw-1993/p/4879930.html