Androidd zygote启动分析

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启动过程时序图如下:

在这里插入图片描述

4 COW机制

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值