抓取systrace

可以通过eclipse,AS或者命令行抓取systrace。

UI抓取

如下图选择抓取systrace的进程,然后点击右上角的按钮,在出现的界面进行设置,包括设置保存路径,抓取systrace的时间间隔,buffer大小,systrace中包含的tag等。

Android Systrace - 图1

命令行抓取

Android-SDK中已经包含了systrace工具,platform-tools\systrace\systrace.py。使用命令行抓取的好处是比较灵活,可以把python、systrace工具打包,然后放到任何电脑上就可以直接抓取。

  • python systrace.py sched freq idle am wm gfx view sync binder_driver irq workq input -b 96000

其它方法抓取systrace

部分手机厂商为了更加方便、快捷的抓取systrace,把这项功能内置到了手机中,在手机上点击记下就可以抓取到。

Android Systrace - 图2

如图所示,打开systrace悬浮窗之后,可以在任何界面点击右下角的按钮就可以开始抓取systrace,更加的方便、简单。

查看支持的TAG

抓取TAG的时候如果选择的太多会导致得到的文件太大,如果选择的太少又可能抓取的信息不全,所以要根据问题进行取舍,可以用如下命令查看手机支持哪些TAG。

  1. adb shell atrace --list_categories
  2. gfx - Graphics
  3. input - Input
  4. view - View System
  5. webview - WebView
  6. wm - Window Manager
  7. am - Activity Manager
  8. sm - Sync Manager
  9. audio - Audio
  10. video - Video
  11. camera - Camera
  12. hal - Hardware Modules
  13. res - Resource Loading
  14. dalvik - Dalvik VM
  15. rs - RenderScript
  16. bionic - Bionic C Library
  17. power - Power Management
  18. pm - Package Manager
  19. ss - System Server
  20. database - Database
  21. network - Network
  22. adb - ADB
  23. vibrator - Vibrator
  24. aidl - AIDL calls
  25. nnapi - NNAPI
  26. rro - Runtime Resource Overlay
  27. pdx - PDX services
  28. sched - CPU Scheduling
  29. irq - IRQ Events
  30. i2c - I2C Events
  31. freq - CPU Frequency
  32. idle - CPU Idle
  33. disk - Disk I/O
  34. mmc - eMMC commands
  35. sync - Synchronization
  36. workq - Kernel Workqueues
  37. memreclaim - Kernel Memory Reclaim
  38. regulators - Voltage and Current Regulators
  39. binder_driver - Binder Kernel driver
  40. binder_lock - Binder global lock trace
  41. pagecache - Page cache
  42. memory - Memory

查看systrace

systrace只能通过chrome浏览器进行查看,把抓取到的systrace导入到chrome中,大概显示如下图所示:

Android Systrace - 图3

可以通过快捷键进行移动、放大、缩小。

  • A 向左移动
  • B 向右移动
  • S 缩小
  • W 放大

查看线程状态

systrace中用不同的颜色表示线程的状态,可以很直观的区分线程的状态。

运行中-绿色

该状态的进程说明在对应时间上正在被CPU调度,同一时间可能有多个进程处于运行状态,查看运行中的进程,可以判断是否跑在了CPU小核上?是否在不同的状态间频繁切换?

Android Systrace - 图4

可运行-蓝色

线程当前在等待CPU调度,目前处于等待中,没有运行。如果进程长时间处于这个状态需要分析是否后台任务过多,导致该进程一直没有被调度到?

Android Systrace - 图5

不可中断的睡眠态-褐色

线程在另一个内核操作上被阻塞。

Android Systrace - 图6

休眠中-白色

线程没有工作要做,可能是因为线程在互斥锁上被阻塞。

Android Systrace - 图7

不可中断的睡眠态 IO Block-橘色