性能优化:
用户体验的性能主要总结为4个类别:
- 流畅:使用时避免出现卡顿,响应速度快,减少用户等待的时间,满足用户期望。
- 稳定:减低crash率和ANR率,不要在用户使用过程中崩溃和无响应。
- 省点、省流量:节省流量和耗电,减少用户使用成本,避免使用时导致手机发烫。
- 安装包小:安装包小可以降低用户的安装成本。
卡顿优化:
卡顿的场景有很多,可分为4类:UI绘制、应用启动、页面跳转和事件响应,这4种卡顿的原因可为2大类:
- 界面绘制:绘制的层级深、页面复杂、刷新不合理,这些原因卡顿的场景更多出现在UI和启动后的初始界面以及跳转页面的绘制上。
- 数据处理:导致卡顿的原因是数据处理量太大,可分为如下3种情况
(1)、数据处理UI线程。
(2)、数据处理占用CPU高,导致主线程拿不到时间片。
(3)、内存增加导致GC频繁,从而引起卡顿。
优化建议:
1.布局优化:主要通过减少层级、测量、绘制时间和提高复用性方面入手,总结如下
- 减少层级:合理使用RelativeLayout和LinerLayout,合理使用Merge。
提高显示速度:使用ViewStub,它是一个看不见、不占布局位置、占用资源非常少的视图对象。 - 布局复用:通过标签提高布局复用
- 减少测量:尽可能少用wrap_content,它会增加布局measure时计算成本,在已知宽高为固定值时,不用wrap_content。
- 删除控件中无用的属性
2.过度绘制:屏幕上的某个像素在同一帧时间内被绘制多次,从而浪费多余的CPU以及CPU资源,避免过度绘制方法如下:
- 布局上优化:移除XML中非必要的背景、Window默认的背景、显示占位背景图片。
- 自定义View优化:使用canvas.clipRect()帮助系统识别可见的区域,只有这个区域内才会被绘制。
3.启动优化:优化启动逻辑,提高应用的启动速度。启动主要完成UI布局、绘制和数据准备,因此启动速度优化需要以下三个过程:
- UI布局:应用一般都有闪屏页,优化闪屏页的UI布局,可通过Profile GPU Rendering检测丢帧情况
- 加载逻辑优化:采用分布加载、异步记载、延期加载策略提高应用启动速度。
- 数据准备:数据初始化分析,记载数据可用线程初始化等策略。
4.合理刷新:数据变化,需要刷新页面展示新的数据,频繁刷新会增加资源开销,并且可能导致卡顿,合理刷新注意以下几点:
- 尽量减少刷新次数。
- 尽量避免后台有高的CPU线程运行。
- 缩小刷新区域
5.动画优化:有些情况下,实现动画效果时,可以用硬件加速方式提供流畅度。
优化内存:
没有内存泄露,并不意味内存就不需要优化,Android系统对每个应用进程都分配有限的堆内存,因此使用最小内存对象或资源可以减小内存开销,同时让GC高效地回收不需要的对象,让也能够用堆内存保持充足的可用内存,使应用更稳定高效地运行,常见做法如下:
- 对象引用:强引用、软引用、弱引用、虚引用四种引用类型,根据业务需求合理使用引用类型。
- 减少内存开销:注意自动装箱,增加内存复用。比如有效利用系统自带资源、视图复用、对象池、Bitmap对象的复用
- 使用最优数据类型:例如针对数据类型容器结构,可使用ArrayMap数据结构,避免使用枚举类型、缓存Lrucache等
- 图片内存优化:可设置位图规格,根据采样因子做压缩,用一些图片缓存方式对图片进行管理等。
稳定性优化:
内存使用不合理、代码异常场景考虑不周全、代码逻辑不合理等,都会影响,最常见的两个场景Crash和ANR,这两个错误将会导致程序无法使用,常用的解决方法如下:
- 提高代码质量:比如开发期间代码审核,看些代码逻辑,业务合理性等。
- 代码静态扫描工具:常见工具有Android Lint、Findbugs、Checkstyle、PMD等。
- Crash监控:记录崩溃信息、异常信息,以便后续分析解决。
- Crash上传机制:尽量保存日志到本地,有网络时再上传日志信息。
耗电优化:
- 计算优化,避开浮点运算等。
- 避免WaleLock使用不当
- 使用Job Scheduler
更多Android 性能优化核心笔记已记录在此:https://qr18.cn/FVlo89