Android 12之启动画面Splash Screens(二) -- framework原理
上篇介绍应用端适配Splash Screens的流程:Android 12之启动画面Splash Screens (一) – 适配,本篇介绍Splash Screens的framework层原理,基于Android12L进行分析,对比Android12有些许变化但流程一致。
系统中创建并预绘制启动画面的流程
SplashScreenView创建与添加流程的时序图如下:

方法调用流程如下:
Task.startActivityLocked—>
StartingSurfaceController.showStartingWindow—>
ActivityRecord.showStartingWindow—>addStartingWindow—>scheduleAddStartingWindow
—>ActivityRecord.AddStartingWindow.run—>
StartingData.createStartingSurface—>
SplashScreenStartingData.createStartingSurface—>
StartingSurfaceController.createSplashScreenStartingSurface—>
TaskOrganizerController.addStartingWindow—>
TaskOrganizer.addStartingWindow—>
StartingWindowController.addStartingWindow—>
StartingSurfaceDrawer.addSplashScreenStartingWindow—>
SplashscreenContentDrawer.createContentView—>makeSplashScreenContentView—>
StartingWindowViewBuilder.build()—>fillViewWithIcon—SplashScreenView.Builder.build—>SplashScreenView—>
StartingSurfaceDrawer.SplashScreenViewSupplier.setView—>
StartingSurfaceDrawer.addWindow—>
WindowManagerGlobal.addView—>
ViewRootImpl.setView—>IWindowSession.addToDisplayAsUser—>
WindowManagerService. addToDisplay—>addWindow—>
rootLayout.addView
整个流程就是Launcher到ActivityTaskManagerService,ActivityTaskManagerService通知SystemUI创建SplashScreenView,SystemUI再addWindow通过WMS添加画面的过程。
startActivity的流程
时序图如下:

Task.startActivityLocked()之前的流程就是Activity.startActivity()进行的流程,方法调用流程如下(承接上述流程):
Activity.startActivity—>startActivityForResult—>
Instrumentation.execStartActivity—>
ActivityStartController.startActivity—>startActivityAsUser—>
getActivityStartController().obtainStarter().execute—>
ActivityStarter.execute—>executeRequest—>startActivityUnchecked—>startActivityInner—>
Task.startActivityLocked—>
StartingSurfaceController.showStartingWindow—>
同时Activity.startActivity()向ActivityManagerService发起请求处理startActivity,ActivityManagerService调用ProcessList.startProcess(),通过Socket向Zygote进程请求创建应用进程。
SystemUI相关组件WMShell
在添加启动画面的过程中,会进入到 SystemUI进程进行一些特殊处理,主要涉及到SysUI的WMShell组件。SystemUI为系统处理各种业务逻辑的关键代码,包含有20多个组件,从中可以看出 SystemUI的复杂程度。其中的WMShell也是复杂多样的,其中SplitScreen分屏模式、OneHanded单手模式、Freeform自由窗口模式、Bubble气泡通知窗口(Android Q)、PIP画中画模式等等系统模式窗口为WMShell处理的一部分,SystemUI引用framework的系统库,通过Dagger2依赖注入,将WMComponent,WMShellModule、WMShellBaseModule整合构建出StartingWindowController、ShellTaskOrganizer、StartingSurfaceDrawer等实例实现启动画面的过渡作用。
方法初始化调用流程如下:
SystemUIFactory.init—>
WMComponent.default init—>getShellInit().init()
InitImpl.init—>
ShellInitImpl.init—>
ShellTaskOrganizer.registerOrganizer()—>
TaskOrganizer.registerOrganizer—>
TaskOrganizerController.registerTaskOrganizer(ITaskOrganizer)—>mTaskOrganizers.add(organizer)
初始化后将ShellTaskOrganizer注册到ActivityManagerTaskService中TaskOrganizerController的列表中,``ActivityManagerTaskService调用的TaskOrganizer即为ShellTaskOrganizer```,与SystemUI夸进程通信。
addSplashScreenStartingWindow方法的添加流程
StartingSurfaceDrawer.addSplashScreenStartingWindow源码添加SplashScreenView的过程中,代码如下:
void addSplashScreenStartingWindow(StartingWindowInfo windowInfo, IBinder appToken,
@StartingWindowType int suggestType) {
final SplashScreenViewSupplier viewSupplier = new SplashScreenViewSupplier();
final FrameLayout rootLayout = new FrameLayout(
mSplashscreenContentDrawer.createViewContextWrapper(context));
rootLayout.setPadding(0, 0, 0, 0);
rootLayout.setFitsSystemWindows(false);
final Runnable setViewSynchronized = () -> {

本文详细剖析了Android 12中启动画面Splash Screens的框架层原理,包括SplashScreenView的创建、添加流程,系统启动与Activity启动的联动,以及SystemUI中WMShell组件的作用。深入讲解了关键方法如addSplashScreenStartingWindow和handleAttachSplashScreenView的工作机制。
 -- framework原理&spm=1001.2101.3001.5002&articleId=126716329&d=1&t=3&u=977a73a834b6414bb3f0ffb8d7125b32)
725

被折叠的 条评论
为什么被折叠?



