什么是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
来源:oschina
链接:https://my.oschina.net/u/4337191/blog/4331863