Android性能优化总结(史上最全总结)
Android中的性能优分为以下几个方面:
- 布局优化
- 绘制优化
- 网络优化
- 安装包优化
- 内存优化
- 卡顿优化
- 耗电优化
- ListView/RecycleView及Bitmap/图片优化
- 数据库SQLite优化
- 启动优化
- 数据结构优化
- 稳定性优化
一.布局优化
在Android种系统对View进行测量、布局和绘制时,都是通过对View数的遍历来进行操作的。如果一个View数的高度太高就会严重影响测量、布局和绘制的速度。Google也在其API文档中建议View高度不宜超过10层。现在版本种Google使用RelativeLayout替代LineraLayout作为默认根布局,目的就是降低LineraLayout嵌套产生布局树的高度,从而提高UI渲染的效率。
布局优化的本质就是减少View的层级。常见的布局优化方案如下:
- 在LinearLayout和RelativeLayout都可以完成布局的情况下优先选择LinearLayout,可以减少View的层级,但是注意相同组件可能RelativeLayout绘制时间长
- 使用 < include > 标签将常用的布局组件共同的部分抽取出来,以便复用。
- 通过 < ViewStub > 标签来加载不常用的布局,延迟加载(需要的时候在activity中加载出来)
- 使用 < Merge > 标签来减少布局的嵌套层次
二.绘制优化:
绘制优化是指View的onDraw方法要避免执行大量的操作,这主要体现在两个方面:
1.onDraw中不要创建新的局部对象。
因为onDraw方法可能会被频繁调用,这样就会在一瞬间产生大量的临时对象,这不仅占用了过多的内存而且还会导致系统更加频繁gc,降低了程序的执行效率。
2.onDraw方法中不要做耗时的任务,
不能执行成千上万次的循环操作,尽管每次循环都很轻量级,但是大量的循环仍然十分抢占CPU的时间片,这会造成View的绘制过程不流畅。
按照Google官方给出的性能优化典范中的标准,View的绘制频率保证60fps是最佳的,这就要求每帧绘制时间不超过16ms(16ms = 1000/60),虽然程序很难保证16ms这个时间,但是尽量降低onDraw方法中的复杂度总是切实有效的。
三.网络优化:
1. 原因
网络优化不好,造成用户流量消耗大,耗电快,用户等待时间长体验差等。
2. 工具
Network Monitor,Charles,Fiddler,Stecho。
3. 优化手段
接口设计
API设计要合理。
使用GZIP压缩。
选择合适的数据格式:json,xml,protocol Buffer。图片处理
图片下载: 使用缩略图。
使用WebP图片。
根据设备规格,指定图片尺寸请求图片。 使用完善的合适的图片加载框架:Glide,Picasso等。
图片上传:一般要支持断点续传。网络缓存
适当缓存,可让App看起来更快。
使用DiskLruCache。打包网络请求
网络状况好(如:WiFi状态下),可一次异步发起多个业务模块的数据请求。监听相关状态变化
休眠状态(即:熄屏状态下),尽量不要发起网络请求。
充电状态,可适当做一些必要的网络请求,但要控制频率。
弱网状态下,可压缩和减少数据传输量;不要自动加载图片,用占位图显示;页面视图先显示,网络请求延迟提交。优化网络请求机制
划分网络请求的优先级,同一页面,同一模块,重要的数据优先请求。
网络差,减少请求量;网络好,提高请求量。
合并网络请求,减少请求次数。比如,本地埋点数据,无需实时上报,可先本地缓存,再根据上报策略,选择合适时机一并上报。IP直连和HttpDns
IP直连,省去DNS解析时间。
使用HttpDns,防止运营商域名劫持或跨网访问问题。开启 keep-alive进行连接复用;
优化请求频率
使用本地缓存,让App在离线状态也能使用。
优先使用缓存;当没有缓存或缓存过期,再请求网络数据。
常见的网络优化方案如下:
- 尽量减少网络请求,能够合并的就尽量合并
- 避免DNS解析,根据域名查询可能会耗费上百毫秒的时间,也可能存在DNS劫持的风险。可以根据业务需求采用增加动态更新IP的方式,或者在IP方式访问失败时切换到域名访问方式。
- 大量数据的加载采用分页的方式
- 网络数据传输采用GZIP压缩
- 加入网络数据的缓存,避免频繁请求网络
- 上传图片时,在必要的时候压缩图片
四.安装包优化
安装包优化的核心就是减少apk的体积,常见的方案如下:
减少应用中不必要的资源文件,比如图片,在不影响APP效果的情况下尽量压缩图片,有一定的效果
在使用了SO库的时候优先保留v7版本的SO库,删掉其他版本的SO库。原因是在2018年,v7版本的SO库可以满足市面上绝大多数的要求,可能八九年前的手机满足不了,但我们也没必要去适配老掉牙的手机。实际开发中减少apk体积的效果是十分显著的,如果你使用了很多SO
发布评论