systrace: 系统级跟踪工具的解析

news2024/11/25 0:42:36

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。

目录

  • 一、导读
  • 二、概览
  • 三、获取systrace文件
    • 3.1 通过python命令获取
      • 3.1.1 安装python
      • 3.1.2 运行命令
        • 参数说明
    • 3.2 通过代码的方式
    • 3.3 使用android studio profiler
    • 3.4 通过收集系统设置
    • 3.5 Perfetto 命令行工具(Android 10 及更高版本)
  • 四、systrace文件分析
    • 4.0 快捷键
    • 4.1 显示帧
    • 4.2 Interactions
    • 4.3 Kernel(CPU activity)
    • 4.4 SurfaceFlinger
    • 4.5 com.xxx.xxx(PackageName)
    • 4.6 其他进程
    • 4.7 举例
  • 五、 推荐阅读

在这里插入图片描述

一、导读

我们继续总结学习Android 基础知识,温故知新。

二、概览

systrace是Android4.1版本之后推出的,对系统Performance分析的工具,该工具结合Android 内核的数据,最终会生产html文件。
systrace的功能包括跟踪系统的I/O操作、内核工作队列、CPU负载以及Android各个子系统的运行状况等
Systrace允许你监视和跟踪Android系统的行为(trace)。
它会告诉你系统都在哪些工作上花费时间、CPU周期都用在哪里,甚至你可以看到每个线程、进程在指定时间内都在干嘛。
它同时还会突出观测到的问题,从垃圾回收到渲染内容都可能是问题对象,甚至提供给你建议的解决方案。可以帮助开发者分析系统瓶颈,改进性能。

三、获取systrace文件

3.1 通过python命令获取

3.1.1 安装python

首先要安装python、pip、pywin32等,这些方便我们使用命令;
python
pip
安装完后进行环境变量配置;

注意: Systrace脚本不支持3.X版本,一定要2。x

3.1.2 运行命令

网站

找到我们sdk的目录,如:
/Users/xyz/Library/Android/sdk

进入目录

cd /Users/xxx/Library/Android/sdk/platform-tools/systrace

然后运行命令

python systrace.py [options] [categories]

python systrace.py [参数] [类别]

例如:

python systrace.py -o mynewtrace.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res app

python systrace.py –a com.xx.xx -o mynewtrace.html sched freq idle am wm gfx view dalvik input res app
        
        
python systrace.py –b 32768 –t 5 –a com.xx.xx -o mynewtrace.html sched freq idle am wm gfx view dalvik input res app
加了个时间,这里5s自动停止

这里根据提示停止,生成的文件会在sdk目录下 .
/Users/xyz/Library/Android/sdk/platform-tools/systrace/mynewtrace.html

在这里插入图片描述

参数说明

Options
-h | --help 帮助信息
-l | --list-categories 查看已连接设备支持的类别
-o file.html 需要保存的文件名,默认trace.html
-t N | --time=N 跟踪设备的时间,没有的话则根据提示来
-b N | --buf-size=N 缓冲区的大小,
-k functions | --ktrace=functions 跟踪特定内核的函数
-a app-name | --app=app-name 检测的包名
–from-file=file-path
-e device-serial | --serial=device-serial

要查看已连接设备支持的类别列表
python systrace.py --list-categories 或者
python systrace.py –l

在这里插入图片描述

3.2 通过代码的方式

Trace.beginSection("xyz");

Trace.endSection();

这两个方法必须成对出现,而且必须在同一个线程中。

在release版本中,我们需要添加以下代码这样就可以手动开启App自定义Label的Trace功能,在非debuggable的版本中也适用

Application的`attachBaseContext` 中添加
        
Class<?> trace = Class.forName("android.os.Trace");
Method setAppTracingAllowed = trace.getDeclaredMethod("setAppTracingAllowed", boolean.class);
setAppTracingAllowed.invoke(null, true);

3.3 使用android studio profiler

  1. 在 Android Studio 中,依次选择 View > Tool Windows > Profiler,或点击工具栏中的 Profile 图标
  2. 点击 CPU 时间轴上的任意位置以打开 CPU 性能分析器
  3. 从 CPU 性能分析器的配置菜单中选择 System Trace,然后点击 Record。完成与应用的交互后,点击 Stop

