窗口管理系统是Android中的主要子系统之一,它涉及到App中组件的管理,系统和应用窗口的管理和绘制等工作。由于其涉及模块众多,且与用户体验密切相关,所以它也是Android当中最为复杂的子系统之一。一个App从启动到主窗口显示出来,需要App,ActivityManagerService(AMS),WindowManagerService(WMS),SurfaceFlinger(SF)等几个模块相互合作。App负责业务逻辑,绘制自己的视图;AMS管理组件、进程信息和Activity的堆栈及状态等等;WMS管理Activity对应的窗口及子窗口,还有系统窗口等;SF用于管理图形缓冲区,将App绘制的东西合成渲染在屏幕上。下面分几个部分进行分析。
窗口管理系统的主要框架及各模块之间的通讯接口大体如下:
下面是各个类之间的关系:
下面在看startActivity操作后的函数调用先后顺序:
S1:Apk1进程中进行启动
Activity#startActivity
Activity#startActivityForResult
Instrumentation#execStartActivity
ActivityManagerNative#getDefault().startActivity
ActivityManagerProxy#startActivity
S2:System_server进程中AMS进行调度
ActivityMangerService#startActivity
ActivityMangerService#startActivityAsUser
ActivityStackSupervisor#startActivityMayWait
ActivityStackSupervisorr#startActivityLocked
ActivityStackSupervisorr#startActivityUncheckedLocked
ActivityStack#startActivityLocked
ActivityStackSupervisor#resumeTopActivitiesLocked
ActivityStack#resumeTopActivityLocked
ActivityStack#resumeTopActivityInnerLocked
ActivityStackSupervisor#startSpecificActivityLocked
ActivityManagerService#startProcessLocked
Process#start
S3:Apk2进程中进行ApplicationThread的传递
ActivityThread#main
ActivityThread#attach
ActivityManagerProxy#attachApplication
S4:System_server进程中AMS通过ApplicationThreadProxy发起调度
ActivityManagerService#attachApplication
ActivityManagerService#attachApplicationLocked
ActivityStack#realStartActivityLocked
ApplicationThreadProxy#scheduleLaunchActivity
S5:Apk2完成Activity的启动
ApplicationThread#scheduleLaunchActivity
ActivityThread#queueOrSendMessage
H#handleMessage
ActivityThread.handleLaunchActivity
ActivityThread.handleConfigurationChanged
ActivityThread.performConfigurationChanged
ComponentCallbacks2.onConfigurationChanged
S5-1:执行Launch
ActivityThread.performLaunchActivity
Instrumentation#newActivity//实例化Activity
S5-1-1:创建Application
LoadedApk.makeApplication
Instrumentation.callApplicationOnCreate
Application.onCreate
S5-1-2:创建Window
activity.attach //创建一个window实例
Instrumentation.callActivityOnCreate
Activity.performCreate
Activity.onCreate
PhoneWindow#setContentVIew
S5-1-2-1:创建根视图DecorView,并将布局加载到DecorView中
PhoneWindow#installDecor
PhoneWindow#generateDecor
Instrumentation.callActivityonRestoreInstanceState
Activity.performRestoreInstanceState
Activity.onRestoreInstanceState
S5-2:执行Resume
ActivityThread.handleResumeActivity
S5-2-1:执行进行Activity生命周期回调
ActivityThread.performResumeActivity
Activity.performResume
Activity.performRestart
Instrumentation.callActivityOnRestart
Activity.onRestart
Activity.performStart
Instrumentation.callActivityOnStart
Activity.onStart
Instrumentation.callActivityOnResume
Activity.onResume
S5-2-2:将DecorView传递给WMS
WindowManagerImpl #addView
WindowManagerGlobal#addView
ViewRootImpl#setView
ViewRootImpl#requestLayout
ViewRootImpl#scheduleTraversals
Session#addToDisplay //将W传给WMS WindowManagerService#addWindow