WMS服务启动
- 1、SystemServer.java#startOtherServices(t)中启动
- 2、WindowManagerService.java#main创建初始化
- 3、简易时序图
- 4、相关线程
1、SystemServer.java#startOtherServices(t)中启动

WMS属于SystemServer启动众多的系统服务中的一个,WindowManagerService中提供了一个静态main方法
context这里是系统ActivityThread中的mSystemContext
inputManager就是InputManagerService
new PhoneWindowManager()是继承 WindowManagerPolicy
mActivityManagerService.mActivityTaskManager就是AMS服务
ServiceManager.addService(Context.WINDOW_SERVICE, wm, ...)添加名为WINDOW_SERVICE = "window"服务
mActivityManagerService.setWindowManager(wm)AMS 中设置关联WMS服务
wm.onInitReady()主要初始化PhoneWindowManager implements WindowManagerPolicy
2、WindowManagerService.java#main创建初始化

1、相关参数关联:
mAtmService = atm、mContext = context、mInputManager = inputManager、mPolicy = policy
2、本地服务添加:LocalServices.addService(WindowManagerPolicy.class, mPolicy)、LocalServices.addService(WindowManagerInternal.class, new LocalService())
private WindowManagerService(Context context, InputManagerService inputManager,
        boolean showBootMsgs, boolean onlyCore, WindowManagerPolicy policy,
        ActivityTaskManagerService atm, DisplayWindowSettingsProvider
        displayWindowSettingsProvider, 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);
    mLetterboxConfiguration = new LetterboxConfiguration(context);
    mInputManager = inputManager; // Must be before createDisplayContentLocked.
    mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
    mSurfaceControlFactory = surfaceControlFactory;
    mTransactionFactory = transactionFactory;
    mSurfaceFactory = surfaceFactory;
    mTransaction = mTransactionFactory.get();
    mPolicy = policy;
    mAnimator = new WindowAnimator(this);
    mRoot = new RootWindowContainer(this);
    final ContentResolver resolver = context.getContentResolver();
    mUseBLAST = Settings.Global.getInt(resolver,
        Settings.Global.DEVELOPMENT_USE_BLAST_ADAPTER_VR, 1) == 1;
    mSyncEngine = new BLASTSyncEngine(this);
    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);
    mTestUtilityService = LocalServices.getService(TestUtilityService.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);
    // 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;
    final String displaySettingsPath = Settings.Global.getString(resolver,
            DEVELOPMENT_WM_DISPLAY_SETTINGS_PATH);
    mDisplayWindowSettingsProvider = displayWindowSettingsProvider;
    if (displaySettingsPath != null) {
        mDisplayWindowSettingsProvider.setBaseSettingsFilePath(displaySettingsPath);
    }
    mDisplayWindowSettings = new DisplayWindowSettings(this, mDisplayWindowSettingsProvider);
    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());
    mHighRefreshRateDenylist = HighRefreshRateDenylist.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());
    mDisplayHashController = new DisplayHashController(mContext);
    setGlobalShadowSettings();
    mAnrController = new AnrController(this);
    mStartingSurfaceController = new StartingSurfaceController(this);
    mBlurController = new BlurController(mContext, mPowerManager);
}
3、简易时序图

4、相关线程
frameworks/base/services/java/com/android/server/SystemServer.java
 frameworks/base/services/core/java/com/android/server/DisplayThread.java
 frameworks/base/services/core/java/com/android/server/UiThread.java
 


![chatgpt赋能python:Python中的[::-1]操作:反转列表、元组和字符串](https://img-blog.csdnimg.cn/img_convert/44de0d90e0ae0c8cf84d27ee6f9bfa15.png)










![[LitCTF 2023]ssvvgg(Steghide爆破)](https://img-blog.csdnimg.cn/7b7a02d4378d48ada2b2bfcdb2468830.png)





