1 前言

​ WMS 是 WindowManagerService 的简称。

(1)WMS 主要职责

  • 窗口管理:负责启动、添加、删除窗口,管理窗口大小、层级,核心成员有:WindowContainer、RootWindowContainer、DisplayContent、TaskStack、Task、AppWindowToken、WindowState;
  • 窗口动画:由其子系统 WindowAnimator 管理;
  • 输入系统中转站:通过对窗口的触摸从而产生触摸事件,由 InputMethodService(IMS)对触摸事件进行处理,它会寻找一个最合适的窗口处理触摸反馈信息;
  • Surface 管理:为每个窗口分配一块 Surface,用于绘制要显示的内容。

img

(2) WMS 创建过程中线程关系

​ WMS 创建过程中涉及到的类主要有 SystemServer、WindowManagerService(WMS)、WindowManagerPolicy(WMP),它们都在 system_server 进程中运行,但是会在不同线程中运行,如下所示。

img

2 WMS启动流程

(1)main

​ /frameworks/base/services/java/com/android/server/SystemServer.java

public static void main(String[] args) {
    new SystemServer().run();
}

(2)run

​ /frameworks/base/services/java/com/android/server/SystemServer.java

private void run() {
	try {
		...
		// 创建Looper
		Looper.prepareMainLooper();
		// 加载libandroid_servers.so
		System.loadLibrary("android_servers");
		// 创建系统的 Context:ContextImpl.createSystemContext(new ActivityThread())
		createSystemContext();
		// 创建 SystemServiceManager
		mSystemServiceManager = new SystemServiceManager(mSystemContext);
		LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
		...
	}
	...
	try {
		//启动引导服务,ActivityManagerService、ActivityTaskManagerService、PackageManagerService、PowerManagerService、DisplayManagerService 等
		startBootstrapServices(); 
		//启动核心服务,BatteryService、UsageStatusService 等
		startCoreServices(); 
		//启动其他服务,InputManagerService、WindowManagerService、CameraService、AlarmManagerService 等
		startOtherServices(); 
		...
	}
	...
	// 开启消息循环
	Looper.loop();
}

(3)startOtherServices

​ /frameworks/base/services/java/com/android/server/SystemServer.java

private void startOtherServices() {
	...
	WindowManagerService wm = null;
	...
	InputManagerService inputManager = null;
	...
	try {
        ...
        inputManager = new InputManagerService(context);
		...
        //PhoneWindowManager 是 WMP 的实现类
		wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore, new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);
		ServiceManager.addService(Context.WINDOW_SERVICE, wm, false, DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);
		ServiceManager.addService(Context.INPUT_SERVICE, inputManager, false, DUMP_FLAG_PRIORITY_CRITICAL);
		...
		mActivityManagerService.setWindowManager(wm);
		...
		wm.onInitReady(); //initPolicy
		...
        //wm 的 mInputManagerCallback 属性在定义时就被初始化
		inputManager.setWindowManagerCallbacks(wm.getInputManagerCallback());
		inputManager.start();
		...
	}
	...
	try {
		wm.displayReady(); //初始化屏幕信息
	}
	...
	try {
		wm.systemReady(); //通知 WMS 系统的初始化完成
	}
	...
    final Configuration config = wm.computeNewConfiguration(DEFAULT_DISPLAY);
    ...
}

​ 注意:在 WindowManagerService.main() 中,传入了 InputManagerService、PhoneWindowManager(WindowManagerPolicy 的实现类)、ActivityTaskManagerService(简称 ATMS)

​ 通过 ServiceManager.addService() 将 Context.WINDOW_SERVICE 与 WMS 绑定,因此在其他进程中可以通过如下方式获取 WMS。

IBinder b = ServiceManager.getService(Context.WINDOW_SERVICE); 
IWindowManager wm = IWindowManager.Stub.asInterface(b);

(4)main

​ /frameworks/base/services/java/com/android/server/wm/WindowManagerService.java

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, SurfaceControl.Transaction::new);
}

