Android 是先启动FallbackHome,再启动Launcher,就导致了在Launcher启动之前,开机动画就退出了,产生黑屏现象。关于开机动画的退出流程,请参考:Android 11 开机动画启动流程分析
解决这个问题,思想就是将开机动画延长到Launcher启动后再退出,有两种方案:
- 将performEnableScreen中的设置关闭开机动画属性的代码移动到Launcher绘制的地方
- Launcher启动后,再调用WindowManagerService的enableScreenAfterBoot方法,设置mSystemBooted为true,让performEnableScreen继续往下执行,设置关闭开机动画
代码实现
方案一:
在APP绘制的时候,都会调用到ActivityRecord.java的onWindowsDrawn方法,调用栈如下:
onWindowsDrawn shortComponentName:com.android.settings/.FallbackHome
java.lang.Exception
at com.android.server.wm.ActivityRecord.onWindowsDrawn(ActivityRecord.java:5419)
at com.android.server.wm.ActivityRecord.updateReportedVisibilityLocked(ActivityRecord.java:5544)
at com.android.server.wm.ActivityRecord.onFirstWindowDrawn(ActivityRecord.java:5349)
at com.android.server.wm.WindowState.performShowLocked(WindowState.java:4438)
at com.android.server.wm.WindowStateAnimator.commitFinishDrawingLocked(WindowStateAnimator.java:375)
at com.android.server.wm.DisplayContent.lambda$new$8$DisplayContent(DisplayContent.java:889)
at com.android.server.wm.-$$Lambda$DisplayContent$qxt4izS31fb0LF2uo_OF9DMa7gc.accept(Unknown Source:4)
at com.android.server.wm.WindowContainer$ForAllWindowsConsumerWrapper.apply(WindowContainer.java:1984)
at com.android.server.wm.WindowContainer$ForAllWindowsConsumerWrapper.apply(WindowContainer.java:1974)
at com.android.server.wm.WindowState.applyInOrderWithImeWindows(WindowState.java:4651)
at com.android.server.wm.WindowState.forAllWindows(WindowState.java:4550)
at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1302)
at com.android.server.wm.ActivityRecord.forAllWindowsUnchecked(ActivityRecord.java:3641)
at com.android.server.wm.ActivityRecord.forAllWindows(ActivityRecord.java:3636)
at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1302)
at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1302)
at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1302)
at com.android.server.wm.TaskDisplayArea.forAllWindows(TaskDisplayArea.java:488)
at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1302)
at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1302)
at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1319)
at com.android.server.wm.DisplayContent.applySurfaceChan