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绘制”,观察界面颜色,检测应用是否过度绘制。

    logo

  5. Canvas.clipRect 帮助你识别给定View的图形边界。边界之外的区域任何绘制操作会被忽略。不用懂得重叠原理,通过 Canvas.quickReject 可以判断给定区域是否完全在剪辑矩形之外。
    通过Canvas.clipRect可以实现如下效果:

    logo
    logo

  6. hierachy Viewer检测

Compute 计算

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

  1. 缓慢的函数执行通常有两方面问题造成:

    1
    2
    1.执行速度缓慢的函数。
    2.成千上百个函数。需要进行分析,各个击破
  2. TraceView
    我们能得到的信息:直观了解到每个线程中方法的执行时间。

    TraceView的两种使用方式:

    方法一:

    1
    通过DDMS 选择需要检测的包名,点击"start method profiling",操作应用中需要检测耗时的逻辑,再次点击 "stop method profiling" 生成 .trace检测图标
    1
    2
    3
    4
    5
    通常看的几个信息点:
    1.条形的宽度表示方法的执行时间
    2.excl CPU time 独占CPU时间: 执行方法本身所用的时间,Incl CPU time 减去内部所有函数所用时间
    3.incl CPU time 非独占CPU时间: 这个函数和函数中所有在其内部调用的所有方法所用的时间。
    4.call and recursion 方法调用了多少次,或递归调用了多少次

    方法二:

    1
    2
    3
    Trace.beginSection("Data structures");
    ...//需要检测时间的代码
    Trace.endSection();
  3. batching and caching 批处理和缓存

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

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

    logo

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

Memory GC and Performance

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

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

    内存占用

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

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

    内存占用

    1
    2
    3
    4
    一个图形显示java内存的时间。
    显示垃圾收集(GC)事件随着时间的推移。
    快速测试APP是否慢可能与过度的垃圾收集事件有关。
    快速测试应用程序崩溃是否与内存耗尽有关。
  5. Heap Viewer 检测程序详细的内存占用
    Heap Viewer可以清楚的显示分配的类型、数量以及各自在堆中的容量。
    Heap Viewer 使用

    1
    2
    3
    Android studio中打开DDMS
    1.图3 显示当前可用对象,以及个数占用的大小
    2.图4 显示这一数据的内存分配的数量
  6. 先用 Memory Monitor观察 在用Heap Viewer
    检测

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

    Allocation Tracker

  8. Tool Strengths

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

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