Android系统服务------WMS和AMS

时间:2021-06-11 16:04:57

本文转载自,博主写的很棒:

http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73b67848c5425938448e435061e5a24febd22754157d5c67a670bf94d48afad762438507ce1db95d31ccabbe36d70c9&p=8f3fd716d9c15afd07bd9b7d0d1786&newp=817c8d3788934eac58ec8c2d02149c231610db2151d6d10129


“可以毫不夸张的说,Android的framework层主要是由WMS、AMS还有View所构成,这三个模块穿插交互在整个framework中,掌握了它们之间的关系和每一个逻辑步骤,你对framework的了解至少有百分之五十”。这是《Android源码与设计模式》作者的原话,最近学习WMS和AMS相关知识,的确非常复杂,这篇文章是在学习之初的初步整理,虽然内容不够细致,但对其也算有个宏观的了解。难点是其中具体的代码逻辑,也都在相应框架下给出了参考链接,日后的工作就是详细学习其中的代码逻辑,让整个框架在脑海中越来越细致、清晰。

AMS与WMS

在没有深入了解AMS与WMS前,对它俩负责的功能一直很模糊,一直搞不清区别。所以在深入理解其中之一时,先对它们在Android中各自负责的任务有个基本的了解和区分。

此外,AMS和WMS都属于Android中的系统服务,系统服务有很多,它们在Android体系架构中都属于同一层次,所以最好在深入了解它们各自的运行机理前,对系统的宏观架构能够有所掌握,也就是在自己的脑海中能够搭建一个简单的模型和框架,搞清楚它们在系统中所扮演的角色。每当我们学习了一个新的知识点,都是对这个模型的填充和细化,并能够较好的与之前所学的知识结合起来,既有利于理解,也有利于记忆,而且还能够感受到自己的积累与进步。

下面先简单对AMS与WMS作个简单的介绍,以解我之前的疑惑。

Activity与WIndow:

  • Activity只负责生命周期和事件处理
  • Window只控制视图
  • 一个Activity包含一个Window,如果Activity没有Window,那就相当于Service

AMS与WMS

  • AMS统一调度所有应用程序的Activity
  • WMS控制所有Window的显示与隐藏以及要显示的位置

在视图层次中,Activity在WIndow之上,如下图,直接截取自我的另一篇博客:

Android系统服务------WMS和AMS
Android应用程序窗口模型

下面进入到对WMS的介绍。

WMS

基础了解

WindowManagerService服务的实现是相当复杂的,毕竟它要管理的整个系统所有窗口的UI,

  • 为所有窗口分配Surface。客户端向WMS添加一个窗口的过程,其实就是WMS为其分配一块Surface的过程,一块块Surface在WMS的管理下有序的排布在屏幕上。Window的本质就是Surface。
  • 管理Surface的显示顺序、尺寸、位置
  • 管理窗口动画
  • 输入系统相关:当接收到一个触摸事件,WMS需要寻找一个最合适的窗口来处理消息,WMS是派发系统按键和触摸消息的最佳人选,WMS是窗口的管理者,系统中所有的窗口状态和信息都在其掌握之中,完成这一工作不在话下。

什么是Window

“Window”表明它是和窗口相关的,“窗口”是一个抽象的概念,

从用户的角度来讲,它是一个“界面”;

从SurfaceFlinger的角度来看,它是一个Layer,承载着和界面有关的数据和属性;

WMS角度来看,它是一个WindowState,用于管理和界面有关的状态。


WMS与SurfaceFling的一个重要区别就是——后者只做与“显示”相关的事情,而WMS要处理对输入事件的派发。

    解惑

    Q:WMS是系统服务,有SystemServer负责启动,启动时机相对较晚,那么在WMS运行之前,终端显示屏就一团黑?

    A:在WMS启动之前,系统只需显示开机动画,它们都有特殊的方式来向屏幕输出图像,比如直接通过OpenGL ES与SurfaceFling的配合来完成。这也从侧面告诉我们,要想在Android上显示UI,并不一定要通过WMS

    AMS

    基础了解

    • 统一调度所有应用程序的Activity的生命周期
    • 启动或杀死应用程序的进程
    • 启动并调度Service的生命周期
    • 注册BroadcastReceiver,并接收和分发Broadcast
    • 启动并发布ContentProvider
    • 调度task
    • 处理应用程序的Crash
    • 查询系统当前运行状态

    工作流程

    AMS的工作流程,其实就是Activity的启动和调度的过程,所有的启动方式,最终都是通过Binder机制的Client端,调用Server端的AMS的startActivityXXX()系列方法。所以可见,工作流程又包括Client端和Server端两个。

    Client端流程

    • Launcher主线程捕获onClick()点击事件后,调用Launcher.startActivitySafely()方法。Launcher.startActivitySafely()内部调用了Launcher.startActivity()方法,Launcher.startActivity()内部调用了Launcher的父类Activity的startActivity()方法。
    • Activity.startActivity()调用Activity.startActivityForResult()方法,传入该方法的requestCode参数若为-1,则表示Activity启动成功后,不需要执行Launcher.onActivityResult()方法处理返回结果。
    • 启动Activity需要与系统ActivityManagerService交互,必须纳入Instrumentation的监控,因此需要将启动请求转交instrumentation,即调用Instrumentation.execStartActivity()方法。
    • Instrumentation.execStartActivity()首先通过ActivityMonitor检查启动请求,然后调用ActivityManagerNative.getDefault()得到ActivityManagerProxy代理对象,进而调用该代理对象的startActivity()方法。
    • ActivityManagerProxy是ActivityManagerService的代理对象,因此其内部存储的是BinderProxy,调用ActivityManagerProxy.startActivity()实质是调用BinderProxy.transact()向Binder驱动发送START_ACTIVITY_TRANSACTION命令。Binder驱动将处理逻辑从Launcher所在进程切换到ActivityManagerService所在进程。

    Server端流程

    1)预启动

    • ActivityManagerService.startActivity()
    • ActivityStack.startActivityMayWait()
    • ActivityStack.startActivityLocked()
    • ActivityStack.startActivityUncheckedLocked()
    • ActivityStack.startActivityLocked()(重载)
    • ActivityStack.resumeTopActivityLocked()

    2)暂停

    • ActivityStack.startPausingLocked()
    • ApplicationThreadProxy.schedulePauseActivity()
    • ActivityThread.handlePauseActivity()
    • ActivityThread.performPauseActivity()
    • ActivityManagerProxy.activityPaused()
    • completePausedLocked()

    3)启动应用程序进程

    • 第二次进入ActivityStack.resumeTopActivityLocked()
    • ActivityStack.startSpecificActivityLocked()
    • startProcessLocked()
    • startProcessLocked()(重载)
    • Process.start()

    4)加载应用程序Activity

    • ActivityThread.main()
    • ActivityThread.attach()
    • ActivityManagerService.attachApplication()
    • ApplicationThread.bindApplication()
    • ActivityThread.handleBindApplication()

    5)显示Activity

    • ActivityStack.realStartActivityLocked()
    • ApplicationThread.scheduleLaunchActivity()
    • ActivityThead.handleLaunchActivity()
    • ActivityThread.performLaunchActivity()
    • ActivityThread.handleResumeActivity()
    • ActivityThread.performResumeActivity()
    • Activity.performResume()
    • ActivityStack.completeResumeLocked()

    6)Activity Idle状态的处理

    7)停止源Activity

    • ActivityStack.stopActivityLocked()
    • ApplicationThreadProxy.scheduleStopActivity()
    • ActivityThread.handleStopActivity()
    • ActivityThread.performStopActivityInner()