Systrace从入门到放弃

﹥>﹥吖頭↗ 提交于 2020-08-12 02:03:49

什么是Systrace

Systrace 是 Android4.1 中新增的性能数据采样和分析工具。它可帮助开发者收集 Android 关键子系统(如 SurfaceFlinger/SystemServer/Kernel/Input/Display 等 Framework 部分关键模块、服务,View系统等)的运行信息,从而帮助开发者更直观的分析系统瓶颈,改进性能。通常使用 systrace 跟踪系统的 I/O 操作、CPU 负载、Surface 渲染、GC 等事件。

Systrace 的功能包括跟踪系统的 I/O 操作、内核工作队列、CPU 负载以及 Android 各个子系统的运行状况等。在 Android 平台中,它主要由3部分组成:

内核部分:Systrace 利用了 Linux Kernel 中的 ftrace 功能。所以,如果要使用 Systrace 的话,必须开启 kernel 中和 ftrace 相关的模块。 数据采集部分:Android 定义了一个 Trace 类。应用程序可利用该类把统计信息输出给ftrace。同时,Android 还有一个 atrace 程序,它可以从 ftrace 中读取统计信息然后交给数据分析工具来处理。 数据分析工具:Android 提供一个 systrace.py( python 脚本文件,位于 Android SDK目录/platform-tools/systrace 中,其内部将调用 atrace 程序)用来配置数据采集的方式(如采集数据的标签、输出文件名等)和收集 ftrace 统计数据并生成一个结果网页文件供用户查看。 从本质上说,Systrace 是对 Linux Kernel中 ftrace 的封装。应用进程需要利用 Android 提供的 Trace 类来使用 Systrace. 关于 Systrace 的官方介绍和使用可以看这里:http://developer.android.google.cn/tools/help/systrace.html

Systrace 允许你收集和检查设备上运行的所有进程的计时信息。 它包括Androidkernel的一些数据(例如CPU调度程序,IO和APP Thread),并且会生成HTML报告,方便用户查看分析trace内容。

