AMS的启动过程

273 阅读2分钟

Zygote进程的启动过程

init.rc启动Zygote.main()。 image.png

SystemServer进程的启动过程

简化的SystemServer的启动流程:

Zogote.main()  
    new ZygoteServer()  
    forkSystemServer()  
        Zygote.forkSystemServer()  
            nativeForkSystemServer()  
        handleSystemServerProcess()  
            ZygoteInit.zygoteInit()  
                ZygoteInit.nativeZygoteInit(); // 启动binder线程池
                RuntimeInit.applicationInit()  
                    findStaticMain() // 执行SystemServer.main()
    zygoteServer.runSelectLoop()

ZygoteInit.java

main() {
    preload();  // class, resource等等 
    zygoteServer = new ZygoteServer(isPrimaryZygote); // 创建socket
    if (startSystemServer) {
        Runnable r = forkSystemServer(); // 得到线程,在此线程中反射执行SystemServer.main()。
        r.run(); // 真正执行SystemServer.main()
    }
    zygoteServer.runSelectLoop(); // 无限循环,等待客户端socket的连接,然后通过ZygoteConnection.processOneCommand()来处理
}

private static Runnable forkSystemServer(String abiList, String socketName,
        ZygoteServer zygoteServer) {
    ...
    /* SystemServer的启动参数 */
    /* 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,3011",
            "--capabilities=" + capabilities + "," + capabilities,
            "--nice-name=system_server", // SystemServer的进程名是system_server
            "--runtime-args",
            "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
            "com.android.server.SystemServer", // 启动的类名,后面根据这个反射执行main()
	};
    ZygoteArguments parsedArgs = null;
    int pid;
    parsedArgs = new ZygoteArguments(args);
    /* Request to fork the system server process */
    pid = Zygote.forkSystemServer(
            parsedArgs.mUid, parsedArgs.mGid,
            parsedArgs.mGids,
            parsedArgs.mRuntimeFlags,
            null,
            parsedArgs.mPermittedCapabilities,
            parsedArgs.mEffectiveCapabilities);

    /* For child process */
    if (pid == 0) { // fork进程成功
        if (hasSecondZygote(abiList)) {
            waitForSecondaryZygote(socketName);
        }
        zygoteServer.closeServerSocket();
        return handleSystemServerProcess(parsedArgs);	// SystemServer进程启动后的准备工作
    }
    return null;
}

private static Runnable handleSystemServerProcess(ZygoteArguments parsedArgs) {
    if (parsedArgs.mInvokeWith != null) {
        String[] args = parsedArgs.mRemainingArgs;
        WrapperInit.execApplication(parsedArgs.mInvokeWith,
                parsedArgs.mNiceName, parsedArgs.mTargetSdkVersion,
                VMRuntime.getCurrentInstructionSet(), null, args);
        throw new IllegalStateException("Unexpected return from WrapperInit.execApplication");
    } else {
        return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion,
                parsedArgs.mDisabledCompatChanges,
                parsedArgs.mRemainingArgs, cl);
    }
}

public static final Runnable zygoteInit(int targetSdkVersion, long[] disabledCompatChanges,
        String[] argv, ClassLoader classLoader) {
    RuntimeInit.commonInit(); // 初始化运行环境
    ZygoteInit.nativeZygoteInit(); // 启动Binder线程池,用于和其他进程通信
    return RuntimeInit.applicationInit(targetSdkVersion, disabledCompatChanges, argv,
            classLoader); // 反射执行SystemServer.main()
}

RuntimeInit.java

protected static Runnable applicationInit(...) {
    return findStaticMain(args.startClass, args.startArgs, classLoader);
}

protected static Runnable findStaticMain(String className, String[] argv,
        ClassLoader classLoader) {
    Class<?> cl;
    cl = Class.forName(className, true, classLoader);
    Method m;
    m = cl.getMethod("main", new Class[] { String[].class });
    return new MethodAndArgsCaller(m, argv); // 以线程方式封装执行main(),这个线程将是SystemServer进程的主线程
}

static class MethodAndArgsCaller implements Runnable { // 内部类
    public MethodAndArgsCaller(Method method, String[] args) {...}
    public void run() {
        mMethod.invoke(null, new Object[] { mArgs });
    }
}

AMS的启动过程

SystemServer.java

public static void main(String[] args) {
    new SystemServer().run();
}

private void run() {
    Looper.prepareMainLooper();	// Looper
    System.loadLibrary("android_servers");
    performPendingShutdown();
    createSystemContext(); // 创建Context
	
    // Create the system service manager.
    mSystemServiceManager = new SystemServiceManager(mSystemContext); // 创建SystemServiceManager,用来创建后面的服务
    mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
    LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);

    startBootstrapServices(); // 启动Installer、AMS、PowerMS、PackageMS...,不熟悉的没列出
    startCoreServices(); // BatteryService
    startOtherServices();
}

private void createSystemContext() {
    ActivityThread activityThread = ActivityThread.systemMain();
    mSystemContext = activityThread.getSystemContext();
    mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
    final Context systemUiContext = activityThread.getSystemUiContext();
    systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}

private void startBootstrapServices() {
    Installer installer = mSystemServiceManager.startService(Installer.class);

    // Activity manager runs the show.
    traceBeginAndSlog("StartActivityManager");
    mActivityManagerService = mSystemServiceManager.startService(
            ActivityManagerService.Lifecycle.class).getService();
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
    mActivityManagerService.setInstaller(installer);
    traceEnd();
}

1、Zygote fork时,不会fork binder吗?socket是被fork的,在子进程中关闭的。 2、通知Zygote启动,为什么用socket而不是binder。