界面卡顿检测

3.4 通过收集系统设置

针对部分Android 9 以上设备,可以这样做

Android 9 以上设备

3.5 Perfetto 命令行工具(Android 10 及更高版本)

分析应用性能

四、systrace文件分析

  1. Google Chrome浏览器可以直接打开systrace,
  2. 通过chrome://tracing/,然后load systrace。

打开后是这个样子的:
在这里插入图片描述

4.0 快捷键

在这里插入图片描述
w 放大
s 缩小
a 左移
d 右移
f 放大当前选定区域
m 标记当前选定区域
v 高亮VSync
g 是否显示网格线
0 恢复trace到初始态

4.1 显示帧

这一部分通常是报告中最顶部的部分,描绘了一条多色线条,后面是成堆的条形。这些形状表示已创建的特定线程的状态和帧堆栈,如下图所示;
在这里插入图片描述
每个条形堆上方的多色线条表示特定线程随时间变化的一组状态。每段线条可以包含以下一种颜色:

绿色:正在运行
线程正在完成与某个进程相关的工作或正在响应中断。
蓝色:可运行
线程可以运行但目前未进行调度。
白色:休眠
线程没有可执行的任务,可能是因为线程在遇到互斥锁定时被阻止。
橙色:不可中断的休眠
线程在遇到 I/O 操作时被阻止或正在等待磁盘操作完成。
紫色:可中断的休眠
线程在遇到另一项内核操作(通常是内存管理)时被阻止。

4.2 Interactions

第一部分包含表示应用或游戏中的具体用户互动(例如点按设备屏幕)的条形图。这些互动可用作有用的时间标记。
在这里插入图片描述

4.3 Kernel(CPU activity)

下一部分显示了表示每个 CPU 中的线程活动的条形图。这些条形会显示所有应用(包括您的应用或游戏)中的 CPU 活动。

CPU 活动部分可以展开,展开后您就可以查看每个 CPU 的时钟频率。图 1 展示了一个收起后的 CPU 活动部分示例,图 2 展示了显示时钟频率的展开后版本:

在这里插入图片描述

4.4 SurfaceFlinger

描绘 Surface Flinger 进程(包括 VSync 事件和界面线程交换工作)的其他直方图

4.5 com.xxx.xxx(PackageName)

跟包名相关的进程,一般就是主进程

4.6 其他进程

后面还有很多其他进程信息,如system_serve、processxxx等等

4.7 举例

如图 4 所示,Systrace 报告列出了渲染界面帧的每个进程,并指明了沿时间轴渲染的每个帧。在 16.6 毫秒内渲染的必须保持每秒 60 帧稳定帧速率的帧以绿色圆圈表示。渲染时间超过 16.6 毫秒的帧以黄色或红色帧圆圈表示。
在这里插入图片描述

点击某个帧圆圈可将其高亮显示,并提供有关系统为渲染该帧所做工作的其他信息,包括提醒。此报告还会显示系统在渲染该帧时执行的方法。您可以调查这些方法以确定界面卡顿的可能原因。
在这里插入图片描述

选择运行速度慢的帧后,您可能会在报告的底部窗格中看到一条提醒。图 5 中显示的提醒指明帧的主要问题是在 ListView 回收和重新绑定上花费了太多时间。指向跟踪记录中相关事件的链接可详细说明系统在此期间执行的操作。

如需查看此工具在您的跟踪记录中发现的每条提醒以及设备触发每条提醒的次数,请点击窗口最右侧的 Alerts 标签页,如图 6 所示。Alerts 面板可帮助您了解跟踪记录中出现的问题以及这些问题导致出现卡顿的频率。您可以将此面板视为要修正的 bug 列表。通常情况下,只需对一个区域进行细微改动或改进即可移除整组提醒。
在这里插入图片描述

如果您发现在界面线程上执行的工作太多,请使用以下方法之一来帮助确定哪些方法占用了过多的 CPU 时间:

如果您想了解哪些方法可能会导致瓶颈,请在这些方法中添加跟踪标记。如需了解详情,请参阅有关如何在代码中定义自定义事件的指南。
如果您不确定界面瓶颈的来源,请使用 Android Studio 中提供的 CPU 分析器。您可以生成跟踪日志,然后使用 CPU 分析器导入和检查这些日志。

