一、什么是SysTrace?

在日常开发中有时候遇到棘手的功能问题就需求运用这个东西,Systrace 是 Android 4.1」 中新增的功能数据采样和剖析东西。它可协助开发者搜集 Android 要害子体系 (如 SurfaceFlinger/SystemServer/Kernel/Input/Display 等 Framework 部分要害模块、服务,View」体系等 的运转信息,从而协助开发者更直观的「剖析体系瓶颈,改进功能」

你真的了解Systrace吗?

二、怎么运用SysTrace?

2.1 收集trace

首先咱们需求了解Trace的收集首要涉及几部分:收集方法、自界说trace阶段、Release包抓取Trace和体系Trace类同异步调用的差异;

指令行收集:

  • 设备要求**「Android 4.3 (API level 18)及以上」**
  • 指令如下:python systrace.py [options][「categories」],示例如下:
python/Users/yangzhiyong/Library/Android/sdk/platform-tools/systrace/systrace.py-t10-otrace.htmlgfxinputviewschedfreqwmamhwuiworkqresdalviksyncdiskloadperfhalrsidlemmc-acom.ss.android.lark.debug
#-o:指示输出文件的路径和名字
#-t:抓取时间(最新版别能够不用指定,按Enter即可完毕),单位为秒
#-b:指定buffer巨细(一般状况下,默许的Buffer是够用的,假如你要抓很长的Trae,那么建议调大Buffer)
#-a:指定app包名(假如要Debug自界说的Trace点,记得要加这个)
  • 检查支撑的categories

    • adb shell atrace –list_categories
    • python systrace.py -l
//粗体部分是常用的categories;
gfx-Graphics
input-Input
view-ViewSystem
webview-WebView
wm-WindowManager
am-ActivityManager
sm-SyncManager
audio-Audio
video-Video
camera-Camera
hal-HardwareModules
res-ResourceLoading
dalvik-DalvikVM
rs-RenderScript
bionic-BionicCLibrary
power-PowerManagement
pm-PackageManager
ss-SystemServer
database-Database
network-Network
adb-ADB
vibrator-Vibrator
aidl-AIDLcalls
pdx-PDXservices
sched-CPUScheduling
freq-CPUFrequency
idle-CPUIdle
disk-DiskI/O
sync-Synchronization
memreclaim-KernelMemoryReclaim
binder_driver-BinderKerneldriver
binder_lock-Bindergloballocktrace

体系自带东西:

  • 设备要求**「Android 9(API level 28)及其以上」**

  • 开发者形式->体系跟踪

  • trace导出:

    • 告诉栏分享;
    • adb pull /data/local/traces/ .
    • systrace –from-file .ctrace .perfetto-trace 转换成html

网页版收集剖析东西:

  • 设备要求**「Android 10(API level 29)及其以上;」**
  • Perfetto UI

除此之外还有一些常用的技巧

  1. 自界说TAG

你真的了解Systrace吗?
详细运用可参阅:developer.android.com/topic/perfo…

  • 「界说」

    • 在事情开端调用Trace.beginSection(event);
    • 在事情完毕调用Trace.endSection(),需成对调用;
  • 「运用」 添加了自界说TAG后,需求-a指定包名参数,才能够收集到自界说的trace信息;

  1. Release包抓取trace

反射调用setAppTracingAllowed即可:

try{
Class<?>threadClazz=Class.forName("android.os.Trace");
MethodsetAppTracingAllowed=threadClazz.getDeclaredMethod("setAppTracingAllowed",boolean.class);
setAppTracingAllowed.invoke(null,true);
}catch(Exceptione){
e.printStackTrace();
}

3. 同异步trace的差异

「同步」 「异步」 「差异」
beginSection(@NonNull String sectionName) beginAsyncSection(@NonNull String methodName, int cookie) 异步调用需求传methodName及cookie,开端完毕匹配更准确,且不用B-A-A-B相似嵌套,不过该接口为隐藏接口,需反射调用,可运用SystemTracer类;
endSection() endAsyncSection(@NonNull String methodName, int cookie)

2.2 剖析

拿到这些trace 咱们怎么剖析也是一个重要的部分

2.2.1 Trace文件翻开

首先是翻开这个文件

  1. chrome://tracing:引荐:不过近期版别该东西对trace中线程、进程名解析不出来,不利于检查;
  2. ui.perfetto.dev/#!/: 引荐,不过新版剖析东西不支撑VSync的高亮;
  3. perfetto.bytedance.net/#!/viewer: 不引荐,仅支撑单进程检查,关于涉及体系调用的剖析不便利;

较早版别sysTrace生成的html文件浏览器即可翻开,但最近版别已无法正常翻开,需求经过chrome东西手动加载;

2.2.2 面板区域说明

你真的了解Systrace吗?

image.png

  1. 用户屏幕交互
  2. CPU 运用率
  3. CPU各中心的运转状况
  4. 进程信息
  5. 进程变量/进程
  6. 选中区段的详细信息
  7. 鼠标操作选项,可经过1-4快速切换
  8. 进程过滤
  9. VSync高亮配置

2.2.3 常用快捷键

比较常用的快捷键是W S A D M V;

  • W : 扩大 Systrace,扩大能够更好地看清局部细节
  • S : 缩小 Systrace,缩小以检查全体
  • A : 左移
  • D : 右移
  • M : 高亮选中当时鼠标点击的段(这个比较常用,能够快速标识出这个方法的左右鸿沟和履行时间,便利上下检查)
  • V : 高亮VSync的时机,便利剖析掉帧的原因;

你真的了解Systrace吗?

image.png

2.2.4 线程状况

a) 线程状况
「线程状况」 「Systrace中的显现」 「说明」
绿色 : 运转中(Running)
你真的了解Systrace吗?
咱们经常会检查 Running 状况的线程,检查其运转的时间,与竞品做比照,剖析快或许慢的原因
蓝色 : 可运转(Runnable)
你真的了解Systrace吗?
Runnable 状况的线程状况持续时间越长,则表明 cpu 的调度越忙,没有及时处理到这个使命
白色 : 休眠中(Sleep)
你真的了解Systrace吗?
一般是在等事情驱动
橘色 : 不行中止的睡觉态 IO Block(Uninterruptible Sleep WakeKill)
你真的了解Systrace吗?
一般是标明 IO 操作慢,假如有大量的橘色不行中止的睡觉态呈现,那么一般是由于进入了低内存状况
紫色 : 不行中止的睡觉态(Uninterruptible Sleep)
你真的了解Systrace吗?
一般是陷入了内核态,有些状况下是正常的,有些状况下是不正常的,需求依照详细的状况去剖析
b) 线程唤醒

