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

相关文章

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能

《POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能》ApachePOI是一个流行的Java库,用于处理MicrosoftOffice格式文件,提供丰富API来创建、读取和修改O... 目录前言:Apache POIEasyPoiEasyExcel一、EasyExcel1.1、核心特性

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python FastAPI入门安装使用

《PythonFastAPI入门安装使用》FastAPI是一个现代、快速的PythonWeb框架,用于构建API,它基于Python3.6+的类型提示特性,使得代码更加简洁且易于绶护,这篇文章主要介... 目录第一节:FastAPI入门一、FastAPI框架介绍什么是ASGI服务(WSGI)二、FastAP