SystemServer进程是Android系统的核心进程,运行在Android系统启动后,负责管理和加载系统服务。本文将介绍SystemServer进程的详细结构和工作原理,并使用代码注释的方式阐述其关键部分代码。
结构:
SystemServer进程的核心是SystemServer类,它是Android系统启动后的第一个Java进程。SystemServer类负责启动系统的各种服务,它通过Binder机制提供各种服务接口。下面是SystemServer类的结构:
public final class SystemServer {
private static final String TAG = "SystemServer";
private static final boolean DEBUG_LISTENER = false;
private static final boolean DEBUG_PRIORITY = false;
private static final String ANSI_RED_BACKGROUND = "\u001B[31;40m";
private static final String ANSI_RESET = "\u001B[0m";
...
public static void main(String[] args) {
...
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "InitBeforeStartServices");
SystemServer systemServer = null;
try {
//创建systemServer实例
systemServer = new SystemServer();
//启动系统服务
systemServer.run();
} catch (Throwable ex) {
Log.e("System", "******************************************");
Log.e("System", "************ Failure starting system services", ex);
System.exit(10);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
//启动各种系统服务的方法
private void run() {
...
startCoreServices();
startOtherServices();
startBootstrapServices();
...
}
//启动核心服务的方法
private void startCoreServices() {
...
}
//启动其他服务的方法
private void startOtherServices() {
...
}
//启动引导服务的方法
private void startBootstrapServices() {
...
}
...
}
如上所示,SystemServer主要由三个部分组成:main()方法、启动各种系统服务的run()方法,以及三个启动服务的方法:startCoreServices()、startOtherServices()和startBootstrapServices()。下面将详细解释每一个部分的作用。
main()方法:
main()方法是SystemServer进程的入口。它调用run()方法启动系统服务。下面是SystemServer进程的main()方法的结构:
public static void main(String[] args) {
...
SystemServer systemServer = new SystemServer();
systemServer.run();
}
如上所示,SystemServer的“main”方法只是简单地创建了SystemServer的实例,并调用了“run”方法。
run()方法:
run()方法是启动各种系统服务的主要方法。它调用了三个方法以启动核心服务、其他服务和引导服务。下面是SystemServer的“run”方法的结构:
private void run() {
startCoreServices();
startOtherServices();
startBootstrapServices();
}
如上所示,在“run”方法中,首先调用“startCoreServices”方法以启动核心服务,接着调用“startOtherServices”方法以启动其他服务,最后调用“startBootstrapServices”方法以启动引导服务。
startCoreServices()方法:
startCoreServices()方法负责启动Android系统中的核心服务,例如属性服务、电源服务、USB服务、Vibrator服务等。下面是SystemServer的“startCoreServices”方法的结构:
private void startCoreServices() {
...
//启动属性服务
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "InitializeSystemProperties");
SystemProperties.init();
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
//启动电源服务
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartPowerManagerService");
power = powerManagerService;
powerManagerService.setPolicy((WindowManagerPolicy) policy);
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
//启动USB服务
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartUsbService");
UsbService usb = new UsbService(context);
ServiceManager.addService(Context.USB_SERVICE, usb);
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
//启动Vibrator服务
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartVibratorService");
vibrator = new VibratorService(context);
ServiceManager.addService(Context.VIBRATOR_SERVICE, vibrator);
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
//启动下载服务
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartDownloadService");
ServiceManager.addService(Context.DOWNLOAD_SERVICE, new DownloadManagerService(context));
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
...
}
如上所示,“startCoreServices”方法分别启动了系统属性服务、电源服务、USB服务、Vibrator服务、下载服务等。它主要是通过调用ServiceManager.addService()方法以将这些服务添加到系统服务列表中。
startOtherServices()方法:
startOtherServices()方法负责启动其他系统服务,例如媒体服务、网络服务、位置服务等。下面是SystemServer的“startOtherServices”方法的结构:
private void startOtherServices() {
...
//启动媒体服务
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartMediaServer");
media = new MediaServer(context);
ServiceManager.addService(Context.MEDIA_ROUTER_SERVICE, media.getMediaRouter());
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
//启动网络服务
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartNetworkManagementService");
try {
final NetworkManagementService nmService = NetworkManagementService.create(context);
ServiceManager.addService(Context.NETWORKMANAGEMENT_SERVICE, nmService);
} catch (Throwable e) {
reportWtf("starting NetworkManagementService", e);
}
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
//启动位置服务
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartLocationManagerService");
locationManagerService = new LocationManagerService(context);
ServiceManager.addService(Context.LOCATION_SERVICE, locationManagerService);
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
...
}
如上所示,“startOtherServices”方法依次启动了媒体服务、网络服务和位置服务。它们主要是通过调用ServiceManager.addService()方法以将这些服务添加到系统服务列表中。
startBootstrapServices()方法:
startBootstrapServices()方法负责启动引导服务,例如重命名文件系统、格式化data分区等。下面是SystemServer的“startBootstrapServices”方法的结构:
private void startBootstrapServices() {
//重命名文件系统
if (!mRuntimeRestart) {
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "RenameFilesystem");
ZygoteInit.renameAndRemoveOldUserSystemDirs();
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
//格式化data分区
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartBootstrapServices");
Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED);
intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT);
intent.setPackage("android");
context.sendBroadcastAsUser(intent, UserHandle.ALL);
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
如上所示,“startBootstrapServices”方法重命名了文件系统并格式化了data分区。它们主要是通过调用ZygoteInit.renameAndRemoveOldUserSystemDirs()方法和发送一个广播以让系统前台服务启动。
在实际开发中,我们要深入分析SystemServer进程的代码实现,掌握其启动和管理系统服务的原理,对于优化和改进Android系统具有重要意义。此外,我们也可以借鉴SystemServer进程的设计思路,提高自己的代码实现水平。
参考资料:
-
Android Framework源码:https://cs.android.com/android/platform/superproject/
-
Android Developers官方文档:https://developer.android.com/docs