一个使命在进入 Running 状况之前,会先进入 Runnable 状况进行等候,而 Systrace 会把这个状况也标明在 Systrace 上;

你真的了解Systrace吗?
你真的了解Systrace吗?
stateWhenDescheduled界说:chromium.googlesource.com/external/tr…

c) 线程参数说明
  • Wall Duration:函数履行的总耗时
  • CPU Duration:在 CPU 上履行的耗时
  • Self Time:本身履行的总耗时,不包含子方法
  • CPU Self Time:本身在 CPU 上履行的耗时,不包含子方法
d) 函数调用虚实差异

如下图,咱们看到标识setUpHWComposer调用的紫色条并不是实心的,实心的部分代表CPU Duration相关于Wall Duration的占比:

你真的了解Systrace吗?

2.2.5 CPU信息

你真的了解Systrace吗?

image.png

  1. C-State

为了在CPU闲暇的时候降低功耗,CPU能够被指令进入low-power形式。每个CPU都有几种power形式,这些形式被统称为C-states或许C-modes; C-States从C0开端,C0是CPU的正常作业形式,CPU处于100%运转状况。C后的数越高,CPU睡觉得越深,CPU的功耗被降低得越多,一起需求更多的时间回到C0形式。

「C-State」 「描绘」
C-0 RUN MODE,运转形式。
C-1 STANDBY,就位形式,随时预备投入运转
C-2 DORMANT,休眠状况,被唤醒投入运转时有必定的推迟
C-3 SHUTDOWN,关闭状况,需求有较长的推迟才能进入运转状况,削减耗电
  1. Clock Frequency:CPU当时运转频率;
  2. Clock Frequency Limits:CPU最大最小频率,经过该参数能够判断CPU中心差异,如大中小核