public static WindowManagerService main(final Context context, final InputManagerService im, final boolean showBootMsgs, 
		final boolean onlyCore, WindowManagerPolicy policy, ActivityTaskManagerService atm, TransactionFactory transactionFactory) {
    //在 android.display 线程中创建 WMS(此时 system_server 线程阻塞)
	DisplayThread.getHandler().runWithScissors(() ->
			sInstance = new WindowManagerService(context, im, showBootMsgs, onlyCore, policy, atm, transactionFactory), 0);
	return sInstance;
}

3 WMS 初始化

​ 本节主要研究 WMS 在初始化时做的工作。

(1)构造函数

​ /frameworks/base/services/java/com/android/server/wm/WindowManagerService.java

private WindowManagerService(Context context, InputManagerService inputManager, boolean showBootMsgs, boolean onlyCore, 
		WindowManagerPolicy policy, ActivityTaskManagerService atm, TransactionFactory transactionFactory) {
	...
	mAtmService = atm;
	mContext = context;
	...
	mInputManager = inputManager;
    mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
	...
	mPolicy = policy;
    //动画管理
	mAnimator = new WindowAnimator(this);
    //根容器,其子容器是 DisplayContent
	mRoot = new RootWindowContainer(this);
    mWindowPlacerLocked = new WindowSurfacePlacer(this);
    ...
    //mPolicy 是 PhoneWindowManager 对象,WindowManagerPolicy 的实现类
    LocalServices.addService(WindowManagerPolicy.class, mPolicy);
	...
	//DM
	mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
	//PM
	mPowerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
	//AMS
	mActivityManager = ActivityManager.getService();
	//ATMS
	mActivityTaskManager = ActivityTaskManager.getService();
    //ActivityManagerInternal
    mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
    //ActivityTaskManagerInternal
    mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
    ...
    //PackageManagerInternal
    mPmInternal = LocalServices.getService(PackageManagerInternal.class);
    //添加本地服务
    LocalServices.addService(WindowManagerInternal.class, new LocalService());
}

​ LocalService 是 WMS 的内部类,也是 WindowManagerInternal 的实现类。

(2)初始化 WMP

​ /frameworks/base/services/java/com/android/server/wm/WindowManagerService.java

public void onInitReady() {
	//初始化 WMP
	initPolicy();
	...
	//打开 Surface 事务:SurfaceControl.openTransaction()
	openSurfaceTransaction();
	...
}

private void initPolicy() {
	//在 android.ui 线程中执行
	UiThread.getHandler().runWithScissors(new Runnable() {
		@Override
		public void run() {
			WindowManagerPolicyThread.set(Thread.currentThread(), Looper.myLooper());
			mPolicy.init(mContext, WindowManagerService.this, WindowManagerService.this);
		}
	}, 0);
}

(3)初始化 Display

​ /frameworks/base/services/java/com/android/server/wm/WindowManagerService.java

public void displayReady() {
	synchronized (mGlobalLock) {
		if (mMaxUiWidth > 0) {
			mRoot.forAllDisplays(displayContent -> displayContent.setMaxUiWidth(mMaxUiWidth));
		}
		final boolean changed = applyForcedPropertiesForDefaultDisplay();
		mAnimator.ready();
		...
	}
	...
	updateCircularDisplayMaskIfNeeded();
}

(4)通知系统 WMS 初始化完成

​ /frameworks/base/services/java/com/android/server/wm/WindowManagerService.java

public void systemReady() {
	mSystemReady = true;
	mPolicy.systemReady();
	mRoot.forAllDisplayPolicies(DisplayPolicy::systemReady);
	mTaskSnapshotController.systemReady();
	...
	UiThread.getHandler().post(mSettingsObserver::updateSystemUiSettings);
	UiThread.getHandler().post(mSettingsObserver::updatePointerLocation);
	...
}

​ 声明:本文转自【framework】WMS启动流程