一、前提提要
Launcher即桌面程序是在系统服务等启动后打开的第一个应用程序进程,主要管理手机内部的各个用户App的展示与打开等功能,在开启Launcher的过程中SystemUI 如导航栏等布局也相继加载到屏幕中。
Launcher的启动在各种系统服务初始化完成后进行的,即SystemServer的startOtherService()方法最后
二、启动流程
1、SystemServer.run()
//com.android.server.SystemServer
private void run() {
try{
......
//1、创建系统Context
createSystemContext();
......
}catch(..){..}
......
try{
......
//2、启动其他服务
startOtherServices();
......
}catch(..){..}
//......
}
系统服务如:AMS\ATMS、PMS、WMS等都是在SystemServer的run()方法中启动初始化,关于系统服务的启动不做过多介绍,这里主要有是创建了系统Context为后续启动做准备,然后进入到startOtherServices方法中
2、startOhterServices()
//com.android.server.SystemServer
private void startOtherServices() {
final Context context = mSystemContext;
......
//wms、ims等各种服务初始化
......
//通过AMS做启动前的准备
mActivityManagerService.systemReady(() -> {
......
try {
//2、启动系统UI
startSystemUi(context, windowManagerF);
} catch (Throwable e) {
reportWtf("starting System UI", e);
}
......
},BOOT_TIMINGS_TRACE_LOG);
}
在startOtherServices方法中先是完成必要的系统服务后,通过AMS开始对Launcher的启动进行准备工作,调用AMS的systemReady方法传入了一个Callback,并且在Callback中又对系统UI进行启动
3、启动SystemUI
//com.android.server.SystemServer
private static void startSystemUi(Context context, WindowManagerService windowManager) {
//启动系统UI Service
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.android.systemui",
"com.android.systemui.SystemUIService"));
intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
//Slog.d(TAG, "Starting service: " + intent);
context.startServiceAsUser(intent, UserHandle.SYSTEM);
windowManager.onSystemUiStarted();
}
通过启动Service的方式初始化UI
//com.android.systemui.SystemUIService
public class SystemUIService extends Service {
@Override
public void onCreate() {
super.onCreate();
//执行SystemUIApplication中的创建方法
((SystemUIApplication) getApplication()).startServicesIfNeeded();
......
}
......
}
在Service的onCreate()方法中又调用了当前Application的startServicesIfNeeded方法继续初始化
在前面的createSystemContext()方法中创建了Context的同时也创建的Application对象,Application的具体实例类型是通过解析对应的AndroidManifest.xml获取,此处创建的Application所解析的xml在 /frameworks/base/packages/SystemUI 包下
//frameworks/base/packages/SystemUI/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
package="com.android.systemui"
android:sharedUserId="android.uid.systemui"
coreApp="true">
......
<application
//Application类