1、Launcher
Launcher作为Android系统的桌面,它的作用有两点:
作为Android系统的启动器,用于启动应用程序;
作为Android系统的桌面,用于显示和管理应用程序的快捷图标或者其它桌面组件;
2、Launcher进程启动流程
2.1、SystemServer调用
在SystemServer进程启动之后,在main()方法中执行其run()函数,在里面执行了大量的配置设置操作,并且启动了各种引导服务、核心服务以及其他服务等,包括AMS(ActivityManagerService.java)、PMS(PackageManagerService.java)、WMS、电量管理服务等一系列服务,以及创建主线程Looper,并循环等待消息;
其中在启动引导服务方法中,启动了ActivityManagerService,并且在启动其他服务的方法中,调用AMS的systemReady()方法,Launcher进程就是从这儿开始启动的;
public final class SystemServer {
private void run() {
...
startBootstrapServices();
startOtherServices();
...
}
private void startBootstrapServices() {
...
mActivityManagerService = mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
...
}
private void startOtherServices() {
...
mActivityManagerService.systemReady(() -> {
}, BOOT_TIMINGS_TRACE_LOG);
}
}
2.2、AMS执行
在AMS中执行systemReady()方法,在其中执行startHomeOnAllDisplays()方法,传入当前用户ID;
public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
...
synchronized (this) {
...
mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
...
}
...
}
frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java
boolean startHomeOnAllDisplays(int userId, String reason) {
boolean homeStarted = false;
for (int i = getChildCount() - 1; i >= 0; i--) {
final int displayId = getChildAt(i).mDisplayId;
homeStarted |= startHomeOnDisplay(userId, reason, displayId);
}
return homeStarted;
}