五、 推荐阅读

Java 专栏

SQL 专栏

数据结构与算法

Android学习专栏

ddd

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/874640.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HCIP学习-ospf3

前置内容 HICA学习--ospf动态路由协议_板栗妖怪的博客-CSDN博客 HCIA学习--ospf配置_板栗妖怪的博客-CSDN博客 HCIP学习--ospf1_板栗妖怪的博客-CSDN博客 HICP学习--ospf2_板栗妖怪的博客-CSDN博客 5类、7类路由类型 概念 5、7类的路由会纯在一个类型1和类型2的区别 设备…

Jlink RTT工具打印日志

背景 平常调试代码中使用串口打印log&#xff0c;往往需要接出串口引脚&#xff0c;比较麻烦&#xff0c;并且串口打印速度较慢&#xff0c;串口的中断可能会影响代码的执行效率。 SEGGER RTT支持使用J-link调试器输出来自目标微控制器的信息&#xff0c;也可以接收输入&#…

Python 潮流周刊#15:如何分析异步任务的性能?

△点击上方“Python猫”关注 &#xff0c;回复“1”领取电子书 你好&#xff0c;我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容&#xff0c;大部分为英文。标题取自其中一则分享&#xff0c;不代表全部内容都是该主题&#xff0c;特此声明。 本周刊精心筛选国内外的…

dubbo3-高级特性

dubbo-admin 1.dubbo-admin管理平台&#xff0c;是图形化的管理页面 2.从注册中心中获取所有的提供者/消费者进行配置管理 3.路由规则&#xff0c;动态配置&#xff0c;服务降级&#xff0c;访问控制&#xff0c;权重调整&#xff0c;负载均衡等管理功能 dubbo-admin是一个前…

一文读懂!一年耗能堪比2个三峡电站的大数据中心,背后竟隐藏着这些秘密......

全国大数据中心1年的能耗规模相当于2个三峡电站一整年的发电量&#xff0c;这是为什么&#xff1f; 大数据中心每耗费1度电&#xff0c;只有一半用在了“计算”上面&#xff0c;其他的都应用在散热、照明等方面到底是怎么回事&#xff1f; 为什么说在算力上每投入1元&#xff0…

【CI/CD】基于 Jenkins+Docker+Git 的简单 CI 流程实践(下)

基于 JenkinsDockerGit 的简单 CI 流程实践&#xff08;下&#xff09; 5.环境测试 5.1 远程 clone 代码测试 clone 云主机 docker-git 上的仓库 tomcat-java-demo.git&#xff1a; [rootdocker-jenkins ~]# yum install git vim wget -y [rootdocker-jenkins ~]# git confi…

【数据结构】-- 栈和队列

&#x1f407; &#x1f525;博客主页&#xff1a; 云曦 &#x1f4cb;系列专栏&#xff1a;数据结构 &#x1f4a8;吾生也有涯&#xff0c;而知也无涯 &#x1f49b; 感谢大家&#x1f44d;点赞 &#x1f60b;关注&#x1f4dd;评论 文章目录 前言一、栈&#x1f4d9;1.1 栈…

windows程序基础

一、windows程序基础 1. Windows程序的特点 1.用户界面统一、友好 2.支持多任务:允许用户同时运行多个应用程序(窗口) 3.独立于设备的图形操作 使用图形设备接口( GDI, Graphics Device Interface )屏蔽了不同硬件设备的差异&#xff0c;提供了设备无关的图形输出能力…

“新基建”重新定义大数据安全

摘要&#xff1a;数字信息经济发展时代,大数据已逐渐成为最新和最重要的生产要素。国家大力支持推进“新基建”发展战略,由此带来的大数据安全挑战俨然愈发严峻。“新基建”重新定义了大数据安全&#xff0c;面对层出不穷的网络安全事件,需要构建主动安全防御体系。 关键词:新…

前端开发环境搭建,换新电脑前端开发的步骤,node环境配置

