SystemServer#main
上篇说过,system_server进程启动后会调用SystemServer#main方法,SystemServer#main非常的简单
public static void main(String[] args) {
new SystemServer().run();
}
我们再看SystemServer#run
private void run() {
try {
...
// The system server should never make non-oneway calls
Binder.setWarnOnBlocking(true);
...
// Increase the number of binder threads in system_server
BinderInternal.setMaxThreads(sMaxBinderThreads);
// Prepare the main looper thread (this thread).
android.os.Process.setThreadPriority(
android.os.Process.THREAD_PRIORITY_FOREGROUND);
android.os.Process.setCanSelfBackground(false);
Looper.prepareMainLooper();
Looper.getMainLooper().setSlowLogThresholdMs(
SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);
SystemServiceRegistry.sEnableServiceNotFoundWtf = true;
// Initialize native services.
System.loadLibrary("android_servers");
...
// Check whether we failed to shut down last time we tried.
// This call may not return.
performPendingShutdown();
// Initialize the system context.
createSystemContext();
// Call per-process mainline module initialization.
ActivityThread.initializeMainlineModules();
// Create the system service manager.
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.start();
...
} finally {
...
}
// Setup the default WTF handler
RuntimeInit.setDefaultApplicationWtfHandler(SystemServer::handleEarlySystemWtf);
// Start services.
try {
startBootstrapServices(t);
startCoreServices(t);
startOtherServices(t);
} catch (Throwable ex) {
...
} finally {
...
}
...
// Loop forever.
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
可以看到run方法的工作主要要以下几点:
- 对Binder进行了一些设置,这个等到之后分析Binder的时候再看;
- performPendingShutdown:判断是否要关机或者重启;
- createSystemContext:创建系统上下文,这个留到分析Context的时候再看;
- 创建ServiceManager
- 开启各种服务,然后进入Looper消息循环
本文主要关注第5点。
performPendingShutdown
private void performPendingShutdown() {
final String shutdownAction = SystemProperties.get(
ShutdownThread.SHUTDOWN_ACTION_PROPERTY, "");
if (shutdownAction != null && shutdownAction.length() > 0) {
boolean reboot = (shutdownAction.charAt(0) == '1');
...
if (不需要关机或重启) {
return;
}
Runnable runnable = new Runnable() {
@Override
public void run() {
synchronized (this) {
ShutdownThread.rebootOrShutdown(null, reboot, reason);
}
}
};
// ShutdownThread must run on a looper capable of displaying the UI.
Message msg = Message.obtain(UiThread.getHandler(), runnable);
msg.setAsynchronous(true);
UiThread.getHandler().sendMessage(msg);
}
}
可以看出,主要是根据ShutdownThread.SHUTDOWN_ACTION_PROPERTY属性值来判断是否需要关机或重启
startBootstrapServices
startBootstrapServices主要是启动最重要的相互依赖的关键性的系统服务,比如ActivityManagerService、PackageManagerService、UserManagerService和PowerManagerService等等。
由于SystemServer启动的服务非常众多,我们不可能一下子每个都去了解完,这里我们只关注几个常用的核心服务以及SystemServer的启动阶段即可。后续再去具体分析ActivityManagerService等的具体工作流程。
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
// 启动ActivityManagerService
ActivityTaskManagerService atm = mSystemServiceManager.startService(
ActivityTaskManagerService.Lifecycle.class).getService();
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
mSystemServiceManager, atm);
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
mWindowManagerGlobalLock = atm.getGlobalLock();
// 启动PowerManagerService
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
//
mActivityManagerService.initPowerManagement();
mSystemServiceManager.startService(LightsService.class);
mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
mSystemServiceManager.startBootPhase(t, SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
// 启动PackageManagerService
try {
Watchdog.getInstance().pauseWatchingCurrentThread("packagemanagermain");
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
} finally {
Watchdog.getInstance().resumeWatchingCurrentThread("packagemanagermain");
}
// 启动PackageManagerService
mSystemServiceManager.startService(UserManagerService.LifeCycle.class);
}
上面代码精简了非常多的代码,只保留了一下常见的服务启动相关代码。值得注意的是,DisplayManagerService启动后,SystemServer进入PHASE_WAIT_FOR_DEFAULT_DISPLAY阶段。也就是这句
mSystemServiceManager.startBootPhase(t, SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
startCoreServices
startCoreServices中启动了没有在startBootstrapServices启动的核心服务
private void startCoreServices(@NonNull TimingsTraceAndSlog t) {
// Service for system config
mSystemServiceManager.startService(SystemConfigService.class);
// Tracks the battery level. Requires LightService.
mSystemServiceManager.startService(BatteryService.class);
// Tracks application usage stats.
mSystemServiceManager.startService(UsageStatsService.class);
mActivityManagerService.setUsageStatsManager(
LocalServices.getService(UsageStatsManagerInternal.class));
// Tracks whether the updatable WebView is in a ready state and watches for update installs.
if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_WEBVIEW)) {
mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class);
}
// Tracks and caches the device state.
mSystemServiceManager.startService(CachedDeviceStateService.class);
// Tracks cpu time spent in binder calls
mSystemServiceManager.startService(BinderCallsStatsService.LifeCycle.class);
// Tracks time spent in handling messages in handlers.
mSystemServiceManager.startService(LooperStatsService.Lifecycle.class);
// Manages apk rollbacks.
mSystemServiceManager.startService(ROLLBACK_MANAGER_SERVICE_CLASS);
// Service to capture bugreports.
mSystemServiceManager.startService(BugreportManagerService.class);
// Serivce for GPU and GPU driver.
mSystemServiceManager.startService(GpuService.class);
}
startCoreServices启动的服务不多,这里精简了log相关代码。可以看到电池服务、GPU相关服务、BugReport等都在这里启动。
startOtherServices
startOtherServices非常庞大,有1400+行代码,启动了几十上百个服务,其中我们比较常见的应该是ConnectivityService、WindowManagerService
private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
...
t.traceBegin("MakeLockSettingsServiceReady");
if (lockSettings != null) {
try {
lockSettings.systemReady();
} catch (Throwable e) {
reportWtf("making Lock Settings Service ready", e);
}
}
t.traceEnd();
mSystemServiceManager.startBootPhase(t, SystemService.PHASE_LOCK_SETTINGS_READY);
// 这两个阶段中间什么也没有做
mSystemServiceManager.startBootPhase(t, SystemService.PHASE_SYSTEM_SERVICES_READY);
// Start device specific services
final String[] classes = mSystemContext.getResources().getStringArray(
R.array.config_deviceSpecificSystemServices);
for (final String className : classes) {
try {
mSystemServiceManager.startService(className);
} catch (Throwable e) {
reportWtf("starting " + className, e);
}
}
mSystemServiceManager.startBootPhase(t, SystemService.PHASE_DEVICE_SPECIFIC_SERVICES_READY);
mActivityManagerService.systemReady(() -> {
mSystemServiceManager.startBootPhase(t, SystemService.PHASE_ACTIVITY_MANAGER_READY);
try {
startSystemUi(context, windowManagerF);
} catch (Throwable e) {
reportWtf("starting System UI", e);
}
// Wait for all packages to be prepared
mPackageManagerService.waitForAppDataPrepared();
// confirm webview completion before starting 3rd party
if (webviewPrep != null) {
ConcurrentUtils.waitForFutureNoInterrupt(webviewPrep, WEBVIEW_PREPARATION);
}
mSystemServiceManager.startBootPhase(t, SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
}, t);
t.traceEnd(); // startOtherServices
}
可以看到在调用lockSettings.systemReady()之后进入了PHASE_LOCK_SETTINGS_READY和PHASE_SYSTEM_SERVICES_READY,这两个阶段什么都没有做。
“device specific services”看来应该是一组服务,此处暂不深究。这一组服务启动后,进入PHASE_DEVICE_SPECIFIC_SERVICES_READY阶段。
startOtherServices方法的最后调用了ActivityManagerService#systemReady,并在回调中启动了SystemUi。跟进一下
public void systemReady(final Runnable goingCallback, @NonNull TimingsTraceAndSlog t) {
mSystemServiceManager.preSystemReady();
synchronized(this) {
if (mSystemReady) {
// If we're done calling all the receivers, run the next "boot phase" passed in
// by the SystemServer
if (goingCallback != null) {
goingCallback.run();
}
return;
}
...
}
...
if (bootingSystemUser) {
t.traceBegin("startHomeOnAllDisplays");
mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
t.traceEnd();
}
...
}
可以看到,在调用SystemServiceManager#preSystemReady()就运行了回调,进了PHASE_ACTIVITY_MANAGER_READY阶段。随后启动了SystemUi,这个后续分析SystemUi的时候再深入了解。
另外,在webview就绪之后,进入了PHASE_THIRD_PARTY_APPS_CAN_START阶段,可以启动第三方App了。
值得注意的是,Launcher的启动也是由这里开始:
mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
SystemServer的启动还有最后一个阶段,发生在ActivityManagerService#finishBooting方法中
final void finishBooting() {
...
// Let system services know.
mSystemServiceManager.startBootPhase(t, SystemService.PHASE_BOOT_COMPLETED);
...
synchronized (this) {
...
// 发送系统启动完成通知,包括我们熟悉的开机广播
mUserController.sendBootCompleted(
new IIntentReceiver.Stub() {
@Override
public void performReceive(Intent intent, int resultCode,
String data, Bundle extras, boolean ordered,
boolean sticky, int sendingUser) {
synchronized (ActivityManagerService.this) {
mOomAdjuster.mCachedAppOptimizer.compactAllSystem();
requestPssAllProcsLocked(SystemClock.uptimeMillis(), true, false);
}
}
});
maybeLogUserspaceRebootEvent();
mUserController.scheduleStartProfiles();
}
}
至此,系统服务启动完成。我们熟悉的开机广播也是在这里发出的。
SystemServer启动流程
不同版本的SystemServer启动流程会有一些差别,比如WatchDog的启动时机等等。这里分析的是Android 11中的SystemServer。我们注意到在每个启动阶段都会调用SystemServiceManager#startBootPhase方法,其定义如下:
public void startBootPhase(@NonNull TimingsTraceAndSlog t, int phase) {
...
mCurrentPhase = phase;
Slog.i(TAG, "Starting phase " + mCurrentPhase);
try {
t.traceBegin("OnBootPhase_" + phase);
final int serviceLen = mServices.size();
for (int i = 0; i < serviceLen; i++) {
final SystemService service = mServices.get(i);
...
service.onBootPhase(mCurrentPhase);
...
}
} finally {
t.traceEnd();
}
...
}
其主要工作是遍历和调用每个Service的onBootPhase方法,让系统服务知晓当前启动阶段并可以执行相应的操作。
各个阶段的定义位于SystemService.java内:
public abstract class SystemService {
/*
* The earliest boot phase the system send to system services on boot.
*/
public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100;
/**
* After receiving this boot phase, services can obtain lock settings data.
*/
public static final int PHASE_LOCK_SETTINGS_READY = 480;
/**
* After receiving this boot phase, services can safely call into core system services
* such as the PowerManager or PackageManager.
*/
public static final int PHASE_SYSTEM_SERVICES_READY = 500;
/**
* After receiving this boot phase, services can safely call into device specific services.
*/
public static final int PHASE_DEVICE_SPECIFIC_SERVICES_READY = 520;
/**
* After receiving this boot phase, services can broadcast Intents.
*/
public static final int PHASE_ACTIVITY_MANAGER_READY = 550;
/**
* After receiving this boot phase, services can start/bind to third party apps.
* Apps will be able to make Binder calls into services at this point.
*/
public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600;
/**
* After receiving this boot phase, services can allow user interaction with the device.
* This phase occurs when boot has completed and the home application has started.
* System services may prefer to listen to this phase rather than registering a
* broadcast receiver for {@link android.content.Intent#ACTION_LOCKED_BOOT_COMPLETED}
* to reduce overall latency.
*/
public static final int PHASE_BOOT_COMPLETED = 1000;
}
PHASE_WAIT_FOR_DEFAULT_DISPLAY: 已启动ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService等核心引导服务
PHASE_LOCK_SETTINGS_READY:已完成核心服务的启动,LockSettingsService已经就绪
PHASE_SYSTEM_SERVICES_READY:系统核心服务已经就绪,可以为其他Service提供服务了
PHASE_DEVICE_SPECIFIC_SERVICES_READY:设备特定服务组已经就绪
PHASE_ACTIVITY_MANAGER_READY:ActivityManagerService就绪,可以发送广播了
PHASE_THIRD_PARTY_APPS_CAN_START:服务可以启动或者bind第三方App,App可以通过Binder调用系统服务了
PHASE_BOOT_COMPLETED:开机完成,可以相应用户交互了。系统服务应该监听PHASE_BOOT_COMPLETED流程而不是等待ACTION_LOCKED_BOOT_COMPLETED广播。
总结
SystemServer是系统非常重要的进程,牵涉非常广泛,但是大部分功能都封装在对应的Service里,所以SystemServer.java本身代码量并不是很多,总体流程也不算很复杂。接下来会深入我们常见的服务,一探究竟。