Android5.1--SystemServer进程

本文详细探讨了Android系统的核心组件SystemServer的启动过程和WatchDog模块。SystemServer承载了大部分Android服务,通过Binder机制,应用进程通过SystemServer访问设备资源。WatchDog用于监控系统服务和线程,确保系统的稳定运行。主要关注点包括WatchDog的启动、监控的服务及原理。

这篇博客作为自己的学习心得记录下来,欢迎提出问题,一起学习进步。


SystemServer是Android系统的核心之一,大部分Android提供的服务都运行在这个进程里,SystemServer中运行的服务总共有60多种。为了防止应用进程对系统造成破坏,Android的应用进程没有权限访问设备的底层资源,只能通过SystemServer中的服务代理访问。通过Binder,用户进程使用systemServer中的服务并没有太多的不便之处。

下面我们重点看下SystemServer的启动过程和它的WatchDog模块。

SystemServer的创建过程

SystemServer的创建可以分成两部分,一部分是在Zygote进程中fork并初始化SystemServer进程,另一部分是执行SystemServer类的main()方法来启动系统的服务。

创建SystemServer进程

Init.rc文件中定义的Zygote进程的启动参数包括了“--start-system-server”,因此,在ZygoteInit类的main()方法里会调用startSystemServer()方法,如下:
            if (startSystemServer) {
                startSystemServer(abiList, socketName);
            }
    /**
     * Prepare the arguments and fork for the system server process.
     */
    private static boolean startSystemServer(String abiList, String socketName)
            throws MethodAndArgsCaller, RuntimeException {
        long capabilities = posixCapabilitiesAsBits(
            OsConstants.CAP_BLOCK_SUSPEND,
            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_RESOURCE,
            OsConstants.CAP_SYS_TIME,
            OsConstants.CAP_SYS_TTY_CONFIG
        );
        /* Hardcoded command line to start the system server */
        String args[] = {//指定forkSystemServer所需要的参数
            "--setuid=1000",//SYSTEM_UID
            "--setgid=1000",
            "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1032,3001,3002,3003,3006,3007",
            "--capabilities=" + capabilities + "," + capabilities,
            "--runtime-init",
            "--nice-name=system_server",//进程的名字
            "com.android.server.SystemServer",//systemServer类的位置
        };
        ZygoteConnection.Arguments parsedArgs = null;

        int pid;

        try {
            parsedArgs = new ZygoteConnection.Arguments(args);//根据指定的参数,生成一个ZygoteConnection.Arguments对象
            ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);//根据ro.debuggable属性值,设置parseArgs.debugFlags的值
            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);
        }

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

            handleSystemServerProcess(parsedArgs);
        }

        return true;
    }
在startSystemServer()方法中,主要做了3件事,一是为SystemServer准备启动参数,从参数可以看到:SystemServer的进程Id和组Id都被指定为1000.SystemServer的执行类是com.android.server.SystemServer。二是调用Zygote类的forkSystemServer()来fork出SystemServer子进程。Zygote会检查SystemServer是否启动成功,如果不成功,Zygote进程会自动退出,重新启动一遍。三是fork出systemServer后,调用handleSystemServerProcess()来初始化SystemServer进程。如下:
    /**
     * Finish remaining work for the newly forked system server process.
     */
    private static void handleSystemServerProcess(
            ZygoteConnection.Arguments parsedArgs)
            throws ZygoteInit.MethodAndArgsCaller {

        closeServerSocket();//Close and clean up zygote sockets.

        // set umask to 0077 so new files and directories will default to owner-only permissions.
        Os.umask(S_IRWXG | S_IRWXO);

        if (parsedArgs.niceName != null) {
            Process.setArgV0(parsedArgs.niceName);//修改进程名
        }

        final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");
        if (systemServerClasspath != null) {
            performSystemServerDexOpt(systemServerClasspath);
        }

        if (parsedArgs.invokeWith != null) {//invokeWith通常为空
            String[] args = parsedArgs.remainingArgs;
            // If we have a non-null system server class path, we'll have to duplicate the
            // existing arguments and append the classpath to it. ART will handle the classpath
            // correctly when we exec a new process.
            if (systemServerClasspath != null) {
                String[] amendedArgs = new String[args.length + 2];
                amendedArgs[0] = "-cp";
                amendedArgs[1] = systemServerClasspath;
                System.arraycopy(parsedArgs.remainingArgs, 0, amendedArgs, 2, parsedArgs.remainingArgs.length);
            }

            WrapperInit.execApplication(parsedArgs.invokeWith,
                    parsedArgs.niceName, parsedArgs.targetSdkVersion,
                    null, args);
        } else {
            ClassLoader cl = null;
            if (systemServerClasspath != null) {
                cl = new PathClassLoader(systemServerClasspath, ClassLoader.getSystemClassLoader());
                Thread.currentThread().setContextClassLoader(cl);
            }

            /*
             * Pass the remaining arguments to SystemServer.
             */
            RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
        }

        /* should never reach here */
    }
