1、工欲善其事必先利其器。论语曰:工欲善其事,必先利其器。首先找到阻碍你前进的点。要找到这些点,我们需要使用我们的工具。上面提到了很多工具,今天我们使用Traceview来分析一下我们的启动过程。1.1Traceview简介Traceview是一个性能分析工具,主要分析当前线程情况,各个方法的执行时间等。如下:指标说明:Inclusion(包含)CpuTime方法本身及其调用的所有子方法占用CPU时间。Excl(Exclusive)CpuTime方法本身占用CPU时间。包括实时方法(包括子方法)开始到结束的时间。ExclRealTime方法本身使用从开始到结束的时间。Call+RecursionCalls/Total方法被调用的次数+方法被递归调用的次数。CpuTime/Call方法调用占用CPU时间一次。RealTime/Call方法调用一次实际执行时间。一般来说,我们使用RealTime/Call排序来找出耗时的方法。有必要解释一下CPUTime和RealTime:CPUTime方法实际执行时间(不含io等待时间)RealTime方法起止时间差(含Waiting时间)参考:http://stackoverflow.com/questions/15760447/what-is-the-meaning-of-incl-cpu-time-excl-cpu-time-incl-real-cpu-time-excl-re/17902682#179026821.2Traceview使用Traceview有两种方式:a、通过DDMS:点击开始,会弹出trace模式选择框,默认选择“Samplebasedprofiling”:Samplebasedprofiling(基于样本分析)采样间隔用于定时中断VM记录方法调用栈(CallStack),开销与采样频率成正比。Tracebasedprofiling(基于完整的trace数据分析)记录每一个方法的进入和退出,每一个方法执行时都会开启记录,不管是多么小的方法,所以开销非常大。b、在正确的地方使用code://startDebug.startMethodTracing("GithubApp");//stopDebug.stopMethodTracing();注:以上方法等同于“Tracebasedprofiling”,会记录每个方法的执行情况。Android4.4及以上版本可以通过代码调用startMethodTracingSampling()开启“Samplebasedprofiling”的trace方法。2、App启动流程分析要优化App启动流程,首先要了解它的启动流程,具体流程可以参考这篇翻译:Android应用程序启动流程分析3.App启动方式一般来说,一个App的启动可以分为以下三种不同的状态:冷启动App还没有启动或者App进程被kill掉,App进程在系统中不存在,此时启动App就是冷启动。冷启动过程就是整个过程第2节描述的App启动流程,需要创建App进程,加载相关资源,启动MainThread,初始化首屏Activity,这个过程中,屏幕w显示一个空白窗口(颜色根据主题),直到第一个屏幕Activity完全启动。下图是冷启动的时间线:热启动热启动是指你的App进程只是在后台,系统只是把它从后台拉到前台展示给用户。与冷启动类似,在这个过程中,屏幕会显示一个空白窗口(颜色根据主题而定),直到Activity渲染完成。热启动介于冷启动和热启动之间,一般发生在以下两种情况:用户退出App,然后再次启动。App进程可能仍在运行,但Activity需要重建。用户退出App后,系统可能会因为内存原因kill掉App,进程和activity都需要重启,但是被动kill锁保存的实例状态可以在onCreate中恢复。通过三种启动状态的描述,可以看出我们要做的启动优化其实是针对冷启动的。热启动和温启动都比较快。4、App快速启动的敌人在哪里?根据冷启动时间图可以看出,对于App来说,我们可以控制的启动时间线点无非就是:Application的onCreate渲染首屏Activity和我们现在App集成了很多第三方每次服务,启动时需要检查广告、注册状态等一系列接口,都是在Application的onCreate或者首屏的onCreate中完成的。很多第三方平台的SDK文档也有这个提示。5.结束语了解了App启动的原理,知道了App启动过程中哪些地方容易阻塞,知道了用什么工具来分析各个方法的执行时间,那么下一步就很容易做了。
