Jimmy Chen

A Programmer

基于Android 9之应用冷启动过程分析(三)之进程创建过程

  上一篇最后分析到:因为我们现在做的假设是应用的冷启动,所以系统中是还没有对应的进程的,需要通过startSpecificActivityLocked方法来创建对应的进程。这一篇我们从这个方法开始

上面的过程很简单,在启动Activity所在进程前会再次检查进程是否已经启动,只有确认进程没有启动的情况下才会调用ActivityManagerService的startProcessLocked方法来启动进程。

最后会调用到startProcessLocked,之后会调用到几个同名的startProcessLocked方法,我们只看最后一个有实质内容的startProcessLocked方法好了。

上面的过程比较容易理解,主要是进行一些启动前的处理,紧接着分析startProcessLocked方法

上面具体大的过程中分两种情况:同步还是异步,最终不管同步创建还是异步创建,最后都会调用startProcess进行进程创建。下面我们简单分析一下整个的调用流程,在必要的地方我们再详细分析

上面整个的调用过程,最后会调用到startViaZygote,我们都知道进行最后肯定是需要通过zygote通过fork进程来创建的。

上面是对参数进行解析,然后构造出zygote服务端能够识别的方式,再将构造好的参数发送到zygote服务。最后调用openZygoteSocketIfNeeded就是为应用的abi找到合适的zygote服务,因为从Android 5.0之后,Android支持64位系统了,需要通过应用的abi寻找合适的zygote服务。下面分析openZygoteSocketIfNeeded方法

openZygoteSocketIfNeeded的内容比较简单,主要是为改应用寻找合适的zygote去执行。另外要提一下的是,上面还设置了API黑名单,目前猜测可能是有一些API已经不能被反射调用了,具体情况还需要后续做深入分析。这里我们先接着前一步进行分析,openZygoteSocketIfNeeded已经找到合适的zygote了,那么接着就是zygoteSendArgsAndGetResult调用了。

这上面都只是在准备一些数据,然后传送给zygote,但是没有看到和zygote是如何连接的。其实zygote连接的过程还是在openZygoteSocketIfNeeded方法里面完成的,这里的连接过程就是一个文件socket的创建过程一样,所以这里就不细说了,有兴趣的同学可以openZygoteSocketIfNeeded方法里面primaryZygoteState = ZygoteState.connect(mSocket);这行代码就行。

zygote处理

如果上面的内容没问题,那么现在已经连接到zygote去了。我们在分析zygote的时候有提到,zygote会在他的main方法中等待请求的到来,具体如下:

所以zygote的具体处理的事情都是在runSelectLoop里面完成。我们下面来看看,一些不相干代码就省略了。

上面可以看出,具体处理客户端请求的代码都运行在processOneCommand方法里面。我们来看看这个方法是怎么处理的

上面的代码处理过后就非常简单了,先对参数进行处理之后就是通过forkAndSpecialize创建进程,而forkAndSpecialize最后会通过JNI调用到底层去,通过Linux的fork方法产生子进程,然后父子进程在分别完成不同的任务。forkAndSpecialize的内容比较简单,这里就不分析了,我们接着看子进程具体处理那些事务

上面的方法进过一连串的调用、处理后,最后会调用到findStaticMain方法,findStaticMain才是最最最关键的,因为这里是具体执行之前传经来的方法的main方法的地方。

这最后是通过反射的方法调用到android.app.ActivityThread的main方法,之后都会在android.app.ActivityThread中执行,具体内容我们下一篇再进行分析,这一篇我们就到这里了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注