这篇文章主要讲App启动优化的过程和心得,会夹杂一些技术点。
最近项目接到了一个需求,那就是对app现存的问题进行优化,至于说app有哪些问题呢,这里大概罗列一下:
- 启动速度慢
- 耗内存
- 掉帧严重,也就是通常所说的卡顿
- 耗电量大
- 流量消耗比较严重
今天主要说一下启动速度慢这个问题
刚开做这方面优化的时候始也是一脸懵逼啊,没办法,硬着头皮上呗。后来才发现,无论结果如何,只要硬着头皮上了最终都会有收获的。当时对于启动优化这一点可以说一点思路都没有,更别说找到入口点了。不过事情硬着头皮做到现在也算是有些思路了,在这里稍作个总结吧。
启动优化,首先要理解启动这两个字。仁者见仁智者见智,对于有启动页或者闪屏页的app,有人可能会想app启动就是点击app图标到启动页或者闪屏页展示出来的过程,我理解的启动是指的点击app图标到应用进入到主页面的过程。具体的启动过程不是本文重点,不做详细分析,这里只记录一下这个过程存在的问题及优化思路。
我把点击应用icon到程序进入主页面的过程都理解为启动过程,在没有优化之前,我们的应用启动主要经过了以下几个小过程
应用启动->启动页->主页。应用启动速度之所以慢是因为这两个过程每一个都多多少少有些问题,
首先是应用启动这个过程
这个过程包含点击icon和application初始化过程。这个过程当时最大的问题就是,点击应用icon到出现启动页之间有2s左右的视觉卡顿现象。这个问题的原因现在看来就两个:1 app设置了一个透明的theme 2 application中三方sdk的初始化操作太多。这个问题要针对性去解决:1 设置闪屏来为app营造一个秒开的假象,具体方法在文末给出,2 分析一下所用到的三方sdk是否必须在application中初始化,如果必须,再考虑是否可以设置延迟或者放到service中,如果要将初始化操作放到service中进行,需要将service的优先级提高,防止被系统给干掉。
接下来该说启动页到主页的过程了
这个过程耗时比较长主要有这么几点:
1 启动页布局比较复杂,出现过渡绘制或者丢帧现象,
2 代码逻辑问题
3 初始化操作太多
4 有一些不必要的耗时操作。
处理的思路主要有一下几点:
1 优化视图结构,减少视图层次,尽量避免过渡绘制,可以考虑使用viewstub或者marge标签处理布局;
2 仔细阅读代码,看代码是否存在逻辑缺陷,同时去掉一些没用的代码;
3 启动页虽然可以进行初始化操作,但是依然建议将三方sdk的初始化操作放到使用之前进行;
4 去掉一些不必要的耗时操作,比如广告页并不是每个应用必须的,如果应用没有使用广告页但仍然在启动页请求网络去下载广告资源了,这个时候可以酌情考虑去掉下载广告页的过程。
另外,启动页可能需要预先下载一些资源供主页使用,这个可以考虑使用缓存,文件缓存或者数据库缓存都行。我们的项目就是做了个数据库缓存,启动页下载了资源之后把资源内容和资源的md5缓存到数据库,后续使用的时候将数据库存储的内容md5取出来和网络请求的资源md5进行比对,如果比对结果一致就继续使用数据库缓存中的数据,如果不一致则使用网络请求的数据,同时更新数据库缓存。
上面只是简单记录了一下,后续会把这块形成一个系列来详细介绍。