SystemServiceManager类是用来管理系统服务(SystemService)的创建、启动和其他生命周期事件的。SystemServiceManager是frameworks/base/services/core/java/com/android/server/SystemServiceManager.java。
本文是基于Android 12,代码参考:SystemServiceManager.java - OpenGrok cross reference for /frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
目录
4. public void isBootCompleted()
5. public void preSystemReady()
6. void setSafeMode(boolean safeMode)
三、SystemServer启动SystemMangerService
一、成员变量
1. private final ArrayList<SystemService> mServices;
存储启动的service的列表,回调services的onStart()和onBootPhase()生命周期时都需要遍历该List。
2. private ArrayMap<String, PathClassLoader> mLoadedPaths;
加载SystemService的ClassLoader,是为了去重,一种ClassLoader只需要加载一次即可。
3.private int mCurrentPhase = -1;
该mCurrentPhase是为了根据状态回调给相应service的onBootPhase()的参数,请参考上篇【Framework层SystemService类的详细介绍】中对于该字段取值的介绍。
4.private boolean mSafeMode;
5.private static File sSystemDir;
6. private final Context mContext;
二、成员函数
1. 构造函数
private final Context mContext;
SystemServiceManager(Context context) {
mContext = context;
}
2. 四种startService()
该方法有4中重写的方法,分别如下
(1) public SystemService startService(String className)——类名
根据传入的className启动相应的service,返回该service的实例,该实例先由ClassLoader加载到相应Class,然后Constructor.newInstance()。实际上是调用了第(3)个startService(),然后调用第(4)个startService()。
(2) public SystemService startServiceFromJar(String className, string path)——类名+路径
根据传入的className和指定的service类所在的jar路径来启动service。
mLoadedPaths就是该方法中判断该path是否有对应PathClassLoader,如果不存在就创建该classLoader,然后加载相应的class。
public SystemService startServiceFromJar(String className, String path) {
PathClassLoader pathClassLoader = mLoadedPaths.get(path);
if (pathClassLoader == null) {
pathClassLoader = new PathClassLoader(path, this.getClass().getClassLoader());
mLoadedPaths.put(path, pathClassLoader);
}
final Class<SystemService> serviceClass = loadClassFromLoader(className, pathClassLoader);
return startService(serviceClass);
}
其中,loaderClassFromLoader()核心只有一行代码,如下:
private static Class<SystemService> loadClassFromLoader(String className,
ClassLoader classLoader) {
try {
return (Class<SystemService>) Class.forName(className, true, classLoader);
} catch(ClassNotFoundException ex) {
throw new RuntimeException(...);
}
}
(3) public <T extends SystemService> T startService(Class<T> serviceClass)——全路径类名
该方法主要是根据传入的ClassLoader加载的serviceclass,该class必须是extends SystemSerice的子类,然后构建相应service的实例,该方法主要的就是创建对应service实例。
public <T extends SystemService> T startService(Class<T> serviceClass) {
final T service;
try {
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
//注意:创建的实例传入的mContext是系统上下文
service = constructor.newInstance(mContext);
} catch (Exception ex) {
...
}
startService(service);
return service;
}
(4) public void startService(final SystemService service)——系统服务的实例对象
该方法是启动系统service的最终实现,在该方法中把传入的service注册进mService(mService是所有service的ArrayList),然后调用该service的onStart()方法。
之后就会进入该service的onStart()方法,执行ServiceManager的publishBinderService()方法。
public void startService(@NonNull final SystemService service) {
// Register it.
mServices.add(service);
// Start it.
long time = SystemClock.elapsedRealtime();
try {
service.onStart();
} catch (RuntimeException ex) {
throw new RuntimeException("Failed to start service " + service.getClass().getName() + ": onStart threw an exception", ex);
}
warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
}
该方法就是回调SystemService的onStart()。
3. startBootPhase()
public void startBootPhase( TimingsTraceAndSlog t, int phase)
该方法为启动的所有系统services开启指定的启动阶段。
该方法实际上是遍历mServices中的所有启动的service,调用他们的onBootPhase()方法,传入的参数是自己的入参phase。
该方法就是回调SystemService的onBootPhase()方法。
4. public void isBootCompleted()
该方法是判断系统是否完成启动,根据mCurrentPhrase >= SystemService.PHASE_BOOT_COMPLETED,如果true,则返回true,表示系统启动完成。
5. public void preSystemReady()
该方法在ActivityManagerService.systemReady()前调用。
public void preSystemReady() {
mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
}
6. void setSafeMode(boolean safeMode)
设置服务查询的安全模式标志。
7. public boolean isSafeMode()
(10) 其他方法都是关于User相关的方法,我还没看到和User方法相关的调用,以后涉及到再更新补充。
三、SystemServer启动SystemServiceManger
1. 在SystemServer.run()初始化SystemServiceManager对象,传递的参数是mSystemContext,所以在startService()中创建的系统服务实例都是使用的mSystemContext对象,该对象实际上是由ContextImpl.createSystemContext(this)创建的。
// /frameworks/base/services/java/com/android/server/SystemServer.java
public final class SystemServer implements Dumpable {
private Context mSystemContext;
private void run() {
// Initialize the system context.
createSystemContext();
...
// 初始化SystemServiceManager实例,参数mSystemContext是系统上下文
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setStartInfo(mRuntimeRestart, mRuntimeStartElapsedTime, mRuntimeStartUptime);
mDumper.addDumpable(mSystemServiceManager);
}
private void createSystemContext() {
ActivityThread activityThread = ActivityThread.systemMain();
mSystemContext = activityThread.getSystemContext();
mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
final Context systemUiContext = activityThread.getSystemUiContext();
systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}
}
2. 创建系统上下文的过程
// /frameworks/base/core/java/android/app/ActivityThread.java
public final class ActivityThread extends ClientTransactionHandler
implements ActivityThreadInternal {
@UnsupportedAppUsage
public static ActivityThread systemMain() {
ThreadedRenderer.initForSystemProcess();
ActivityThread thread = new ActivityThread();
thread.attach(true, 0);
return thread;
}
@Override
@UnsupportedAppUsage
public ContextImpl getSystemContext() {
synchronized (this) {
if (mSystemContext == null) {
mSystemContext = ContextImpl.createSystemContext(this);
}
return mSystemContext;
}
}
@Override
public ContextImpl getSystemUiContext() {
synchronized (this) {
if (mSystemUiContext == null) {
mSystemUiContext = ContextImpl.createSystemUiContext(getSystemContext());
}
return mSystemUiContext;
}
}
}