2.2.6 常见体系进程、线程

  • 进程

    • system_server

      • AMS
      • WMS
      • SurfaceFlinger
  • 线程

    • UI Thread //主线程
    • Render Thread //烘托线程
    • Binder Thread //跨进程调用线程

2.2.7 常见问题

a) 「锁等候」

你真的了解Systrace吗?
「monitor contention」 with owner 「caton_dump_stack (11056)」 waiters=0 blocking from 「boolean android.os.MessageQueue.enqueueMessage(android.os.Message, long)(MessageQueue.java:544)」
你真的了解Systrace吗?
结合代码看,这段信息的意思是,「caton_dump_stack」线程(线程ID是11056)作为「owner」持有了主线程音讯队列目标锁,「waiters」表明等候在该目标锁上的其他线程数(不包含当时线程),所以总的有1个线程等候目标锁开释,当时线程等候的方位是「enqueueMessage调用处」

b) 「SurfaceFlinger制作」

SurfaceFlinger首要是搜集各个UI烘托层的数据组成发送给Hardware Composer;一般运用的烘托层包含状况栏、运用页面、导航栏,每个部分都是单独烘托生成Buffer的,根本步骤如下:

  1. 运用收到VSYNC-app信号后,在**「UI Thread」完结数据核算;预备好后,将数据发送到「RenderThread」**;
  2. 运用在**「RenderThread」完结数据烘托后,将数据填充到「SurfaceFlinger」**的对应页面BufferQueue中;
  3. 在**「SurfaceFlinger」收到VSYNC-sf信号后,「SurfaceFlinger」** 会遍历它的层列表的BufferQueue,以寻觅新的缓冲区。假如找到新的缓冲区,它会获取该缓冲区;否则,它会继续运用曾经获取的缓冲区。「SurfaceFlinger」 有必要始终显现内容,因此它会保存一个缓冲区。假如在某个层上没有提交缓冲区,则该层会被疏忽;
  4. **「SurfaceFlinger」**向 「HWC」 供给一个完整的层列表,并询问“您期望怎么处理这些层?”
  5. 「HWC」 的响应方法是将每个层标记为叠加层或 GLES 组成;
  6. 「SurfaceFlinger」 会处理一切 GLES 组成,将输出缓冲区传送到 「HWC」,并让 「HWC」 处理其余部分;

你真的了解Systrace吗?

image.png

c) 「掉帧」

上一部分描绘了SurfaceFlinger组成每帧数据的进程,在上述进程中,假如**「UI Thread」核算不及时,或许「RenderThread」烘托不及时,或许「BufferQueue」**中可用Buffer不足导致鄙人一次VSYNC信号降临之前,没有预备好需求显现的帧的数据,就会呈现丢帧,Systrace 报告列出了烘托界面帧的每个进程,并指明晰沿时间轴烘托的每个帧。在 16.6 毫秒内烘托的有必要保持每秒 60 帧安稳帧速率的帧会以绿色圆圈表明。烘托时间超越 16.6 毫秒的帧会以黄色或赤色帧圆圈表明:

  1. 绿色:未丢帧;
  2. 棕色:轻微丢帧,丢1帧 ;
  3. 赤色:严重丢帧,丢大于1帧;

