经过一段时间的面试,发现很多大公司对“性能调优”这部分的技术提问最多,而且都比较深入,所以今天汇总一下“性能调优”相关技术点,先上一张汇总思维导图。
性能调优
性能调优总结起来就是4个字 “快、稳、省、小”。
1)快
UI
布局:1.少使用嵌套布局,多用ContraintLayout。
2.使用 merge 去除冗余的节点与嵌套。
3.使用 include 提高布局的复用率。
4.使用 ViewStub 实现懒加载,需要时才加载。
绘制: 1.尽量在多使用缓存,减少绘制次数。
2.通过Profile GPU Rendering检测渲染有问题的界面。
3.通过Hierarchy Viewer来查看布局层次和每个View所花的时间。
4.Android Profile CPU检测。
动画:1.避免多个View同时执行动画操作。
2.使用多图片操作动画时候,应该需要对图片大小进行优化,以防低端手机OOM。
3.适当使用 Hardware Layer 提升Android动画性能。
启动
冷启动:1.避免在Applcation的onCreate主线程中过渡初始化。
2.避免在MainActivityonCreate主线程中过渡初始化。
3.主题中的windowIsTranslucent设置为true去掉启动app时的黑屏或者白屏。
4.设置主题中windowBackground,消除启动时的白屏/黑屏。
热启动:1.避免在onResume主线程中实现较多的阻塞工作。
跳转
1.A跳转到B,需要经历A的onPause,B的onCreate,onStart,onResume,所以在这几个方法中不能做耗 时的操作。
2.一进入页面不可见的视图可以用ViewStub做延迟加载。
3.网络请求可以在加载完页面控件后再进行。
响应
1.避免主线程中操作耗时的任务(数据加载、过渡UI更新等等)。
2)稳
内存泄漏(生命周期长的对象引用生命周期短的对象)
1.非静态内部类的实例(Handler)
2.Bitmap
3.资源对象未关闭(Cursor)
4.静态变量。
内存溢出(OOM)
1.Bitmap
解决方式:可以通过android:process=":xxx",实现同多进程方式,分散内存占用。
ANR
1.Service 处理超时(20秒)
2.Broadcastt 处理超时(10秒)
3.Input 处理超时(按键、触屏、轨迹等输入事件,5秒没有反应)
分析ANR方法:通过查看 /data/anr 里面含有trace.txt文件可以分析。
阻塞
1.不要在主线程中执行一些耗时的任务。
代码质量
1.使用Bugly实时记录程序BUG情况。
2.可以使用“埋点”的开发思想,记录程序使用情况。
3.使用“高复用、低耦合、去依赖、易扩展、易维护”的设计思想。
3)省
电量
当应用退到后台时,一切的界面刷新都没有意义与浪费内存与电量,如以下操作:
1.系统广播接收(网络状态、屏幕显示状态)。
2.数字传输(蓝牙、wifi、移动网络)。
3.位置服务。
我们这通过AlarmManager、WakeLock、JobScheduler的API,根据需求拟定比较好的后台任务执行机制,
实现电量的优化。
流量
4)小
APK瘦身
1.使用 Android Lint 检测无用的图片。
2.使用 TinyPng 工具,将图片转换为 WebP
格式或者有损压缩png/jpeg,进一步缩小图片的体积。
3.多使用 Vector
矢量图。
4.去除无用的库 。
。