冷启动优化

1. 什么是冷启动

1. 冷启动的定义

冷启动就是在启动应用前,系统中没有该应用的任何进程信息。这时候启动应用就叫冷启动。

2. 冷启动/热启动的区别

热启动:用户使用返回键(Home键)退出应用,然后马上又重新启动应用(进程在后台)。

启动特点:

1. 冷启动会创建Application和MainActivity,进行测量,绘制显示
2. 热启动则不会再次初始化Application,因为一个进程只需要初始化一次Application

3. 冷启动时间的计算

这个时间值从应用启动(创建进程)开始计算,到完成视图的第一次绘制(即Activity内容对用户可见)为止。

adb计算应用启动时间的命令(冷启动和热启动都是用这个命令):

adb shell am start -W -n   application包名/启动Activity的完整名字
例如:
D:\Architect_workspace\GridViewDemo>adb shell am start -W -n com.gridviewdemo/com.gridviewdemo.MainActivity
WARNING: linker: libhoudini.so has text relocations. This is wasting memory and prevents security hardening. Please fix.
Starting: Intent { cmp=com.gridviewdemo/.MainActivity }
Status: ok
Activity: com.gridviewdemo/.MainActivity
ThisTime: 2407
TotalTime: 2407
WaitTime: 2418
Complete

如果只关心某个应用自身启动耗时,参考TotalTime;如果关心系统启动应用耗时,参考WaitTime;如果关心应用有界面Activity启动耗时,参考ThisTime

2. 冷启动的流程

  1. 首先,从Zygote进程中fork创建出一个新的进程
  2. 创建和初始化Application类,创建MainActivity类
  3. inflate布局
  4. 当onCreate/onStart/onResume方法都走完后,会measure/layout/draw contentView,然后显示到界面上

冷启动的生命周期简要流程:

Application构造方法 –> attachBaseContext()–>onCreate –>Activity构造方法 –> onCreate() –> 配置主体中的背景等操作 –>onStart() –> onResume() –> 测量、布局、绘制显示

3. 如何对冷启动的时间进行优化

1. 减少onCreate()方法的工作量

懒加载的方式初始化一些三方SDK等。(很难区分,需要去权衡)

2. 不要让Application参与业务的操作

3. 不要在Application进行耗时操作

避免耗时操作等

4. 不要以静态变量的方式在Application保存数据

5. 减少布局的复杂度和层级

viewStub按需加载

6. 减少主线程耗时

懒加载或者使用子线程进行操作