system_server进程启动过程

本文详细解析了Android系统中system_server进程的启动流程,从zygote进程的main方法开始,通过startSystemServer方法创建system_server进程,再通过JNI方式forksystem_server进程,最后初始化并启动核心服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/base/core/java/com/android/internal/os/
 - ZygoteInit.java
 - Zygote.java
 - RuntimeInit.java
/base/core/jni/
 - com_android_internal_os_Zygote.cpp
/base/services/java/com/android/server/
 - SystemServer.java
/base/core/java/android/app/
 - ActivityThread.java
复制代码

phone进程是由system_server进程的startOtherServices发起创建的,有必要了解system_server进程启动过程。

1 启动zygote进程

zygote进程创建后,会进入ZygoteInit的main方法,main会去调用startSystemServer方法,开始创建system_server进程。

/base/core/java/com/android/internal/os/ZygoteInit.java
复制代码
public static void main(String argv[]) {
    try{
        if (startSystemServer) {
            startSystemServer(abiList, socketName);
        }
    } catch (MethodAndArgsCaller caller) {
    //RuntimeInit的invokeStaticMain抛出MethodAndArgsCaller被捕获,
    //反射进入SystemServer的main方法
            caller.run();
    } 
}

 private static boolean startSystemServer(String abiList, String socketName)
            throws MethodAndArgsCaller, RuntimeException {
    /* 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,1032,3001,3002,3003,3006,3007",
            "--capabilities=" + capabilities + "," + capabilities,
            "--nice-name=system_server",
            "--runtime-args",
            "com.android.server.SystemServer",
        };
        ...
        /* Request to fork the system server process */
        //创建systemserver进程
            pid = Zygote.forkSystemServer(
                    parsedArgs.uid, parsedArgs.gid,
                    parsedArgs.gids,
                    parsedArgs.debugFlags,
                    null,
                    parsedArgs.permittedCapabilities,
                    parsedArgs.effectiveCapabilities);
        ...
        //进入systemserver进程,继续处理system_server中的任务
        handleSystemServerProcess(parsedArgs);
}
复制代码

2 native方式forksystem_server进程

参数 "--nice-name=system_server"中可以看出,startSystemServer将创建system_server进程,而且是通过JNI方式调用native方法nativeForkSystemServer。

