SystemServer分析过程

本文详细介绍了Android系统中SystemServer进程的启动过程,从zygote进程fork出SystemServer,到ZygoteInit类的startSystemServer方法,再到SystemServer.java的main函数。主要步骤包括设置uid/gid,forkSystemServer,handleSystemServerProcess,以及SystemServer的run方法,涉及服务初始化,Binder服务,Context创建,SystemServiceManager,以及服务启动等关键环节。
摘要由CSDN通过智能技术生成

SystemServer是由zygote进程fork出来的进程.

Step 1 如下代码,启动zygote进程以后,SystemServer进程由zygote start出来

    service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server  
        socket zygote stream 666  
        onrestart write /sys/android_power/request_state wake  
        onrestart write /sys/power/state on  
        onrestart restart media  
        onrestart restart netd  


Step 2. RuntimeInit.zygoteInit 中main调用StartSystemServer方法来启动SystemServer,接下来具体分析下startSystemServer方法.

       这个函数定义在frameworks/base/core/java/com/android/internal/os/ZygoteInit.java文件中:

    public static void main(String argv[]) {
        try {
            RuntimeInit.enableDdms();
            // 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
            gcAndFinalize();

            // 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值