Android framework系列3 -zygote

1、入口

system/core/rootdir/init.zygote64.rc
frameworks/base/cmds/app_process/app_main.cpp

2、流程图

https://note.youdao.com/s/MolK1dkA
在这里插入图片描述

3、源码分析

init进程会解析init.zygote64.rc文件,来启动zygote进程
在这里插入图片描述
zygote进程入口
在这里插入图片描述
首先会初始化AndroidRuntime
在这里插入图片描述
AppRuntime继承自AndroidRuntime
在这里插入图片描述
在这里插入图片描述
我们在启动的时候是传入了zygote 和start-system-server参数的,所以我们会启动zygote,这里看到对这个进程进行了命名。
在这里插入图片描述
这里调用了AndroidRuntime的start方法,用于调用ZygoteInit
接下来我们继续查看start方法
在这里插入图片描述
在这里插入图片描述

这里有创建虚拟机,可以看到虚拟机的参数都是在这里设置的,如果对系统虚拟机进行优化,我们可以在这里做相应的调整。
接下来,我们看到注册jni的方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里对Android框架的一些jni进行了注册,举个例子,我们找一下handler下MessageQueue的注册。
在这里插入图片描述
在这里插入图片描述
这里我们可以看到了MessageQueue的native方法注册。
tips:
1、对于jni动态&静态注册不了解的可以参考文章学习下,https://www.cnblogs.com/pengxurui/p/16526272.html
2、为什么注册jni放到zygote处进行?
1)时机,此时还在c/c++层面执行
2)fork,app进程都是通过zygote进程fork出来的,fork的进程是复制的,在zygote注册了,那么app进程也就注册了JNI(如果zygote进程死了,那么所有的app进程都会挂掉)

我们接着注册jni后继续分析代码,可以看到如下代码,这里通过JNI反射完成了c++层到java层代码的调用。
在这里插入图片描述
到此zygote c++层代码流程完成,接下来我们切入到zygote java代码层面分析。

入口main函数
在这里插入图片描述
还是按照流程图中的关键函数查看,preload
在这里插入图片描述
在这里插入图片描述
可以看到这里有加载资源等信息,这个方法是在卡机启动里面比较耗时的函数,如果对开机启动做优化,可以看下这块的逻辑。
接下来我们继续查看,可以看到了有创建zygoteserver和forkSystemServer,最终会循环保持进程活着。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值