一大堆前人指引
http://www.jianshu.com/p/98032786711a
http://hukai.me/android-performance-patterns-season-6/
如何减少应用的内存使用量
1. 使用优化的数据结构, 比如使用SparseArray族替换HashMap, 减少auto-boxing的开销, 和减少内存占用
但是当数据量超过1000时, 速度会比HashMap慢很多.
ArrayMap 默认尺寸为0.
2. 减少使用抽象, 减少类的数目, 降低内存占用. --- 这一点基本上可以忽略, 现在越来越重视建模的重要性了.
3. 避免使用enum . 这点也仁者见仁吧.
4. 相对于 Sevice 尽量使用IntentService. 避免不需要的Service在后台运行.
5. 谨慎使用第三方库, 尤其一些不是专门为移动设备开发的第三方库, 可能会对内存的占用不够高效.
6. 使用合适分辨率的图片. 避免不必要的高分辨率.
7. 避免内存泄漏 -- 这个是正确性问题, 比上面的优化措施都要严重.
8. 小心使用异步回调. 会影响对象回收.
如何避免内存抖动
1. 避免频繁创建临时对象, 这里的频繁创建场景包括, onDraw() getView() bindView(), onViewAttchedToWindow(), ..等执行非常频繁的函数. 比较常见的错误是paint对象的初始化.
方法就是缓存, 包括对象池技术, 可以提供bitmap, connection, view的缓存,
2. 优化逻辑, 减少内存使用.
3. 注意auto-boxing
如何提高滑动时的流畅度, 或者说如何避免卡顿, 丢帧.
1. 避免内存抖动, 减少滑动时的内存回收操作. ---- 而这一般是通过缓存做到的, 这就要增加内存的占用量
2. 从逻辑上, 减少滑动时的计算量, 减少cpu耗时.
2.1 降低布局复杂度, 减少嵌套层级, 包括整个activity, fragment级别的层级.
2.1 延迟加载不必要的图片, 不必要的控件, 使用viewstub避免创建不显示的控件.
2.2 使用易于计算的控件, 尽量减少measure次数, 还有避免不必要的刷新
2.3 去除不必要的背景颜色, 避免过度绘制.
2.4 去除不必要的透明度, 减少重绘次数. 可以使用完全透明的背景, 这是没有问题的.
2.5 onDraw时, 减少或者避免重叠的绘制区域, 可以考虑使用ClipRect之类的优化.
2.6 直接访问变量, 要比通过getter方法快. 延伸出一种情况, 如果使用内部类, 并且内部类引用了外部类的私有变量, 那么尽量使用包访问权限, 而不是私有访问权限修改变量.
http://hukai.me/android-training-performance-tips/
2.7 如果能通过int实现, 就不要使用float和double
2.8 减少使用资源 可以考虑使用ColorFilter上色.
2.9 减少不必要的显示元素, 能用GONE的千万不要使用invisible
2.10 尽量保持你的布局只有一层拥有Background,避免给过多的ViewGroup设置背景. 如果用到了系统定义的MaterialDesign的主题会默认给一个背景。可以在Activity设置 getWindow().setBackgroundDrawable(null);
2.11 对于复杂布局, 使用ConstraintLayout进行优化.
2.12 注意自动装箱, auto-boxing 有时候会导致性能问题.
2.13 滑动过程中, 修改一个控件的尺寸或者某些属性, 小心影响其他控件的布局, 可能会导致整个view 树的重新计算.
2.14 滑动时避免调用requestLayout()方法.
解决卡顿问题,
1. 量化问题, 建立一套工具或者流程去计算当前的帧率, 平均耗时, 通过优化后做对比, 可以看到优化的效果
adb shell dumpsys gfxinfo com.kingsoft 检查帧率数据
2. 发现问题的工具, Traceview, Hierarchy Viewer, 检查
如何降低耗电.
1. 避免一直活跃, 无法使手机进入休眠.
网友评论