Framework层SystemServiceManager类的详解

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


目录

一、成员变量

二、成员函数

1. 构造函数

2. 四种startService()

3. startBootPhase()

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;
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值