Android P WMS简介

Android P WMS初始化过程

Android P WMS addwindow流程

Android P WMS removewindow流程

Android P WMS relayoutWindow流程

Android P WMS windowanimator

Android P WMS Surface

Android P WMS 问题种类和debug分析技巧

Android P WMS View System 简介

 

Android P WMS初始化过程

             
  1. @/frameworks/base/services/java/com/android/server/SystemServer. java
  2. private void startOtherServices () {
  3. WindowManagerService wm = null;
  4. InputManagerService inputManager = null;
  5. traceBeginAndSlog( "InitWatchdog");
  6. final Watchdog watchdog = Watchdog.getInstance();
  7. watchdog.init(context, mActivityManagerService);
  8. traceEnd();
  9. traceBeginAndSlog( "StartInputManagerService");
  10. inputManager = new InputManagerService(context); //4 需要input,因此才有事件输入
  11. traceEnd();
  12. traceBeginAndSlog( "StartWindowManagerService");
  13. // WMS needs sensor service ready
  14. ConcurrentUtils.waitForFutureNoInterrupt(mSensorServiceStart, START_SENSOR_SERVICE);
  15. mSensorServiceStart = null;
  16. wm = WindowManagerService.main(context, inputManager,
  17. mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
  18. !mFirstBoot, mOnlyCore, new PhoneWindowManager());
  19. ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false,
  20. DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);
  21. ServiceManager.addService(Context.INPUT_SERVICE, inputManager,
  22. /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
  23. traceEnd();
  24. traceBeginAndSlog( "SetWindowManagerService");
  25. mActivityManagerService.setWindowManager(wm);
  26. traceEnd();
  27. traceBeginAndSlog( "WindowManagerServiceOnInitReady");
  28. wm.onInitReady(); //android o没有
  29. traceEnd();
  30. traceBeginAndSlog( "StartInputManager");
  31. inputManager.setWindowManagerCallbacks(wm.getInputMonitor());
  32. inputManager.start();
  33. traceEnd();
  34. // TODO: Use service dependencies instead.
  35. traceBeginAndSlog( "DisplayManagerWindowManagerAndInputReady");
  36. mDisplayManagerService.windowManagerAndInputReady();
  37. traceEnd();
  38. traceBeginAndSlog( "MakeWindowManagerServiceReady");
  39. try {
  40. wm.systemReady();
  41. } catch (Throwable e) {
  42. reportWtf( "making Window Manager Service ready", e);
  43. }
  44. traceEnd();
  45. // Update the configuration for this context by hand, because we're going
  46. // to start using it before the config change done in wm.systemReady() will
  47. // propagate to it.
  48. final Configuration config = wm.computeNewConfiguration(DEFAULT_DISPLAY);
  49. DisplayMetrics metrics = new DisplayMetrics();
  50. WindowManager w = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
  51. w.getDefaultDisplay().getMetrics(metrics);
  52. context.getResources().updateConfiguration(config, metrics);
  53. }

