android L 之SystemServer

一、SystemServer 的源码位置

frameworks/base/services/java/com/android/server/SystemServer.java

二、SystemServer调用流程

/**
 * Startup class for the zygote process.          
 *
 * Pre-initializes some classes, and then waits for commands on a UNIX domain
 * socket. Based on these commands, forks off child processes that inherit
 * the initial state of the VM.
 *
 * Please see {@link ZygoteConnection.Arguments} for documentation on the                                                                                                                                                                                                
 * client protocol.
 *
 * @hide
 */    
public class ZygoteInit {
    private static final String TAG = "Zygote";

    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]);                                                                                                                                                                             
                }
            }

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

            if (startSystemServer) {
                startSystemServer(abiList, socketName);  //这里启动SystemServer    
            }

            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;
        }
    }  
public final class SystemServer {
    private void run() {
        // Initialize native services.
        System.loadLibrary("android_servers");
        nativeInit();
        // Check whether we failed to shut down last time we tried.
        // This call may not return.
        performPendingShutdown();

        // Initialize the system context.
        createSystemContext();

        // Create the system service manager.
        mSystemServiceManager = new SystemServiceManager(mSystemContext);
        LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);

        // Start services.
        try {
            startBootstrapServices();
            startCoreServices();
            startOtherServices();
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        }

        // For debug builds, log event loop stalls to dropbox for analysis.
        if (StrictMode.conditionallyEnableDebugLogging()) {
            Slog.i(TAG, "Enabled StrictMode for system server main thread.");
        }

        // During a controlled shutdown, ShutdownThread.java will reset
        // persist.sys.boot.sound.volume to the correct value (or keep it at 0,
        // if the user has disabled the sound from Settings). If the device
        // restarts due to a crash, the property will still be 0 which will
        // prevent the audio from playing which in turn will prevent the device
        // from drawing the user's attention to the fact the device just
        // crashed.
        //
        // The reason the property is written here and not by bootanimation is
        // that bootanimation runs as user graphics, which doesn't have
        // permission to write to persist.sys.*.
        SystemProperties.set("persist.sys.boot.sound.volume", "0");

        // Loop forever.
        Looper.loop();

    }
}

这边比较重要的三个函数
startBootstrapServices();
startCoreServices();
startOtherServices();

frameworks/base/cmds/app_process/app_main.cpp 这个是AppRuntime
int main(int argc, char* const argv[])
{
    ++i;  // Skip unused "parent dir" argument.
    while (i < argc) {
        const char* arg = argv[i++];
        if (strcmp(arg, "--zygote") == 0) {
            zygote = true;
            niceName = ZYGOTE_NICE_NAME;
        } else if (strcmp(arg, "--start-system-server") == 0) {
            startSystemServer = true;
        } else if (strcmp(arg, "--application") == 0) {    
            application = true;
        } else if (strncmp(arg, "--nice-name=", 12) == 0) {
            niceName.setTo(arg + 12);
        } else if (strncmp(arg, "--", 2) != 0) {
            className.setTo(arg);
            break;
        } else {
            --i;
            break;
        }
    }
    Vector<String8> args;
    if (!className.isEmpty()) {
        // We're not in zygote mode, the only argument we need to pass
        // to RuntimeInit is the application argument.     
        //
        // The Remainder of args get passed to startup class main(). Make
        // copies of them before we overwrite them with the process name.
        args.add(application ? String8("application") : String8("tool"));
        runtime.setClassNameAndArgs(className, argc - i, argv + i);
    } else {
        // We're in zygote mode.
        maybeCreateDalvikCache();

        if (startSystemServer) {
            args.add(String8("start-system-server"));
        }

        char prop[PROP_VALUE_MAX];
        if (property_get(ABI_LIST_PROPERTY, prop, NULL) == 0) {
            LOG_ALWAYS_FATAL("app_process: Unable to determine ABI list from property %s.",
                ABI_LIST_PROPERTY);
            return 11;
        }

        String8 abiFlag("--abi-list=");
        abiFlag.append(prop);
        args.add(abiFlag);

        // In zygote mode, pass all remaining arguments to the zygote
        // main() method.
        for (; i < argc; ++i) {
            args.add(String8(argv[i]));
        }
    }
    if (!niceName.isEmpty()) {
        runtime.setArgv0(niceName.string());
        set_process_name(niceName.string());
    }

    if (zygote) {
        runtime.start("com.android.internal.os.ZygoteInit", args);
    } else if (className) {
        runtime.start("com.android.internal.os.RuntimeInit", args);
    } else {
        fprintf(stderr, "Error: no class name or --zygote supplied.\n");
        app_usage();
        LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
        return 10;
    }

}

system/core/rootdir/init.rc 这个文件里边现在开头如下
import /init.environ.rc
import /init.usb.rc
import /init.${ro.hardware}.rc
import /init.${ro.zygote}.rc 这里是为了适配64和32位系统的
import /init.trace.rc

看一下这个目录下一共有如下 四个这类文件
init.zygote32_64.rc init.zygote32.rc init.zygote64_32.rc init.zygote64.rc

里边还是启动app_process的

service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
    setenv LD_PRELOAD /system/lib/stamina.so
    class main
    socket zygote stream 660 root system
    onrestart exec /system/bin/clmcheck -s init -n zygote
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart media
    onrestart restart netd

这里写图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值