了解过Launcher(桌面)的人都知道launcher作为桌面是用户开机解锁后看到的第一个页面,其本质上就是一个Activity。因此,它的启动自然少不了AMS(ActivityMangerService)的参与,对于Service的统一管理,必然少不了SystemServer的参与。本文主要梳理Android系统开机之后,从SystemServer开始启动Launcher的流程。
由SystemServer启动Launcher的简易流程图可知,该过程其实就是系统进程到应用进程的一个过程,他们之间通过Binder进行通信,并且相互作用来完成Launcher的启动。
SystemServer
public static void main(String[] args) {
new SystemServer().run();
}
zygote进程通过反射启动SystemServer的main方法调用run方法。
private void run() {
try {
...
// 实例化SystemServiceManager.
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setStartInfo(mRuntimeRestart,
mRuntimeStartElapsedTime, mRuntimeStartUptime);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
// Prepare the thread pool for init tasks that can be parallelized
SystemServerInitThreadPool.get();
} finally {
traceEnd(); // InitBeforeStartServices
}
// 启动关键服务.
try {
traceBeginAndSlog("StartServices");
//启动BootstrapServices
startBootstrapServices();
startCoreServices(); //启动一些核心服务
startOtherServices();
SystemServerInitThreadPool.shutdown();
} catch (Throwable ex) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting system services", ex);
throw ex;
} finally {
traceEnd();
}
....
//启动系统Looper开始消息循环.
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
SystemServer里面加载android_servers的动态库 设置系统一些属性如时区、语言等 启动系统的服务如AMS、PMS、WMS等。
具体启动服务的代码调用在下面三个方法中。
startBootstrapServices();
startCoreServices();
startOtherServices();
关于启动ams和系统UI方面主要在startOtherServices中
mActivityManagerService.systemReady(() -> {
Slog.i(TAG, "Making services ready");traceBeginAndSlog("StartActivityManagerReadyPhase");
....
traceBeginAndSlog("StartSystemUI");
try {
//启动SystemUI的关键代码
startSystemUi(context, windowManagerF);
} catch (Throwable e) {
reportWtf("starting System UI", e);
}
....
}, BOOT_TIMINGS_TRACE_LOG);
在SystemServer中调用ams的systemReady方法。
ActivityManagerService
systemReady关键代码如下
public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
...
//回调SystemServer的方法启动SystemUI
if (goingCallback != null) goingCallback.run();
...
//启动activity
startHomeActivityLocked(currentUserId, "systemReady");
...
mStackSupervisor.resumeFocusedStackTopActivityLocked();
....
}
}
startHomeActivityLocked方法获取Launcher应用程序的intent并且通过系列方法启动。
boolean startHomeActivityLocked(int userId, String reason) {
if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL
&& mTopAction == null) {
return false;
}
//获取Launcher的Intent
Intent intent = getHomeIntent();
ActivityInfo aInfo = resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);
if (aInfo != null) {
in

本文详细解析了Android系统开机后,从SystemServer启动Launcher的流程。通过SystemServer、ActivityManagerService、ActivityStartController等组件,描述了从系统进程到应用进程的过程,涉及Binder通信、AMS的启动及ActivityStackSupervisor的角色。流程包括SystemServer的启动、AMS的systemReady方法、启动HomeActivity等步骤,最后通过时序图直观展示整个启动过程。
最低0.47元/天 解锁文章
769

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



