Android R WindowManagerService模块(1) WMS整体架构及启动过程

  1. ConfigurationContainer:最顶层容器,定义了多个Configuration对象,以及提供了用来组织各容器层级的公共逻辑;
  2. WindowProcessController:用于和AMS中的ProcessRecord进行通讯,当ProcessRecord中对应用进程作出调整后,通过WindowProcessController和WM进行通信;
  3. WindowContainer:作为可以保存窗口类父类,定义了用于操作窗口的所有公共方法;
  4. RootWindowContainer:窗口容器在树结构中的根节点;
  5. DisplayContent:作为RootWindowContainer的子节点,用于管理同一个逻辑屏的窗口;
  6. DisplayChildWindowContainer:DisplayContent中的所有子节点的父类;
  7. NonAppWindowContainers:继承于DisplayChildWindowContainer,主要保存非来自应用的WindowToken;
  8. WindowContainers:只包含一个子节点——DisplayArea.Root,大部门窗口都会保存在这个容器中;
  9. DisplayArea:用于对DisplayContent中的节点进行分组管理,主要分为了三类;
  10. Root:DisplayArea的子类,该容器作为DisplayContent中最顶层的显示区域,用来保存Tokens、TaskDisplayArea、ImeContainer容器;
  11. TaskDisplayArea:DisplayArea的子类,此类容器用于管理Task;
  12. Tokens:DisplayArea的子类,该容器用来保存正常窗口的WindowToken;
  13. ImeContainer:Tokens的子类,该容器用来保存IME窗口的WindowToken;
  14. Task:用来保存ActivityRecord,即我们常说的"任务";
  15. ActivityStack:Task的子类,用来管理处于同一个栈的Activity,特殊栈可以保存Task;
  16. WindowToken:用来管理窗口,多个窗口可以被一个WindowToken进行管理;
  17. ActivityRecord:继承于WindowToken,表示ActivityStack中的一个Activity实例;
  18. WallpaperWindowToken:继承于WindowToken,壁纸窗口比较特殊,因此由WallpaperWindowToken进行管理;
  19. WindowState:窗口对象实例;

DisplayArea是Android R上新添加的容器,目的就是将复杂的窗口层级管理简单化、低耦合。

而在树结构中,各个容器结构如下:

window_tree.png

可以看到,在树结构中,根节点为RootWindowContainer,叶子节点为WindowState。 正是通过这种结构,WMS中将系统中所有的窗口显示管理得井井有条,并将所有窗口以Surface的形式送到SurfacaFlinger中进行合成和显示。

2.WMS启动流程

接下来我们看下WMS的启动过程。WindowManagerService没有继承与SystemService,而是直接继承了IWindowManager.Stub接口,因此启动过程中,和SytemService的启动有区别。在system_server中,通过以下这些操作完成了WMS的启动:

// frameworks/base/services/java/com/android/server/SystemServer.java

private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
// 创建WMS
wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore,
new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);
// 进行初始化
wm.onInitReady();
// 设置InputCallback接口
inputManager.setWindowManagerCallbacks(wm.getInputManagerCallback());
// 进行Display配置更新
wm.displayReady();
// 系统启动完成
wm.systemReady();
// 计算Configuration
final Configuration config = wm.computeNewConfiguration(DEFAULT_DISPLAY);
DisplayMetrics metrics = new DisplayMetrics();
context.getDisplay().getMetrics(metrics);
context.getResources().updateConfiguration(config, metrics);
}

下面对以上操作分别进行分析。

1.1.WMS#main()创建WMS对象

在执行main()方法后,最终会在android.display线程去创建WMS的实例:

// frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

