Framework源码分析 启动流程 Zygote启动SystemServer

背景

Framework中最为重要的就是四大组件了,整个Android体系都是围绕四大组件进行搭建的。之前相关的源码看过一篇,但是因为最近在学习插件化框架相关的知识,发现很多细节记得不是很清楚了,再加上现在市面上将Android源码的书中基于的Android源码版本已经很老了, 所以这次打算自己再深入学习一遍。这个系列都是基于AndroidX, branch android_10.0.0_r1进行分析。

ActivityManagerService在system_server中的初始化

整个Android启动流程大体是: 加电启动->fastboot->kernel->init->Zygote Zygote的启动代表着整个Android世界开始构建。Zygote启动时会拉起system_server, 而Android大部分系统服务都是在system_server中初始化的

Zygote启动system_server

ZygoteInit.forkSystemServer

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

    /**
     * Prepare the arguments and forks for the system server process.
     *
     * @return A {@code Runnable} that provides an entrypoint into system_server code in the child
     * process; {@code null} in the parent.
     */
    private static Runnable forkSystemServer(String abiList, String socketName,
            ZygoteServer zygoteServer) {
        long capabilities = posixCapabilitiesAsBits(
                OsConstants.CAP_IPC_LOCK,
                OsConstants.CAP_KILL,
                OsConstants.CAP_NET_ADMIN,
                OsConstants.CAP_NET_BIND_SERVICE,
                OsConstants.CAP_NET_BROADCAST,
                OsConstants.CAP_NET_RAW,
                OsConstants.CAP_SYS_MODULE,
                OsConstants.CAP_SYS_NICE,
                OsConstants.CAP_SYS_PTRACE,
                OsConstants.CAP_SYS_TIME,
                OsConstants.CAP_SYS_TTY_CONFIG,
                OsConstants.CAP_WAKE_ALARM,
                OsConstants.CAP_BLOCK_SUSPEND
        );
        /* Containers run without some capabilities, so drop any caps that are not available. */
        StructCapUserHeader header = new StructCapUserHeader(
                OsConstants._LINUX_CAPABILITY_VERSION_3, 0);
        StructCapUserData[] data;
        try {
            data = Os.capget(header);
        } catch (ErrnoException ex) {
            throw new RuntimeException("Failed to capget()", ex);
        }
        capabilities &= ((long) data[0].effective) | (((long) data[1].effective) << 32);

        /* 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 {
            parsedArgs = new ZygoteArguments(args);
            Zygote.applyDebuggerSystemProperty(parsedArgs);
            Zygote.applyInvokeWithSystemProperty(parsedArgs);

            boolean profileSystemServer = SystemProperties.getBoolean(
                    "dalvik.vm.profilesystemserver", false);
            if (profileSystemServer) {
                parsedArgs.mRuntimeFlags |= Zygote.PROFILE_SYSTEM_SERVER;
            }

            /* Request to fork the system server process */
            // 通过fork启动system_server
            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);
            }

            zygoteServer.closeServerSocket();
            // 开始执行system_server
            return handleSystemServerProcess(parsedArgs);
        }

        return null;
    }

Zygote.forkSystemServer

可以看到nativeForkSystemServer是一个native函数,实际fork工作是丢给它来完成的,我们进去看下

nativeForkSystemServer

在fork system_server进程时是通过ForkCommon函数,ForkCommon中再调用fork来完成。

ForkCommon

SpecializeCommon

SpecializeCommon函数主要是根据参数设置进程的一些参数,如权限,调度策略.

callPostForkSystemServerHookscallPostForkChildHooks,是针对Zygote的两个hook,我们这里略过,重点在于ZygoteInit类的createSystemServerClassLoader方法

ZygoteInit.createSystemServerClassLoader

createSystemServerClassLoader被调用是已经在system_server进程里了,这个函数只是获取了SYSTEMSERVERCLASSPATH环境变量,创建了sCachedSystemServerClassLoader,下图是在Android手机上截取的环境变量,可以看到SYSTEMSERVERCLASSPATH. fork相关的部分到这里就结束了,我们现在退栈到ZygoteInitforkSystemServer, 看下handleSystemServerProcess SYSTEMSERVERCLASSPATH

ZygoteInit.handleSystemServerProcess

handleSystemServerProcess主要做了两件事:

  1. 优化相关代码

  2. 调用ZygoteInit.zygoteInit

ZygoteInit.zygoteInit

zygoteInit的主要工作:

  1. 重定向日志

  2. 完成一些通用初始化:时区等

  3. 调用native方法初始化,这个函数主要使用创建进行的线程池,待会儿看一下

  4. 最后调用RuntimeInit.applicationInit进一步处理参数

    下面先看下ZygoteInit.nativeZygoteInit

nativeZygoteInit

nativeZygoteInit函数在AndroidRuntime.cpp

AndroidRuntime中,onZygoteInit是个虚函数,啥都没做,看下AndroidRuntime的定义

实际运行中,onZygoteInit的函数的具体实现是在AppRuntime里面

nativeZygoteInit看完了,现在回去继续看Java空间的处理,下面看RuntimeInit.applicationInit

RuntimeInit.applicationInit

findStaticMain函数就是找到目标类中的static main方法,实现主要就是通过反射,比较简单就不细看了。 追了一路,这里稍微总结下:Zygote通过fork出一个进程,然后在这个进程中准备一系列参数,最终返回的Runnable就是com.android.server.SystemServermain方法。之后子进程就从main开始往下走了。下面我们就正式进入SystemServer的代码中去了。

Last updated

Was this helpful?