0. SystemServer.main()

SystemServer 是 system_server 进程的 Java 层入口,main() 方法中创建 SystemServer 对象,并执行 run()run() 方法中创建 SystemServiceManager 对象,然后调用 startBootstrapServices()startCoreServices()startOtherServices()

startBootstrapServices() 中创建 ActivityManagerService、PowerManagerService、PackageManagerService 等。

1. SystemService

SystemService 是在 system_server 进程中执行的服务的抽象类,它定义了一些回调接口,例如 onStart()onBootPhase()onStartUser() 等等。还有 publicBinderService() 实现了向 servicemanager 注册服务,publicLocalService() 实现了注册 system_server 本地服务。

系统服务不是必须继承 SystemService,关键是调用 ServiceManager 类的 addService() 向 servicemanager 注册服务及调用 ServiceManagerRegistry 类的 registerService() 向 client 端注册服务的代理对象。

2. PowerManagerService 的启动

PowerManagerService 是比较标准的系统服务实现方式,它继承了 SystemService。

PowerManagerService 是调用 SystemServiceManager 类的 startService() 方法创建并注册的。

mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);

看一下 startService() 方法的实现。首先反射调用构造器创建对象,然后调用 startService(service) 注册 Service。

// com.android.server.SystemServiceManager
/**
 * Creates and starts a system service. The class must be a subclass of
 * {@link com.android.server.SystemService}.
 */
public <T extends SystemService> T startService(Class<T> serviceClass) {
    try {
        final String name = serviceClass.getName();
        Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartService " + name);
        final T service;
        try {
            Constructor<T> constructor = serviceClass.getConstructor(Context.class);
            service = constructor.newInstance(mContext);
        } ...
        startService(service);
        return service;
    } finally {
        Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}}

startService(service) 就是把该 Service 添加到 mServices 中,然后调用 onStart()

// com.android.server.SystemServiceManager
public void startService(@NonNull final SystemService service) {
    mServices.add(service);
    long time = SystemClock.elapsedRealtime();
    try {
        service.onStart();
    } ...
}

3. PowerManagerService 的注册

那 PowerManager 如何调用到 PowerManagerService 的?ServiceManager 类是 servicemanager 进程的 client端,servicemanager 是管理所有 service 的程序,代码在 framework/native/cmds/servicemanager/service_manager.c。把一个服务注册到 servicemanager 中需要调用 ServiceManager 类的 addService(),看一下 PowerManagerService 类的 onStart() 的实现。

onStart() 中调用了 publishBinderService()publishLocalService(),第一个就是往 servicemanager 注册服务的,第二个是注册本地 service,供 system_server 进程内调用。

// frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
public void onStart() {
    publishBinderService(Context.POWER_SERVICE, new BinderService());
    publishLocalService(PowerManagerInternal.class, new LocalService());

    Watchdog.getInstance().addMonitor(this);
    Watchdog.getInstance().addThread(mHandler);
}

publishBinderService()publishLocalService() 都是 SystemService 的方法。第一个方法最终会调用 ServiceManager#addService(),第二个方法会调用 LocalServices#addService()