2024年安卓最全Android R WindowManagerService模块(1) WMS整体架构及启动过程,2024年最新面试官很吊

结尾

最后,针对上面谈的内容,给大家推荐一个Android资料,应该对大家有用。

首先是一个知识清单:(对于现在的Android及移动互联网来说,我们需要掌握的技术)

泛型原理丶反射原理丶Java虚拟机原理丶线程池原理丶
注解原理丶注解原理丶序列化
Activity知识体系(Activity的生命周期丶Activity的任务栈丶Activity的启动模式丶View源码丶Fragment内核相关丶service原理等)
代码框架结构优化(数据结构丶排序算法丶设计模式)
APP性能优化(用户体验优化丶适配丶代码调优)
热修复丶热升级丶Hook技术丶IOC架构设计
NDK(c编程丶C++丶JNI丶LINUX)
如何提高开发效率?
MVC丶MVP丶MVVM
微信小程序
Hybrid
Flutter

接下来是资料清单:(敲黑板!!!


1.数据结构和算法

2.设计模式

3.全套体系化高级架构视频;七大主流技术模块,视频+源码+笔记

4.面试专题资料包(怎么能少了一份全面的面试题总结呢~)

不论遇到什么困难,都不应该成为我们放弃的理由!共勉~

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

// 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) {

新的开始

改变人生,没有什么捷径可言,这条路需要自己亲自去走一走,只有深入思考,不断反思总结,保持学习的热情,一步一步构建自己完整的知识体系,才是最终的制胜之道,也是程序员应该承担的使命。

《系列学习视频》

《系列学习文档》

《我的大厂面试之旅》

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 14
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值