Android进程管理篇(一)-应用进程启动过程

一、基本概念

Android本身是基于Linux系统的,在Linux系统中,用进程描述一个运行的应用程序,对应于一个名叫task_struct的结构体,由系统统一调度和管理。另外,进程是系统资源分配的最小单位,各个进程用户空间虚拟地址相互隔离,如果要互相访问需要通过进程间通信,常见的包括Socket、Binder等。进程内部每一个执行路径是一个线程,线程共享进程中分配到的系统资源。因此在Android系统中,要启动一个应用程序,首先需要启动对应的进程,但是这个过程是framework层完成的,应用层完全感知不到。

要想启动一个应用程序,首先要保证这个应用程序所需要的应用程序进程已经被启动。ActivityManagerService在启动应用程序时会检查这个应用程序需要的应用程序进程是否存在,不存在就会请求Zygote进程将需要的应用程序进程启动。

二、应用进程启动过程

这里就简单讲讲流程了,不贴源码,只梳理一些核心环节,代码细节可以根据时序图去跟一下。

流程图如下:

2828107-044c6801fdba0fcd.png
from liuwangshu

这个过程简单讲就两步:AMS向Zygote请求创建进程,Zygote孵化进程。
流程简单描述:
首先是调用AMS startProcessLocked方法开始,由Process包装好进程实例,准备好参数,包括uid、gid等等,然后通过socket与zygote通信,在zygote启动篇我们知道,zygote初始化主要做了如下几件事情:注册socket、预加载系统类和资源(包括启动虚拟机)、启动SystemServer、循环等待客户端创建进程请求。对,这个socket通信就是针对这个循环,对应的方法是:runSelectLoop。最终通过Process包装的进程信息来fork出应用进程,fork就是zygote 复制自己的一份内存拷贝给对应进程,内部包括系统预加载的资源和类也包括虚拟机环境,同时fork也为进程设置了pid。另外,在应用程序进程创建过程中会启动Binder线程池,这部分之前在Binder篇有介绍。最后通过反射执行ActivityThread的main方法,开始主线程的大loop循环,开启组件消息处理。

当然这只是一个大概的流程,更多的细节的学习可以去分析下源码。

猜你喜欢

转载自blog.csdn.net/weixin_33918357/article/details/87311062