Framework学习(三)之PMS、AMS、WMS
优秀的博主博文
在讲述AMS、PMS、WMS之前有几篇非常好的博文推荐给大家,因为个人觉得介绍的非常好,必要分享给大家,希望对大家有所帮助,同时也感谢这些博主的辛勤付出。
1:PackageMangerService(PMS)讲解博主
PMS系列我觉得csdn博主jeanboy讲的非常好,这里附上博主的博客链接jeanboy。这是一位资深级的博客专家。关于他PMS的讲解我归纳了一下,大致如下。
Android - PackageMangerService 相关系列分析
1. 一篇文章看明白 Android 系统启动时都干了什么
2. 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制
3. 一篇文章看明白 Android 从点击应用图标到界面显示的过程
4. 一篇文章看明白 Activity 与 Window 与 View 之间的关系
5.一篇文章看明白 Android 图形系统 Surface 与 SurfaceFlinger 之间的关系
6. 一篇文章看明白 Android Service 启动过程
7.一篇文章看明白 Android PackageManagerService 工作流程
8. 一篇文章看明白 Android v1 & v2 签名机制
2: WindowManagerService(WMS)讲解博主
WMS系列我推荐大家学习csdn传奇大佬罗升阳罗大佬的博文,罗大佬在Android方面的造诣在业界大家有目共睹的,可以说,我在学习Android过程中遇到的好多问题都是看他的博客从而获得启发的。这里附上博主的博客链接《罗升阳》。关于他WMS的讲解我归纳了一下,大致如下。
1. Android窗口管理服务WindowManagerService计算Activity窗口大小的过程分析
2. Android窗口管理服务WindowManagerService对窗口的组织方式分析
3. Android窗口管理服务WindowManagerService对输入法窗口(Input Method Window)的管理分析
4. Android窗口管理服务WindowManagerService对输入法窗口(Input Method Window)的管理分析
5. Android窗口管理服务WindowManagerService计算窗口Z轴位置的过程分析
6. Android窗口管理服务WindowManagerService显示Activity组件的启动窗口(Starting Window)的过程分析
7. Android窗口管理服务WindowManagerService切换Activity窗口(App Transition)的过程分析
8. Android窗口管理服务WindowManagerService显示窗口动画的原理分析
3:ActivityManagerService(AMS)讲解博主
AMS系列我推荐大家学习csdn博主刘望舒大佬的博文。关于他AMS的讲解我归纳了一下,大致如下:
1. Android解析ActivityManagerService(一)AMS启动流程和AMS家族
2. Android解析ActivityManagerService(二)ActivityTask和Activity栈管理
3. ActivityManager与Proxy模式的运用
分类归纳
看了以上的博主的讲解,大概明白了PMS、AMS、WMS各自的职能,下面简单归纳一下,关于他们的精髓还是要在项目实战中不断摸索探究,这里我只是简单的做一个归纳总结。因为关于这三者的东西实在是很多,需要花费一定的时间去学习,去踩坑。
一:认识WMS
1.1:初识WMS
WindowManagerService服务(WMS)的实现是相当复杂的,毕竟它要管理的整个系统所有窗口的UI,而在任何一个系统中,窗口管理子系统都是极其复杂的。而WMS就是管理整个系统的窗口的。
1.2:WMS的功能
- 为所有窗口分配Surface。客户端向WMS添加一个窗口的过程,其实就是WMS为其分配一块Suiface的过程,一块块Surface在WMS的管理下有序的排布在屏幕上。Window的本质就是Surface。
- 管理Surface的显示顺序、尺寸、位置
- 管理窗口动画
- 输入系统相关:WMS是派发系统按键和触摸消息的最佳人选,当接收到一个触摸事件,它需要寻找一个最合适的窗口来处理消息,而WMS是窗口的管理者,系统中所有的窗口状态和信息都在其掌握之中。
1.3:认识Window
Window
表明它是和窗口相关的,窗口
是一个抽象的概念,从用户的角度来讲,它是一个界面
;从SurfaceFlinger
的角度来看,它是一个Layer
,承载着和界面有关的数据和属性;从WMS
角度来看,它是一个WIndowState
,用于管理和界面有关的状态。
在《深入理解Android内核设计思想》
一书中有这样的一个比喻。整个界面就像由N个演员参与的话剧:SurfaceFling
是摄像机,它只负责客观的捕捉当前的画面,然后真实的呈现给观众;WMS
就是导演,它要负责话剧的舞台效果、演员站位;ViewRoot
就是各个演员的长相和表情,取决于它们各自的条件与努力。可见,WMS
与SurfaceFling
的一个重要区别就是——后者只做与显示
相关的事情,而WMS
要处理对输入事件的派发。
Android支持的窗口类型很多,统一可以分为三大类,另外各个种类下还细分为若干子类型,且都在WindowManager.java
中有定义。这三类分别是ApplicationWindow
,SystemWindow
,SubWindow
。
1.4:WMS工作流程
关于WMS的工作流程根据上述老罗的讲解思路大致归纳如下几步,具体参考上面的参考链接博主《2: WindowManagerService(WMS)讲解博主》
讲解部分,他们和下面的归纳是一一对应的。
- 窗口大小和位置(X轴和Y轴)的计算过程
- 窗口的组织方式
- 输入法窗口的调整过程
- 壁纸窗口的调整过程
- 窗口Z轴位置的计算和调整过程
- Activity窗口的启动窗口的显示过程
- Activity窗口的切换过程
- Activity窗口的动画显示过程
1.5:WMS的设计思想
我们知道,学习一个框架其实就是学习一种编程思想,或者说理解他的设计模式,只有掌握了设计思想理解起来就事半功倍了,WMS的设计思想就是利用了桥接模式
。关于桥接模式
这里不做过多讲解,可以再《Android源码设计模式》
第24章了解到。
二:认识AMS
2.1:初识AMS
AMS是系统的引导服务,应用进程的启动、切换和调度、四大组件的启动和管理都需要AMS的支持。
2.2:AMS的功能
- 统一调度所有应用程序的Activity的生命周期
- 启动或杀死应用程序的进程
- 启动并调度Service的生命周期
- 注册BroadcastReceiver,并接收和分发Broadcast
- 启动并发布ContentProvider
- 调度task
- 处理应用程序的Crash
- 查询系统当前运行状态
2.3:AMS的启动流程
关于AMS的启动流程大致我认为可以分为如下几步,自己也没有深入了解。我也是看了刘望舒大佬的博客简单的做了一点概括,具体的还是要不断自己深入底层原理自行探究。可以参看上面《3:ActivityManagerService(AMS)讲解博主》
讲解部分的链接结合源码深入学习,这里我也是初步概括一下。
- 启动ActivityManagerService。
- 调用setSystemProcess。
- 调用installSystemProviders方法。
- 调用systemReady方法。
2.4:AMS的工作流程
AMS
的工作流程,其实就是Activity的启动和调度的过程,所有的启动方式,最终都是通过Binder
机制的Client
端,调用Server
端的AMS
的startActivityXXX
()系列方法。所以可见,工作流程又包括Client
端和Server
端两个。下面简单介绍一下这俩端的职责,具体还是参考上面《3:ActivityManagerService(AMS)讲解博主》
讲解部分的链接结合源码深入学习,这里我也是初步概括一下。
1:客户端工作流程
1. Launcher主线程捕获onClick()点击事件后,调用Launcher.startActivitySafely()方法。Launcher.startActivitySafely()内部调用了Launcher.startActivity()方法,Launcher.startActivity()内部调用了Launcher的父类Activity的startActivity()方法。
2. Activity.startActivity()调用Activity.startActivityForResult()方法,传入该方法的requestCode参数若为-1,则表示Activity启动成功后,不需要执行Launcher.onActivityResult()方法处理返回结果。
3. 启动Activity需要与系统ActivityManagerService交互,必须纳入Instrumentation的监控,因此需要将启动请求转交instrumentation,即调用Instrumentation.execStartActivity()方法。
4. Instrumentation.execStartActivity()首先通过ActivityMonitor检查启动请求,然后调用ActivityManagerNative.getDefault()得到ActivityManagerProxy代理对象,进而调用该代理对象的startActivity()方法。
5. ActivityManagerProxy是ActivityManagerService的代理对象,因此其内部存储的是BinderProxy,调用ActivityManagerProxy.startActivity(),实质是调用BinderProxy.transact()向Binder驱动发送START_ACTIVITY_TRANSACTION命令。Binder驱动将处理逻辑从Launcher所在进程切换到ActivityManagerService所在进程。
2:服务端工作流程
启动Activity的请求从Client端传递给Server端后,便进入了启动应用的七个阶段,这里也是整理出具体流程。
2.1 预启动
- ActivityManagerService.startActivity()
- ActivityStack.startActivityMayWait()
- ActivityStack.startActivityLocked()
- ActivityStack.startActivityUncheckedLocked()
- ActivityStack.startActivityLocked()(重载)
- ActivityStack.resumeTopActivityLocked()
2.2 暂停
- ActivityStack.startPausingLocked()
- ApplicationThreadProxy.schedulePauseActivity()
- ActivityThread.handlePauseActivity()
- ActivityThread.performPauseActivity()
- ActivityManagerProxy.activityPaused()
- completePausedLocked()
2.3 启动应用程序进程
- 第二次进入ActivityStack.resumeTopActivityLocked()
- ActivityStack.startSpecificActivityLocked()
- startProcessLocked()
- startProcessLocked()(重载)
- Process.start()
2.4 加载应用程序Activity
- ActivityThread.main()
- ActivityThread.attach()
- ActivityManagerService.attachApplication()
- ApplicationThread.bindApplication()
- ActivityThread.handleBindApplication()
2.5 显示Activity
- ActivityStack.realStartActivityLocked()
- ApplicationThread.scheduleLaunchActivity()
- ActivityThead.handleLaunchActivity()
- ActivityThread.performLaunchActivity()
- ActivityThread.handleResumeActivity()
- ActivityThread.performResumeActivity()
- Activity.performResume()
- ActivityStack.completeResumeLocked()
2.6 Activity Idle状态的处理
2.7 停止源Activity
- ActivityStack.stopActivityLocked()
- ApplicationThreadProxy.scheduleStopActivity()
- ActivityThread.handleStopActivity()
- ActivityThread.performStopActivityInner()
2.5:AMS的设计思想
AMS也用到了设计思想,主要是代理模式
。关于代理模式这里就不再讲解,参考《Android源码设计模式》
第18章。
根据上图我们可以看出,ActivityManagerProxy
和ActivityManagerNative
都实现了IActivityManager
,ActivityManagerProxy
就是代理部分,ActivityManagerNative
就是实现部分,但ActivityManagerNative
是个抽象类,并不处理过多的具体逻辑,大部分具体逻辑是由ActivityManagerService
承担,这就是为什么我们说真实部分应该为ActivityManagerService
。
三:认识PMS
3.1:初识PMS
PackageManagerService(简称 PMS),是 Android 系统核心服务之一,处理包管理相关的工作,常见的比如安装、卸载应用等。PMS是系统服务,那么应用层肯定有个PackageManager作为binder call client端来供使用,但是这里要注意,PackageManager是个抽象类,一般使用的是它的实现类:ApplicationPackageManager。因此PackageManager功能的具体实现还是ApplicationPackageManager这个实现类。
3.2:PMS的功能
- 提供一个应用程序的所有信息(ApplicationInfo)
- 提供四大组件的信息
- 查询permission相关信息
- 提供包的信息
- 安装、卸载APK
总结
简单归纳总结一下大致如下。
服务端
- AMS 主要用于管理所有应用程序的Activity
- WMS 管理各个窗口,隐藏,显示等
- PMS 用来管理跟踪所有应用APK,安装,解析,控制权限等.
- 还有用来处理触摸消息的两个类KeyInputQueue和InputDispatchThread,一个用来读消息,一个用来分发消息.。
客户端
主要包括ActivityThread,Activity,DecodeView及父类View,PhoneWindow,ViewRootImpl及内部类等
ActivityThread主要用来和AMS通讯的客户端,Activity是我们编写应用比较熟悉的类。
这里只是简单的认识和归纳总结一下,非常感谢以上博主的贡献。后期我会深入了解Android系统的源码,然后专开一个专栏来详细介绍PMS、AMS、WMS。
Framework学习(三)之PMS、AMS、WMS相关推荐
- Entity Framework学习三:查询、插入、更新和删除操作
1.LINQ过滤数据 var query = from person in context.Peoplewhere person.FirstName.StartsWith("a" ...
- 透视Android系统AMS、PMS和WMS,了解开发中的重要角色
原理 在Android系统中,AMS(Activity Manager Service).PMS(PackageManager Service)和WMS(Window Manager Service) ...
- Android面试之百题经典Android答案——cookie,session,JNI,AIDL,Binder,ClassLoader,AMS,WMS,PWS,热更新,插件化,Hook,dex
一.Activity生命周期 实际面试中可能会以实例形式出现,比如:启动A,再从A启动B,请描述各生命周期 二.Activity的启动模式 Activity的启动模式有4种,分别是Standard.S ...
- Framework学习之路(一)—— UI绘制深入源码分析
Framework学习之路(一)-- UI绘制深入源码分析 本篇为笔者对Android SDK 33版本的UI绘制入口进行追踪的过程,主要作笔记作用.由于笔者经验尚浅,水平也有限,所以会存在很多不足的 ...
- Android framework学习
一:概述 众所周知,Android是一个基于Linux实现的操作系统.但对于Linux内核来说,Android也仅仅只是一个运行在内核之上的应用程序,与其他运行在内核之上的应用程序没有任何区别.所以A ...
- Android FrameWork学习(二)Android系统源码调试
点击打开链接 通过上一篇 Android FrameWork学习(一)Android 7.0系统源码下载\编译 我们了解了如何进行系统源码的下载和编译工作. 为了更进一步地学习跟研究 Android ...
- Entity Framework 学习中级篇1—EF支持复杂类型的实现
本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作. 通常,复杂类型是指那些由几个简单的类型组合而成的类型.比如:一张Customer表,其中有FristName和Las ...
- Entity Framework 学习建议及自学资源
Entity Framework 学习建议及教学PPT 金旭亮 =============================================== EntityFramework(EF)是 ...
- 【安卓Framework学习】Wifi框架学习之热点评分机制
系列文章目录 [安卓Framework学习]Wifi框架学习之核心类 [安卓Framework学习]Wifi框架学习之wifi状态机 [安卓Framework学习]Wifi框架学习之连接与断开流程 [ ...
最新文章
- hdu 1263 水果
- 对android.mk debug
- python excel模板 插件_python脚本——自动推送txt,EXCEL等文件模板
- 行列转换的帖子mysql_[转载]mysql行列转换方法总结 (转)
- Docker教程(二) Docker环境安装
- UIView - CAGradientLayer
- 如何使用JavaScript阻止关闭窗口
- 网站发布(项目上线流程)
- 搜索引擎广告的检索和匹配算法
- Vue Mapbox-GL 在地图中增加图标、线条、标记点击弹窗、地图平移
- timeline java_Java Timeline.stop方法代码示例
- SCTF 2021 | 冰天雪地 极限比拼
- android 添加意图,c# - Xamarin.Android:如何为每个通知添加唯一的意图 - 堆栈内存溢出...
- 云原生在京东丨揭秘五大云原生项目在京东的落地实践
- 微信小程序开发09 开放数据:微信生态帮助业务快速落地
- 计算机操作系统—信号
- python用selenium 验证码图片_Python +Selenium解决图片验证码登录或注册问题(推荐)
- 【计算机网络高分笔记】第三章:数据链路层
- 八大排序之归并排序(建议与快排一起看)
- Matlab实现图片格式转换 pgm转jpg等