性能优化:
性能优化是一个宽泛的概念,以下的优化都可以认为是性能优化的范畴。
内存优化:
常见的内存问题及优化方案
1,内存泄漏:点击查看第二十三题答案
2,内存抖动:避免频繁创建大量、临时的小对象
3,图片Bitmap相关:点击查看第二十题答案
4,代码质量 & 数量:减少不必要的类&对象,谨慎选用第三方库,代码混淆,选用合适数据结构
5,日常不正确使用:基础要扎实,在实践中活学活用
启动优化
1,闪屏页优化:App 应用启动都会先进入一个空白的启动窗口(闪屏页)来展示应用信息,默认是空白的,一般通过设置闪屏页主题图片来给用户带来的视觉优化体验
2,Application 优化:很多第三方组件(包括App应用本身)都选择在完成初始化操作。过多的复杂初始化操作会影响到应用的启动性能
1)必要的组件一定要在主线程中立即初始化(入口 Activity 可能立即会用到)
2)组件一定要在主线程中初始化,但是可以延迟初始化
3)组件可以在子线程中初始化(建议延迟初始化)
3,广告页优化:广告页图片可以采用异步加载的方式,并判断下载信息以决定重新下载和展示
图片优化:
参考内存优化中的第三条
布局优化:
1,合理选择布局嵌套,建议使用ConstraintLayout
2,合理使用include(布局重用,便于管理)、merge(与include配合减少嵌套)、ViewStub(占位布局,懒加载)
3,避免过度绘制
响应优化:
1,减少刷新次数:比如进度更新,要进度有变化再去刷新,且保证频率不得高于系统的刷新频率
2,避免非必要的刷新:若控件不可见,则无需刷新
3,避免后台线程影响:如列表控件,在滑动时不要去加载图片,可以在滑动监听里停止图片的加载
4,局部刷新:
5,尽量使用属性动画:它减少了自身的重绘,最后要清除
6,使用StringBuilder:大量字符拼接或修改时,使用StringBuilder以避免频繁创建对象
7,开启硬件加速
电量优化:
1,网络请求:在蜂窝移动网络下,最好批量执行网络请求,尽量避免频繁的间隔网络请求,尽量多地保持在 Radio Standby 状态
尽量在 Wi-Fi 环境下使用数据传输
2,避免Wake Lock使用不当:必要的时候使用,及时释放
3,定位:定位中使用 GPS,及时关闭
4,传感器:选择合适的采样率,在后台时注意及时注销传感器监听
5,熄屏:熄屏后停止一些和 UI 效果有关的操作,比如动画
6,计算优化:浮点运算比整数运算更消耗 CPU 时间片,因此耗电也会增加,在编写代码的过程中应该尽量减少浮点运算
1)除法变乘法
2)充分利用移位
3)查表法,直接使用映射关系,但这会增加内存占用,视情况而定
7,使用 Job Scheduler管理后台任务
网络优化:
1,不用域名,用IP直连
2,服务器部署:服务器多运营商多地部署
3,连接复用:节省连接建立时间,如开启 keep-alive
4,数据压缩:利用Gzip库来压缩文本数据
5,请求打包:合并网络请求,减少请求次数
6,网络缓存:对服务端返回数据进行缓存,设定有效时间
7,大文件传输:避免整文件传输,采用分片传输;根据网络类型以及传输过程中的变化动态的修改分片大小;每个分片失败重传的机会
8,与服务端接口优化:避免传输无用数据,对即将使用的数据合并传输
安装包优化:
1,删除无用代码和资源
2,图片压缩及图片格式选用(如webp格式,矢量图)
3,避免重复库,第三方lib库的清理
4,开启混淆
5,支持插件化
6,使用第三方压缩打包工具