startOtherServices方法用于启动其他服务,其他服务大概有70多个,上面的代码只列出了WMS以及和它相关的IMS的启动逻辑,剩余的其他服务的启动逻辑也都大同小异。 
在注释1、2处分别得到Watchdog实例并对它进行初始化,Watchdog用来监控系统的一些关键服务的运行状况,后文会再次提到它。在注释3处创建了IMS,并赋值给IMS类型的inputManager对象。注释4处执行了WMS的main方法,其内部会创建WMS,需要注意的是main方法其中一个传入的参数就是注释1处创建的IMS,WMS是输入事件的中转站,其内部包含了IMS引用并不意外。结合上文,我们可以得知WMS的main方法是运行在SystemServer的run方法中,换句话说就是运行在”system_server”线程”中,后面会再次提到”system_server”线程。 
注释5和注释6处分别将WMS和IMS注册到ServiceManager中,这样如果某个客户端想要使用WMS,就需要先去ServiceManager中查询信息,然后根据信息与WMS所在的进程建立通信通路,客户端就可以使用WMS了。注释7处用来初始化显示信息,注释8处则用来通知WMS,系统的初始化工作已经完成,其内部调用了WindowManagerPolicy的systemReady方法。 
 

             
  1. @http: //androidxref.com/9.0.0_r3/xref/frameworks/base/services/java/com/android/server/SystemServer.java#875
  2. private WindowManagerService(Context context, InputManagerService inputManager,
  3. boolean haveInputMethods, boolean showBootMsgs, boolean onlyCore,
  4. WindowManagerPolicy policy) {
  5. mInputManager = inputManager; // Must be before createDisplayContentLocked.
  6. mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
  7. mDisplaySettings = new DisplaySettings();
  8. mDisplaySettings.readSettingsLocked();
  9. mPolicy = policy;
  10. mAnimator = new WindowAnimator( this); //创建了WindowAnimator,它用于管理所有的窗口动画
  11. mRoot = new RootWindowContainer( this);
  12. mWindowPlacerLocked = new WindowSurfacePlacer( this);
  13. mTaskSnapshotController = new TaskSnapshotController( this);
  14. mWindowTracing = WindowTracing.createDefaultAndStartLooper(context);
  15. LocalServices.addService(WindowManagerPolicy.class, mPolicy);
  16. if(mInputManager != null) {
  17. final InputChannel inputChannel = mInputManager.monitorInput(TAG_WM);
  18. mPointerEventDispatcher = inputChannel != null
  19. ? new PointerEventDispatcher(inputChannel) : null;
  20. } else {
  21. mPointerEventDispatcher = null;
  22. }
  23. mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
  24. mKeyguardDisableHandler = new KeyguardDisableHandler(mContext, mPolicy);
  25. ...
  26. //得到AMS实例,并赋值给mActivityManager ,这样WMS就持有了AMS的引用
  27. mActivityManager = ActivityManager.getService();
  28. mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
  29. IntentFilter filter = new IntentFilter();
  30. // Track changes to DevicePolicyManager state so we can enable/disable keyguard.
  31. filter.addAction(ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
  32. mContext.registerReceiver(mBroadcastReceiver, filter);
  33. mLatencyTracker = LatencyTracker.getInstance(context);
  34. mSettingsObserver = new SettingsObserver();
  35. mHoldingScreenWakeLock = mPowerManager.newWakeLock(
  36. PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, TAG_WM);
  37. mHoldingScreenWakeLock.setReferenceCounted( false);
  38. mSurfaceAnimationRunner = new SurfaceAnimationRunner();
  39. LocalServices.addService(WindowManagerInternal.class, new LocalService());
  40. }
  41. public void onInitReady() {
  42. initPolicy(); //初始化了窗口管理策略的接口类WindowManagerPolicy(WMP)
  43. // Add ourself to the Watchdog monitors.
  44. Watchdog.getInstance().addMonitor( this); //加入到watchdog
  45. openSurfaceTransaction();
  46. try {
  47. createWatermarkInTransaction();
  48. } finally {
  49. closeSurfaceTransaction( "createWatermarkInTransaction");
  50. }
  51. showEmulatorDisplayOverlayIfNeeded();
  52. }
             
  1. private void initPolicy() {
  2. UiThread.getHandler().runWithScissors( new Runnable() {
  3. @Override
  4. public void run() {
  5. WindowManagerPolicyThread.set(Thread.currentThread(), Looper.myLooper());
  6. mPolicy.init(mContext, WindowManagerService. this, WindowManagerService. this);
  7. }
  8. }, 0);
  9. }

 

运行线程状态

 

initPolicy方法和此前讲的WMS的main方法的实现类似,注释1处执行了WMP的init方法,WMP是一个接口,init方法的具体实现在PhoneWindowManager(PWM)中。PWM的init方法运行在”android.ui”线程中,它的优先级要高于initPolicy方法所在的”android.display”线程,因此”android.display”线程要等PWM的init方法执行完毕后,处于等待状态的”android.display”线程才会被唤醒从而继续执行下面的代码。

在本文中共提到了3个线程,分别是”system_server”、”android.display”和”android.ui”,为了便于理解,下面给出这三个线程之间的关系。
 

Android P WMS初始化过程_第1张图片

 

main运行在DisplayThread(android.display),initPolicy运行在UiThread(android.ui)

             
  1. //android.display thread
  2. public static WindowManagerService main(final Context context, final InputManagerService im,
  3. final boolean haveInputMethods, final boolean showBootMsgs, final boolean onlyCore,
  4. WindowManagerPolicy policy) {
  5. DisplayThread.getHandler().runWithScissors(() ->
  6. sInstance = new WindowManagerService(context, im, haveInputMethods, showBootMsgs,
  7. onlyCore, policy), 0);
  8. return sInstance;
  9. }
  10. //android.ui thread
  11. private void initPolicy() {
  12. UiThread.getHandler().runWithScissors( new Runnable() {
  13. @Override
  14. public void run() {
  15. WindowManagerPolicyThread.set(Thread.currentThread(), Looper.myLooper());
  16. mPolicy.init(mContext, WindowManagerService. this, WindowManagerService. this);
  17. }
  18. }, 0);
  19. }
             
  1. //DisplayThread android.display
  2. /frameworks/base/services/core/java/com/android/server/
  3. H A DDisplayThread.java 36 super( "android.display", Process.THREAD_PRIORITY_DISPLAY + 1, false /*allowIo*/);
  4. //UiThread android.ui
  5. /frameworks/base/services/core/java/com/android/server/
  6. H A DUiThread.java 36 super( "android.ui", Process.THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);

 

“system_server”线程中会调用WMS的main方法,main方法中会创建WMS,创建WMS的过程运行在”android.display”线程中,它的优先级更高一些,因此要等创建WMS完毕后才会唤醒处于等待状态的”system_server”线程。 
WMS初始化时会执行initPolicy方法,initPolicy方法会调用PWM的init方法,这个init方法运行在”android.ui”线程,并且优先级更高,因此要先执行完PWM的init方法后,才会唤醒处于等待状态的”android.display”线程。 
PWM的init方法执行完毕后会接着执行运行在”system_server”线程的代码,比如本文前部分提到WMS的 
systemReady方法。
 

总结

wms初始化和前面的android版本变化不是很大,可以进行对比分析

 

源码路径: http://androidxref.com/9.0.0_r3/

参考书籍: Android解析WindowManager系列

                 Android解析WindowManagerService(一)WMS的诞生

              《深入理解Android:卷III》 

 

 

 

 

 

更多相关文章

  1. android-2.2以下杀进程方法:restartPackage();
  2. 【Android 开发】:UI控件之拖动条控件 SeekBar的使用方法
  3. 在Android中使用Handler和Thread线程执行后台操作
  4. Android NullPointerException解决方法
  5. 【原创】Android锁定横竖屏、splash,全屏、去除标题的方法
  6. Android基于TextView属性android:ellipsize实现跑马灯效果的方法
  7. Android的线程模型
  8. Android离线安装方法

随机推荐

  1. Android高通平台下编译时能生成(拷贝)预
  2. Android(安卓)个推 Clientid,PushManagerR
  3. Android_SQLite数据库详解
  4. Android(安卓)创建证书 或加固后更新签名
  5. android toast使用总结
  6. Android(安卓)AsyncTask几个注意事项
  7. Android(安卓)Studio 2.2 NDK开发 opencv
  8. 高逼格UI-ASD(Android(安卓)Support Desi
  9. Android开发:设置圆形Button
  10. android的小细节