前言
说起性能,大家可能第一印象是硬件相关的,比如说大家在玩游戏的时候卡了就会抱怨这太电脑性能太差了,为了更好的体验,首先会想到的是提高硬件性能,处理更快的CPU,大内存,更快的IO读写的固态硬盘,处理能力更强劲的显卡等等。但是我们作为移动端的软件开发者,在用户抱怨说卡的时候不能跟用户说你机器性能太差了,换手机吧(虽然这样也能暂时解决问题),我们还是尽可能的在硬件不变的情况下处理我们程序的性能问题。与硬件相反,更换更好的硬件可以让程序表现更好,在应用本身方面则要尽可能减少这样的硬件开销才能使程序表现更好。
Android 性能优化是个很大的课题,这篇文章主要从优化方向和优化方案入手进行分析
优化方向
主要有以下几个方向来进行优化
- 流畅性---启动、显示、响应
- 稳定性---ANR、crash
- 资源消耗---内存、网络、电量、包大小
优化方案
针对每个方向的具体指标制定具体的优化方案
流畅性
在用户操作过程中不卡顿,能快速响应用户的操作
启动
原因:以Activity为例,影响启动速度的主要在onCreate方法中执行过多的资源加载以及逻辑处理
解决方案:1. 非必须的逻辑可以采用多线程异步处理 2.延迟加载,部分资源加载放在onResume中处理
显示
原因:有两方面一个是测量布局一个是绘制
解决方案:1.减少层级和控件使用layout inspector查看布局,使用inspect code的Lint工具查看布局优化建议,使用merge、include、viewStub 2.绘制方面就是减少过度绘制,主题和activity以及代码中背景设置,自定义view使用Canvas的clipRect控制每个视图每次刷新的区域
响应
原因:在主线程中执行耗时操作,容易发生ANR,应用5s没响应用户输入或触摸事件/广播10s内未完成处理/服务20s内没完成处理
解决方案:启用线程异步处理耗时操作
稳定性
anr在响应的优化有说明。crash这个又分为必现的和偶现的,必现的一般比较好解决比如ClassCastException、NullPointExpection、ArrayIndexOutOfBoundsExpection等等运行时异常,比较难处理的是偶现的,而偶现的一般是因为OutOfMemory引起的,所以这里着重说一下OutOfMemory。
原因:系统给每个应用分配的内存大小是固定的,当超过系统分配的内存大小的时候就会报这个错
解决方案:可以从几个方面类解决1. 使用弱引用的方式 2. 避免内存抖动(频繁的创建大量的小的临时对象)3. 释放资源、屏幕适配、使用缓存
资源消耗
内存
内存优化中提到的方式
网络
1、缓存 2、合并请求 3、wifi环境下请求
电量
1、WakeLock 2、JobScheduler
包大小
1、so库筛选 2、资源文件(svg、webp)3、代码混淆 4、资源混淆 5、国际化