SystemServer 是 system_server 进程的 Java 层入口,main() 方法中创建 SystemServer 对象,并执行 run()。run() 方法中创建 SystemServiceManager 对象,然后调用 startBootstrapServices()、startCoreServices()、startOtherServices()。
startBootstrapServices() 中创建 ActivityManagerService、PowerManagerService、PackageManagerService 等。
SystemService 是在 system_server 进程中执行的服务的抽象类,它定义了一些回调接口,例如 onStart()、onBootPhase()、onStartUser() 等等。还有 publicBinderService() 实现了向 servicemanager 注册服务,publicLocalService() 实现了注册 system_server 本地服务。
系统服务不是必须继承 SystemService,关键是调用 ServiceManager 类的 addService() 向 servicemanager 注册服务及调用 ServiceManagerRegistry 类的 registerService() 向 client 端注册服务的代理对象。
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();
} ...
}
那 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()。