Systrace从入门到放弃

2023-10-31 03:50
文章标签 入门 放弃 systrace

本文主要是介绍Systrace从入门到放弃,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是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左右,这个针对app或者容易复现的bug是可以的,如果是不太容易复现的,可以adb shell atrace ..设置更长时间进行处理

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

这篇关于Systrace从入门到放弃的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/312630

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

MySQL入门到精通

一、创建数据库 CREATE DATABASE 数据库名称; 如果数据库存在,则会提示报错。 二、选择数据库 USE 数据库名称; 三、创建数据表 CREATE TABLE 数据表名称; 四、MySQL数据类型 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串类型 4.1 数值类型 数值类型 类型大小用途INT4Bytes整数值FLOAT4By

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是