AndroidStudio3.0 Profiler分析器

AndroidStudio3.0之后推出了一个性能检测工具Android Profiler。其功能分为三大模块: CPU、内存 、网络。

1. 如何使用Android Profiler

  • 点击 View > Tool Windows > Android Profiler (还可以点击工具栏的这里写图片描述).

  • 从Android Profiler工具栏中选择要配置的设备和应用程序进程.

  • 启动成功后,界面如下
    这里写图片描述

    1. Android Profiler 是显示该面板的一个工具,如果找不到可以搜这个工具。模块1显示了我们当前调试的手机型号和当前进程号。
    2. 模块2用来控制时间检测轴,分别是放大缩小 显示合适的比例,还有最右边一个工具,点击可以让当前时间轴停下来,再次点击可以让时间轴跳到最近的时间节点上。
    3. 模块3主要是对应用的高级配置,它可以检测用户启动了哪一个Activity,用户的触摸和点击事件也会被检测到,包括屏幕旋转事件等等。
    4. 模块4分别就是我们关心的3个子模块,他们共享同一时间线,通过双击我们可以看到各自模块的具体信息。

2. 如何启动高级检测

上面我们谈到模块2没有显示出来,只是显示了Advanced profilling is unavailable …,如下步骤实现简单的配置:

  1. 点击模块中的 run config 按钮,进入如下面板。可以选中如下选项(但一般情况下默认选项是被禁用的,主要是因为我们的编译版本现在都是27以上的,而他要求最大的版本必须小于26.如果你也有这样的问题继续执行步骤2.),重启AndroidStudio.

    这里写图片描述

  2. 修改编译版本,如下图:

    这里写图片描述

  3. 在module下的build.gradle中禁用Proguard:

    buildTypes {
           release {
               minifyEnabled false
               useProguard false  //添加该代码
               proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
           }
       }

    异步成功后,重新执行步骤1.重启AndroidStudio.并重新使用Android Profiler工具。如果面板还是没法显示,双击面板,则会看到如下界面,蓝色的点表示我们做了一个点击事件,并且此刻MainActivity停止了,而CachingActivity启动了。

    这里写图片描述

3. CPU检测

双击CPU面板,我们可以看到CPU的具体信息界面,如下图:

这里写图片描述

  1. 记录配置:允许您选择以下选项之一以确定分析器记录函数跟踪的方式。

    • Sampled: 一个默认配置,在应用执行期间频繁捕获应用的调用堆栈。 分析器比较捕获的数据集以推导与应用代码执行有关的时间和资源使用信息。
    • Instrumented: 在运行时设置应用以在每个函数调用的开始和结束时记录时间戳。 它收集时间戳并进行比较,以生成函数跟踪数据,包括时间信息和 CPU 使用率。 如果应用短时间内执行大量函数,则分析器可能会迅速超出它的文件大小限制,且不能再记录更多跟踪数据。
  2. 记录按钮: 用于开始和停止记录函数跟踪。

  3. Live : 控制时间轴的暂停和继续运行。

  4. 用户操作检测面板: 可以观察Activity的生命长度,屏幕是否旋转,用户点击等等。

  5. CPU面板:点击暂停时间轴后,将鼠标停放在该面板中,可以观察到我们的APP在此刻占用了多少CPU空间,其他程序(其他APP进程/系统进程)占用的CPU空间。并且我们还能看到目前总线程数为51个。

    这里写图片描述

  6. 线程 Activity 时间线: 列出属于应用进程的每个线程(大部分线程是安卓帮我们应用创建的)并使用下面列出的颜色沿时间线标示它们的活动状态。

    • 绿色: 表示线程处于活动状态或准备使用 CPU。 即,它正在“运行中”或处于“可运行”状态。
    • 黄色: 表示线程处于活动状态,但它正在等待一个I/O操作(如磁盘或网络 I/O),然后才能完成它的工作。
    • 灰色: 表示线程正在休眠且没有消耗任何 CPU 时间。

4. 方法跟踪

这里写图片描述

  1. 该按钮为方法追踪的按钮 , 可以启动/停止追踪某段时间内方法的调用栈。

  2. 选择时间范围: 用于确定您要在跟踪窗格中检查所记录时间范围的哪一部分。 如果您想仅检查所记录时间范围一小部分的函数跟踪数据,您可以点击并拖动突出显示的区域边缘以修改其长度。

  3. 从下拉菜单中选择以下选项之一,以确定如何测量每个函数调用的时间信息:

    • Wall clock time: 方法实际经过的时间。

    • Thread time: 线程消耗 CPU 资源的时间。 对于任何给定函数,其线程时间始终少于或等于其壁钟时间。 使用线程时间可以让您更好地了解线程的实际 CPU 使用率中有多少是给定函数消耗的。

  4. 选择后,可通过 调用图表火焰图Top Down树Bottom Up树 的形式显示您的函数跟踪。这个下面给出详细介绍。

  5. 相关的方法关键字搜索框。

4.1 Call Chart 标签检查跟踪

下图是真实的Call Chart图标,其x轴表示时间段,y轴为显示其被调用者关系。

  • 橙色:对系统 API 的函数调用。
  • 绿色:对应用自有函数的调用。
  • 蓝色:对第三方 API(包括 Java 语言 API)的函数调用。

这里写图片描述

