美文网首页
Android 系统启动(2)----SystemServer

Android 系统启动(2)----SystemServer

作者: 石器时代小古董 | 来源:发表于2020-03-15 22:06 被阅读0次

参考自:
Android 进阶解密
网易课程

Zygote 服务启动 SystemServer

在 ZygoteInit 的 main 函数中

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

  public static void main(String argv[]) {
      ....
      startSystemServer(...)
      ....
  }

startSystemServer 函数

startSystemServer 函数会 fork 出当前 Zygote 的进程空间,并在该进程空间下启动 SystemServer,由于 fork 时同样获得了 Zygote Server 的 Socket ,但这个 Socket 对 SystemServer 来说是没有用的,所以关闭它。

   pid = Zygote.forkSystemServer(
                    parsedArgs.uid, parsedArgs.gid,
                    parsedArgs.gids,
                    parsedArgs.debugFlags,
                    null,
                    parsedArgs.permittedCapabilities,
                    parsedArgs.effectiveCapabilities);
  if (pid == 0) {
            if (hasSecondZygote(abiList)) {
                waitForSecondaryZygote(socketName);
            }

            zygoteServer.closeServerSocket();
            handleSystemServerProcess(parsedArgs);
  }

handleSystemServerProcess

handleSystemServerProcess 函数会调用 ZygoteInit 函数

  ....
 ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
 ....

ZygoteInit 的 nativeZygoteInit 函数对应 AndroidRuntime 的 jni 函数,负责创建 Binder 线程池,让 SystemServer 可以和其他进程进行通信。

RuntimeInit.applicationInit 函数真正调用 SystemServer 的 main 函数

 public static final void zygoteInit(int targetSdkVersion, String[] argv,
            ClassLoader classLoader) throws Zygote.MethodAndArgsCaller {
 .....

        ZygoteInit.nativeZygoteInit();
        RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
    }

SystemServer 的 main 函数

frameworks/base/services/java/com/android/server/SystemServer.java

SystemServer 的 run 方法主要做了以下几个事情

  1. 创建 Looper 消息循环体
  2. 创建系统的 context
  3. 创建 SystemServerManager
  4. 启动引导服务
  5. 启动核心服务
  6. 启动其他服务
public static void main(String[] args) {
        new SystemServer().run();
    }

SystemServer.run

 Looper.prepareMainLooper();
 Looper.getMainLooper().setSlowLogThresholdMs(SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);
      // Initialize the system context.
 createSystemContext();
       // Create the system service manager.
 mSystemServiceManager = new SystemServiceManager(mSystemContext);
 startBootstrapServices();
 startCoreServices();
 startOtherServices();

SystemServiceManager 负责启动和管理服务

  1. 首先将要启动的 Service 放入集合中管理
  2. 根据反射调用到 Service 并执行服务的 onStart 方法

基本上所有的服务都是 SystemServer 的子类,都具备 onStart 方法。

 private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();
 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");
    }

总结

  1. SystemServer 是由 Zygote 服务启动的,在创建 SystemServer 的时候会创建 Binder 线程池,然后 fork 出一个进程,在这个新的进程环境下启动 SystemServer,调用 SystemServer 的 main 函数。
  2. SystemServer 的 main 函数触发后,会创建 Looper 消息循环,创建 context,同时启动系统服务,引导服务以及其他服务

相关文章

网友评论

      本文标题:Android 系统启动(2)----SystemServer

      本文链接:https://www.haomeiwen.com/subject/hpkiehtx.html