写在文章开头的话
所有应用程序的父进程都是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。
ZygoteState的核心方法connect():
与zygote通讯
通过ZygoteState完成基础工作之后,就可以与zygote进程进行通讯。主要是写入启动参数,然后读取结果。核心方法zygoteSendArgsAndGetResult()。
调用流程
ZygoteProcess内部的调用流程,start()方法是public,供Process类调用,如下:
启动参数说明
应用程序的启动参数有很多,下面是官方注释:
Process
Process是一个工具类,用来管理系统的进程。
Process内部有一个ZygoteProcess变量,用来完成应用程序启动相关的功能。
Process类有上千行代码,和本篇主题相关的并不多,Process类的其它功能会在后面的文章展开。
初始化
静态类变量zygoteProcess,在声明的时候完成初始化。
对外接口
Process对外提供静态的start()方法,供外部调用。这个方法很简单,没有实际逻辑,只是一层封装,内部会直接调用ZygoteProcess的start()方法:
应用启动逻辑中间层调用关系
Process.start()方法的调用在AMS里面,整个Android系统,只此一处调用。所以,所有应用程序的创建都是通过Adroid Framework的AMS来完成的。
写在文章结尾的话
至此,这个中间层的逻辑就分析完了。从这个Android系统来看,这个中间层供AMS调用,代码运行在system_server进程,通过socket与zygote进程进行IPC通讯。下面一篇文章,将分析zygote进程接收system_server通过socket通讯发来的应用程序启动参数的处理逻辑。
閱讀更多 做事情的幻想家 的文章