systrace 利用了 Linux 的ftrace(https://source.android.google.cn/devices/tech/debug/ftrace)调试工具,相当于在系统各个关键位置都添加了一些性能探针,也就是在代码里加了一些性能监控的埋点。Android 在 ftrace 的基础上封装了atrace(https://android.googlesource.com/platform/frameworks/native/+/master/cmds/atrace/atrace.cpp),并增加了更多特有的探针,例如 Graphics、Activity Manager、Dalvik VM、System Server 等。

systrace 工具只能监控特定系统调用的耗时情况,所以它是属于 sample 类型,而且性能开销非常低。但是它不支持应用程序代码的耗时分析,所以在使用时有一些局限性。由于系统预留了Trace.beginSection接口来监听应用程序的调用耗时,那我们有没有办法在 systrace 上面自动增加应用程序的耗时分析呢?划重点了,我们可以通过编译时给每个函数插桩的方式来实现,也就是在重要函数的入口和出口分别增加Trace.beginSection和Trace.endSection。当然出于性能的考虑,我们会过滤大部分指令数比较少的函数,这样就实现了在 systrace 基础上增加应用程序耗时的监控。通过这样方式的好处有:可以看到整个流程系统和应用程序的调用流程。包括系统关键线程的函数调用,例如渲染耗时、线程锁,GC 耗时等。性能损耗可以接受。由于过滤了大部分的短函数,而且没有放大 I/O,所以整个运行耗时不到原来的两倍,基本可以反映真实情况。systrace 生成的也是 HTML 格式的结果,我们利用跟 Nanoscope 相似方式实现对反混淆的支持。

备注:何为sample类型:可能你会觉得按照各种 Linux 命令组合来排查问题太麻烦了,有没有更简单的、图形化的操作界面呢?Traceview 和 systrace 都是我们比较熟悉的排查卡顿的工具,从实现上这些工具分为两个流派。第一个流派是 instrument。获取一段时间内所有函数的调用过程,可以通过分析这段时间内的函数调用流程,再进一步分析待优化的点。第二个流派是 sample。有选择性或者采用抽样的方式观察某些函数调用过程,可以通过这些有限的信息推测出流程中的可疑点,然后再继续细化分析。

systrace能干什么

如果想分析Android系统或者某个app的卡顿性能或者渲染问题,这时候Systrace 就非常有用。

首先我们需要抓取Systrace文件,然后分析并找出引起系统卡顿,或者app反应慢的原因,最好在源码上解决引起卡顿、响应慢的问题。

一下是其他人搬运的官方的教程:https://www.jianshu.com/p/8ac1ceb5bb14

systrace简单使用

获取trace.html的方法,也可参考网上的链接:https://blog.csdn.net/weixin_33862514/article/details/91467096

\1. 命令行:systrace -l

python systrace -t 10 -o d:/mytrace.html sched gfx view am -a com.xx.xx

检查app有没有掉帧 ​ 功能: ​ 分析UI卡顿 ​ app启动流程 ​ 分析锁性能 ​ 参数介绍: ​ 如果测试列表滑动,桌面滑动等流畅性问题 ​ gfx ​ input ​ view ​ 如果还需分析hwui ​ 新增命令参数hwui ​ app启动,进入某个界面的速度 ​ gfx input view am wm res ​ 怀疑gc或者io导致的卡顿 ​ gfx input view dalvik disk ​ 怀疑电量相关的 ​ power ​ gfx input view res am wm power

 

\2. 工具ddms抓取

 

3.手机上自己抓取:参考链接https://www.jianshu.com/p/0ab49e5aeb14,问题来了,这个文件格式需要其他的方式打开:https://www.jianshu.com/p/ab22238a9ab1, 也可以通过这个网址,转成trace.html

google浏览器,输入Chrome://tracing,点击load按钮,导入抓取到的html文件

备注:抓取的时间,最好5s左右

systrace基本使用:https://www.jianshu.com/p/75aa88d1b575

systrace基本使用:https://www.lizenghai.com/archives/26061.html

systrace生成文件的认识

systrace预备知识篇:https://www.androidperformance.com/2019/07/23/Android-Systrace-Pre/

systrace高级使用

参考这个博客的内容使用 :https://blog.csdn.net/w553000664/article/details/106268707 & https://www.androidperformance.com/2019/07/23/Android-Systrace-Pre/

 

同时学习这个课程能极大的理解systrace底层原理以及插桩等分析:张绍文---android开发高手课:https://time.geekbang.org/column/article/73277

** **

systrace使用场景举例

app冷启动分析:使用systrace分析:https://www.jianshu.com/p/6451538fb38b

命令行统计app冷启动时间: adb shell am start -S -R 10 -W pkgname/mainActivity -S 表示每次启动前先强行停止 -R表示重复测试次数

启动方式:

冷 还没有该应用的进程,启动的时候,创建新进程 ​

热 后台有进程,比如home之后 ​

温 进程还有,但是启动的入口的acti干掉了,应用进程还在,在启动

命令行统计app冷启动时间

参数 ​

thisTime 最后一个启动的activity的启动耗时 ​

totalTime 新应用启动的耗时,包含新进程的启动和activity的启动 ​

waittime(5.0之前没有) activitymanagerService启动app的activity时的总时间,包括了当前activity的onpause和自己的activity的启动

          系统日志统计 过滤displayed输出的启动日志
          waitTime 时startacriviryAndwait这个方法的调用耗时
          ThisTime 时指调用过程中最后一个activity启动时间到这个activty的startactivityandWait调用结束
          TotalTime 时指调用过程中第一个activity的启动时间到最后一个activity的startactivityandwait结束,如果过程中只有一个atvity,则total就等于thistime

WaitTime 就是总的耗时,包括前一个应用 Activity pause 的时间和新应用启动的时间; ​

ThisTime 表示一连串启动 Activity 的最后一个 Activity 的启动耗时; ​

TotalTime 表示新应用启动的耗时,包括新进程的启动和 Activity 的启动,但不包括前 ​ 一个应用 Activity pause 的耗时。也就是说,开发者一般只要关心 TotalTime 即可,这个时间才是自己应用真正启动的耗时。

其他性能优化功能简介

traceView ​ 具体告诉哪个函数时间和调用次数 ​

profile cpu rendering (手机的开发者选项 profile hwUI rendering)

       ​ 蓝色 测量绘制的时间 ​

       红色 执行的时间 display list ​

        橙色 处理时间,耗cpu ​

         紫色 将资源转移到渲染线程的时间 ​

shell dumpsys fgxinfo com.xxx.x

 

开发阶段:使用blockcanary或者anrwatchdog等第三方监控sdk

method  、 tracing 、​ nimbledroid 、​ lint

性能优化方向:

          绘制优化 ​

          内存优化 ​

          存储优化 ​

          稳定性优化 ​

          耗电优化 ​

          apk瘦身

数据结构优化-设计模式

性能优化必知必会

Android 性能优化必知必会(2020-5-16) https://juejin.im/post/5ebf4f21f265da7bad355036
张绍文---android开发高手课:https://time.geekbang.org/column/article/73277
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!