android进程启动流程

来源:互联网 发布:mac air 能玩什么游戏 编辑:程序博客网 时间:2024/06/05 19:59

一、整个android系统的进程启动流程如下:
    init进程 –> Zygote进程(有些系统会有Zygote64进程,64bit) –> SystemServer进程 –>各种应用进程


init进程:linux的根进程,android系统是基于linux系统的,因此可以算作是整个android操作系统的第一个进程;在Linux中所有的进程都是由init进程直接或间接fork出来的。


Zygote进程:android系统的根进程,而当init进程创建之后,会fork出一个Zygote进程,这个进程是所有Java进程的父进程;  主要作用:Zygote进程fork出SystemServer进程和各种应用进程。


SystemService进程:Zygote进程fork出来
1)主要作用是启动各种系统服务,比如ActivityManagerService(AMS),PackageManagerService(PMS),WindowManagerService(WMS)服务等;
2)而当我们的应用需要使用各种系统服务的时候其实也是通过与SystemServer进程通讯获取各种服务对象的句柄的进而执行相应的操作的。
3)进程种的各种服务与其他应用交互是通过Binder机制(IPC)通讯的,与Zygote之间交互是通过socket通讯
4)创建的系统服务过程中主要通过SystemServiceManager对象来管理,SystemServer在执行过程中首先会初始化一些系统变量,加载类库,创建Context对象,创建SystemServiceManager对象等之后才开始启动系统服务;


各种应用进程:Zygote进程fork出来





二、Zygote进程启动流程:
init进程在启动Zygote进程时一般都会调用ZygoteInit类的main方法,Zygote进程mian方法主要执行逻辑:


    初始化DDMS;

    注册Zygote进程的socket通讯;

    初始化Zygote中的各种类,资源文件,OpenGL,类库,Text资源等等;

    初始化完成之后fork出SystemServer进程;

    fork出SystemServer进程之后,关闭socket连接;





三、点击桌面图标启动新进程流程:
当我们点击桌面的APP图标时,Launcher进程会采用Binder的方式向AMS发出startActivity请求
AMS在接收到请求之后,就会通过Socket向Zygote进程发送创建进程的请求
Zygote进程会fork出新的子进程(APP进程)
之后APP进程会再向AMS发起一次请求,AMS收到之后经过一系列的准备工作再回传请求。
APP进程收到AMS返回的请求后,会利用Handler向主线程发送LAUNCH_ACTIVITY消息
主线程在收到消息之后,就创建目标Activity,并回调onCreate()/onStart()/onResume()等方法,UI渲染结束后便可以看到App主界面