Android性能优化一些理解

注:之前对Android的优化有了解,工具也懂,就是分析不太熟练,无从下手的感觉,看了Google Android 性能优化 的视频,比较系统的学习了这块,感觉有的时候能力到了在看收获比较大,特作学习备注。

Render 渲染

  1. Android 屏幕 每秒刷新60hz,相当于16ms渲染,超过16ms,将在下次16ms中刷新,故产生卡顿。
  2. cpu gpu 必须遵守相应的规则才能发挥正确的作用
    cpu: 重建显示列表次数过多,二是花费太多的时间作废视图层次,并进行不需要的重绘。
    gpu: 透支、多度绘制,过度着色的时候,浪费gpu处理时间。
  3. Android的绘制原理:是将图像进行栅格化(Rasterization),拆分到不同的像素上在屏幕上进行显示。栅格化是一项非常耗时的操作。设备中gpu就是为了加速栅格化这个操作的。cpu在处理之前会发送一些指令给gpu,这一过程通常使用的API就是Android中的OpenGL ES。
  4. 可以通过 “开发者模式” 中打开 “GPU绘制”,观察界面颜色,检测应用是否过度绘制。
image_4.jpg
  1. Canvas.clipRect 帮助你识别给定View的图形边界。边界之外的区域任何绘制操作会被忽略。不用懂得重叠原理,通过 Canvas.quickReject 可以判断给定区域是否完全在剪辑矩形之外。
    通过Canvas.clipRect可以实现如下效果:
image_5_1.png
image_5_2.png
  1. hierachy Viewer检测

Compute 计算

执行浮点型的运算是整数或boolean数值的4倍,原因在于芯片架构,当然有些时候需要你理解底层的结构。为了优化你的代码,你需要理解系统是如何运行代码的。

  1. 缓慢的函数执行通常有两方面问题造成:
1.执行速度缓慢的函数。
2.成千上百个函数。需要进行分析,各个击破
  1. 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();
  1. batching and caching 批处理和缓存
 批处理能很大程度上解决每个运算的独立执行开销。

 缓存
  1. 将耗时操作从UI移除:解码图像是一项艰巨的任务。这也是我们不能轻易优化的任务。对于长时间运行的任务,尤其是那些涉及到网络访问、冗长的数据库调用和图像处理的任务,一般的规则是将它们从主线程中移走

  2. Java中使用适当的集合容器:

image_6.png

存储和修改应用程序数据的代码的性能问题

Memory GC and Performance

  1. 内存泄漏:通常指无法被释放的内存块。

  2. 内存溢出:申请的对象内存过大超过了剩余可用内存,内存泄漏会缓慢吞噬程序中可用内存,最终也会造成内存溢出。如下图

image_9.png
  1. Java中通常不需要我们去管理操作申请、释放内存。随着应用的操作进行,系统会自动处理内存的清理。当大量GC操作的时候,很产生很大程度上的掉帧(超过16ms的呈像刷新)。

  2. 为了减少任意帧内启动GC的次数,需要着重优化程序的内存使用量。
    这里推荐 “Memory Monitor”工具 可以大体直观得到程序在一段时间内占用的内存

image_7.png
一个图形显示java内存的时间。
显示垃圾收集(GC)事件随着时间的推移。
快速测试APP是否慢可能与过度的垃圾收集事件有关。
快速测试应用程序崩溃是否与内存耗尽有关。
  1. Heap Viewer 检测程序详细的内存占用
    Heap Viewer可以清楚的显示分配的类型、数量以及各自在堆中的容量。
image_8.png
 Android studio中打开DDMS
 1.图3 显示当前可用对象,以及个数占用的大小
 2.图4 显示这一数据的内存分配的数量
  1. 先用 Memory Monitor观察 在用Heap Viewer
    检测

  2. Allocation Tracker 分配追踪 Heap Viewer不能显示内存具体分配的代码的何处,所以有了Allocation Tracker工具.

Allocation Tracker

  1. Tool Strengths
     1.Memory Monitor 比较好的方式展示内存变化的动态视图。
     2.heap Viewer 比较好的展示详细数据在你的堆中。
     3.Allocation tracker 定位内存在你的代码中。
    
  2. MAT工具的使用以及多hprof对比检测内存泄漏

推荐 内存分析工具 MAT 的使用

推荐阅读更多精彩内容