Android系统启动流程(七)——SystemServer进程(基于Android13)

1 概述

SystemServer进程是Android系统中的核心进程,该进程由zygote进程在开机时fork而出。
在SystemServer进程中,启动了很多关键的服务,如AMS、PMS、WMS等,还启动了WatchDog,用于监测系统服务。

2 SystemServer进程创建

SystemServer进程由zygote fork而出
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

if (startSystemServer) {
   
   
    Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);

    // {@code r == null} in the parent (zygote) process, and {@code r != null} in the
    // child (system_server) process.
    if (r != null) {
   
   
        r.run();
        return;
    }
}

在zygoteInit的main方法中,会根据传入的参数判断是否执行forkSystemServer的操作,返回是一个Runnable类型,如果创建成功,则执行run方法。

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
        );
        ...
        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,3005,3006,3007,3009,3010,3011,3012",
                "--capabilities=" + capabilities + "," + capabilities,
                "--nice-name=system_server",
                "--runtime-args",
                "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
                "com.android.server.SystemServer",
        };
        ...

            /* Request to fork the system server process */
            //fork进程
            pid = Zygote.forkSystemServer(
                    parsedArgs.mUid, parsedArgs.mGid,
                    parsedArgs.mGids,
                    parsedArgs.mRuntimeFlags,
                    null,
                    parsedArgs.mPermittedCapabilities,
                    parsedArgs.mEffectiveCapabilities);
      	...

        /* For child process */
        //子进程中执行
        if (pid == 0) {
   
   
            if (hasSecondZygote(abiList)) {
   
   
                waitForSecondaryZygote(socketName);
            }

			//关闭socket的server端
            zygoteServer.closeServerSocket();
            //处理systemServer进程逻辑
            return handleSystemServerProcess(parsedArgs);
        }

        return null;
    }

这里会设置一些参数并执行fork流程,fork成功后,会运行systemServer中的逻辑
frameworks/base/core/java/com/android/internal/os/Zygote.java

static int forkSystemServer(int uid, int gid, int[] gids, int runtimeFlags,
        int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {
   
   
    ZygoteHooks.preFork();

    int pid = nativeForkSystemServer(
            uid, gid, gids, runtimeFlags, rlimits,
            permittedCapabilities, effectiveCapabilities);

    // Set the Java Language thread priority to the default value for new apps.
    Thread.currentThread().setPriority(Thread.NORM_PRIORITY);

    ZygoteHooks.postForkCommon();
    return pid;
}

private static native int nativeForkSystemServer(int uid, int gid, int[] gids, int runtimeFlags,
            int[][] rli
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值