美文网首页
2.对于SystemServer的理解

2.对于SystemServer的理解

作者: 梦想黑客 | 来源:发表于2020-03-04 23:40 被阅读0次

SystemServer是什么?

SystemServer是Android主要核心服务所在的进程,像AMS、WMS、PMS这些服务都是运行在SystemServer进程中的,从Zygote的启动流程中可以知道SystemServer是Zygote进程fork的,SystemServer同时也算是Android系统的应用进程。

SystemServer的作用?

  • 创建服务
  • 启动服务
  • 注册服务

SystemServer的启动流程

1.在Zygote.java的main()方法中调用forkSystemServer来创建进程,主要流程如下:

  • 解析参数;
  • 调用native函数fork进程;
  • 关闭ZygoteServer,进行后续处理;
private static Runnable forkSystemServer(String abiList, String socketName,
          ZygoteServer zygoteServer) {
      
      ... ...  
    
      //1.解析参数
      /* Hardcoded command line to start the system server */
      String args[] = {
              "--setuid=1000",
              "--setgid=1000",
              "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,"
                      + "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010",
              "--capabilities=" + capabilities + "," + capabilities,
              "--nice-name=system_server",
              "--runtime-args",
              "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
              "com.android.server.SystemServer",
      };
      ZygoteArguments parsedArgs = null;

      int pid;

      try {
        
          //2.调用native函数fork进程
          /* Request to fork the system server process */
          pid = Zygote.forkSystemServer(
                  parsedArgs.mUid, parsedArgs.mGid,
                  parsedArgs.mGids,
                  parsedArgs.mRuntimeFlags,
                  null,
                  parsedArgs.mPermittedCapabilities,
                  parsedArgs.mEffectiveCapabilities);
      } catch (IllegalArgumentException ex) {
          throw new RuntimeException(ex);
      }

      /* For child process */
      if (pid == 0) {
          if (hasSecondZygote(abiList)) {
              waitForSecondaryZygote(socketName);
          }
          
          //3.pid=0为子进程,进行后续处理;
          zygoteServer.closeServerSocket();
          return handleSystemServerProcess(parsedArgs);
      }

      return null;
  }

2.fork成功之后进入handleSystemServerProcess(parseArgs),根据parsedArgs.mInvokeWith判断是启动SystemServer还是普通应用进程,
最终调用ZygoteInit.zygoteInit();

private static Runnable handleSystemServerProcess(ZygoteArguments parsedArgs) {
     
        if (parsedArgs.mNiceName != null) {
            //设置进程名字
            Process.setArgV0(parsedArgs.mNiceName);
        }

       ... ...

        if (parsedArgs.mInvokeWith != null) {
         
            ... ...
            
            //启动应用程序进程
            WrapperInit.execApplication(parsedArgs.mInvokeWith,
                    parsedArgs.mNiceName, parsedArgs.mTargetSdkVersion,
                    VMRuntime.getCurrentInstructionSet(), null, args);

            throw new IllegalStateException("Unexpected return from WrapperInit.execApplication");
        } else {
            //创建classloader
            createSystemServerClassLoader();
            ClassLoader cl = sCachedSystemServerClassLoader;
            if (cl != null) {
                Thread.currentThread().setContextClassLoader(cl);
            }

            /*
             * Pass the remaining arguments to SystemServer.
             */
            //进行初始化
            return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion,
                    parsedArgs.mRemainingArgs, cl);
        }

        /* should never reach here */
    }

3.在zygoteInit方法中主要做的:

  • 初始化操作 RuntimeInit.commonInit(); 和ZygoteInit.nativeZygoteInit(),其中在ZygoteInit.nativeZygoteInit()中调用了native方法来启动binder线程;
  • 最终反射调用SystemServer.java的main方法,正式进入SystemServer处理;

4.运行SystemServer.java的main():

  • 创建主线程Looper;
  • 加载系统库“ android_servers”;
  • 创建系统上下文;
  • 分批、分阶段启动各种服务;
  • Looper.loop();
public static void main(String[] args) {
    new SystemServer().run();
}
private void run() {
   

    // 主线程looper就在当前线程运行
    Looper.prepareMainLooper();

    //加载android_servers.so库,该库包含的源码在frameworks/base/services/目录下
    System.loadLibrary("android_servers");

  
    //初始化系统上下文 
    createSystemContext();

    //创建系统服务管理
    mSystemServiceManager = new SystemServiceManager(mSystemContext);

    //启动各种系统服务
    try {
        startBootstrapServices(); // 启动引导服务
        startCoreServices();      // 启动核心服务
        startOtherServices();     // 启动其他服务
    } catch (Throwable ex) {
        Slog.e("System", "************ Failure starting system services", ex);
        throw ex;
    }

    //一直循环执行
    Looper.loop();
    throw new RuntimeException("Main thread loop unexpectedly exited");
}
  1. createSystemContext(),该方法主要创建了ActivityThread,并创建了SystemContext:
    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);
    }

6.分批、分阶段启动各种Service,并注册到ServiceManager中;

相关文章

网友评论

      本文标题:2.对于SystemServer的理解

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