WindowManagerService的启动

计算机软件开发 2024-9-21 07:03:04 37 0 来自 中国
本次源码基于Android11分析
相干源码:
/frameworks/base/services/java/com/android/server/SystemServer.java/frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java1. WMS的启动过程

WindowManagerService服务在system_server历程中被启动,在其startOtherServices()方法中调用WMS.main()方法开始实例化WMS,如下是WMS的团体启动流程:
public final class SystemServer {  private void run() {      try {          // 启动服务          startBootstrapServices(t);          startCoreServices(t);          startOtherServices(t);      } catch (Throwable ex) {          throw ex;      }  }  private void startOtherServices(@NonNull TimingsTraceAndSlog t) {      try {          //...          // 1. WindowManagerService启动          wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore,                  new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);          // 2. 调用WindowManagerService的onInitReady()方法          wm.onInitReady();          //...          // 3.调用WindowManagerService的displayReady()方法          wm.displayReady();          // 4.调用WindowManagerService的systemReady()方法          wm.systemReady(      }  }}首先调用WMS.main()实例化WindowManagerService对象,之后分别调用WMS.onInitReady()、WMS.displayReady()、WMS.systemReady()方法做后续的初始化使用。
1.2 WMS.main()

public class WindowManagerService extends IWindowManager.Stub      implements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs {  @VisibleForTesting  public static WindowManagerService main(final Context context, final InputManagerService im,                                          final boolean showBootMsgs, final boolean onlyCore, WindowManagerPolicy policy,                                          ActivityTaskManagerService atm, Supplier<SurfaceControl.Transaction> transactionFactory,                                          Supplier<Surface> surfaceFactory,                                          Function<SurfaceSession, SurfaceControl.Builder> surfaceControlFactory) {      // DisplayThread线程的创建WindowManagerService      DisplayThread.getHandler().runWithScissors(() ->              // 创建WindowManagerService()实例,              sInstance = new WindowManagerService(context, im, showBootMsgs, onlyCore, policy,                      atm, transactionFactory, surfaceFactory, surfaceControlFactory), 0);      return sInstance;  }private WindowManagerService(Context context, InputManagerService inputManager,                               boolean showBootMsgs, boolean onlyCore, WindowManagerPolicy policy,                               ActivityTaskManagerService atm, Supplier<SurfaceControl.Transaction> transactionFactory,                               Supplier<Surface> surfaceFactory,                               Function<SurfaceSession, SurfaceControl.Builder> surfaceControlFactory) {      installLock(this, INDEX_WINDOW);      mGlobalLock = atm.getGlobalLock();      mAtmService = atm;      mContext = context;      mIsPc = mContext.getPackageManager().hasSystemFeature(FEATURE_PC);      mAllowBootMessages = showBootMsgs;      mOnlyCore = onlyCore;      mLimitedAlphaCompositing = context.getResources().getBoolean(              com.android.internal.R.bool.config_sf_limitedAlpha);      mHasPermanentDpad = context.getResources().getBoolean(              com.android.internal.R.bool.config_hasPermanentDpad);      mInTouchMode = context.getResources().getBoolean(              com.android.internal.R.bool.config_defaultInTouchMode);      inputManager.setInTouchMode(mInTouchMode);      mDrawLockTimeoutMillis = context.getResources().getInteger(              com.android.internal.R.integer.config_drawLockTimeoutMillis);      mAllowAnimationsInLowPowerMode = context.getResources().getBoolean(              com.android.internal.R.bool.config_allowAnimationsInLowPowerMode);      mMaxUiWidth = context.getResources().getInteger(              com.android.internal.R.integer.config_maxUiWidth);      mDisableTransitionAnimation = context.getResources().getBoolean(              com.android.internal.R.bool.config_disableTransitionAnimation);      mPerDisplayFocusEnabled = context.getResources().getBoolean(              com.android.internal.R.bool.config_perDisplayFocusEnabled);      mAssistantOnTopOfDream = context.getResources().getBoolean(              com.android.internal.R.bool.config_assistantOnTopOfDream);      mInputManager = inputManager; // Must be before createDisplayContentLocked.      mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);      mSurfaceControlFactory = surfaceControlFactory;      mTransactionFactory = transactionFactory;      mSurfaceFactory = surfaceFactory;      mTransaction = mTransactionFactory.get();      mDisplayWindowSettings = new DisplayWindowSettings(this);      mPolicy = policy;      mAnimator = new WindowAnimator(this);      mRoot = new RootWindowContainer(this);      mUseBLAST = DeviceConfig.getBoolean(              DeviceConfig.NAMESPACE_WINDOW_MANAGER_NATIVE_BOOT,              WM_USE_BLAST_ADAPTER_FLAG, false);      mWindowPlacerLocked = new WindowSurfacePlacer(this);      mTaskSnapshotController = new TaskSnapshotController(this);      mWindowTracing = WindowTracing.createDefaultAndStartLooper(this,              Choreographer.getInstance());      LocalServices.addService(WindowManagerPolicy.class, mPolicy);      mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);      mKeyguardDisableHandler = KeyguardDisableHandler.create(mContext, mPolicy, mH);      mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);      mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);      if (mPowerManagerInternal != null) {          mPowerManagerInternal.registerLowPowerModeObserver(                  new PowerManagerInternal.LowPowerModeListener() {                      @Override                      public int getServiceType() {                          return ServiceType.ANIMATION;                      }                      @Override                      public void onLowPowerModeChanged(PowerSaveState result) {                          synchronized (mGlobalLock) {                              final boolean enabled = result.batterySaverEnabled;                              if (mAnimationsDisabled != enabled && !mAllowAnimationsInLowPowerMode) {                                  mAnimationsDisabled = enabled;                                  dispatchNewAnimatorScaleLocked(null);                              }                          }                      }                  });          mAnimationsDisabled = mPowerManagerInternal                  .getLowPowerState(ServiceType.ANIMATION).batterySaverEnabled;      }      mScreenFrozenLock = mPowerManager.newWakeLock(              PowerManager.PARTIAL_WAKE_LOCK, "SCREEN_FROZEN");      mScreenFrozenLock.setReferenceCounted(false);      mDisplayNotificationController = new DisplayWindowListenerController(this);      mActivityManager = ActivityManager.getService();      mActivityTaskManager = ActivityTaskManager.getService();      mAmInternal = LocalServices.getService(ActivityManagerInternal.class);      mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);      mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);      AppOpsManager.OnOpChangedInternalListener opListener =              new AppOpsManager.OnOpChangedInternalListener() {                  @Override                  public void onOpChanged(int op, String packageName) {                      updateAppOpsState();                  }              };      mAppOps.startWatchingMode(OP_SYSTEM_ALERT_WINDOW, null, opListener);      mAppOps.startWatchingMode(AppOpsManager.OP_TOAST_WINDOW, null, opListener);      mPmInternal = LocalServices.getService(PackageManagerInternal.class);      final IntentFilter suspendPackagesFilter = new IntentFilter();      suspendPackagesFilter.addAction(Intent.ACTION_PACKAGES_SUSPENDED);      suspendPackagesFilter.addAction(Intent.ACTION_PACKAGES_UNSUSPENDED);      context.registerReceiverAsUser(new BroadcastReceiver() {          @Override          public void onReceive(Context context, Intent intent) {              final String[] affectedPackages =                      intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);              final boolean suspended =                      Intent.ACTION_PACKAGES_SUSPENDED.equals(intent.getAction());              updateHiddenWhileSuspendedState(new ArraySet<>(Arrays.asList(affectedPackages)),                      suspended);          }      }, UserHandle.ALL, suspendPackagesFilter, null, null);      final ContentResolver resolver = context.getContentResolver();      // Get persisted window scale setting      mWindowAnimationScaleSetting = Settings.Global.getFloat(resolver,              Settings.Global.WINDOW_ANIMATION_SCALE, mWindowAnimationScaleSetting);      mTransitionAnimationScaleSetting = Settings.Global.getFloat(resolver,              Settings.Global.TRANSITION_ANIMATION_SCALE,              context.getResources().getFloat(                      R.dimen.config_appTransitionAnimationDurationScaleDefault));      setAnimatorDurationScale(Settings.Global.getFloat(resolver,              Settings.Global.ANIMATOR_DURATION_SCALE, mAnimatorDurationScaleSetting));      mForceDesktopModeOnExternalDisplays = Settings.Global.getInt(resolver,              DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS, 0) != 0;      IntentFilter filter = new IntentFilter();      // Track changes to DevicePolicyManager state so we can enable/disable keyguard.      filter.addAction(ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);      mContext.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null);      mLatencyTracker = LatencyTracker.getInstance(context);      mSettingsObserver = new SettingsObserver();      mHoldingScreenWakeLock = mPowerManager.newWakeLock(              PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, TAG_WM);      mHoldingScreenWakeLock.setReferenceCounted(false);      mSurfaceAnimationRunner = new SurfaceAnimationRunner(mTransactionFactory,              mPowerManagerInternal);      mAllowTheaterModeWakeFromLayout = context.getResources().getBoolean(              com.android.internal.R.bool.config_allowTheaterModeWakeFromWindowLayout);      mTaskPositioningController = new TaskPositioningController(              this, mInputManager, mActivityTaskManager, mH.getLooper());      mDragDropController = new DragDropController(this, mH.getLooper());      mHighRefreshRateBlacklist = HighRefreshRateBlacklist.create(context.getResources());      mConstants = new WindowManagerConstants(this, DeviceConfigInterface.REAL);      mConstants.start(new HandlerExecutor(mH));      LocalServices.addService(WindowManagerInternal.class, new LocalService());      mEmbeddedWindowController = new EmbeddedWindowController(mAtmService);      mDisplayAreaPolicyProvider = DisplayAreaPolicy.Provider.fromResources(              mContext.getResources());      setGlobalShadowSettings();  }}通过DisplayThread线程的Handler,并调用其runWithScissors()方法,该方法会将当前的实行线程壅闭,并直到要实行的使命完成后,在重新叫醒被壅闭的线程:
public class Handler {  public final boolean runWithScissors(@NonNull Runnable r, long timeout) {      // 对runnable和time举行查抄      if (r == null) {          throw new IllegalArgumentException("runnable must not be null");      }      if (timeout < 0) {          throw new IllegalArgumentException("timeout must be non-negative");      }      // 查抄当火线程的Looper是否便是此mLooper      if (Looper.myLooper() == mLooper) {          r.run(); // 直接运行Runnable.run          return true;      }      BlockingRunnable br = new BlockingRunnable(r);      return br.postAndWait(this, timeout);  }  private static final class BlockingRunnable implements Runnable {      private final Runnable mTask;      private boolean mDone;      public BlockingRunnable(Runnable task) {          mTask = task;      }      @Override      public void run() {          try {              // 实行Runnable创建WMS              mTask.run();          } finally {              synchronized (this) {                  mDone = true;                  notifyAll();              }          }      }      public boolean postAndWait(Handler handler, long timeout) {          // 将BlockingRunnable加入到handler中          if (!handler.post(this)) {              return false;          }          // 没实行完run()方法则调用wait()让调用的线程等待          synchronized (this) {              if (timeout > 0) {                  final long expirationTime = SystemClock.uptimeMillis() + timeout;                  while (!mDone) {                      long delay = expirationTime - SystemClock.uptimeMillis();                      if (delay <= 0) {                          return false; // timeout                      }                      try {                          wait(delay);                      } catch (InterruptedException ex) {                      }                  }              } else {                  // 没实行完run()方法则调用                  while (!mDone) {                      try {                          wait();                      } catch (InterruptedException ex) {                      }                  }              }          }          return true;      }  }}会判断当前实行的线程跟调用的Handler线程是否相称,相称则实行Runnable。如果不想等,则在封装一个Runnable,并在这个Runnable类中判断是否实行了run()方法,如果没有则壅闭当前的实行线程,直到实行完Run方法后才重新叫醒。
以是在DisplayThread线程中创建了WindowManagerService实例对象。
1.3 WMS.onInitReady()

public class WindowManagerService extends IWindowManager.Stub      implements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs {  public void onInitReady() {      // 调用initPolicy()方法      initPolicy();      //...  }  private void initPolicy() {      UiThread.getHandler().runWithScissors(new Runnable() {          @Override          public void run() {              WindowManagerPolicyThread.set(Thread.currentThread(), Looper.myLooper());              // 此mPolicy在构造函数中赋值,由SystemServer类中传入,为PhoneWindowManager()              mPolicy.init(mContext, WindowManagerService.this, WindowManagerService.this);          }      }, 0);  }}public class PhoneWindowManager implements WindowManagerPolicy {  // 在UiThread线程中实行  public void init(Context context, IWindowManager windowManager,                   WindowManagerFuncs windowManagerFuncs) {      mContext = context;      mWindowManager = windowManager;      mWindowManagerFuncs = windowManagerFuncs;      mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);      mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);      mActivityTaskManagerInternal = LocalServices.getService(ActivityTaskManagerInternal.class);      mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);      mDreamManagerInternal = LocalServices.getService(DreamManagerInternal.class);      mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);      mAppOpsManager = mContext.getSystemService(AppOpsManager.class);      ...      mHandler = new PolicyHandler();      mWakeGestureListener = new MyWakeGestureListener(mContext, mHandler);      ...      mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);      mBroadcastWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,              "honeWindowManager.mBroadcastWakeLock");      mPowerKeyWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,              "honeWindowManager.mPowerKeyWakeLock");      ...      mGlobalKeyManager = new GlobalKeyManager(mContext);      if (!mPowerManager.isInteractive()) {          startedGoingToSleep(WindowManagerPolicy.OFF_BECAUSE_OF_USER);          finishedGoingToSleep(WindowManagerPolicy.OFF_BECAUSE_OF_USER);      }      mWindowManagerInternal.registerAppTransitionListener(new AppTransitionListener() {          @Override          public int onAppTransitionStartingLocked(int transit, long duration,                                                   long statusBarAnimationStartTime, long statusBarAnimationDuration) {              return handleStartTransitionForKeyguardLw(transit, duration);          }          @Override          public void onAppTransitionCancelledLocked(int transit) {              handleStartTransitionForKeyguardLw(transit, 0 /* duration */);          }      });  }}在UiThread线程的Handler中实行PhoneWindowManager.init()方法,举行一些变量的的初始化使用。
1.4 WMS.displayReady()、systemReady()

public class WindowManagerService extends IWindowManager.Stub      implements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs {  // 继续在system_server历程中实行WMS.displayReady()方法  public void displayReady() {      synchronized (mGlobalLock) {          if (mMaxUiWidth > 0) {              mRoot.forAllDisplays(displayContent -> displayContent.setMaxUiWidth(mMaxUiWidth));          }          applyForcedPropertiesForDefaultDisplay();          mAnimator.ready();          mDisplayReady = true;          // Reconfigure all displays to make sure that forced properties and          // DisplayWindowSettings are applied.          mRoot.forAllDisplays(DisplayContent::reconfigureDisplayLocked);          mIsTouchDevice = mContext.getPackageManager().hasSystemFeature(                  PackageManager.FEATURE_TOUCHSCREEN);      }      try {          mActivityTaskManager.updateConfiguration(null);      } catch (RemoteException e) {      }  }  // 继续在system_server历程中实行WMS.systemReady()方法  public void systemReady() {      mSystemReady = true;      // 实行PhoneWindowManager.systemReady()方法      mPolicy.systemReady();      mRoot.forAllDisplayPolicies(DisplayPolicy::systemReady);      mTaskSnapshotController.systemReady();      mHasWideColorGamutSupport = queryWideColorGamutSupport();      mHasHdrSupport = queryHdrSupport();      UiThread.getHandler().post(mSettingsObserver::loadSettings);      IVrManager vrManager = IVrManager.Stub.asInterface(              ServiceManager.getService(Context.VR_SERVICE));      if (vrManager != null) {          try {              final boolean vrModeEnabled = vrManager.getVrModeState();              synchronized (mGlobalLock) {                  vrManager.registerListener(mVrStateCallbacks);                  if (vrModeEnabled) {                      mVrModeEnabled = vrModeEnabled;                      mVrStateCallbacks.onVrStateChanged(vrModeEnabled);                  }              }          } catch (RemoteException e) {              // Ignore, we cannot do anything if we failed to register VR mode listener          }      }  }}WMS.systemReady()方法会调用PhoneWindowManager.systemReady()方法:
public class PhoneWindowManager implements WindowManagerPolicy {  public void systemReady() {      // In normal flow, systemReady is called before other system services are ready.      // So it is better not to bind keyguard here.      mKeyguardDelegate.onSystemReady();      mVrManagerInternal = LocalServices.getService(VrManagerInternal.class);      if (mVrManagerInternal != null) {          mVrManagerInternal.addPersistentVrModeStateListener(mPersistentVrModeListener);      }      readCameraLensCoverState();      updateUiMode();      mDefaultDisplayRotation.updateOrientationListener();      synchronized (mLock) {          mSystemReady = true;          mHandler.post(new Runnable() {              @Override              public void run() {                  updateSettings();              }          });          // If this happens, for whatever reason, systemReady came later than systemBooted.          // And keyguard should be already bound from systemBooted          if (mSystemBooted) {              mKeyguardDelegate.onBootCompleted();          }      }      mAutofillManagerInternal = LocalServices.getService(AutofillManagerInternal.class);  }}至此WindowManagerService在system_server历程的启动就完成了,WMS重要有四大功能:

  • Window窗口的管理
  • Surface的管理
  • Input系统的管理
  • 窗口动画
如下是WindowManagerService的关联图:

2.jpeg
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 22:31, Processed in 0.179356 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表