Android Profiler 简介和实践入门——CPU

概述:

Android Studio 3.0及更高版本中的Android Profiler窗口取代了 Android Monitor工具。这些分析工具为应用程序的CPU,内存和网络活动提供实时数据,可以执行基于样本的方法跟踪来计算代码执行时间,捕获堆转储,查看内存分配以及检查网络传输文件的详细信息,此工具集成的调试功能大大的提高了开发效率,方便发现代码中存在的耗时和内存问题,相信使用过的同学都深有体会,本文结合具体示例讲解此工具的使用,旨在对Android Profiler 的使用入门

Android Profiler简介

  • 打开Android Profiler :单击视图>工具窗口> Android Profiler(您也可以单击 工具栏中的Android Profiler )
  • 调试窗口介绍(此处引用谷歌官方的图片)

  1. 为要选择调试的设备
  2. 要调试的进程
  3. 窗口时间线的缩放按钮
  4. 实时更新的开关按钮
  5. 显示活动状态,用户输入事件和屏幕旋转事件的事件时间线 

CPU调试工具

     衡量一个程序的用户体验,很大的成都取决与应用的响应速度和体验的流畅度,而CPU的使用率验证影响着产品的性能,cpu使用率越高,程序越容易出现卡顿的想象,且耗电量也会增加,这种情况在老得机型上会显得更加严重,所以最大限度地减少应用程序的CPU使用率有许多优点,例如提供更快,更流畅的用户体验,以及保持设备电池寿命。

操作窗口介绍

  1. 事件时间轴:显示应用在其生命周期中的不同状态转换时的活动,并指示用户与设备的交互,包括屏幕旋转事。
  2. CPU时间线:显示应用程序的实时CPU使用率 - 占总可用CPU时间的百分比 - 以及应用程序使用的线程总数。时间线还显示其他进程(例如系统进程或其他应用程序)的CPU使用情况,因此您可以将其与应用程序的使用情况进行比较。您可以通过沿时间轴的水平轴移动鼠标来检查历史CPU使用率数据
  3. 线程活动时间轴:列出属于您的应用程序进程的每个线程,并使用下面列出的颜色在时间轴上指示它们的活动。记录方法跟踪后,可以从此时间轴中选择一个线程,以在跟踪窗格中检查其数据。
    绿色:线程处于活动状态或准备使用CPU。也就是说,它处于“运行”或“可运行”状态。
    黄色:线程处于活动状态,但它正在等待I / O操作,例如磁盘或网络I / O,然后才能完成其工作。
    灰色:线程处于休眠状态,不消耗任何CPU时间。当线程需要访问尚不可用的资源时,有时会发生这种情况。线程进入自愿休眠状态,或者内核将线程置于休眠状态,直到所需资源可用。
  4. 录制配置:允许您选择以下选项之一以确定探查器如何记录方法跟踪
  5. 录制按钮:开始和停止录制方法轨迹

记录并检查方法

  • 点击录制按钮开始录制--》开始交互--》点击录制按钮结束录制

检查跟踪信息

  • 使用callChart 查看

  1. 上述D方法中调用顺序 : 方法D调用 B、C     方法B中调用C
  2. 所以方法D的执行时间(图标的长度)为 :B的时间 +  C的时间  + D自身的时间
  • 使用Flame Chart查看

Flame Chart”选项卡提供反向调用图表,用于聚合相同的调用堆栈。也就是说,收集共享相同序列的呼叫者的相同方法并将其表示为火焰图中的一个较长的条,若B1、B2、B3的调用顺序为一样则 B1、B2、B3聚合,同理C1和C3聚合

此时对应的 Flame Chart 为

  • Top Down 和 Bottom Up

“ Top Down”选项卡提供以下信息,以帮助描述在每个方法调用上花费的CPU时间(时间也表示为线程在所选时间范围内的总时间的百分比):

  • Self:方法调用执行自己的代码而不是其callees的时间
  • 子项:方法调用执行其被调用者而不是自己的代码所花费的时间
  • 总计:方法的自己和chi l d时间的总和

到此CPU的使用方式和查看跟踪信息介绍完毕,下面我们用一个简单的示例来使用CPU调试,在一个方法中调用三个耗时方法,分别睡眠2秒、2秒和4秒,程序代码如下:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    Debug.startMethodTracing("MemoryTest")
    tvHello.setOnClickListener { prepare() }
}
private fun prepare() {
    prepareFirst()
    prepareSecond()
    prepareThird()
}
private fun prepareFirst() {
    Thread.sleep(2000)
}
private fun prepareSecond() {
    Thread.sleep(2000)
}
private fun prepareThird() {
    Thread.sleep(4000)
}
override fun onDestroy() {
    super.onDestroy()
    Debug.stopMethodTracing()
}
  • 点击录制按钮开始录制,点击界面中的按钮,调用3个睡眠方法,下面使用四种方式查看堆栈信息
  • callChart 查看

此处看出prepareFirst()、prepareSecond()、prepareThird()的3个方法运行时间相加即为prepare()的执行时间

  • Flame Chart

  • Top Down :从上到下的查找耗时方法

从上图可以看出三个睡眠方法的执行时间分别为 2、2、4秒

  • Bottom Up : 可以直接查看到每个方法的耗时情况

Bottom Up 方法中更容易直接看出是 sleep()睡眠了8秒调用的分别为3个prepare()方法,至此四个查看跟踪信息的方法介绍完毕,按照此方法可轻易的查处每个方法的执行时间,进而找到耗时的方法并解决。既然本次的示例代码中调用了 Debug类的startMethodTracing()方法,此方法会生成相应的trace文件,下面就接着讲以下另外两种查看跟踪信息的方法,相信这两个方法大家都用过,此处就当温习以下

  • Android Studio 直接查看.trace文件

   1、使用Debug类的startMethodTracing()方法,运行程序会在~/sdcard/ 目录中生成相应的.trace文件

   2、在 Device File Explorer 打开窗口,找到对应的trace文件,双击即可打开

上述信息中,可以直接看出3个方法的耗时时间

  • 使用TraceView查看

     1、点击File -> Open 选择要查看的trace文件即可打开

      2、 点击按照 Excl Real Time 从大到小排序,看出是Thread.sleep()方法耗时

     3、点击相应的 parent 和 child 查找耗时的方法

好了,新旧查看方法都以介绍完毕,示例虽然简单但却能显示整个查找耗时操作的执行顺序,希望有所帮助

猜你喜欢

转载自blog.csdn.net/Alexwll/article/details/81254624