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