Android应用程序启动逻辑-中间层


Android应用程序启动逻辑-中间层

写在文章开头的话

所有应用程序的父进程都是zygote,对于64位系统是zygote/zygote_secondary。所有应用程序进程都是通过zygote/zygote_secondary进程fork而来。

从接口调用来看,所有的startActivity/startService调用,先会到AMS里面,最后都会调用到一个中间层。这个中间层完成与zygote进程通讯,提供统一接口给其它模块调用。

本文主要分析这个中间层的实现逻辑。这个中间层涉及到的主要文件有两个:

frameworks/base/core/java/android/os/Process.java

frameworks/base/core/java/android/os/ZygoteProcess.java

ZygoteProcess

ZygoteProcess和zygote进程通讯是通过socket。

ZygoteState

ZygoteProcess的内部类ZygoteState,负责和Zygote进程进行通讯。ZygoteState负责建立socket连接,保存socket对象、inputStream和writer。

Android应用程序启动逻辑-中间层

ZygoteState的核心方法connect():

Android应用程序启动逻辑-中间层

与zygote通讯

通过ZygoteState完成基础工作之后,就可以与zygote进程进行通讯。主要是写入启动参数,然后读取结果。核心方法zygoteSendArgsAndGetResult()。

Android应用程序启动逻辑-中间层

调用流程

ZygoteProcess内部的调用流程,start()方法是public,供Process类调用,如下:

Android应用程序启动逻辑-中间层

启动参数说明

应用程序的启动参数有很多,下面是官方注释:

Android应用程序启动逻辑-中间层

Process

Process是一个工具类,用来管理系统的进程。

Process内部有一个ZygoteProcess变量,用来完成应用程序启动相关的功能。

Process类有上千行代码,和本篇主题相关的并不多,Process类的其它功能会在后面的文章展开。

初始化

静态类变量zygoteProcess,在声明的时候完成初始化。

Android应用程序启动逻辑-中间层

对外接口

Process对外提供静态的start()方法,供外部调用。这个方法很简单,没有实际逻辑,只是一层封装,内部会直接调用ZygoteProcess的start()方法:

Android应用程序启动逻辑-中间层

应用启动逻辑中间层调用关系

Android应用程序启动逻辑-中间层

Process.start()方法的调用在AMS里面,整个Android系统,只此一处调用。所以,所有应用程序的创建都是通过Adroid Framework的AMS来完成的。

写在文章结尾的话

至此,这个中间层的逻辑就分析完了。从这个Android系统来看,这个中间层供AMS调用,代码运行在system_server进程,通过socket与zygote进程进行IPC通讯。下面一篇文章,将分析zygote进程接收system_server通过socket通讯发来的应用程序启动参数的处理逻辑。


分享到:


相關文章: