Android性能优化一些理解
2017-09-24 本文已影响109人
一洼世界
注:之前对Android的优化有了解,工具也懂,就是分析不太熟练,无从下手的感觉,看了Google Android 性能优化 的视频,比较系统的学习了这块,感觉有的时候能力到了在看收获比较大,特作学习备注。
Render 渲染
- Android 屏幕 每秒刷新60hz,相当于16ms渲染,超过16ms,将在下次16ms中刷新,故产生卡顿。
-
cpu gpu 必须遵守相应的规则才能发挥正确的作用
cpu: 重建显示列表次数过多,二是花费太多的时间作废视图层次,并进行不需要的重绘。
gpu: 透支、多度绘制,过度着色的时候,浪费gpu处理时间。 - Android的绘制原理:是将图像进行栅格化(Rasterization),拆分到不同的像素上在屏幕上进行显示。栅格化是一项非常耗时的操作。设备中gpu就是为了加速栅格化这个操作的。cpu在处理之前会发送一些指令给gpu,这一过程通常使用的API就是Android中的OpenGL ES。
- 可以通过 “开发者模式” 中打开 “GPU绘制”,观察界面颜色,检测应用是否过度绘制。
-
Canvas.clipRect 帮助你识别给定View的图形边界。边界之外的区域任何绘制操作会被忽略。不用懂得重叠原理,通过 Canvas.quickReject 可以判断给定区域是否完全在剪辑矩形之外。
通过Canvas.clipRect可以实现如下效果:
- hierachy Viewer检测
Compute 计算
执行浮点型的运算是整数或boolean数值的4倍,原因在于芯片架构,当然有些时候需要你理解底层的结构。为了优化你的代码,你需要理解系统是如何运行代码的。
- 缓慢的函数执行通常有两方面问题造成:
1.执行速度缓慢的函数。
2.成千上百个函数。需要进行分析,各个击破
- TraceView
我们能得到的信息:直观了解到每个线程中方法的执行时间。
TraceView的两种使用方式:
方法一:
通过DDMS 选择需要检测的包名,点击"start method profiling",操作应用中需要检测耗时的逻辑,再次点击 "stop method profiling" 生成 .trace检测图标
通常看的几个信息点:
1.条形的宽度表示方法的执行时间
2.excl CPU time 独占CPU时间: 执行方法本身所用的时间,Incl CPU time 减去内部所有函数所用时间
3.incl CPU time 非独占CPU时间: 这个函数和函数中所有在其内部调用的所有方法所用的时间。
4.call and recursion 方法调用了多少次,或递归调用了多少次
方法二:
Trace.beginSection("Data structures");
...//需要检测时间的代码
Trace.endSection();
- batching and caching 批处理和缓存
批处理能很大程度上解决每个运算的独立执行开销。
缓存
-
将耗时操作从UI移除:解码图像是一项艰巨的任务。这也是我们不能轻易优化的任务。对于长时间运行的任务,尤其是那些涉及到网络访问、冗长的数据库调用和图像处理的任务,一般的规则是将它们从主线程中移走
-
Java中使用适当的集合容器:
存储和修改应用程序数据的代码的性能问题
Memory GC and Performance
-
内存泄漏:通常指无法被释放的内存块。
-
内存溢出:申请的对象内存过大超过了剩余可用内存,内存泄漏会缓慢吞噬程序中可用内存,最终也会造成内存溢出。如下图
-
Java中通常不需要我们去管理操作申请、释放内存。随着应用的操作进行,系统会自动处理内存的清理。当大量GC操作的时候,很产生很大程度上的掉帧(超过16ms的呈像刷新)。
-
为了减少任意帧内启动GC的次数,需要着重优化程序的内存使用量。
这里推荐 “Memory Monitor”工具 可以大体直观得到程序在一段时间内占用的内存
一个图形显示java内存的时间。
显示垃圾收集(GC)事件随着时间的推移。
快速测试APP是否慢可能与过度的垃圾收集事件有关。
快速测试应用程序崩溃是否与内存耗尽有关。
-
Heap Viewer 检测程序详细的内存占用
Heap Viewer可以清楚的显示分配的类型、数量以及各自在堆中的容量。
Android studio中打开DDMS
1.图3 显示当前可用对象,以及个数占用的大小
2.图4 显示这一数据的内存分配的数量
-
先用 Memory Monitor观察 在用Heap Viewer
检测 -
Allocation Tracker 分配追踪 Heap Viewer不能显示内存具体分配的代码的何处,所以有了Allocation Tracker工具.
- Tool Strengths
1.Memory Monitor 比较好的方式展示内存变化的动态视图。 2.heap Viewer 比较好的展示详细数据在你的堆中。 3.Allocation tracker 定位内存在你的代码中。
- MAT工具的使用以及多hprof对比检测内存泄漏