欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Androidd zygote启动分析

程序员文章站 2024-03-15 14:32:29
...

1 Zygote简介

1 Zygote是由init进程通过解析init.zygote32.rc或init.zygote64.rc文件 fork生成的,zygote所对应的可执行程序app_process

Zygote.rc文件如下
// 将进程名app_process64改为zygote, 添加启动system-server参数
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
    class main
    priority -20
    user root
    group root readproc
    // 通过init进程创建socket
    socket zygote stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart audioserver
    onrestart restart cameraserver
    onrestart restart media
    onrestart restart netd
    onrestart restart wificond
    writepid /dev/cpuset/foreground/tasks

2 Zygote启动过程分析

1 创建AppRuntime,并调用start函数
2 startVm 启动虚拟机
    JNI_CreateJavaVM
3 startReg(env) JNI函数注册
4 registerServerSocket 为zygote进程注册监听socket
5 preload
    // 加载"/system/etc/preloaded-classes"下的class
    preloadClasses();
    // private static final String PRELOADED_CLASSES = "/system/etc/preloaded-classes";
        android.R$styleable
        android.accessibilityservice.AccessibilityServiceInfo$1
        android.accounts.Account
        android.accounts.Account$1
        android.accounts.AccountManager
        
    // 加载资源文件
    preloadResources();
    
    // 加载openGL
    preloadOpenGL();
    
    // 加载公共libraries
    preloadSharedLibraries();
        System.loadLibrary("android");
        System.loadLibrary("compiler_rt");
        System.loadLibrary("jnigraphics");
        
    // 加载字体多国语言资源
    preloadTextResources();
    
6 startSystemServer
    // fork SystermServer进程
    Zygote.forkSystemServer
    // 关闭socket
    zygoteServer.closeServerSocket();
    // 通过 throw new MethodAndArgsCaller 最终调用SystemServer的main函数在run函数中的Looper.loop();中死循环
    handleSystemServerProcess
    
7 zygoteServer.runSelectLoop(abiList); //等待ActivityManagerService向Zygote发起启动应用程序的消息
    boolean done = peers.get(i).runOnce(this);
        // fork app进程
        Zygote.forkAndSpecialize
        // 通过 throw new Zygote.MethodAndArgsCaller(m, argv);异常,最终调用ActivityThread的main函数
        handleChildProc

3 Zygote启动过程时序图如下:

Androidd zygote启动分析

4 COW机制

父进程和子进程共享同一个拷贝。只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。也就是说,资源的复制只有在需要写入的时候才进行,在此之前,只是以只读方式共享。这种技术使地址空间上的页的拷贝被推迟到实际发生写入的时候。Zygote通过fork启动APP进程(采用用了COW机制)避免启动APP加载资源速度慢,节省内存,当APP进程被kill时,也不会影响父进程

相关标签: framework