Matrix-TraceCanary 实际使用

前言:
之前根据 Android Studio Profiler 查看卡顿问题 已经解决了部分已知问题「即:有明确场景,进而暴露出来的问题」;
不足的点是:问题暴露之前寻找卡顿的点,抓取的 hprof 文件操作复杂,寻找问题时效率较低,具体每个函数的耗时不可统计 ;
所以需要寻找比较成熟的卡顿工具,帮助我们定位问题.

工具对比:
BlockCanary: 依赖主线程 Looper,监控每次 dispatchMessage 的执行耗时;
ArgusAPM / LogMonitor: 依赖 Choreographer 模块,监控相邻两次 Vsync 事件通知的时间差;

以上方式的问题
无法获取到各个函数的执行耗时,对于稍微复杂一点的堆栈,很难找出可能耗时的函数,也就很难找到卡顿的原因;
通过其他线程循环获取主线程的堆栈,如果稍微处理不及时,很容易导致获取的堆栈有所偏移,不够准确,加上没有耗时信息,卡顿也就不好定位;

Matrix-TraceCanary 优势:
在编译期间修改字节码;
准确定位卡顿函数,并显示堆栈/执行次数/耗时;

使用问题:
TraceCanary 暴露 3 种类型问题:
  Trace_StartUp「启动」
  Trace_EvilMethod「慢函数」
  Trace_FPS「帧率」
其中 Trace_EvilMethod 模块中所给数据格式如下:

{
    "machine":"MIDDLE",
    "cpu_app":0.05800059283652189,
    "mem":6124523520,
    "mem_free":3195336,
    "detail":"NORMAL",
    "cost":230,
    "usage":"87.34%",
    "scene":"com.*.android.pokekara.*.main.*Activity",
    "stack":"0,1048574,1,230\n1,30791,1,226\n2,30756,1,226\n3,30754,1,226\n4,22474,1,226\n5,22603,1,226\n6,145827,1,204\n7,145985,1,199\n8,139523,1,128\n9,180666,1,128\n10,180669,1,128\n11,29838,1,11\n12,29855,1,11\n8,139524,1,66\n9,21060,1,66\n10,21116,1,49\n11,21207,1,17\n12,28079,1,17\n13,28035,1,17\n14,29464,1,17\n15,28388,1,17\n16,28293,1,17\n17,28296,1,17\n18,60995,1,12\n11,21145,1,11\n12,21152,1,11\n10,21063,1,12\n11,142855,1,12\n12,142531,1,12\n13,142851,1,12\n",
    "stackKey":"145985|",
    "tag":"Trace_EvilMethod",
    "process":"com.*.android.*",
    "time":1650008010859,
    "type":0,
    "build_id":"1650007387169",
    "device_id":"6862573909639700608",
    "upload_time":1650008010860
}

stack 为调用堆栈;
stackKey 则能唯一标识调用堆栈;
本文只针对 stack 如何解析,以方便开发人员定位问题;

matrix-stack 详解:
stack每行格式:stack层级,方法id,方法执行次数,方法执行总耗时;
methodmap是插桩函数表,每行格式:方法id,方法accessType,类名,方法名,方法描述;

使用:

  1. 将 matrix 生成的 methodMapping.txt 保存下来「每一次 build,会生成唯一对应 methodMapping.txt」;
  2. 根据 stack 生成 stack.log 文件,这块是我自己用 python 写的,最后生成 stack.log 文件如下:
0,1048574,1,300\n
1,29689,1,283\n
2,4534,1,283\n
...
11,83065,1,278\n
15,78775,1,278\n
...
24,3174,1,123\n
20,81443,1,67\n

注:上面的文件不能含有多余空格 按照格式去写;

  1. matrix-trace-processor download 项目到本地,执行python脚本,生成
python3 main.py workflow_traces stack.log > stack_processor.txt methodMapping.txt

此时 stack_processor.txt 已经是 DTrace 格式的堆栈文件,可以利用 FlameGraph 这个库生成火焰图,方便开发者生成调用栈;

注:这个库同样有脚本可以根据 stack 生成 log 文件,但是我认为使用不方便,可以看这里matrix-trace-processor 解析

  1. FlameGraph项目到本地,执行脚本
 stackcollapse.pl stack_processor.txt > stack.folded
 flamegraph.pl stack.folded > stack.svg

最终将 stack 的 string 转化为可直接在浏览器打开的 svg 格式的调用栈
注:电脑若为 windows 需要查看 perl 是否安装,上面的脚本文件是用 perl 写的

检查 perl 是否已安装:

perl -v

最终生成的文件如下:


stack.svg

经过上面的步骤,自己开发用来检测已经可以了,but 我「Andorid」做了一个 python 项目「因为后端没人鸟我」,把 matrix 的日志上报到服务端,可根据 方法耗时cost 和 stackKey 去查看 svg 文件,方便组内人员开发;
需要 python + 数据库,就能做这个事情,有兴趣可以整一下;

感谢
matrix-trace-processor
FlameGraph

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容