Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

Android源码分析之SystemServer的创建过程

$
0
0

SystemServer进程的创建

前言

SystemServer进程是Android系统的核心之一,大多数的服务都运行在这个进程中。Android的应用程序没有权限访问设备的底层资源,都要通过SystemServer提供的代理来访问。

SystemServer创建图

SystemServer的创建过程

SystemServer的创建分为两个部分,一部分是在Zygote进程中fork并进行初始化,另一部分是执行SystemServer类main来启动服务

Zygote进程fork出SystemServer进程

ZygoteInit类中的main方法会调用startSystemServer来启动SystemServer

 public static void main(String argv[]) {
        try {
            // Start profiling the zygote initialization.
            SamplingProfilerIntegration.start();

            boolean startSystemServer = false;
            String socketName = "zygote";
            String abiList = null;
            for (int i = 1; i < argv.length; i++) {
                if ("start-system-server".equals(argv[i])) {
                    startSystemServer = true;
                } else if (argv[i].startsWith(ABI_LIST_ARG)) {
                    abiList = argv[i].substring(ABI_LIST_ARG.length());
                } else if (argv[i].startsWith(SOCKET_NAME_ARG)) {
                    socketName = argv[i].substring(SOCKET_NAME_ARG.length());
                } else {
                    throw new RuntimeException("Unknown command line argument: " + argv[i]);
                }
            }

            if (abiList == null) {
                throw new RuntimeException("No ABI list supplied.");
            }

            registerZygoteSocket(socketName);
            EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
                SystemClock.uptimeMillis());
            preload();
            EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
                SystemClock.uptimeMillis());

            // Finish profiling the zygote initialization.
            SamplingProfilerIntegration.writeZygoteSnapshot();

            // Do an initial gc to clean up after startup
            gc();

            // Disable tracing so that forked processes do not inherit stale tracing tags from
            // Zygote.
            Trace.setTracingEnabled(false);

            if (startSystemServer) {
                startSystemServer(abiList, socketName);
            }

            Log.i(TAG, "Accepting command socket connections");
            runSelectLoop(abiList);

            closeServerSocket();
        } catch (MethodAndArgsCaller caller) {
            caller.run();
        } catch (RuntimeException ex) {
            Log.e(TAG, "Zygote died with exception", ex);
            closeServerSocket();
            throw ex;
        }
    }

在启动SystemServer的过程中,根据init.rc中定义的zygote的启动参数 “–start-system-server”,会给startSystemServer 赋值为ture,进而执行到 startSystemServer(abiList, socketName); 这个方法。
在启动SystemServer的最后会throw一个例外。从而执行到
caller.run();进行执行启动系统众多服务的功能。

startSystemServer

这个方法主要做了三件事
- 为SystemServer启动准备参数
- fork出SystemServer进程
- 对SystemServer进行初始化的操作

        /* 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,1032,3001,3002,3003,3006,3007",
            "--capabilities=" + capabilities + "," + capabilities,
            "--runtime-init",
            "--nice-name=system_server",
            "com.android.server.SystemServer",
        };

为SystemServer准备了启动参数 ,设置进程id和组id为1000。指定了SystemServer的执行类为com.android.server.SystemServer” ,这个参数将会在parsedArgs.remainingArgs 中存储。

 try {
            parsedArgs = new ZygoteConnection.Arguments(args);
            ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);
            ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);

            /* Request to fork the system server process */
            pid = Zygote.forkSystemServer(
                    parsedArgs.uid, parsedArgs.gid,
                    parsedArgs.gids,
                    parsedArgs.debugFlags,
                    null,
                    parsedArgs.permittedCapabilities,
                    parsedArgs.effectiveCapabilities);
        } catch (IllegalArgumentException ex) {
            throw new RuntimeException(ex);
        }

通过Zygore.forkSystemServer fork出SystemServer进程。
会调用native层的 nativeForkSystemServer来fork子进程。
通过还会检查如果SystemServer创建不成功。则Zygote会杀死自己,重新启动。

    /* For child process */
        if (pid == 0) {
            if (hasSecondZygote(abiList)) {
                waitForSecondaryZygote(socketName);
            }

            handleSystemServerProcess(parsedArgs);
        }

如果pid ==0 ,则表示是子进程即SystemServer进程。在子进程中会执行 handleSystemServerProcess(parsedArgs);
来做初始化的操作。
在这个方法中,主要是通过

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

进行初始化的。这里的parsedArgs.remainingArgs 即为com.android.server.SystemServer 。

“`
public static final void zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
throws ZygoteInit.MethodAndArgsCaller {
if (DEBUG) Slog.d(TAG, “RuntimeInit: Starting application from zygote”);

    redirectLogStreams();

    commonInit();
    nativeZygoteInit();

    applicationInit(targetSdkVersion, argv, classLoader);
}

“`
调用applicationInit实现初始化的操作。在初始化中,通过反射的机制找到 SystemServer类的main方法。最后会throw一个例外
throw new ZygoteInit.MethodAndArgsCaller(m, argv);
这个例外被MethodAndArgsCaller 进行catch到。执行caller.run,就会通过反射执行到SystemServer的main方法。

从此SystemServer进程就启动系统中绝大多数的服务。

总结

  • SystemServer进程是由Zygote进程创建出来。 在init.rc中进行指定启动的参数,
  • SystemServer启动后,会运行SystemServer.java的main方法,从此启动系统众多的服务,比较PMS WMS AMS等。

涉及的代码

/frameworks/base/core/java/com/android/internal/os/Zygote.java
/frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
/frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
/frameworks/base/services/java/com/android/server/SystemServer.java

作者:u013377887 发表于2017/1/7 16:22:54 原文链接
阅读:30 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>