您的位置:首页 > 移动开发 > Android开发

如何加快Android应用启动速度

2014-12-13 18:06 676 查看
好的产品经理知道怎么做减法,在重要的地方只放重要的东西,这样出来的是简洁的应用,比如微信。不好的产品经理只会想着在重要的地方展示尽可能多的东西,这样出来的就是乱七八糟的首页,例子嘛,呵呵

但产品经理是头,那程序狗就加吧。于是首页上的东西越来越多。终于有一天,老板吐槽了,xxx,你们的程序起来怎么这么慢啊,赶紧优化!

----------------------------吐槽分割线----------------------------
先说总结。其一,不管你是不是真变快了,至少让用户觉得你变快了。其二,能不做的事就不做,能后做的事不先做,绝不浪费。其三,流程合并,减少中间步骤。
先说说之前程序启动时的问题。用户从Launcher点击我们的图标,首先打开的是一个splash activity,这个activity既作为一个logo展示等待页面,又是一个动作分流地。在这里根据是否有用户,以及传入的intent决定后面再打卡哪个activity。一般情况下,都是进入用户看到的首页。为了量化即将进行的优化,我用了一台HTC one,并保持要加载的数据量基本不变。优化之前,从点开icon,到首页数据加载完毕,总共大概是9秒。下面就一步一步开始优化。

首先,还是想着从黑科技上着手。不是启动慢吗,那我想办法让程序在点开我们的app之前,就让程序先爬起来。我们不是神,没法知道用户什么时候会点我,那怎么办呢?两方面。一是让我们的程序尽可能一直留在内存中,别被系统杀掉。根据android系统的规则,就是要提高我们进程的优先级。进程优先级可以通过cat /proc/pid/oom_adj查看。当我们进程切到后台后,以前就会变成一个后台进程,进入缓存的应用列表里面,这里随时都可能会被杀掉,可以通过给进程添加一个service来将其变为一个服务进程,一下子,它就变成小强了。第二,我们还是可以稍微预测一下用户行为的。至少,当用户收到消息后,他还是很可能会点开程序的。这时候,我们可以先把它给先爬起来。通过这一步,当用户收到消息后,再点开程序,启动速度大概能减少1秒。

其次,首页上东西太多,初始化需要做的事情实在是太多了。我们得让它少做一点事。我们首页上是一个ViewPager,里面有5帧内容,为了滑动流畅,5帧全部预加载进来了。之前太实诚了,全部加载进来干嘛啊。这个地方方式就比较简单了,按需加载即可。当然,为了,滑动不卡顿,每一帧还是先加载一个空壳和一个等待图标,然后划过来的时候先在后台加载数据,然后inflate view,挂到空壳下面。这么做了之后,程序启动时间缩短到了大约6点几秒。不过,因为涉及到加载流程的改变,要注意数据改变时UI更新时是否存在,初始化各帧界面时是否有初始一些全局数据等。

再然后,因为每次启动到首页之前,都还要先经历一个splash activity,如果能把这一步去掉,启动速度必然又能大幅提升一把。去掉这个activity还是比较容易的。因为用户已经安装过我们的程序,launcher上的图标对应的activity已经固定,所以我选择保留原来的SplashActivity,抽取他的功能到另外一个辅助类,然后把原来的首页调整为一个Fragment,动态添加到SplashActivity上。做到这里,启动时间刷刷的都蹭到了4秒左右。目的基本达到了,反正不比主要竞品差了。

在合并启动页的时候碰到了另外一个问题。之前首页是从ActionBarActivity继承,而且必须保留ActionBar的,而SplashActivity必须具有全屏属性。想在Activity的OnCreate里面hide actionbar,然后等加载完再显示是行不通的,这时候开始的启动画面还是会带有actionbar,然后等到快启动完的时候才小时一下,然后在显示出来。因为Android启动程序是先从Zygote孵化出来,然后到Application的onCreate,然后到intent对应的组件。在Application创建之前,系统就会先解析启动界面的theme,然后将这个界面的背景先显示出来。如果要在一开始不显示actionbar,只能在theme里面就指定不要它。然后再在onCreate里面通过requestFeature把他添加回去。V7包20.0版本之前的requestFeature实现是有问题的,android
4.2以上版本调了它之后还是不会有actionbar,需要通过反射将ActionBarActivityDelegate的mHasActionBar变量置为true才行。当然,你也可以选择不要从ActionBarActivity继承,而是直接从FragmentActivity继承,然后自己实现ActionBar。或者升级一下V7包的版本,它后面又给修正了。。。

再就是背景问题,一开始系统会先显示theme里指定的背景。所以,给theme选择一个好的背景也是很重要的。优化之前,我们指定的是一个透明背景,这样子用它做中继Activity时用户不会先看到一个多余的背景。但有一个坏处是每次点app的icon时,都会显得先卡顿了一下。启动页合并之后,再用它就没必要了,因为我们的首页是一直存在的。把背景直接改为logo页,这时候再点击icon,卡顿就再也不存在了,直接如丝般顺滑啊。

最后再赞美一下Android L,启动不用9秒,也不用4秒,甚至不用1秒,直接秒开啊!真的秒开。简直要秒杀ios的节奏。 虽说有其他兼容问题,但流畅性真的是杠杠的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: