WMS启动过程
SystemServer.startOtherServices()
设备开机后,在startOtherServices()中启动WindowManagerService,需要传入以下几个参数。
- mSystemContext:system_server进程的Context
- inputManager:IMS实例
- mFirstBoot:未知
- mOnlyCore:未知
- PhoneWindowManager:用于管理Window的一些特定行为
- ActivityTaskManagerService:对Activity的管理
startOtherServices()中的流程如下:
WindowManagerService wm = null;
// 实例化WMS并注册到ServiceManager中
t.traceBegin("StartWindowManagerService");
// WMS needs sensor service ready
mSystemServiceManager.startBootPhase(t, SystemService.PHASE_WAIT_FOR_SENSOR_SERVICE);
wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore,
new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);
ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false,
DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);
ServiceManager.addService(Context.INPUT_SERVICE, inputManager,
/* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
t.traceEnd();
// AMS添加WMS的引用
t.traceBegin("SetWindowManagerService");
mActivityManagerService.setWindowManager(wm);
t.traceEnd();
// 做一些初始化操作
t.traceBegin("WindowManagerServiceOnInitReady");
wm.onInitReady();
t.traceEnd();
WindowManagerService.main()
之后在DisplayThread线程中创建了WMS的实例,所以WMS创建时是运行在android.display线程中的。
public static WindowManagerService main(final Context context, final InputManagerService im,
final boolean showBootMsgs, final boolean onlyCore, WindowManagerPolicy policy,
ActivityTaskManagerService atm) {
return main(context, im, showBootMsgs, onlyCore, policy, atm,
new DisplayWindowSettingsProvider(), SurfaceControl.Transaction::new,
SurfaceControl.Builder::new);
}
/**
* Creates and returns an instance of the WindowManagerService. This call allows the caller
* to override factories that can be used to stub native calls during test.
*/
@VisibleForTesting
public static WindowManagerService main(final Context context, final InputManagerService im,
final boolean showBootMsgs, final boolean onlyCore, WindowManagerPolicy policy,
ActivityTaskManagerService atm, DisplayWindowSettingsProvider
displayWindowSettingsProvider, Supplier<SurfaceControl.Transaction> transactionFactory,
Function<SurfaceSession, SurfaceControl.Builder> surfaceControlFactory) {
final WindowManagerService[] wms = new WindowManagerService[1];
DisplayThread.getHandler().runWithScissors(() ->
wms[0] = new WindowManagerService(context, im, showBootMsgs, onlyCore, policy,
atm, displayWindowSettingsProvider, transactionFactory,
surfaceControlFactory), 0);
return wms[0];
}
WMS构造函数
private WindowManagerService(Context context, InputManagerService inputManager,
boolean showBootMsgs, boolean onlyCore, WindowManagerPolicy policy,
ActivityTaskManagerService atm, DisplayWindowSettingsProvider
displayWindowSettingsProvider, Supplier<SurfaceControl.Transaction> transactionFactory,
Function<SurfaceSession, SurfaceControl.Builder> surfaceControlFactory) {…}
构造方法中的关键操作如下:
// WMS持有IMS的引用
mInputManager = inputManager;
// 持有PhoneWindowManager的引用
mPolicy = policy;
// WindowAnimator用于管理窗口动画
mAnimator = new WindowAnimator(this);
// RootWindowContainer是窗口容器的根容器,子容器是DisplayContent
mRoot = new RootWindowContainer(this);
// 获取其它相关Service和对象的引用
mWindowPlacerLocked = new WindowSurfacePlacer(this);
mTaskSnapshotController = new TaskSnapshotController(this);
mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
mActivityManager = ActivityManager.getService();
mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
WMS.onInitReady()
在SystemServer.startOtherServices()中执行完构造WMS的实例后,会接着执行WMS的onInitReady()。
主要执行以下操作:
- initPolicy()会调用到PhoneWindowManager.init(),用于初始化窗口管理策略相关的参数。
- Watchdog.getInstance().addMonitor()是将WMS中实现的接口添加到Watchdog中,用于防止死锁的发生。
- createWatermark()是创建水印,会读取”/system/etc/setup.conf”中的文件,用于开发新机型中的保密水印。
- showEmulatorDisplayOverlayIfNeeded():应该是和模拟器相关的设置
/**
* Called after all entities (such as the {@link ActivityManagerService}) have been set up and
* associated with the {@link WindowManagerService}.
*/
public void onInitReady() {
initPolicy();
// Add ourself to the Watchdog monitors.
Watchdog.getInstance().addMonitor(this);
createWatermark();
showEmulatorDisplayOverlayIfNeeded();
}