base/core/java/com/android/internal/os/Zygote.java
复制代码
public static int forkSystemServer(int uid, int gid, int[] gids, int debugFlags,
            int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {
        VM_HOOKS.preFork();
        int pid = nativeForkSystemServer(
复制代码

nativeForkSystemServer的实现在/base/core/jni/com_android_internal_os_Zygote.cpp,最终会去调用fork方法,创建system_server进程。

/base/core/jni/com_android_internal_os_Zygote.cpp
复制代码
static jint com_android_internal_os_Zygote_nativeForkSystemServer(
        JNIEnv* env, jclass, uid_t uid, gid_t gid, jintArray gids,
        jint debug_flags, jobjectArray rlimits, jlong permittedCapabilities,
        jlong effectiveCapabilities) {
  pid_t pid = ForkAndSpecializeCommon(env, uid, gid, gids,
                                      debug_flags, rlimits,
                                      permittedCapabilities, effectiveCapabilities,
                                      MOUNT_EXTERNAL_DEFAULT, NULL, NULL, true, NULL,
                                      NULL, NULL);
}
static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray javaGids,
                                     jint debug_flags, jobjectArray javaRlimits,
                                     jlong permittedCapabilities, jlong effectiveCapabilities,
                                     jint mount_external,
                                     jstring java_se_info, jstring java_se_name,
                                     bool is_system_server, jintArray fdsToClose,
                                     jstring instructionSet, jstring dataDir) {
  SetSigChldHandler();

  pid_t pid = fork();//fork子进程
  }
复制代码

3 进程创建完成,继续初始化进程参数

system_server进程创建完之后,继续进入handleSystemServerProcess。

/base/core/java/com/android/internal/os/ZygoteInit.java
复制代码
private static void handleSystemServerProcess(
            ZygoteConnection.Arguments parsedArgs)
            throws ZygoteInit.MethodAndArgsCaller {
            /*
             * Pass the remaining arguments to SystemServer.
             */
            RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);进入system_server进程
    }
复制代码

在ZygoteInit的startSystemServer方法中传递的参数中有"com.android.server.SystemServer",继续传给zygoteInit,最终作为invokeStaticMain反射调用的参数。

4 抛出MethodAndArgsCaller

./base/core/java/com/android/internal/os/RuntimeInit.java
复制代码
public static final void zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
            throws ZygoteInit.MethodAndArgsCaller {
            applicationInit(targetSdkVersion, argv, classLoader);
            }
private static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
            throws ZygoteInit.MethodAndArgsCaller {
            // Remaining arguments are passed to the start class's static main
        //args.startClass为com.android.server.SystemServer
        invokeStaticMain(args.startClass, args.startArgs, classLoader);
}
private static void invokeStaticMain(String className, String[] argv, ClassLoader classLoader)
            throws ZygoteInit.MethodAndArgsCaller {
        try {
            m = cl.getMethod("main", new Class[] { String[].class });
        }
        ...
        throw new ZygoteInit.MethodAndArgsCaller(m, argv);
}
复制代码

5 ZygoteInit捕获MethodAndArgsCaller,反射进入SystemServer的main

在RuntimeInit的invokeStaticMain抛出MethodAndArgsCaller,并被ZygoteInit的main方法捕获,进入ZygoteInit.MethodAndArgsCaller的run方法

/base/core/java/com/android/internal/os/ZygoteInit.java
复制代码
public static void main(String argv[]) {
    try{
        if (startSystemServer) {
            startSystemServer(abiList, socketName);
        }
    } catch (MethodAndArgsCaller caller) {
            caller.run();
    } 
}
public static class MethodAndArgsCaller extends Exception
            implements Runnable {
            public void run() {
                mMethod.invoke(null, new Object[] { mArgs });
            }
复制代码

6 system_server启动

开始进入SystemServer的main方法

./base/services/java/com/android/server/SystemServer.java
复制代码
public static void main(String[] args) {
        new SystemServer().run();
    }
    
private void run() {
            // Initialize the system context.
            createSystemContext();
            ...
            startBootstrapServices();
            startCoreServices();
            startOtherServices();//发起创建phone进程
}

    private void createSystemContext() {
        ActivityThread activityThread = ActivityThread.systemMain();
        mSystemContext = activityThread.getSystemContext();
        mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar);
    }
复制代码

至此system_server进程就可以进行初始化,创建application对象,并启动一些核心服务,包括发起fork phone进程Android Phone进程启动过程

7 创建system_server进程的application对象

frameworks/base/core/java/android/app/ActivityThread.java
复制代码
    public static ActivityThread systemMain() {
        // The system process on low-memory devices do not get to use hardware
        // accelerated drawing, since this can add too much overhead to the
        // process.
        ActivityThread thread = new ActivityThread();
        thread.attach(true);
        return thread;
    }

private void attach(boolean system) {
    if (!system) {
    ...
    }else {
            // Don't set application object here -- if the system crashes,
            // we can't display an alert, we just want to die die die.
            android.ddm.DdmHandleAppName.setAppName("system_process",
                    UserHandle.myUserId());
            try {
                mInstrumentation = new Instrumentation();
                ContextImpl context = ContextImpl.createAppContext(
                        this, getSystemContext().mPackageInfo);
                mInitialApplication = context.mPackageInfo.makeApplication(true, null);
                mInitialApplication.onCreate();
            } catch (Exception e) {
                throw new RuntimeException(
                        "Unable to instantiate Application():" + e.toString(), e);
            }
        }
}
复制代码

zygote进程启动过程

转载于:https://juejin.im/post/5c7cdd806fb9a049dc02fa6b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值