handleSystemServerProcess()方法首先关闭了从zygote继承来的socket,接着将systemServer进程的umask设为0077(S_IRWXG|S_IRWXO),这样systemServer创建的文件的属性就是0700,只有systemServer进程可以访问。同时,进程名称修改为system_server。因为参数invokeWith通常为null,还是通过RuntimeInit的zygoteInit()方法来调用systemServer类的mian()方法。

<think>我们正在讨论Android中的SystemServer,根据用户提供的引用和问题,用户希望了解SystemServer的定义以及相关文章的解读。 从用户的问题中,我们可以提取以下关键点: 1. 用户引用了多篇关于SystemServer的文章,特别是提到了SystemServerAndroid的核心进程。 2. 用户要求解释SystemServer的定义,并解读指定的文章(关于窗口动画部分)。 根据用户之前的对话历史,我们已经总结了窗口动画的主要知识点,现在用户进一步询问SystemServer的定义。 结合引用[1]:SystemServer被描述为“Android世界的中央引擎”,它承载着所有核心系统服务的生命周期。它是由Zygote进程fork出来的,负责启动和管理数百个系统服务,如ActivityManagerService、WindowManagerService等。 引用[2]和[4]提到Systrace系列文章,其中对SystemServer进行了介绍,包括其中重要的线程(但Input和Binder单独讨论)。 引用[3]提到在应用启动时,SystemServer会给予资源倾斜。 因此,我们的回答应集中在: 1. 定义SystemServer及其在Android系统中的地位。 2. 解释SystemServer的启动过程(从Zygote fork)。 3. 简述SystemServer的主要职责(管理核心系统服务)。 4. 结合用户之前关注的窗口动画知识点,说明SystemServer在窗口动画中的作用(通过WindowManagerService管理窗口动画)。 另外,用户提供的链接文章(https://www.androidperformance.com/2019/06/29/Android-Systrace-SystemServer/)是关于Systrace中SystemServer的解读,其中包含窗口动画的详细描述(即之前对话中总结的知识点)。由于用户已经通过之前的总结了解了窗口动画部分,这里我们只需在解释SystemServer时关联到窗口动画的管理即可。 根据以上分析,我们组织回答如下: </think> ### SystemServer 定义与核心作用 **SystemServer** 是 Android 系统启动过程中由 Zygote 进程孵化的**核心服务进程**,作为 Android 系统的"中央引擎",负责初始化和管理所有关键系统服务[^1]。其核心特点包括: 1. **系统服务中枢** - 承载 `ActivityManagerService`(AMS)、`WindowManagerService`(WMS)等 60+ 核心服务 - 统一调度窗口动画、应用生命周期、电源管理等关键功能 - 通过 Binder IPC 机制与应用进程通信[^2] 2. **启动流程** ```mermaid graph30% Zygote --> fork进程 --> SystemServer启动 --> 加载JNI库 --> 启动Binder线程池 --> 初始化系统服务 ``` - 由 Zygote 首次 `fork()` 创建 - 依次启动引导服务(如 `PowerManagerService`)、核心服务(如 `WMS`)和其他服务 3. **窗口动画管理** - 通过 WMS **统一调度窗口动画**(应用启动/切换等) - 协调 `Android.Anim`(动画计算)和 `Android.Anim.if`(IPC通信)线程[^2] -Android P 后**将多任务动画逻辑移交 Launcher**,减轻负载[^3] 4. **资源调度特权** 启动应用时,SystemServer 会赋予其 **系统级资源倾斜**: - 提升 CPU/GPU 频率 - 优化 IO 调度优先级 - 确保动画渲染满足 $t_{\text{渲染}} + t_{\text{合成}} \leq 16\text{ms}$ (60FPS)[^3] --- ### 文章核心解读(窗口动画部分) 原文重点描述了 SystemServer 在窗口动画中的核心作用: 1. **动画线程分工** - `Android.Anim`:执行属性动画计算(如位移/透明度插值) - `Android.Anim.if`:处理跨进程动画指令(通过 Binder 与 App 通信) 2. **启动动画流程** ```mermaid sequenceDiagram Launcher->>+SystemServer: 请求启动应用 SystemServer->>WMS: 创建StartingWindow WMS->>Launcher: 显示启动动画 SystemServer->>App进程: 等待第一帧 App进程-->>SystemServer: 第一帧绘制完成 SystemServer->>WMS: 执行窗口切换动画 ``` 3. **性能优化演进** | 系统版本 | 动画架构 | 性能瓶颈 | |---|---|---| | Android P 前 | 集中处理于 SystemServer | 易造成主线程阻塞 | | Android P+ | 逻辑分散到 Launcher/App | 降低 SystemServer 负载 30%+[^3] | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值