前言
在我们开发过程中,随着产品功能的迭代, 使得App变得臃肿,启动速度会逐渐变慢,因此App性能的优化显得尤为重要,这一节不说App启动速度性能的优化,就只是记录一下App应用启动时长的统计
1. App启动类型
1>:冷启动
- 定义:启动应用时,后台没有该进程,系统会重新创建一个新的进程给该应用。
- 首先创建和初始化Application,然后创建和初始化MainActivity,最后显示在界面上。
2>:热启动
- 定义:从已有的进程启动应用,叫热启动。启动应用时,后台有该应用的进程(比如按下home键、back键,应用虽然退出,但是该应用的进程会保存在后台);
- 热启动因为是从已有的进程中启动,所以不会执行 Application,而是直接执行MainActivity的逻辑,热启动不用创建和初始化Application,因为一个应用从进程的创建到销毁,Application只会初始化一次;
3>:首次启动
首次启动严格来说隶属于冷启动,这里之所以单独拎出来,是因为首次启动一般来讲会比非首次启动要久一些,因为首次启动会做一些系统的初始化工作,比如初始化数据库、初始化一些第三方的比如友盟、三方分享、登录、支付等等,当然可以把这些初始化工作可以放在IntentService中执行,所以首次启动速度非常重要。
2. 本地启动统计时间
本地启动统计相对来说比较简单,直接一句命令就ok:
adb shell am start -w packagename/activity
图片.png
我们只需要关心TotalTime即可,因为这个是app启动真正的耗时时间
3. 线上启动统计时间
app上线之后不能依靠命令方式,可以通过打Log的方式来统计,两个地方,起始时间和结束时间,我们首先分析下app应用的启动流程:
app应用从桌面启动流程如下:
1>:用户点击桌面图标之后,会通知ActivityManagerService(AMS)启动应用入口的Activity;
2>:如果AMS发现应用还没有启动,则会通知Zygote孵化出应用进程,然后在这个应用进程中执行ActivityThread的main()方法;
3>:app应用进程然后通知 AMS说app应用进程语句启动,然后AMS会保存app应用进程的一个代理对象,如此一来 AMS可以通过控制这个代理对象来控制app的应用进程;
4>:最后AMS通知app应用进程创建入口Activity实例,然后执行其生命周期的方法;
生命周期方法执行流程
上边说到,AMS可以通过代理对象通知应用进程创建入口Activity的实例,并从执行它的生命周期方法,app启动时间的统计或者app启动速度的优化也是从这里开始的,下边是MainActivity的启动流程:
Application的构造方法
Application.attachBaseContext()
Application.onCreate()
Activity的构造方法
Activity.setTheme()
Activity.onCreate()
Activity.onStart()
Activity.onResume()
Activity.onAttachToWindow()
Activity.onWindowFocusChanged()
起始时间:
- 冷启动:Application.attachBaseContext();
- 热启动:Activity.onReStart();
结束时间:
Activity.onWindowFocusChanged()
网友评论