卡顿直接原因:绘制一帧的时间>16ms
根本原因:
1)UI线程做了耗时操作(严重ANR)
2)布局过于复杂,嵌套多,overdraw
3)内存GC被频繁触发
分析方法:
1)HierarchyViewer会显示绘制每个view时(onMeasure、onLayout和onDraw的耗时),找出哪个view的绘制导致了掉帧,优化其布局;
2)
设置->开发者选项->调试GPU过度绘制(overdraw
)
3)Android Studio 鼠标放在代码区点击右键->Analyze->Inspect Code–>界面选择你要检测的模块->点击确认开始检测,会提示布局及逻辑的问题
4)Traceview定位具体耗时的方法
优化策略:
1) overdraw:优化布局层级(多在xml中使用include标签复用布局、使用merge标签去除不必要的布局层级(配合include使用,即include的布局的根节点不是RelativeLayot或Linearlayout二十merge标签)、使用ViewStub标签实现按需加载)、移除不必要的背景、invisible尽量用gone代替、onDraw中尽量用
canvas.clipRect()指定绘制区域
2)GC频繁导致内存抖动:
GC原因:GC_MALLOC——内存分配失败时触发;GC_CONCURRENT——当分配的对象大小超过一个限定值(不同系统)时触发;GC_EXPLICIT——对垃圾收集的显式调用(System.gc()) ;GC_EXTERNAL_ALLOC——外部内存分配失败时触发;