优秀的博主博文

在讲述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就是各个演员的长相和表情,取决于它们各自的条件与努力。可见,WMSSurfaceFling的一个重要区别就是——后者只做与显示相关的事情,而WMS要处理对输入事件的派发。

Android支持的窗口类型很多,统一可以分为三大类,另外各个种类下还细分为若干子类型,且都在WindowManager.java中有定义。这三类分别是ApplicationWindowSystemWindowSubWindow

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)讲解博主》讲解部分的链接结合源码深入学习,这里我也是初步概括一下。

  1. 启动ActivityManagerService。
  2. 调用setSystemProcess。
  3. 调用installSystemProviders方法。
  4. 调用systemReady方法。

2.4:AMS的工作流程

AMS的工作流程,其实就是Activity的启动和调度的过程,所有的启动方式,最终都是通过Binder机制的Client端,调用Server端的AMSstartActivityXXX()系列方法。所以可见,工作流程又包括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章。

根据上图我们可以看出,ActivityManagerProxyActivityManagerNative都实现了IActivityManagerActivityManagerProxy就是代理部分,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

总结

简单归纳总结一下大致如下。

服务端

  1. AMS 主要用于管理所有应用程序的Activity
  2. WMS 管理各个窗口,隐藏,显示等
  3. PMS 用来管理跟踪所有应用APK,安装,解析,控制权限等.
  4. 还有用来处理触摸消息的两个类KeyInputQueue和InputDispatchThread,一个用来读消息,一个用来分发消息.。

客户端

主要包括ActivityThread,Activity,DecodeView及父类View,PhoneWindow,ViewRootImpl及内部类等
ActivityThread主要用来和AMS通讯的客户端,Activity是我们编写应用比较熟悉的类。

这里只是简单的认识和归纳总结一下,非常感谢以上博主的贡献。后期我会深入了解Android系统的源码,然后专开一个专栏来详细介绍PMS、AMS、WMS。

Framework学习(三)之PMS、AMS、WMS相关推荐

  1. Entity Framework学习三:查询、插入、更新和删除操作

    1.LINQ过滤数据  var query = from person in context.Peoplewhere person.FirstName.StartsWith("a" ...

  2. 透视Android系统AMS、PMS和WMS,了解开发中的重要角色

    原理 在Android系统中,AMS(Activity Manager Service).PMS(PackageManager Service)和WMS(Window Manager Service) ...

  3. Android面试之百题经典Android答案——cookie,session,JNI,AIDL,Binder,ClassLoader,AMS,WMS,PWS,热更新,插件化,Hook,dex

    一.Activity生命周期 实际面试中可能会以实例形式出现,比如:启动A,再从A启动B,请描述各生命周期 二.Activity的启动模式 Activity的启动模式有4种,分别是Standard.S ...

  4. Framework学习之路(一)—— UI绘制深入源码分析

    Framework学习之路(一)-- UI绘制深入源码分析 本篇为笔者对Android SDK 33版本的UI绘制入口进行追踪的过程,主要作笔记作用.由于笔者经验尚浅,水平也有限,所以会存在很多不足的 ...

  5. Android framework学习

    一:概述 众所周知,Android是一个基于Linux实现的操作系统.但对于Linux内核来说,Android也仅仅只是一个运行在内核之上的应用程序,与其他运行在内核之上的应用程序没有任何区别.所以A ...

  6. Android FrameWork学习(二)Android系统源码调试

    点击打开链接 通过上一篇 Android FrameWork学习(一)Android 7.0系统源码下载\编译 我们了解了如何进行系统源码的下载和编译工作. 为了更进一步地学习跟研究 Android ...

  7. Entity Framework 学习中级篇1—EF支持复杂类型的实现

    本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作. 通常,复杂类型是指那些由几个简单的类型组合而成的类型.比如:一张Customer表,其中有FristName和Las ...

  8. Entity Framework 学习建议及自学资源

    Entity Framework 学习建议及教学PPT 金旭亮 =============================================== EntityFramework(EF)是 ...

  9. 【安卓Framework学习】Wifi框架学习之热点评分机制

    系列文章目录 [安卓Framework学习]Wifi框架学习之核心类 [安卓Framework学习]Wifi框架学习之wifi状态机 [安卓Framework学习]Wifi框架学习之连接与断开流程 [ ...

最新文章

  1. hdu 1263 水果
  2. 对android.mk debug
  3. python excel模板 插件_python脚本——自动推送txt,EXCEL等文件模板
  4. 行列转换的帖子mysql_[转载]mysql行列转换方法总结  (转)
  5. Docker教程(二) Docker环境安装
  6. UIView - CAGradientLayer
  7. 如何使用JavaScript阻止关闭窗口
  8. 网站发布(项目上线流程)
  9. 搜索引擎广告的检索和匹配算法
  10. Vue Mapbox-GL 在地图中增加图标、线条、标记点击弹窗、地图平移
  11. timeline java_Java Timeline.stop方法代码示例
  12. SCTF 2021 | 冰天雪地 极限比拼
  13. android 添加意图,c# - Xamarin.Android:如何为每个通知添加唯一的意图 - 堆栈内存溢出...
  14. 云原生在京东丨揭秘五大云原生项目在京东的落地实践
  15. 微信小程序开发09 开放数据:微信生态帮助业务快速落地
  16. 计算机操作系统—信号
  17. python用selenium 验证码图片_Python +Selenium解决图片验证码登录或注册问题(推荐)
  18. 【计算机网络高分笔记】第三章:数据链路层
  19. 八大排序之归并排序(建议与快排一起看)
  20. Matlab实现图片格式转换 pgm转jpg等

热门文章

  1. Tesla柏林超级工厂开始招人,首批职位已发布
  2. 为什么换工作?(面试必问问题)
  3. 【5G落地】首批5G商用牌照正式颁发!5G和AI并肩前行,会带来下一次的工业革命吗?...
  4. 快速排序多种方法代码Python
  5. echarts画中国地图!
  6. 百度AI学习:一、语音识别
  7. 不错的向上滚动广告代码
  8. 聚焦数智技术助力乡村振兴 京东云为乡村振兴注入“数智”力量
  9. 首发骁龙8 Gen1!联想陈劲:摩托罗拉edge X将给行业扔一颗大炸弹
  10. iPhone 13将减产1000万部,因特定芯片供应不足