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()
。