应用程序启动可以以三种状态之一进行,每种状态都会影响用户看到应用程序所需的时间:
冷启动:
冷启动是指应用程序从头开始:在开始之前,系统的进程尚未创建应用程序的进程。冷启动发生在您的应用程序自启动设备以来第一次启动或自系统杀死应用程序以来的情况。这种类型的启动在缩短启动时间方面提出了最大的挑战,因为系统和应用比其他启动状态有更多的工作要做。
在冷启动开始时,系统有三项任务:
加载和启动应用程序。
在启动后立即显示应用程序的空白开始窗口。
创建应用程序进程。
当创建完应用程序进程,应用程序进程就负责下一个阶段。这些阶段是:
创建应用程序对象。
启动主线程。
创建主要活动。
膨胀视图。
布置屏幕。
执行初始绘制。
热启动:
热启动指的是应用进程已经创建,当前页面的Activity也已经创建,驻留在内存中。
如果您的所有应用程序的活动仍驻留在内存中,则该应用程序可以避免重复对象初始化,布局膨胀和渲染。
温热启动:
温热启动指的是应用进程已经创建,但是当前页面的Activity被销毁或者还未创建,需要重新创建。
用户退出您的应用,但后来重新启动它。该过程可能会继续运行,但应用程序必须通过呼叫从头开始重新创建活动。
系统从内存中逐出您的应用程序,然后用户重新启动它。该流程和Activity需要重新启动,但该任务可以从保存的传入的实例状态包中获得一定的好处。
最主要的就要收拾冷启动,因为这是关系用户的留存率,第一感觉。如果不处理好,可能用户就会不使用,甚至直接卸载。
1、启动加速之主题切换
官方文档介绍的方案:使用Activity的 windowBackground主题属性来为启动的Activity提供一个简单的drawable。
这个方案也就是我们常常讲到的延迟加载,说白了就是给用户一个假象,做法一般就是设置倒计时广告,有的干脆就是放入滑动界面,在这一段时间做一判断,哪些是需要即时加载的(如第三方sdk初始化,数据库初始化),哪些可以延迟加载(如无关首页的显示的配置信息,需要同步服务器的非紧急数据等等),延时加载推荐使用Intentservice 处理耗时任务,这里不介绍它的用法。
2、除反射:
反射会在Android上造成重大的性能问题,特别是对于大型的数据驱动应用程序。出于这个原因,应该尽可能地避免。
日志显示分析:
从Android 4.4(API级别19)开始,logcat包含一个包含名为的值的输出行Displayed。此值表示启动过程和完成在屏幕上绘制相应活动之间所经过的时间量,启动之后查看日志会发现类似:ActivityManager:显示 com.android.myexample / .StartupTiming:+ 3s534ms
参考资料:https://developer.android.com/topic/performance/launch-time.html#profiling