App启动优化(一)

前言:

从今天开始我将和大家一起走进应用的性能优化领域,首先还是希望能坚持更新吧。哈哈!作为一个应用开发人员,我们深知应用的性能对于应用本身有多么重要,我为什么把启动优化放在开篇呢,因为启动是用户对应用的第一体验,用户要想使用app,就一定会打开它,这个时候如果这个启动没做好,不管之后做得怎么样,给用户得第一感觉就已经变差了,随之带来的后果就是用户留存会变少,这对公司来说将是巨大的损失。要知道当今移动互联网的红利已经所剩不多,大多是巨头之间的战争。小公司要想有一席之地,那就必须得做得完美才行。我想绝大多数开发者都没经手过日活上千万乃至更多得应用,这都没关系,做性能优化,其实就是一种精益求精得态度,如果你有这种态度,并能做好,这对你得开发生涯将带来巨大的提升,有一天你也许就有机会去接手这种量级的app了,到那时,我相信你应该能非常从容的面对这些问题了吧。

背景介绍:

  • 第一体验:

就如我刚才所说,用户要想使用app,就会去打开它,而启动就是开场,不管之后做得多好,给人的第一印象就已经不好了,这是绝对不行的。

  • 八秒定律:

八秒定律是在互联网领域存在的一个定律,即指用户访问一个网站时,如果等待网页打开的时间超过8秒,会有超过70%的用户放弃等待。要知道这造成的后果就是用户留存会非常低,这显然是不能发生的。

启动分类:

  • 冷启动:

这是冷启动一个基本的流程图,冷启动是耗时最多的,也是我们做启动优化的衡量标准。其实它就是应用第一次启动所经过的一系列逻辑,接下来我简单概括一下:首先呢Click Event这是用户的一个点击事件,它会触发一个IPC的操作,之后呢它会走到Process.start方法里面,这个方法是用来创建一个进程的,接下来呢就来到ActivityThread,这是个非常重要的类,它是单进程应用的入口,里面有个mian方法相当于Java Main方法。这里面会进行一系列的创建,消息循环,handler等。创建完成后,会走到bindApplication这一步,就是通过反射去创建application,调用与application相关的生命周期,application结束之后,我们就来到了activity的生命周期,到这里大家就比较熟悉了,最后来到ViewRootImpl.这个地方才会进行真正的界面绘制。大家看到冷启动经历了这么多流程,所以它是最耗时的。对于冷启动流程的理解,可以帮助我们去寻找之后的一个优化方向,所以说希望各位能记住这张图。

  • 热启动:

对于热启动,它的特点就是最快。为什么最快呢。我们所说的热启动呢,是说它从后台切到前台,那肯定这样是最快的。因为它没有上述冷启动一个application的创建,各种生命周期的调用等。

  • 温启动:

温启动呢?它是较快,它是介于冷热启动之间。对于温启动来说呢,它只会走activity的生命周期,而不会走那些进程的创建,application的创建,application的生命周期等等。

相关任务:

大家要注意的是上述三步都是系统自己在做,我们无法干预,当然第二步我们可以假干预。这个后续再说

从这三步开始呢,其实就和我们自己写得代码息息相关了。

一般到了这里,有很多人就认为说是启动优化做到这里就行了,其实不然。我们后续在说。

优化方向:

大家看到这里,可以自己想想。我可以和各位说,首先我们要优化我们能优化得,像进程创建,application创建等等,这些显然我们无能为力,我们要优化得地方就是在application和activity的生命周期内。只有这些我们是能干预的。

启动时间的测量方式:

我们要想优化启动速度,首先得要了解启动的时间,下面我给各位分享两种启动时间的测量方式。 

  • adb命令: adb shell am start -W packagename/首屏Activity

这就是我的演示结果,我们重点要关注几个数据 。

正常情况下呢,应该是WaitTime>TotalTime>ThisTime.但是大家可以看到这种方式只能是在线下使用,我们还可以用来测试竞争对手的启动时间,它没法再线上使用。还有这里的adb测量的时间并不精准。这里就不展开来说了。

  • 手动打点:

所谓手动打点就是我们尽可能合理的选取代码中开始和结束的地方,然后手动加入代码来记录时间,最后求出两者之差。这里注意我说的要合理,很多人选取的位置并不合理,特别是这个结束的位置,下面我给大家演示一下。

首先大家可以写这么一个工具类,接下来我们看看开始的位置。

这个application的回调方法呢,基本是我们能接触到的启动最早的方法,接下来结束的位置就比较有讲究。我分别给出两种情况,最后放出结果大家可以比较一下优劣,之后我会总结。

大家有没有看到这个位置的差距有点大啊,我相信大家在网上可能会看到说结束的位置应该放在onWindowFocusChanged方法中,这个方法呢,它是首帧绘制的时间,我们要知道,我们做启动优化并不是说一味去追求启动速度,而是要在追求速度的基础上兼顾用户体验,这才有意义,而这里首帧绘制完,我们的列表并不一定展现出来了,所以我们应该把结束的位置,放在用户真正能看到的地方,这里就是我们可以放在列表的第一条item展示出来的时候。希望大家能记住这点。

下面我来总结一下手动打点的特点

尾言:

这篇文章我们暂且到这里,由于启动优化涉及到的东西还有很多,我打算用一个系列来记录,今天作为开篇主要像大家介绍了一下启动的一些前置知识,最后给大家分享了记录时间的方法。我相信大家看完收获应该挺大。接下来我将会介绍优化工具的选择,还有真实代码的实战。一句话性能优化的路还很长,这需要我们共同走下去,希望和大家一起进步,以上。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值