想要更好的进行App的启动优化,就要充分了解相关的启动知识,只有这样,才可以帮助我们更好的进行启动优化,本文谈一下从点击桌面图标到App启动,背后都发生了什么?系统又做了哪些工作?
首先需要知道App启动牵涉几个进程,它们之间如何通信?
init:init是Linux的初始进程,zygote是其后的第一个进程。
Zygote:首先,来了解一下进程Zygote , 字面意思受精卵,说到受精卵,就想到分裂孵化。
《道德经》有云:道生一,一生二,二生三,三生万物。
我们把Zygote视为一,至于Zygote的父进程“道”,属于Android 系统架构Native层中的Init进程,不属于该文章的介绍范围,暂且不表。
zygote是所有Android进程的父进程;
好,下面开始分裂,首先要知道在Android系统架构中Framework层,所有的java进程(C++管不着)都起源于Zygote。
1)system_server
第一次分裂出的进程叫做system_server,(注意Zygote进程一直还在啊,并不是分裂了就没有了,这点不同受精卵真实过程),看着名字就知道是系统服务相关的,没错,我们常用的ActivityManagerService(以下简称AMS)、WindowManagerService和PackageManagerService等等各种服务,都是system_server这个进程启动的
2)Luncher
而Luncher进程就是桌面App,就是我们看到的手机开机完成后桌面,它本质上是一个App(其实安装卸载啊等好多系统功能,其实本质都是一个App)。其他应用比如浏览器、相机、邮件、电话、微信、淘宝等等,都是Zygote孵化而来。
为什么要孵化,因为从头创建消耗太大,从0到1难呐,万事开头难,这样孵化效率较高。
了解了这些概念,好了,我们可以进入精彩的启动流程部分了。
咳咳,肃静!好戏开场。
详细启动流程
1、当你点击了App的桌面图标时,Luncher进程收到你的操作。启动开始。
2、Luncher进程启动远程进程,通过Binder发消息给system_server。
3、system_server 中AMS经过一系列复杂操作,最终调用 Process.start(android.App.ActivityThread) , 然后通过socket通知Zygote进程。
4、Zygote进程收到通知,fork出App进程,并执行ActivityThread.main()方法。
5、ActivityThread.main()主要干了两件事(这里不展开了):
一准备主线程Looper , 这个大家应该很熟悉了,主线程靠它撑着呢。
二是通过ActivityThread.attch()将主线程ApplicationThread绑定到AMS上。
6、AMS绑定后,经过一系列复杂调用,执行到realStartActivityLocked()方法。
7、上一步方法会调用到ApplicationThread的scheduleLaunchActivity(),而该方法又调用ActicityThread的handleLaunchActivity(),创建Application对象,并调用onCreate()方法,获取启动Activity并调用onCreate()方法。
8、启动完成。
注意!!!!如果启动过程中发生了崩溃现象,我们要如何查询问题源所在呢?
这里建议使用友盟+u-apmApp性能稳定监控平台,通过轻量型的接入,即刻拥有实时、可靠、全面的应用崩溃、ANR、自定义异常等捕获能力,及卡顿、启动分析等性能能力等等,应用崩溃监控当App运行时,对主进程和子进程的崩溃捕获和分析。通过对崩溃日志的计算,为开发者展示了App在所选时间中的错误趋势、错误分布、错误列表和错误详情,快速分析出导致App崩溃的主要原因。支持双端的接入查询,不同应用版本、设备机型、操作系统、运营商、地域的信息筛选,功能异常强大。
本文讲述了App启动流程以及崩溃监控平台——友盟u-apm,通过轻量型的接入,获得强大的数据筛选分析能力,使用图表的形式直观展示了数据分布情况,你值得一试!