Android系统性能调优工具

概述

在软件开发过程中,想必很多读者都遇到过系统性能问题。而解决系统性能问题的几个主要步骤是:

  • 测评:对系统进行大量有针对性的测试,以得到合适的测试数据。
  • 分析系统瓶颈:分析测试数据,找到其中的hotspot(热点,即bottleneck)。
  • 性能优化:对hotspot相关的代码进行优化。
    由上述步骤可知,性能优化的目标对象是hotspot。如果找到的hotspot并非真正的热点,则性能优化的结果必然是事倍功半甚至竹篮打水一场空。所以,作为Android性能调优相关知识的第一部分,本篇首先将向读者介绍Android平台中三个重要的性能测试工具,它们能很好得帮助开发者找到hotspot。

Android官方的性能和功耗的优化介绍: https://developer.android.com/topic/performance/

Android性能相关的关键词:

  1. Android Vitals:Android性能指标
  2. [TraceView] :Android性能分析工具
  3. [dmtracedump] :Google提供的工具,能画函数调用图,dmtracedump和TraceView是一对兄弟,一起使用,用来分析性能

Android 性能指标

Android的性能指标,可以参考Google提供的 Android Vitals 仪表盘只能在Google play store上使用,用来监测APP性能数据.
https://support.google.com/googleplay/android-developer/answer/7385505

  1. ANR比例
  2. Crash 比例
  3. 过度唤醒 WakeLock ,AlarmManager
  4. 过度的后台Wifi扫描
  5. 过度的后台网络使用
  6. 渲染慢,UI 渲染要在16ms以下,60fps即60帧/s以上,不然的话就是Jank(不合格),用户明显能够感受到卡顿现象。

    识别Jank的方法:
    a) 通过在 开发者选项中打开 GPU 渲染开关后,查看柱形条
    b)使用systrace
    c)

Android 性能指标监测工具

Android 性能指标检测工具

Android 常见问题:

  • 内存泄漏:不使用的内存空间(对象)一直被引用着没有得到释放。
  • 内存抖动:短时间内大量创建对象又在短时间内频繁触发GC导致内存波动很大,android虚拟机执行GC操作时需要耗费CPU性能频繁GC会到来严重的性能问题。内存抖动是因为大量的对象被创建又在短时间内马上被释放。瞬间产生大量的对象会严重占用Young Generation的内存区域,当达到阀值,剩余空间不够的时候,也会触发GC。即使每次分配的对象占用了很少的内存,但是他们叠加在一起会增加Heap的压力,从而触发更多其他类型的GC。这个操作有可能会影响到帧率,并使得用户感知到性能问题。
  • 内存溢出:内存泄漏到一定程度超出系统给进程分配的内存大小就会造成内存溢出程序奔溃,或者加载一个或多个大型文件(图片)到内存中也会导致内存溢出。
  • ANR:应用无响应,代码效率过低或者在主线程执行耗时操作。

内存监控工具如下:

Android性能测试工具列表

TraceView

TraceView介绍与用途

TraceView 是 Android SDK 中内置的一个工具,它可以加载 trace 文件,用图形的形式展示代码的执行时间、次数及调用栈,便于我们分析。

从代码层面分析性能问题,针对每个方法来分析,比如当我们发现我们的应用出现卡顿的时候,我们可以来分析出现卡顿时在方法的调用上有没有很耗时的操作,关注以下两个问题:

- 调用次数不多,但是每一次执行都很耗时
- 方法耗时不大,但是调用次数太多

简单一点来说就是我们能找到频繁被调用的方法,也能找到执行非常耗时的方法,前者可能会造成Cpu频繁调用,手机发烫的问题,后者就是卡顿的问题

两方面用途:

  1. 查看跟踪代码的执行时间,分析哪些是耗时操作,主要用于分析方法和线程
  2. 可以用于跟踪方法的调用,尤其是android Framework层的方法调用关系

Traceview是Android平台特有的数据采集和分析工具,它主要用于分析Android中应用程序的hotspot。Traceview本身只是一个数据分析工具,而数据的采集则需要使用Android SDK中的Debug类或者利用DDMS工具。二者的用法如下:

  • 开发者在一些关键代码段开始前调用Android SDK中Debug类的startMethodTracing函数,并在关键代码段结束前调用stopMethodTracing函数。这两个函数运行过程中将采集运行时间内该应用所有线程(注意,只能是Java线程)的函数执行情况,并将采集数据保存到/mnt/sdcard/下的一个文件中。开发者然后需要利用SDK中的Traceview工具来分析这些数据。
  • 借助Android SDK中的DDMS工具。DDMS可采集系统中某个正在运行的进程的函数调用信息。对开发者而言,此方法适用于没有目标应用源代码的情况。DDMS工具中Traceview的使用如图1-1所示。
    图1-1
    图1-1 DDMS中Traceview使用示意图

    点击图1-1中所示按钮即可以采集目标进程的数据。当停止采集时,DDMS会自动触发Traceview工具来浏览采集数据。

