跟踪创建流程
ActivityDisplay.createStack --> ActivityDisplay.createStackUnchecked --> ActivityStack.<init> --> ActivityStack.setWindowingMode --> ConfigurationContainer.setWindowingMode --> ActivityStack.onConfigurationChanged --> ActivityStack.onConfigurationChanged --> ActivityDisplay.onStackWindowingModeChanged --> ActivityDisplay.onStackWindowingModeChanged --> ActivityDisplay.addStackReferenceIfNeeded --> ActivityDisplay中mSplitScreenPrimaryStack赋值
ActivityStack.<init> --> ActivityStack.createStackWindowController --> StackWindowController.<init> --> DisplayContent.createStack --> DisplayContent$TaskStackContainers.addStackToDisplay --> DisplayContent$TaskStackContainers.addStackReferenceIfNeeded --> DisplayContent中mSplitScreenPrimaryStack不为null,抛出异常
实例化ActivityStack时,ActivityDisplay addStackReferenceIfNeeded 未抛出异常,DisplayContent TaskStackContainers.addStackReferenceIfNeeded时抛出异常
addStack的stack是不同的,一个是对应AM的ActivityStack,一个是WM中的TaskStack,创建是一起创建的,重复时都会抛出异常
但只有在添加TaskStack时才出现异常
07-04 07:49:40.602757 1046 5067 I am_kill : [0,6623,free.vpn.unblock.proxy.turbovpn,0,stop free.vpn.unblock.proxy.turbovpn]
07-04 07:49:40.611611 1046 5067 I am_finish_activity: [0,134240983,15,free.vpn.unblock.proxy.turbovpn/.activity.VpnMainActivity,proc died without state saved]
07-04 07:49:40.617723 1046 5067 I am_remove_task: [15,4]
07-04 07:49:40.835393 1046 1839 I am_crash:
07-04 07:49:41.232665 1046 1119 I wm_task_removed: [15,removeTask]
07-04 07:49:41.234909 1046 1119 I wm_task_removed: [15,removeAppToken: last token]
07-04 07:49:41.236034 1046 1119 I wm_stack_removed: 4
移除流程log中am的task在crash之前已经移除,wm的task和stack在crash之后才删除,添加log证明了ActivityStack先被移除,TaskStack过几百毫秒才被移除
ActivityManagerService.forceStopPackage --> ActivityManagerService.forceStopPackageLocked --> ActivityManagerService.killPackageProcessesLocked --> ActivityManagerService.removeProcessLocked -->
ActivityManagerService.handleAppDiedLocked --> ActivityStackSupervisor.handleAppDiedLocked --> ActivityStack.handleAppDiedLocked --> ActivityStack.removeHistoryRecordsForAppLocked --> ActivityStack.removeActivityFromHistoryLocked --> ActivityStack.removeTask --> ActivityStack.remove --> ActivityStack.removeFromDisplay --> ActivityDisplay.removeChild --> ActivityDisplay.removeStackReferenceIfNeeded 移除ActivityStack
ActivityStack.handleAppDiedLocked --> ActivityStack.removeHistoryRecordsForAppLocked --> ActivityStack.removeActivityFromHistoryLocked --> ActivityStack.removeTask --> ActivityStack.remove -->
StackWindowController.removeContainer --> TaskStack.removeIfPossible --> WindowContainer.removeImmediately --> DisplayContent$TaskStackContainers.removeChild --> DisplayContent$TaskStackContainers.removeChild -->
--> DisplayContent$TaskStackContainers.removeStackReferenceIfNeeded 移除TaskStack
///反向持锁
ActivityStack.minimalResumeActivityLocked--->
ActivityRecord.completeResumeLocked { mStackSupervisor.wakeUp("turnScreenOnFlag");}--->
ActivityStackSupervisor.wakeUp -->
mPowerManager.wakeUp(SystemClock.uptimeMillis(), PowerManager.WAKE_REASON_APPLICATION,"android.server.am:TURN_ON:" + reason);
PowerManagerService.wakeUp--->wakeUpNoUpdateLocked-->updatePowerStateLocked---> updateDisplayPowerStateLocked--->
DisplayManagerInternal.requestPowerState--->
DisplayManagerService.requestPowerState-->
DisplayPowerController.requestPowerState-->
DisplayPowerController.sendUpdatePowerStateLocked-->H.MSG_UPDATE_POWER_STATE -->
DisplayPowerController.updatePowerState
在ActivityRecrod代码里面调用了PowerManager.wakeup流程,最终会走到DisplayPowerController里面的updatePowerState流程,其持锁路径是: WMS lLock------>DisplayPowerController.mLock
在updatePowerState调用isForegroundApp,会有如下持锁路径: DisplayPowerController.mLock---->WMS lock