APP 启动优化

一、背景

启动速度是一个APP的门面,对用户体验十分重要。简单介绍启动原理、优化方案、线上验证。

二、启动原理

根据google文档,应用启动包括以下三种:

1 冷启动

冷启动是指 APP 进程被杀死(系统回收、用户手动关闭等),启动 APP 需要系统重新创建应用进程,从用户点击应用桌面图标到第一个页面加载完成的全部过程。冷启动是启动类型中耗时最长的一种,也是启动优化最关键的优化点。

简单理解:后台没有该应用的进程,系统会重新创建一个新的进程分配给该应用,先实例化 Application类,再创建Activity

冷启动流程

  1. Zygote进程中fork创建出一个新的进程
  2. 创建和初始化Application类
  3. 创建MainActivity
  4. inflate布局、onCreate/onStart/onResume
  5. 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 热启动

热启动是指应用程序从后台被唤起,此时应用进程仍然存在,应用启动无需创建子进程,但是可能会重新执行 Activity 的生命周期,在热启动中,系统的所有工作就是将您的 Activity 带到前台,只要应用的所有 Activity 仍驻留在内存中,应用就不必重复执行对象初始化、布局和绘制,例如用户按下 back 或者 home 键回到后台。
从已有的进程来启动应用,不会重新创建Application类。

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 闪屏页优化启动速度

posted @ 2022-08-30 10:56  随易来了  阅读(162)  评论(0编辑  收藏  举报