Android性能优化小结
学习笔记小结
一、关于UI优化
1.overdraw和多层布局嵌套不等同。多层布局嵌套不一定导致overdraw。
2.打开真机GPU测试,蓝色为可以接受的,一般导致Overdraw的原因是多层嵌套和背景颜色。
3.Hierarchy Viewer检测嵌套。XML中布局一般最好不要超过2层。
4.include的布局根布局最好用merge。
5.ViewStub延迟初始化。
6.工具:TraceView \Hierarchy Viewer\真机GPU
Profiling GPU Rendering
根据Android性能优化典范,打开设备的GPU配置渲染工具——》在屏幕上显示为条形图,可以协助我们定位UI渲染问题。
GPU呈现模式分析
从Android M版本开始,GPU Profiling工具把渲染操作拆解成如下8个详细的步骤进行显示。
渲染八步骤
- Swap Buffers:表示处理任务的时间,也可以说是CPU等待GPU完成任务的时间,线条越高,表示GPU做的事情越多;
- Command Issue:表示执行任务的时间,这部分主要是Android进行2D渲染显示列表的时间,为了将内容绘制到屏幕上,Android需要使用Open GL ES的API接口来绘制显示列表,红色线条越高表示需要绘制的视图更多;
- Sync & Upload:表示的是准备当前界面上有待绘制的图片所耗费的时间,为了减少该段区域的执行时间,我们可以减少屏幕上的图片数量或者是缩小图片的大小;
- Draw:表示测量和绘制视图列表所需要的时间,蓝色线条越高表示每一帧需要更新很多视图,或者View的onDraw方法中做了耗时操作;
- Measure/Layout:表示布局的onMeasure与onLayout所花费的时间,一旦时间过长,就需要仔细检查自己的布局是不是存在严重的性能问题;
- Animation:表示计算执行动画所需要花费的时间,包含的动画有ObjectAnimator,ViewPropertyAnimator,Transition等等。一旦这里的执行时间过长,就需要检查是不是使用了非官方的动画工具或者是检查动画执行的过程中是不是触发了读写操作等等;
- Input Handling:表示系统处理输入事件所耗费的时间,粗略等于对事件处理方法所执行的时间。一旦执行时间过长,意味着在处理用户的输入事件的地方执行了复杂的操作;
- Misc Time/Vsync Delay:表示在主线程执行了太多的任务,导致UI渲染跟不上vSync的信号而出现掉帧的情况;出现该线条的时候,可以在Log中看到这样的日志:
备注:GPU配置渲染工具虽然可以定位出问题发生在某个步骤,但是并不能定位到具体的某一行;当我们定位到某个步骤之后可以使用工具TraceView进行更加详细的定位。
二、关于内存优化
1.内存泄漏检测工具Memory Monitor\MAT\LeakCanary
Memory Monitor
AndroidStudio自带的Memory Monitor可以方便的观察堆内存的分配情况,并且可以粗略的观察有没有Memory Leak。
频繁的内存抖动,可能存在内存泄漏
- A:initiate GC 手动触发GC操作;
- B:Dump Java Heap 获取当前的堆栈信息,生成一个.hprof文件,AndroidStudip会自动使用HeapViewer打开;一般用于操作之后检测内存泄漏的情况;
- C:Start Allocation Tracking 内存分配追踪工具,用于追踪一段时间的内存分配使用情况,能够知道执行一些列操作后,有哪些对象被分配空间。一般用于追踪某项操作之后的内存分配,调整相关的方法调用来优化app性能与内存使用;
- D:剩余可用内存;
- E:已经使用的内存。
点击Memory Monitor的Dump Java Heap,会生成一个.hprof文件,AndroidStudio会自动使用HeapViewer打开。
Hprof Viewer打开.hprof文件
左面板说明:
- Total Count 该类的实例个数
- Heap Count 选定的Heap中实例的个数
- Sizeof 每个实例占用的内存大小
- Shallow Size 所有该类的实例占用的内存大小
- Retained Size 该类的所有实例可支配的内存大小
右面板说明:
- Instance 该类的所有实例对象(左侧Total Count为15,此处就有15个对象)
- Depth 深度, GC Root点到该实例的最短链路数
- Dominating Size 该实例可支配的内存大小
此处可以看出MainActivity存在了15个示例对象,怀疑此处有问题。