下图为概念图,其展示了一个调用图表示例,并描绘了给定函数的 self time、children time 以及总时间的概念。若要跳转到某个函数的源代码,请右键点击该函数并选择 Jump to Source。 这适用于任一跟踪窗格标签。

这里写图片描述

4.2 Flame Chart 标签检查跟踪

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

这里写图片描述

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

这里写图片描述

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

<img src="/Users/lean/Desktop/Android内存课程/day07/图片/ap13.png" width="80%"/>

请注意,对于火焰图中任何给定的函数调用,消耗最多 CPU 时间的被调用方首先显示。如从底往上在第二维度上,D是消耗最多cpu时间的。

这里写图片描述

4.3 Top Down 标签检查跟踪

Top Down 标签显示一个函数调用列表,在该列表中展开函数节点会显示函数的被调用方。 如下显示的“Top Down”图表。图表中的每个箭头都从调用方指向被调用方。

这里写图片描述

Top Down 标签提供以下信息以帮助说明在每个函数调用上所花费的 CPU 时间 :

  • Self: 表示函数调用在执行自己的代码上所花的时间。
  • Children: 表示函数调用在执行自己的被调用方上所花的时间。
  • 总和: 函数的 SelfChildren 时间的总和。 这表示应用在执行函数调用上所花的总时间。

这里写图片描述

4.4 Bottom Up 标签检查跟踪

这里写图片描述

Bottom Up 标签显示一个函数调用列表,在该列表中展开函数节点将显示函数的调用方。 通过使用左图中展示的跟踪示例,右图为函数 C 提供了一个“Bottom Up”树。

在“Bottom Up”树中打开函数 C 的节点可显示它独有的调用方,即函数 B 和 D。 请注意,尽管 B 调用 C 两次,但在“Bottom Up”树中展开函数 C 的节点时,B 仅显示一次。 然后,展开 B 的节点显示其调用方,即函数 A 和 D。

这里写图片描述

5. Memory检测

Memory Profiler 是 Android Profiler 中的一个组件,可帮助您识别导致应用卡顿、冻结甚至崩溃的内存泄漏和流失。 它显示一个应用内存使用量的实时图表,让您可以捕获堆转储、强制执行垃圾回收以及跟踪内存分配。

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

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

5.1 界面介绍

当您首次打开 Memory Profiler 时,您将看到一条表示应用内存使用量的详细时间线,并可访问用于强制执行垃圾回收、捕捉堆转储和记录内存分配的各种工具。

这里写图片描述

1.用于强制执行GC 的按钮。

2.获取某个时刻中,应用中哪些对象在使用内存。

3.用户记录一个时间段中,哪些对象申请的内存状况。

7.记录内存具体信息:

  • x轴表示当前的运行的时间轴,左y轴表示当前使用了多少内存空间,右y轴表示申请的对象总个数。

  • 具体的数据制表如下:

    这里写图片描述

5.2 分析某个时间段内内存申请状况

点击上图标记3,首次点击开始记录内存信息,再次点击可暂停内存记录,并产生内存分析报表。这里写图片描述

  1. 左上图表示我们记录内存变化的时间段。
  2. 查看是哪些类在该时间段中申请了内存空间,有3种查看方式如下:
    • Arrange by class:基于类名称对所有分配进行分组。
    • Arrange by package:基于软件包名称对所有分配进行分组。
    • Arrange by callstack:将所有分配分组到其对应的调用堆栈。
  3. 该表主要由如下信息表示,选中某个item后jump to source可以查看源码:
    • class Name 指向某个申请内存的类
    • Alloc Count 表示堆中分配对象的数量;
    • Shallow Size 表示对象使用Java内存的大小,单位为byte;
    • Retained Size 表示对象占用的实际内存大小,大于等于Shallow Size;
  4. 当一个类申请了多个实例后,单击某个类名,那么模块4就会显示该类有关的所有实例。选择某个实例,我们可以看到模块5的调用栈关系。如上图调用栈中,上面的方法是被下面的方法所调用的。

5.3 分析某个时间段附近的堆内存信息

点击上图标记2,可以获取某刻手机的内存信息,你可以通过该模块看到如下信息:

  • 您的应用已分配哪些类型的对象,以及每个类型分配多少。
  • 每个对象正在使用多少内存。
  • 在代码中的何处仍在引用每个对象。
  • 对象所分配到的调用堆栈。

在执行操作期间,Java 内存量可能会暂时增加。 这很正常,因为操作与您的应用发生在同一进程中,并需要一些内存来收集数据。

这里写图片描述

要检查您的堆,请按以下步骤操作:

  1. 浏览列表以查找堆计数异常大且可能存在泄漏的对象。点击一个类名称。 此时在右侧将出现 Instance View 窗格,显示该类的每个实例,如图 中所示。
  2. 在 Instance View 窗格中,点击一个实例。此时下方将出现 References (模块3),显示该对象的每个引用(模块2)。 或者,点击实例名称旁的箭头以查看其所有字段,然后点击一个字段名称查看其所有引用。 如果您要查看某个字段的实例详情,右键点击该字段并选择 Go to Instance
  3. References 标签中,如果您发现某个引用可能在泄漏内存,则右键点击它并选择 Go to Instance。 这将从堆转储中选择对应的实例,显示您自己的实例数据。

猜你喜欢

转载自blog.csdn.net/qq285016127/article/details/79906211