private WindowManagerService(Context context, InputManagerService inputManager,
boolean showBootMsgs, boolean onlyCore, WindowManagerPolicy policy,
ActivityTaskManagerService atm, Supplier<SurfaceControl.Transaction> transactionFactory,
Supplier surfaceFactory,
Function<SurfaceSession, SurfaceControl.Builder> surfaceControlFactory) {

// Tranaction对象
mTransaction = mTransactionFactory.get();

// 创建WindowAnimator对象
mAnimator = new WindowAnimator(this);
// 创建RootWindowContainer对象
mRoot = new RootWindowContainer(this);
// 创建WindowSurfacePlacer对象
mWindowPlacerLocked = new WindowSurfacePlacer(this);
// 创建TaskSnapshotController对象
mTaskSnapshotController = new TaskSnapshotController(this);
// 创建DisplayWindowListenerController对象
mDisplayNotificationController = new DisplayWindowListenerController(this);

// 创建SurfaceAnimationRunner对象
mSurfaceAnimationRunner = new SurfaceAnimationRunner(mTransactionFactory,
mPowerManagerInternal);
// 创建TaskPositioningController
mTaskPositioningController = new TaskPositioningController(
this, mInputManager, mActivityTaskManager, mH.getLooper());
// 创建DragDropController对象
mDragDropController = new DragDropController(this, mH.getLooper());
// 创建EmbeddedWindowController
mEmbeddedWindowController = new EmbeddedWindowController(mAtmService);
// 创建 DisplayAreaPolicy.Provider对象
mDisplayAreaPolicyProvider = DisplayAreaPolicy.Provider.fromResources(
mContext.getResources());

}

构造方法中,创建了WMS所用到的多个对象。

2.2.WMS#onInitReady()对Policy进行初始化

接下来执行onInitReady()方法进行初始化,这个方法中,在android.ui线程中调用WindowManagerPolicy#init()方法进行初始化:

// frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

public void init(Context context, IWindowManager windowManager,
WindowManagerFuncs windowManagerFuncs) {
mContext = context;
mWindowManager = windowManager;
mWindowManagerFuncs = windowManagerFuncs;

}

这个方法中做了大量的初始化操作。PhoneWindowManager继承于WindowManagerPolicy,是WMS中管理窗口过程中的一个策略类,窗口的显示、事件的派发等都受到PhoneWindowManager中的策略影响。 mWindowManagermWindowManagerFuncs都是WMS对象本身。

2.3.IMS#setWindowManagerCallbacks()设置InputCallback回调

这个方法用来向IMS中设置InputManagerCallback回调:

// frameworks/base/services/core/java/com/android/server/input/InputManagerService.java

public void setWindowManagerCallbacks(WindowManagerCallbacks callbacks) {
mWindowManagerCallbacks = callbacks;
}

InputManagerCallback对象在WMS加载时完成创建:

// frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

// 创建InputManagerCallback对象
final InputManagerCallback mInputManagerCallback = new InputManagerCallback(this);

public InputManagerCallback getInputManagerCallback() {
return mInputManagerCallback;
}

InputManagerCallback接口用于接受IMS中的回调,如input事件派发过程中发生的ANR等,就是通过该接口向WMS中传递。

2.4.WMS#displayReady()更新DisplayContent配置

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【算法合集】

【延伸Android必备知识点】

【Android部分高级架构视频学习资源】

**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android WindowManagerServiceAndroid系统的核心服务之一,主要负责管理所有窗口的布局和显示,包括应用程序的窗口、系统UI的窗口、Toast提示框、对话框等。其核心功能点包括: 1. 窗口管理:创建、添加、删除、更新窗口,并进行窗口布局和显示管理。 2. 窗口事件处理:处理用户输入事件(如触摸屏幕、按键等)和窗口状态变化事件(如焦点变化、尺寸变化等)。 3. 显示管理:实现窗口的层级管理,控制窗口的显示顺序和透明度等。 4. 窗口动画:实现窗口的动态效果,如弹出、淡入淡出等。 如果想深入学习WindowManagerService,你需要掌握以下知识: 1. Android系统架构和服务机制:了解Android系统架构和服务机制,理解WindowManagerService在整个系统中的位置和作用。 2. Java编程语言和Android开发框架:熟悉Java编程语言和Android开发框架,掌握Android应用程序开发的基本技能。 3. 窗口管理和显示技术:了解窗口管理和显示技术,掌握窗口的创建、添加、删除、更新、布局和显示等基本操作,以及窗口的事件处理和动画效果等。 4. 系统源代码阅读和调试技巧:能够阅读和调试Android系统源代码,理解WindowManagerService的实现原理和代码实现细节。 建议你可以通过阅读官方文档和相关书籍,同时结合源代码进行学习和实践。可以先从WindowManagerService的基本原理和功能入手,逐步深入学习其实现细节和优化技巧。同时,要注重实践,结合实际应用场景进行开发和调试,加深对WindowManagerService的理解和掌握程度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值