Android 启动流程
init 进程是 用户控件鼻祖
zygote 进程是 java进程鼻祖
zygote进程的操作
1.native 层 做的操作
1.初始化java运行环境 虚拟机 (内存管理)
2.注册jni
3.运行 zygoteinit.main方法 进入java
2.java 层做的操作
1.预加载 文件
2.创建sockt (systemServer和zygote进程通讯)
3.zygote fork出 systemServer进程
4.循环等待 AMS发过来消息 fork进程
systemServer进程
1. createSystemContext 创建系统上下文 以及 ActivityThread 上下文
2.创建 SystemServiceManager 管理 服务的生命周期 有个startServicer方法 返回一个服务
3.startBootstrapService 引导服务 11之前 创建 AMS 之后创建 ATMS
4.startCoreservice 核心服务
5.startOtherService 其他服务 PMS WMS 都在这里 启动lanucher进程 (也就是lanucherApp)
app 启动流程 (参考地址 https://zhuanlan.zhihu.com/p/465105920)
1.创建进程
1.Android lanucher app 衔接上面操作
startOtherService 里面会向 systemService里面进行bindler通讯 ,systemservice判断 lanucher进程是否存在 第一次肯定
是不存在的 ,systemServer进程通过socket与zygote进程通讯 zygote fork出 lanucher进程 并交给AMS 管理
2.手机上面点击 icon 启动流程
手机整体相当于个app (lanucherapp)点击icon 启动app 相当于跳转一个app ,lanucher进程收到startActivity方法 通过binder通讯到 systemserver进程中
sysytemserver 进程会判断有没有当前activity的进程 有的话直接用 没有的话 通过socket通讯 通过zygote进程进行fork出 app进程
2.创建 app 主线程 进程创建好之后会生成 ActivityThread 主线程 也就是我们常说的ui线程,执行main方法 并生成applicationThread Loop Handler 对象,并执行loop.loop方法
这就是主线程不用 调用loop.loop的原因 在进程创建好了之后 就已经执行的了
3.创建 application activity ActivityThread 中的main方法会调用attach方法 进程间通讯 到sysytemServer进程中 让AMS 调用 attachAplication方法 在attachaplication方法中 AMS
会调用 bingApplication 以及scheduleLanucherActivity 方法 通知app进程中 handler对象 创建application以及activity 并执行相对应生命周期
4.ui布局以及绘制 创建activity的时候 会生成phoneWindow --》 decorview--》contentView contentView 就是 activity中 setContentView的layout布局