一、下载安装nodeJS 1、下载地址官方网址 NodeJs 2、下载完成后&#xff0c;双击“node-v11.5.0-x64.msi”&#xff0c;开始安装Node.js&#xff0c;一路next&#xff0c;注意&#xff1a;安装目录看自己需求&#xff0c;本人安装在D:\nodejs目录下 3、测试 键盘按下【winR…

Kotlin读写分离CopyOnWriteArrayList

Kotlin读写分离CopyOnWriteArrayList 基于读写分离思想Copy-On-Write(COW)设计的线程安全ArrayList变体&#xff0c;读读共享、写写互斥、读写互斥、写读互斥。读时直接读&#xff0c;不用加锁同步&#xff0c;线程安全。写/删/修改数据时复制一个副本&#xff0c;在新的List副…

挣钱和赚钱是两个概念

挣钱和赚钱虽然听起来很相似&#xff0c;但实际上是两个完全不同的概念。 挣钱通常指的是通过劳动或者服务换取报酬&#xff0c;比如说工资、兼职、打零工等等。而赚钱则是指通过投资、创业等方式获得利润或者收益。 挣钱是一种被动的收入方式&#xff0c;需要付出时间和劳动才…

政策因子条件列表类型

type:1&#xff08;多选下拉输入&#xff09; 目前选项是本地写死得&#xff0c;传参拼接了carOwner这些东西&#xff0c;形式是多选输入 type:2 &#xff08;普通指定形式&#xff09; type:3&#xff08;普通区间形式&#xff09; type:4 (指定输入) 指定除外得特殊一种&…

Chrome浏览器安装Axure插件无法打开本地axure文件

Chrome浏览器安装Axure插件无法打开本地axure文件 Chrome浏览器按照axure插件即可打开 1&#xff0c;下载axure插件&#xff0c;由于Chrome国内连不了商店&#xff0c;只能另外下载 https://download.csdn.net/download/u013303534/88204888 2&#xff0c;Chrome安装插件&#…

c++11 标准模板(STL)(std::basic_stringbuf)(二)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allocator<CharT> > class basic_stringbuf : public std::basic_streambuf<CharT, Traits> std::basic_stringbuf…

从零开始学习 Java:简单易懂的入门指南之抽象类接口内部类(十一)

面向对象进阶&#xff08;抽象类&接口&内部类&#xff09; 第一章 抽象类1.1 概述1.1.1 抽象类引入 1.2 abstract使用格式1.2.1 抽象方法1.2.2 抽象类1.2.3 抽象类的使用 1.3 抽象类的特征1.4 抽象类的细节1.5 抽象类存在的意义 第二章 接口2.1 概述2.2 定义格式2.3 接…

排序算法——基数排序(C语言)

基数排序的概念&#xff1a; 什么是基数排序&#xff1f;&#xff1f;&#xff1f;基数排序是一种和快排、归并、希尔等等不一样的排序...它不需要比较和移动就可以完成整型的排序。它是时间复杂度是O&#xff08;K*N&#xff09;&#xff0c;空间复杂度是O&#xff08;KM&…

【C语言】memcpy()函数

目录 一.memcpy()函数简介 1.函数功能 2.函数参数 1>.void * destination 2>.const void * source 3>.size_t num 3.函数返回值 4.函数头文件 二.memcpy()函数的具体使用 1.使用memcpy()函数完成拷贝整型数组数据 2.使用memcpy()函数拷贝结构体数据 三.模…

善于用兵的人,军队粮草取自敌人

善于用兵的人&#xff0c;军队粮草取自敌人 【安志强趣讲《孙子兵法》第8讲】 【原文】 善用兵者&#xff0c;役不再籍&#xff0c;粮不三载&#xff1b;取用于国&#xff0c;因粮于敌&#xff0c;故军食可足也。 【注释】 役不再籍&#xff1a;役&#xff0c;兵役&#xff1b;…

横向移动-域控提权

横向移动-域控提权 CVE-2021-42287 由于Active Directory没有对域中计算机和服务器账号进行验证&#xff0c;经过身份验证的攻击者利用该漏洞绕过完全限制&#xff0c;可将域中普通用户权限提升为域管理员权限并执行任意代码。 利用条件 前提条件&#xff1a;一个域内普通账…