Android性能优化
https://github.com/lzyzsd/MemoryBugs
Demo分析:
对该项目进行一些内存优化。先运行这个Demo,用内存分析工具MemoryMonitor, AllocationTracker,LeakCanary等进行分析
这时我们还没对应用进行任何操作,只是让它运行在MainActivity中。在MemoryMonitor可以看到当前的内存状态是很平稳的,大约在3M左右:
接下来点击AllocationTracker,图中的波动是进行了几次旋转屏幕的操作
点击Demo中的startAllocation Button,可以看到内存明显上升了:
我们再点击AllocationTracker,按包名查看下对象的类型,大小,时间等信息,可以看到其中有许多Interger和ByteBuffer类型的变量,(这里我的AllocationTracker中没找到COM的包名,不知何故)同时在logcat中打印了大量的rect的width信息。
START后可以可以看到创建了大量的RECT对象:
在代码中我们看到,在第二个方法中,我们循环创建了大量的Rect对象,并且打印了一个String,包含了rect的width信息。
这个方法应该会造成内存抖动,它创建了大量对象但却没有引用,应该很快会被GC掉,可是这时的MemoryMonitor是平稳的(放大才能看到抖动现象),不知道是不是Android Studio的原因,版本是最新的2.1.1.这个方法中创建的大量对象是我们要进行优化的一个点。
接下来点击startB这个Button,可以在MemoryMonitor看到内存明显上升了,并且LeakCanary弹出了内存泄露的信息,于是我们 通过查看startB这个方法的源码可以看出这是Handler带来的内存泄露问题,延时5000ms执行操作,耗时过长,同时Handler持 有对外部Activity的引用,所以可能在销毁了Activity之后内存还未得到释放,这是我们要优化的第二个点。
详细信息如下:
至此我们完成了对Activity中代码的问题的查找。其中还要注意下 static的Textview,也是个需要优化的点。
并且在view中,我们看到了一个自定义view,在源码中看到其中的onDraw里还进行了创建Rect对象的操作,这也是需要优化的
因为onDraw方法会在绘制过程中会被频繁调用,导致它不断地创建rect对象。
通过对Demo的分析,大致掌握了分析内存问题的一个过程,下面对这周学习的部分优化进行系统记录。
1.内存优化:
先看下主体内容,课件非常好,摘录要点:
这里我们要注意单例模式产生的内存泄露比较容易被忽视,这点需要注意。再分享一个链接:http://blog.csdn.net/u013491687/article/details/51277361
2.视图优化
要避免过度绘制: 利用工具GPU OverDraw和GPU Profiler对过度绘制进行分析:
橙色区域表示处理时间。
主要的优化措施:
友情链接:http://blog.csdn.net/androidzhaoxiaogang/article/details/8673654
3.电量优化
比较重要的一个优化点,超级耗电的APP肯定是要被卸载的。
这里用到了一个Battery Historian工具进行分析:https://github.com/google/battery-historian
主要还是针对网络进行优化,因为接收和上传数据时,芯片一直在工作耗电速度会非常快。