zygote进程启动过程

\system\core\rootdir\
  - init.zygote32.rc
\frameworks\base\cmds\app_process\
  - app_main.cpp
\frameworks\base\core\jni\
  - AndroidRuntime.cpp
  - com_android_internal_os_Zygote.cpp
\frameworks\base\core\java\com\android\internal\os\
  - ZygoteInit.java
  - ZygoteConnection.java
  - Zygote.java
复制代码

system_server是zygote进程创建的第一个进程,zygote进程又是如何启动?Android系统创建的第一个Java进程为zygote,zygote是所有Java进程的父进程,包括system_server、phone等进程。zygote进程启动过程如下:

1 init进程启动app_process程序,启动zygote进程

init进程通过解析init.zygote32.rc文件,启动/system/bin/app_process可执行程序.

\system\core\rootdir\init.zygote32.rc
复制代码
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    class main
    socket zygote stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart media
    onrestart restart netd
复制代码

app_process的源码在app_main.cpp中,进入main.

\frameworks\base\cmds\app_process\app_main.cpp
复制代码
int main(int argc, char* const argv[])
{
    //参数为-Xzygote /system/bin --zygote --start-system-server
    AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
    ...
     if (strcmp(arg, "--zygote") == 0) {
            zygote = true;
            niceName = ZYGOTE_NICE_NAME;
    }
    ...
    if (zygote) {
        runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
    } 
}
复制代码

AppRuntime为AndroidRuntime的子类,

class AppRuntime : public AndroidRuntime
复制代码

2 开启虚拟机,并进入ZygoteInit.main方法

\frameworks\base\core\jni\AndroidRuntime.cpp
void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
{
    /* start the virtual machine */
    JniInvocation jni_invocation;
    jni_invocation.Init(NULL);
    JNIEnv* env;
    if (startVm(&mJavaVM, &env, zygote) != 0) {//创建虚拟机
        return;
    }
    ...
        /*
     * Start VM.  This thread becomes the main thread of the VM, and will
     * not return until the VM exits.
     */
    char* slashClassName = toSlashClassName(className);
    jclass startClass = env->FindClass(slashClassName);
    if (startClass == NULL) {
        ALOGE("JavaVM unable to locate class '%s'\n", slashClassName);
        /* keep going */
    } else {
        jmethodID startMeth = env->GetStaticMethodID(startClass, "main",
            "([Ljava/lang/String;)V");
        if (startMeth == NULL) {
            ALOGE("JavaVM unable to find main() in '%s'\n", className);
            /* keep going */
        } else {
            //进入ZygoteInit.main
            env->CallStaticVoidMethod(startClass, startMeth, strArray);
            if (env->ExceptionCheck())
                threadExitUncaughtException(env);
        }
    }
}
复制代码

3 创建zygote服务端,启动system_server进程,并循环接收进程创建请求

\frameworks\base\core\java\com\android\internal\os\ZygoteInit.java
复制代码
public static void main(String argv[]) {
    String socketName = "zygote";
    ...
    registerZygoteSocket(socketName);//创建名为zygote的LocalServerSocket
    ...
    if (startSystemServer) {
        startSystemServer(abiList, socketName);//启动system_server进程
    }
    ...
    Log.i(TAG, "Accepting command socket connections");
    runSelectLoop(abiList);//循环处理进程创建请求,等待接收进程参数等数据,创建非system_server进程,如phone进程
}
复制代码

runSelectLoop会调用runOnce,解析进程参数,发起创建子进程。

\frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java
复制代码
pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,
                    parsedArgs.debugFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo,
                    parsedArgs.niceName, fdsToClose, parsedArgs.instructionSet,
                    parsedArgs.appDataDir);
复制代码

4 native fork非system_server进程。

\frameworks/base/core/java/com/android/internal/os/Zygote.java
复制代码
public static int forkAndSpecialize(int uid, int gid, int[] gids, int debugFlags,
          int[][] rlimits, int mountExternal, String seInfo, String niceName, int[] fdsToClose,
          String instructionSet, String appDataDir) {
        VM_HOOKS.preFork();
        int pid = nativeForkAndSpecialize(
                  uid, gid, gids, debugFlags, rlimits, mountExternal, seInfo, niceName, fdsToClose,
                  instructionSet, appDataDir);
}
复制代码

5 jni fork非system_server进程接口。

\frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
复制代码
static jint com_android_internal_os_Zygote_nativeForkAndSpecialize(
        JNIEnv* env, jclass, jint uid, jint gid, jintArray gids,
        jint debug_flags, jobjectArray rlimits,
        jint mount_external, jstring se_info, jstring se_name,
        jintArray fdsToClose, jstring instructionSet, jstring appDataDir) {
    return ForkAndSpecializeCommon(env, uid, gid, gids, debug_flags,
            rlimits, capabilities, capabilities, mount_external, se_info,
            se_name, false, fdsToClose, instructionSet, appDataDir);
}
复制代码

6 fork子进程,包括system_server进程、非system_server进程。

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) {
                                       pid_t pid = fork();//创建子进程
                                     }
复制代码

zygote进程启动完毕。

ActivityManagerService启动过程

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值