Android启动流程

前言

本文是本人通过学习各位前辈的博客,结合自己对Android的理解所作。如有错误,还请批评指正。

1.总的介绍

在这里插入图片描述

几个注意点:

①idle是内核空间的鼻祖,init是用户空间的鼻祖。Zygote是Java进程的鼻祖
②Zygote既有native层,也有java层。
③JNI就是负责native层和java层的通信的,起到一个桥梁作用。

2.分别介绍各个角色

①init进程

init进程是Linux中的一个核心进程,在Linux中,所有的进程都是由init进程fork出来的,比如Zygote进程。
它完成的主要功能有:
①创建系统文件
②启动Zygote

②Zygote进程

在Android中,所有的进程(除了第一个Zygote进程)都是由第一个Zygote进程fork出来的。它完成的主要作用有

  • 在native层
    ①初始化Android运行环境,比如虚拟机
    ②注册JNI
    ③执行ZygoteInit.main方法,进入Java层
  • 在Java层
    ①进行一些预加载的工作
    ②fork各种进程,如SystemServer进程
    ③创建socket,进入循环等待AMS的通知
③SystemServer

SystemServer也是由Zygote进程fork出来的一个进程。与Zygote一起构成了Framework层的两大非常重要的进程。
ActivityManagerService、PackageManagerService、WindowManagerService等都是在SystemService里面开启的。
那么SystemServer是如何被开启的呢?

在Zygote进程开启的时候,会调用ZygoteInit.main方法进行初始化。如图
在这里插入图片描述
进入这个方法,会发现它调用了forkSystemServer方法。如图
在这里插入图片描述
这样就开启了SystemServer

③AMS

AMS全称为“ActivityManagerService”,是一种服务即Service。是由Zygote进程fork出来的。负责系统中所有Activity的生命周期。在SystemServer进程开启的时候进行初始化。

如图,在SystemServer类的startBootstrapServices方法中,有
在这里插入图片描述
从而在SystemServer中开启了这些服务
还有一个需要注意的点为:
App与AMS通过Binder进行IPC通信,AMS与zygote通过Socket进行IPC通信。

④Launcher进程

我对Launcher进程的理解是,它也是一个普通的App进程,只是它是一个系统级别的进程,可以管理手机上的App。比如它实现了点击,长按等回调接口,能实现开启一个App的功能。本质上还是调用了Activity.startActivity方法,并且因为设置了
在这里插入图片描述
所以这个Activity会添加到一个新的Task栈中。

所以在Launcher中开启一个App,其实和在Activity中调用startActivity开启一样,而且最终都会调用Activity.startActivityForResult()

⑤Instrumentation

每个Activity都持有Instrumentation对象的一个引用,但是整个进程只会存在一个Instrumentation对象。它意为“仪器”,完成对Application和Activity的初始化,以及生命周期的管理,是一个大管家。

⑥ActivityThread

它就是我们常说的UI线程,它的main方法是App的入口,之前说App和AMS是通过Binder进行通信的,那么Activity就是负责与AMS的外交工作的。它与上面的Instrumentation的关系是:
ActivityThread主外,Instrumentation主内,ActivityThread对初始化以及生命周期的调用,最终都会调用到Instrumentation的相关方法。
另外,App开启消息循环,以及Application的创建,都是在ActivityThread类的main方法
在这里插入图片描述

3.总结,启动的具体流程

①BootLoader启动kernel层的idle进程,然后启动init进程,进入native层。
②init进程启动zygote进程,进入java层
③zygote进程在native层完成xxx的工作,在Java层完成xxx的工作。
④zygote进程fork出SystemServer进程,SystemServer进程启动AMS,PMS,WMS等
⑤此时Android系统已经就绪,点击一个App,Launcher进程的ActivityManagerProxy会发送startActivity请求给AMS(通过Binder)
⑥AMS通过socket向Zygote发送创建进程的请求,Zygote就会fork出一个App进程
⑦App进程的ActivityManagerProxy向AMS发送attachApplication的请求(通过binder),AMS调用ApplicationThreadProxy的realStartActivityLocked方法。
⑧ApplicationThreadProxy向ApplicationThread发送scheduleLaunchActivity(通过Binder)
⑨ApplicationThread向ActivityThread发送消息LAUNCH_ACTIVITY
⑩ActivityThread调用handlerLaunchActivity方法,通过反射来创建目标Activity,并回调Activity.onCreate方法,从而完成启动

两部分的图:

在这里插入图片描述
在这里插入图片描述

补充:通信的具体角色

客户端向服务端(AMS)进行通信。

需要借助ActivityManagerProxy类,ActivityManagerProxy和AMS都需要实现IActivityManager接口。
客户端通过调用ActivityManagerProxy类,通过transact方法,调用到AMS的相应方法(Binder机制)

服务端(AMS)向客户端进行通信

服务端调用ApplicationThreadProxy类,再调用到ApplicationThread类,从而完成通信。ApplicationThreadProxy和ApplicationThread都实现了IApplicationThread接口

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值