TraceView的使用

TraceView工具如何使用
Google官方TraceView 教程:

  1. 使用TraceView收集log https://developer.android.com/studio/profile/generate-trace-logs
  2. 分析TraceView log https://developer.android.com/studio/profile/traceview#timelinepanel

Android代码调试工具 traceview 和 dmtracedump的波折演绎 https://blog.csdn.net/yiyaaixuexi/article/details/6716884 此文的优点:可以使用dmtracedump来输出函数调用关系图

以下章节来自:
Android 性能优化:使用 TraceView 找到卡顿的元凶

生成TraceView文件

生成 trace 文件有三种方法:

  1. 使用代码
  2. 使用 Android Studio
  3. 使用 DDMS

使用代码生成trace文件

android.os.Debug类,其中重要的两个方法Debug.startMethodTracing()和Debug.stopMethodTracing()。这两个方法用来创建.trace文件,将从Debug.startMethodTracing()开始,到Debug.stopMethodTracing()结束,期间所有的调用过程保存在.trace文件中,包括调用的函数名称和执行的时间等信息。
把下面代码分别在加在调试起始代码的位置,和终止位置。

1
2
3
Debug.startMethodTracing(Environment.getExternalStorageDirectory().getPath()+"/"+TAG);    //开始 trace,保存文件到外部存储空间的TAG.trace,/mnt/sdcard目录下
// ...
Debug.stopMethodTracing(); //结束

代码很简单,当你调用开始代码的时候,系统会生产 trace 文件,并且产生追踪数据,当你调用结束代码时,会将追踪数据写入到 trace 文件中。

下一步使用 adb 命令将 trace 文件导出到电脑:

1
adb pull /sdcard/TAG.trace /tmp

使用代码生成 trace 方式的好处是容易控制追踪的开始和结束,缺点就是步骤稍微多了一点。

使用Android Studio生成trace文件

暂时没有用过

使用Android Device Monitor生成Trace文件

参考: Android性能专项测试之TraceView工具(Device Monitor)

根据 TraceView 显示内容定位问题

定位问题时 TraceView 的使用方式:

  • 从上半部分查看哪些线程执行时间长?什么时候开始执行?与主线程交错时间?
  • 哪些方法的执行需要花费很长时间点击 TraceView 中的 Cpu Time/Call,按照占用 CPU 时间从高到低排序
  • 哪些方法调用次数非常频繁,点击 TraceView 中的 Calls + Recur Calls/Total ,按照调用次数从高到底排序排序后,然后逐个排查是否有项目代码或者依赖库代码,有的话点击查看详情,查看是这个方法还是调用的子方法的问题,进一步定位问题。

Systrace

Systrace简介

Systrace是Android4.1中新增的性能数据采样和分析工具。它可帮助开发者收集Android关键子系统(如surfaceflinger、WindowManagerService等Framework部分关键模块、服务)的运行信息,从而帮助开发者更直观的分析系统瓶颈,改进性能。

Systrace的功能包括跟踪系统的I/O操作、内核工作队列、CPU负载以及Android各个子系统的运行状况等。在Android平台中,它主要由3部分组成:

  • 内核部分:Systrace利用了Linux Kernel中的ftrace功能。所以,如果要使用Systrace的话,必须开启kernel中和ftrace相关的模块。
  • 数据采集部分:Android定义了一个Trace类。应用程序可利用该类把统计信息输出给ftrace。同时,Android还有一个atrace程序,它可以从ftrace中读取统计信息然后交给数据分析工具来处理。
  • 数据分析工具:Android提供一个systrace.py(python脚本文件,位于Android SDK目录/platform-tools/systrace中,其内部将调用atrace程序)用来配置数据采集的方式(如采集数据的标签、输出文件名等)和收集ftrace统计数据并生成一个结果网页文件供用户查看。

从本质上说,Systrace是对Linux Kernel中ftrace的封装。应用进程需要利用Android提供的Trace类来使用Systrace。Android 4.1为系统中的几个关键进程和模块都添加了Systrace功能。以显示系统中重要模块Hwcomposer为例,其代码中使用Systrace的方法如图2-1所示:

Oprofile

内存泄漏

Android 内存泄漏总结
Android 内存泄漏案例和解析
Handler内存泄漏分析及解决

参考资料

Android系统性能调优工具介绍 介绍了TraceView、Systrace、Oprofile等性能分析工具
Android Vitals各性能指标介绍 Google官方的性能介绍
Android 性能指标检测工具
Android 编程下的 TraceView 简介及其案例实战
Android 性能优化:使用 TraceView 找到卡顿的元凶
Android性能优化(一)之启动加速35%
Android 性能优化:使用 Lint 优化代码、去除多余资源
Android 性能优化:多线程

[第 30 期] Android 周报 有些性能的文章

Android性能分析工具Systrace和TraceView的使用

Android 性能优化最佳实践