APP 启动优化
一、背景
启动速度是一个APP的门面,对用户体验十分重要。简单介绍启动原理、优化方案、线上验证。
二、启动原理
根据google文档,应用启动包括以下三种:
1 冷启动
冷启动是指 APP 进程被杀死(系统回收、用户手动关闭等),启动 APP 需要系统重新创建应用进程,从用户点击应用桌面图标到第一个页面加载完成的全部过程。冷启动是启动类型中耗时最长的一种,也是启动优化最关键的优化点。
简单理解:后台没有该应用的进程,系统会重新创建一个新的进程分配给该应用,先实例化 Application类,再创建Activity
冷启动流程
- Zygote进程中fork创建出一个新的进程
- 创建和初始化Application类
- 创建MainActivity
- inflate布局、onCreate/onStart/onResume
- contentView的measure/layout/draw显示在界面上;
生命周期函数执行流程,我们的启动时间统计以及启动速度优化也是从这里开始
-> Application 构造函数 -> Application.attachBaseContext() -> Application.onCreate() -> Activity 构造函数 -> Activity.setTheme() -> Activity.onCreate() -> Activity.onStart -> Activity.onResume -> Activity.onAttachedToWindow -> Activity.onWindowFocusChanged
记录应用启动时间
- 起始时间点:Application.attachBaseContext()
- 结束时间点:Activity.onWindowFocusChanged
可优化的阶段-减少Application和MainActivity,OnCreate方法做的事情。事情越多,冷启动时间越长。
2 热启动
3 温启动
温启动包含了在冷启动期间发生的部分操作,同时它的开销要比热启动高,例如用户在退出应用后又重新启动应用,此时应用进程仍然存在,但应用必须通过调用 onCreate() 从头开始重新创建 Activity
系统有应用进程,内存中没有相关activity,如back键退出应用,未清除进程
冷启动是三种启动状态中最耗时的一种,启动优化也是在冷启动的基础上进行优化,热启动和温启动相对耗时较少,暂不考虑优化。
三、问题分析
工欲善其事必先利其器。要想优化启动时间,必须了解应用启动过程中发生了什么。以及耗时方法有哪些,APP常用性能检测工具:
(1) adb shell
命令:adb shell am start -W 包名/xxxActivity 查看应用启动时间
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.xt.compress/com.xt.activity.SplashActivity }
Status: ok
Activity:com.xt.compress/com.xt.activity.SplashActivity
ThisTime: 727
TotalTime: 727
WaitTime: 763
TotalTime:应用启动总时长,包括应用进程创建、Application 创建和第一个 Activity 创建并绘制完成到显示的所有过程,冷启动的情况下我们只需要关注 TotalTime 即可
(2) Displayed
在 Logcat 中过滤关键字 displayed 即可看到应用启动的总时长,如下图所示,displayed 打印的时长跟 adb shell 几乎相同,也就是一次冷启动的总时长。
system_process I/ActivityManager: Displayed com.xxxx.xxxarea/com.xxxx.SwitchActivity: +819ms
Starting: Intent { cmp=com.xxx.xxxea/com.xxxx.SwitchActivity }
Status: ok
Activity: com.xxxx.xxxea/com.xxxx.SwitchActivity
TotalTime: 819
WaitTime: 822
以上两种方法可以获取启动总时长,无法获取具体耗时的堆栈信息。应用启动的具体信息可以使用Systrace和Traceview
(3)Systrace
Systrace是Android平台自带的命令行工具,可记录短时间内的设备活动,并保存在压缩的文本文件中。
该工具会生成一份报告,里面汇总了android内核中的数据,如CPU调度程序,应用线程。
四、优化方案
1、减少两处onCreate初始化的操作,可将部分操作放到IntentService中操作。
2、接收广播,拉起应用:会走application oncreate方法
3、启动页主题用google推荐的SplashTheme 参考:Splash启动界面秒开的正确打开模式 - 简书 (jianshu.com)
4、减少布局的复杂性和深度
小结:
1.冷启动主要耗时:zygote进程为应用fork新进程
2.可通过adb,displayed命令查看启动时间
3.通过IntentService初始化操作,减少onCreate方法的事情
4.通过广播拉起应用(温启动)
5.使用SplashTheme 闪屏页优化启动速度