你真的了解Systrace吗?
经过Systrace右上角的View Options > Highlight VSync,咱们能够高亮VSYNC信号到来的时间,需求留意的是,高亮的VSYNC首要是VSYNC-app信号(可在SurfaceFlinger进程中检查),且灰白相间的方位是VSYNC信号到来的时间。 如下图,显现了丢1帧的状况,第二个VSYNC到来时,主线程仍未完结显现帧数据的核算,所以呈现丢帧的问题。
你真的了解Systrace吗?

三、常见trace东西比照

其实咱们剖析trace不但只要体系这一种方法,下图做个简略的总结

「东西名」 「类型」 「原理」 「优缺陷」 「运用场景」 「运用说明」
Traceview instrument 运用 Android Runtime 函数调用的 event 事情,将函数运转的耗时和调用关系写入 trace 文件中。 「长处:」 全函数调用剖析;「缺陷:」 东西本身带来的功能开支过大,有时无法反映实在的状况。比方一个函数本身的耗时是 1 秒,开启 Traceview 后可能会变成 5 秒,而且这些函数的耗时变化并不是成比例扩大; – 线下- 整个程序履行流程的耗时 已抛弃,之前DDMS有相关东西进口
Nanoscope instrument 直接修正 Android 虚拟机源码,在ArtMethod履行进口和履行完毕方位添加埋点代码,将一切的信息先写到内存,等到 trace 完毕后才统一生成成果文件。 「长处:」– 全函数调用剖析;- 功能开支小;- 能够支撑剖析恣意一个运用,可用于做竞品剖析;「缺陷:」– 需求自己刷 ROM,而且当时只支撑 Nexus 6P,或许选用其供给的 x86 架构的模拟器;- 默许只支撑主线程收集,其他线程需求代码手动设置; – 线下- 整个程序履行流程的耗时 github.com/uber/nanosc…
systrace sample 实际是其他东西的封装,Systrace运用atrace开启追寻,然后读取ftrace的缓存,而且把它重新转换成HTML格式。 「长处:」– 能够看到整个流程体系和运用程序的调用流程。包含体系要害线程的函数调用,例如烘托耗时、线程锁,GC 耗时等;- 功能损耗能够接受;「缺陷:」– 不支撑运用程序代码的耗时剖析;需手动添加或许编译期插装; – 线下- 剖析体系调用 developer.android.com/topic/perfo…
Simpleperf sample 运用 CPU 的功能监控单元(PMU)供给的硬件 perf 事情。 「长处:」– 支撑Native剖析;- 功能开支非常低;「缺陷:」Java剖析对Android版别要求比较高; – 线下- 剖析 Native 代码的耗时 android.googlesource.com/platform/sy… 在 Android M 和曾经,Simpleperf 不支撑 Java 代码剖析。- 在 Android O 和曾经,需求手动指定编译 OAT 文件。- 在 Android P 和以后,无需做任何事情,Simpleperf 就能够支撑 Java 代码剖析;
Profiler(CPU Profiler) 混合 – Sample Java Methods 的功能相似于 Traceview 的 sample 类型;- Trace Java Methods 的功能相似于 Traceview 的 instrument 类型;- Trace System Calls 的功能相似于 systrace;- Sample Native (API Level 26+) 的功能相似于 Simpleperf; 「长处:」– 集成在IDE中,操作简略;「缺陷:」– 功能开支大,运用明显卡顿;- 无法用于自动化测验等场景; – 线下 developer.android.com/studio/prof…

「instrument」:获取一段时间内一切函数的调用进程,能够经过剖析这段时间内的函数调用流程,再进一步剖析待优化的点。

「sample」:有选择性或许选用抽样的方法调查某些函数调用进程,能够经过这些有限的信息推测出流程中的可疑点,然后再继续细化剖析。

欢迎重视「Android茶话会」更多精彩等你来探究

  1. 「学习之路」 取Android技术道路经典电子书
  2. 「天涯好文」取天涯论坛200+精彩博文,包含小说、形而上学等
  3. 「技术简历」取精选简历模板一份
  4. 「幼年游戏」取60+幼年游戏合集一份
你真的了解Systrace吗?