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

  1. 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配置

这个方法用来进行Display相关配置的第一次更新:

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

public void displayReady() {
synchronized (mGlobalLock) {

// 告知WindowAnimator初始化完成
mAnimator.ready();
// 表示Display准备完成
mDisplayReady = true;
// 更新Configuration
mRoot.forAllDisplays(DisplayContent::reconfigureDisplayLocked);
}

try {
// 更新Configuration
mActivityTaskManager.updateConfiguration(null);
} catch (RemoteException e) {
}
}

文末

当你打算跳槽的时候,应该把“跳槽成功后,我能学到什么东西?对我的未来发展有什么好处”放在第一位。这些东西才是真正引导你的关键。在跳槽之前尽量“物尽其用”,把手头上的工作做好,最好是完成了某个项目或是得到提升之后再走。跳槽不是目的,而是为了达到最终职业目标的手段

最后祝大家工作升职加薪,面试拿到心仪Offer



《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
中…(img-HWLNPy3C-1714656868623)]
[外链图片转存中…(img-dfX93asN-1714656868624)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值