美文网首页
TraceView替换方案CPU Profiler

TraceView替换方案CPU Profiler

作者: perry_Fan | 来源:发表于2019-02-11 21:09 被阅读0次

    首先,我们回顾一下TraceView。

    TraceView 是Android SDK自带的工具,用来分析函数调用过程,可以对Android的应用程序以及Framework层的代码进行性能分析。它是一个图形化的工具,最终会产生一个图表,用于对性能分析进行说明,可以分析到应用具体每一个方法的执行时间,使用非常直观简单,分析性能问题很简便。

    TraceView使用方法

    (1)在DDMS中使用。连接设备,打开应用,打开DDMS,单击Start Method of Profiling 按钮,在应用中操作需要监控的点比如进入一个Activity或者滑动一个列表,完成后单击Stop Method Profiling,结束后会自动跳转到TraceView视图。这种方法使用方便,但监控范围不够精确,如果需要精确监控某一个路径,就需要使用下一个方法:在代码中加入调试语句保存Trace文件。
    (2)代码中加入调试语句保存trace文件
    在android.os.Debug类中提供了相应的方法,过程很简单步骤如下:
    1)在需要开始监控的地方调用startMethodTracing();
    2)在需要结束监控的地方调用stopMethodTracing();
    3)系统会在SD卡中创建<trace-name>.trace文件。
    4)使用traceview打开该文件进行分析。

       // start tracing to "/sdcard/ui_performance.trace"
       Debug.startMethodTracing("ui_performance");
        //...
       // stop tracing
       Debug.stopMethodTracing();
    

    在应用程序中调用startMethodTracing()时,系统会在指定的路径上创建一个名为<trace_filename>.trace 文件。这个文件包含了方法名跟踪数据,以及与线程和方法名的映射表。然后系统开始缓存应用产生的跟踪数据,知道应用程序调用stopMethodTracing()结束,此时将其缓冲的数据写入输出文件中。如果系统达到最大缓存大小时,还没有调用stopMethodTracing(),系统会停止跟踪并发送一个通知。
    关于TraceView查看耗时,主要关注Calls+Recur Calls/Total 和 Cpu Time / Call 这两个值,也就是关注调用次数多少和耗时多久的方法,然后优化这些方法的逻辑和调用次数,减小耗时。

    新的解决方案CPU Profiler

    使用CPUProfiler 来实现CPU使用率检测和使用Activity,并记录函数跟踪。以便您可以优化和调试您的应用代码。
    它集成在Android Studio 3.2版本之后的Android Profiler工具当中。

    要打开 CPU Profiler,请按以下步骤操作:

    1. 点击 View > Tool Windows > Android Profiler(也可以点击工具栏中的 Android Profiler
    2. 从 Android Profiler 工具栏中选择您想要分析的设备和应用进程。 如果您通过 USB 连接了某个设备但该设备未在设备列表中列出,请确保您已[启用 USB 调试]
    3. 点击 CPU 时间线中的任意位置即可打开 CPU Profiler。

    为什么要分析 CPU 使用率

    最大限度减少应用的 CPU 使用率具有许多优势,如提供更快更顺畅的用户体验,以及延长设备电池续航时间。 它还可帮助应用在各种新旧设备上保持良好性能。 与应用交互时,您可以使用 CPU Profiler 监控 CPU 使用率和线程 Activity。

    对于应用进程中的每个线程,您可以查看一段时间内执行了哪些函数,以及在其执行期间每个函数消耗的 CPU 资源。 您还可以使用函数跟踪来识别调用方和被调用方。 调用方指调用其他函数的函数,而被调用方是指被其他函数调用的函数。 您可以使用此信息确定哪些函数负责调用常常会消耗大量特定资源的任务,并尝试优化应用代码以避免不必要的工作。

    如果想收集可帮助您检查原生系统进程的详细系统级数据,并解决掉帧引起的界面卡顿,您应使用 systrace
    如果想导出您使用 Debug 类捕获的 .trace 文件,您应使用 Traceview

    CPU Profiler 概览

    当您打开 CPU Profiler 时,它将立即开始显示应用的 CPU 使用率和线程 Activity。 您应该会看到类似图 1 的一些内容:


    CPU profiler.png

    如图 1 所示,CPU Profiler 的默认视图包括以下内容:

    1. Event 时间线: 显示应用中在其生命周期不同状态间转换的 Activity,并表明用户与设备的交互,包括屏幕旋转 Event。 如需了解有关 Event 时间线的更多信息,包括如何启用它,请阅读 启用高级分析
    2. CPU 时间线: 显示应用的实时 CPU 使用率(以占总可用 CPU 时间的百分比表示)以及应用使用的总线程数。 此时间线还显示其他进程的 CPU 使用率(如系统进程或其他应用),以便您可以将其与您的应用使用率进行对比。 通过沿时间线的水平轴移动鼠标,您还可以检查历史 CPU 使用率数据。
    3. 线程 Activity 时间线: 列出属于应用进程的每个线程并使用下面列出的颜色沿时间线标示它们的 Activity。 在您记录一个函数跟踪后,您可以从此时间线中选择一个线程以在跟踪窗格中检查其数据。
      • 绿色: 表示线程处于活动状态或准备使用 CPU。 即,它正在“运行中”或处于“可运行”状态。
      • 黄色: 表示线程处于活动状态,但它正在等待一个 I/O 操作(如磁盘或网络 I/O),然后才能完成它的工作。
      • 灰色: 表示线程正在休眠且没有消耗任何 CPU 时间。 当线程需要访问尚不可用的资源时偶尔会发生这种情况。 线程进入自主休眠或内核将此线程置于休眠状态,直到所需的资源可用。
    4. 记录配置: 允许您选择以下选项之一以确定分析器记录函数跟踪的方式。
      • Sampled: 一个默认配置,在应用执行期间频繁捕获应用的调用堆栈。 分析器比较捕获的数据集以推导与应用代码执行有关的时间和资源使用信息。 基于“Sampled”的跟踪的固有问题是,如果应用在捕获调用堆栈后进入一个函数并在下一次捕获前退出该函数,则分析器不会记录该函数调用。 如果您对此类生命周期很短的跟踪函数感兴趣,您应使用“Instrumented”跟踪。
      • Instrumented: 一个默认配置,在运行时设置应用以在每个函数调用的开始和结束时记录时间戳。 它收集时间戳并进行比较,以生成函数跟踪数据,包括时间信息和 CPU 使用率。 请注意,与设置每个函数关联的开销会影响运行时性能,并可能会影响分析数据,对于生命周期相对较短的函数,这一点更为明显。 此外,如果应用短时间内执行大量函数,则分析器可能会迅速超出它的文件大小限制,且不能再记录更多跟踪数据。
      • Edit configurations: 允许您更改上述“Sampled”和“Instrumented”记录配置的某些默认值,并将它们另存为自定义配置。 如需了解更多信息,请转到创建记录配置部分。
    5. 记录按钮: 用于开始和停止记录函数跟踪。 如需了解更多信息,请转到记录和检查函数跟踪部分 。

    记录和检查函数跟踪

    要开始记录函数跟踪,从下拉菜单中选择 SampledInstrumented 记录配置,或选择您创建的自定义记录配置,然后点击 Record

    。 与应用交互并在完成后点击 Stop recording

    。 分析器将自动选择记录的时间范围,并在函数跟踪窗格中显示其跟踪信息,如图 2 所示。如果您想检查另一个线程的函数跟踪,只需从线程 Activity 时间线中选中它。


    图2 记录函数跟踪后的 CPU Profiler

    1.选择时间范围: 用于确定您要在跟踪窗格中检查所记录时间范围的哪一部分。 当您首次记录函数跟踪时,CPU Profiler 将在 CPU 时间线中自动选择您的记录的完整长度。 如果您想仅检查所记录时间范围一小部分的函数跟踪数据,您可以点击并拖动突出显示的区域边缘以修改其长度。
    2.时间戳: 用于表示所记录函数跟踪的开始和结束时间(相对于分析器从设备开始收集 CPU 使用率信息的时间)。 在选择时间范围时,您可以点击时间戳以自动选择完整记录,如果您有多个要进行切换的记录,则此做法尤其有用。
    3.跟踪窗格: 用于显示您所选的时间范围和线程的函数跟踪数据。 仅在您至少记录一个函数跟踪后此窗格才会显示。 在此窗格中,您可以选择想如何查看每个堆叠追踪(使用跟踪标签),以及如何测量执行时间(使用时间引用下拉菜单)。
    4.选择后,可通过 Top Down 树、Bottom Up 树、调用图表或火焰图的形式显示您的函数跟踪。 您可以在下文中了解每个跟踪窗格标签的更多信息。
    5.从下拉菜单中选择以下选项之一,以确定如何测量每个函数调用的时间信息:

    Wall clock time:壁钟时间信息表示实际经过的时间。
    Thread time:线程时间信息表示实际经过的时间减去线程没有消耗 CPU 资源的任意时间部分。 对于任何给定函数,其线程时间始终少于或等于其壁钟时间。 使用线程时间可以让您更好地了解线程的实际 CPU 使用率中有多少是给定函数消耗的。

    使用 Call Chart 标签检查跟踪

    Call Chart 标签提供函数跟踪的图形表示形式,其中,水平轴表示函数调用(或调用方)的时间段和时间,并沿垂直轴显示其被调用者。 对系统 API 的函数调用显示为橙色,对应用自有函数的调用显示为绿色,对第三方 API(包括 Java 语言 API)的函数调用显示为蓝色。 下面的图 3 展示了一个调用图表示例,并描绘了给定函数的 self time、children time 以及总时间的概念。 您可以在如何使用 Top Down 和 Bottom Up 检查跟踪部分详细了解这些概念。

    图 3. 一个调用图表示例,描绘了函数 D 的 self、children 及总时间

    使用 Flame Chart 标签检查跟踪

    Flame Chart 标签提供一个倒置的调用图表,其汇总相同的调用堆栈。 即,收集共享相同调用方顺序的完全相同的函数,并在火焰图中用一个较长的横条表示它们(而不是将它们显示为多个较短的横条,如调用图表中所示)。 这样更方便您查看哪些函数消耗最多时间。 不过,这也意味着水平轴不再代表时间线,相反,它表示每个函数相对的执行时间。

    为帮助说明此概念,请考虑以下图 4 中的调用图表。 请注意,函数 D 多次调用 B(B1、B2 和 B3),其中一些对 B 的调用也调用了 C(C1 和 C3)。


    图 4. 包含多个共享通用调用方顺序的函数调用的调用图表

    由于 B1、B2 和 B3 共享相同的调用方顺序 (A → D → B),因此,可将它们汇总在一起,如下所示。 同样,将 C1 和 C3 汇总在一起,因为它们也共享相同的调用方顺序 (A → D → B → C)—请注意,未包含 C2,因为它具有不同的调用方顺序 (A → D → C)。


    图 5. 汇总共享相同调用堆栈的相同函数

    汇总的函数调用用于创建火焰图,如图 6 所示。请注意,对于火焰图中任何给定的函数调用,消耗最多 CPU 时间的被调用方首先显示。


    图 6 显示的调用图表的火焰图表示形式

    引用:
    1.《Android应用性能优化最佳实践》

    1. 官方文档:https://developer.android.com/studio/profile/cpu-profiler#method_traces

    相关文章

      网友评论

          本文标题:TraceView替换方案CPU Profiler

          本文链接:https://www.haomeiwen.com/subject/zasdkqtx.html