Android性能优化–Systrace工具

Android性能优化–Systrace工具(1) 总而言之,成功是留给准备好的人的。无论是参加什么面试,都要做好充足的准备,注意好面试的礼仪和穿着,向面试官表现出自己的热忱与真诚就好。即使最后没有过关,也要做好经验的总结,为下一次面试做好充足准备。这里我为大家准备了一些我在面试后整理的面试专题资料,除了面试题,还总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料分享给大家,希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。 阅读详情

Systrace

Systrace是一个平台提供的工具,可以在很短的时间内记录设备活动。该工具生成一个报告,该报告结合了Android内核中的数据,例如CPU调度程序,磁盘活动和应用程序线程。报告可帮助您确定如何最好地改善应用或游戏的性能。

chrome查看trace报告

报告提供了Android设备在给定时间段内的系统进程的总体情况。该报告还检查捕获的跟踪信息,以突出显示它所观察到的问题,例如UI jank或高功耗。

通过sdk自带的脚本工具获取想要的报告,报告只能用Chrome浏览器分析查看

获取Systrace报告文件

使用sdk的工具生成报告文件
工具:/sdk/platform-tools/systrace

                   

systrace脚本工具

 

可以通过设定脚本参数得到自己想要的报告内容

通过命令查看连接设备所支持的类型列表
python systrace.py --list-categories
可以看到可以分析的模块十分全面从硬件到软件、从底层到上层app、从view到渲染引擎基本全覆盖,配合上Profiler、MAT、hprof-conv、Hierarchy view、OverDraw工具可谓是一剑在手天下我有

image.png

获取报告的命令参数
./systrace.py -h

Commandsoptions描述
-h–help显示帮助信息
-l–list-categories列出所连接设备可用的跟踪类别
-ofile将HTML跟踪报告写入指定的文件。如果未指定此选项,systrace请将报告保存到与其相同的目录中并为其命名。 systrace.pytrace.html
-t N–time=N跟踪设备活动N秒。如果未指定此选项,则systrace提示您通过从命令行按Enter键来结束跟踪。
-b N–buf-size=N使用N千字节的跟踪缓冲区大小。此选项允许您限制跟踪期间收集的数据的总大小。
-k functions–ktrace=functions跟踪以逗号分隔的列表中指定的特定内核函数的活动。
-a app-name–app=app-name启用应用程序的跟踪,指定为以逗号分隔的进程名称列表 。应用程序必须包含来自Trace类的跟踪检测调用 。每当您分析应用程序库时,都应指定此选项,例如 RecyclerView,包括跟踪检测调用,这些调用在启用应用程序级跟踪时提供有用信息。有关更多信息,请转到有关如何检测应用程序代码的部分。
–from-file=file-path从文件创建交互式HTML报告,例如包含原始跟踪数据的TXT文件,而不是运行实时跟踪。
-e device-serial–serial=device-serial在特定连接设备上进行跟踪
categories 包括您指定的系统进程的跟踪信息,例如gfx用于呈现图形的系统进程。您可以systrace使用该-l命令运行以查看所连接设备可用的服务列表。
–waltWALT trace options测量手机和计算机上物理传感器和输出的延迟

获取报告
无时间限制,需要enter键开始
./systrace.py -o trace.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res
加时间参数
./systrace.py -o trace.html -t 12 sched freq idle am wm gfx view binder_driver hal dalvik camera input res
完成后使用chrome打开得到的文件即可

获取报告的命令执行,file路径为报告文件路径

Android9以上版本也可以通过开发者模式获取

次方式不推荐使用 

                                       

打开系统跟踪

                                       

开启记录

                                                           

停止记录

                                              

分享记录文件

通过消息或通过ADB共享跟踪时,报告本身驻留在.ctrace文件中。使用此文件,可以生成跟踪的HTML报告。为此,请在终端窗口中运行以下命令:

cd / path-to-traces-on-my-dev-machine && \
systrace –from-file trace-file-name .ctrace

但是需要systrace命令行程序

报告分析

Systrace生成包含一系列部分的输出HTML文件。该报告列出了每个进程的线程。如果给定线程呈现UI帧,则报告还指示沿时间线的呈现帧。当在报告中从左向右移动时,时间会向前传递。

报告从上到下包含以下部分

  • UI交互活动
    第一部分包含表示应用或游戏中特定用户交互的条形图,例如点击设备屏幕。这些相互作用充当有用的时间标记

    UI交互活动
  • CPU活动
    显示了表示每个CPU中的线程活动的条形图。条形图显示所有应用程序(包括您的应用程序或游戏)的CPU活动。

折叠的CPU活动部分的示例


折叠图

CPU活动部分是可扩展的,允许您查看每个CPU的时钟频率


CPU活动(展开视图),显示Systrace报告中的CPU时钟频率

  • 系统事件
    直方图显示特定的系统级事件,例如纹理计数和特定对象的总大小。

    系统级事件

值得仔细检查的直方图是标记为SurfaceView的直方图。计数表示已传递到显示管道并等待在设备屏幕上显示的组合帧缓冲区的数量。由于大多数设备都是双缓冲或三缓冲,因此该计数几乎总是0,1或2。

描述Surface Flinger过程的其他直方图,包括VSync事件和UI线程交换工作,如下图


Systrace报告中的Surface Flinger示例图

  • 显示框架

    显示框架

这一部分,通常是报告中最多的部分,描绘了一条彩色线条,后面是成堆的条形图。这些形状表示已创建的特定线程的状态和帧堆栈。

UI线程或应用程序或游戏通常运行的主线程始终显示为第一个线程。


帧堆栈信息

每堆条形图上方的多色线表示特定线程随时间变化的状态集。该行的每个部分可以包含以下颜色之一:

绿色:Running
线程正在完成与进程相关的工作或正在响应中断。
蓝色:Runnable
线程可以运行但当前没有安排。
白色:Sleeping
线程没有工作要做,可能是因为线程在互斥锁上被阻塞。
橙色:Uninterruptable sleep(不间断的睡眠)
线程在I / O上被阻塞或等待磁盘操作完成。
紫色:Interruptable sleep(可以中断睡眠)
线程在另一个内核操作(通常是内存管理)上被阻塞。

  • 报告分析操作快捷键
key描述
W放大时间轴
A在跟踪时间线上左移
S缩小时间轴
D在跟踪时间轴上向右平移
E将跟踪时间轴置于当前鼠标位置的中心
M选中当前帧
1将当前活动的选择模型更改为“选择”模式。对应于鼠标选择器工具栏中显示的第一个按钮
2将当前活动的选择模型更改为“平移”模式。对应于鼠标选择器工具栏中显示的第二个按钮
3将当前活动的选择模型更改为“缩放”模式。对应于鼠标选择器工具栏中显示的第3个按钮
4将当前活动的选择模型更改为“计时”模式。对应于鼠标选择器工具栏中显示的第4个按钮
G在当前所选任务的开头显示网格
Shift + G在当前所选任务的末尾显示网格
左键在当前选定的时间轴上选择上一个事件
右键选择当前所选时间轴上的下一个事件

自定义systrace数据获取

以上数据默认仅在系统级别向显示有关进程的信息,因此有时很难知道应用程序或游戏的哪些方法在给定时间相对于系统事件执行。

Android平台提供了一个trace API,可以使用它来标记特定的代码段。如果捕获应用程序“debug”版本的新系统跟踪并包含该-a选项,如下面的代码段所示,这些自定义事件将显示在Systrace报告中:

python systrace.py -a com.zerone.qrcode -b 16384 -o my_systrace_report.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res 

java 层code
堆栈的每个级别代表为应用或游戏定义beginSection()的自定义跟踪事件的调用或开始

  • Trace.beginSection(String sectionName)和 Trace.endSection()需要成对出现
  • 为保证每个 Trace.beginSection(String sectionName) 都会有对应的 Trace.endSection(),建议使用 try {……} finally {……}
  • 如果在 Trace.endSection()之前有多个 Trace.beginSection(String sectionName),Trace.endSection()会匹配离它最近的一个未匹配过的 Trace.beginSection(String sectionName)
  • Trace.beginSection(String sectionName)和 Trace.endSection()需要在同一线程中
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Trace.beginSection("MyAdapter.onCreateViewHolder");
        MyViewHolder myViewHolder;
        try {
            myViewHolder = MyViewHolder.newInstance(parent);
        } finally {
            //在try和catch语句中,总是在a中调用“endSection()”
            //“终于”阻止。这样,即使在a时也调用该方法
            //发生异常。
            Trace.endSection();
        }
        return myViewHolder;
    }
   @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        Trace.beginSection("MyAdapter.onBindViewHolder");
        try {
            try {
                Trace.beginSection("MyAdapter.queryDatabase");
                RowItem rowItem = queryDatabase(position);
                dataset.add(rowItem);
            } finally {
                Trace.endSection();
            }
            holder.bind(dataset.get(position));
        } finally {
            Trace.endSection();
        }
    }
}

Native层code
Android 6.0(API级别23)及更高版本支持native trace API,trace.h将跟踪事件写入系统缓冲区,然后使用Systrace进行分析。此API的常见用例包括观察特定代码块执行的时间以及将代码块与不良系统行为相关联的时间。

要定义应用或游戏中本机代码中发生的自定义事件,请完成以下步骤:
1、定义用于捕获游戏中自定义事件的ATrace函数的函数指针,如以下代码段所示:

#include <android/trace.h>
#include <dlfcn.h>
void *(*ATrace_beginSection) (const char* sectionName);
void *(*ATrace_endSection) (void);
typedef void *(*fp_ATrace_beginSection) (const char* sectionName);
typedef void *(*fp_ATrace_endSection) (void);

2、在运行时加载ATrace符号,如以下代码段所示。通常,在对象构造函数中执行此过程。

//检索libandroid的句柄。
void *lib = dlopen("libandroid.so", RTLD_NOW || RTLD_LOCAL);
//访问本机跟踪功能。
if (lib != NULL) {
   //使用dlsym()防止运行Android 5.1的设备崩溃
    //(API级别22)或更低。
    ATrace_beginSection = reinterpret_cast<fp_ATrace_beginSection>(
        dlsym(lib, "ATrace_beginSection"));
    ATrace_endSEction = reinterpret_cast<fp_ATrace_endSection>(
        dlsym(lib, "ATrace_endSection"));
}

出于安全原因,请dlopen()仅在您的应用或游戏的调试版本中包含调用 。

3、打电话ATrace_beginSection()和 ATrace_endSection()在开始和结束时,分别自定义事件:

#include <android/trace.h>
char *customEventName = new char[32];
sprintf(customEventName, “用户点击%s按钮” , buttonName);
ATrace_beginSection(customEventName);
//您的应用或游戏对按下按钮的响应。
ATrace_endSection();

 

Perfetto/Systrace进阶:第三方App如何正确使用Trace.beginSection方法(附解决方案) 本文深入解析了第三方Android应用在使用Trace.beginSection方法时,标记在Perfetto/Systrace中不显示的常见问题。核心原因在于ATRACE_TAG_APP标签默认未启用,需要通过抓取命令的-a参数指定目标应用包名。文章提供了从原理剖析到多种实战解决方案的完整指南,帮助开发者正确启用应用级跟踪,实现精准性能分析。 阅读详情

相关推荐

Android性能优化–Systrace工具,移动网页开发工具

| –walt | WALT trace options | 测量手机和计算机上物理传感器和输出的延迟 | 获取报告 无时间限制,需要enter键开始 ./systrace.py -o trace.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res 加时间参数 ./systrace.py -o trace.html -t 12 sched freq idle am wm gfx view binder_d

m0_65146205的博客 9340

Android 性能优化系列 - 01 手把手教你使用 systrace

转自:https://www.jianshu.com/p/19b3245207e8?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io 一. 概述 性能优化是 Android 中的一个重要知识,也是衡量一个 Android 工程师水平的重要依据,简单的性能优化,可能很多人都会。比如以下几个优化 UI 渲染...

along 4757

Android性能优化四维归因:卡慢耗崩的系统级根因分析

Android性能问题本质是应用层、Framework、HAL与Kernel多层调度协同失效的表现。理解UI线程阻塞如何被SurfaceFlinger放大为掉帧、Bitmap复用为何在ART GC策略下引发内存抖动,是突破‘知其然不知其所以然’的关键。这类问题不单靠工具堆砌,而需建立从Activity启动到GPU提交的全链路断点定位能力,并结合LMK阈值、唤醒频率、对象生命周期错配等底层机制进行归因。适用于中高级Android开发者解决真实产线中的卡顿、OOM、高功耗与ANR问题。

weixin_30872577的博客 201

Android技能树点亮计划-Trace的使用

背景 做App启动优化的时候,Trace是优化过程中一个很重要的工具,Trace分析工具包含两种 method trace:抓线程中代码的执行栈和耗时 systrace:抓app使用过程中cpu、线程和锁阻塞等信息 method trace 介绍 通过method trace 抓取线程中执行的方法栈和方法耗时。如图,通过分析主线程的方法调用,解决主线程耗时逻辑。 放大: 按W 键或者向前滑动鼠标的同时按下Ctrl 键 缩小: 按S 键或者向前滑动鼠标的同时按下Ctrl 键 左移: 按A 或者左移.

m0_59162559的博客 4864

LocalTrace:针对所有Android的systrace的beginSectionendSection的进程内重新生成

本地痕迹 您的所需的全部*的完整替代品。 或者 我如何学会停止阅读日志并热爱可视化 *:出于我的目的 什么 (几乎)直接替代android.os.Trace.beginSection / endSection单进程使用,但它没有任何依赖关系(Android API v1之外)。 看! 它给你这个! 如何 在代码周围LocalTrace.beginSection("name") / LocalTrace.endSection()调用(每个部分必须在同一线程上开始/结束),然后运行该应用程序。 日志大约每秒钟刷新一次到磁盘上,因此请等到有趣的事情完成后至少等待一秒钟。 每当您的应用程序启动时,都会创建一个新文件,因此结果不会互相干扰。 之后,通过adb pull (或adb shell run-as com.example.yourapp cat file.trace > file.tr

别再只盯着报点率了:聊聊电容触摸屏算法里那些不为人知的‘软实力’

本文深入探讨了电容触摸屏算法中常被忽视的‘软实力’,包括环境噪声干扰、信号衰减补偿和多物理场耦合等核心挑战。通过对比消费电子与工业场景的算法需求,揭示了触摸算法在不同应用中的技术分野。文章还提供了实用的算法评估方法和前沿发展趋势,帮助开发者全面了解电容触摸屏技术的隐秘战场。

weixin_42524276的博客 391

systrace/perfetto第三方app的Trace.beginSection方法无效问题和TAG开放剖析

有针对native的c++代码,也有系统app的java代码,但是缺少了普通第三方app如何打印trace,有学员朋友在第三方app尝试打印trace时候发现了一些问题,那就是使用perfetto抓取的trace死活没有自己打印的trace,马哥这边经过验证也确实有存在相关的问题,下面针对第三方app没办法打印trace问题来进行详细的分析。下面分别分析一下普通tag和ATRACE_TAG_APP是如何进行设置的,这里为了简单方便拿atrace代码来分析。//trace代表结束,与上面方法成对出现。

liaosongmao1的专栏 471

txt经纬度批量转面要素(附自定义ArcGIS工具箱方法)

当涉及大量txt坐标文件需要转换成面要素的时候,逐步操作工作量较大。本文由需求出发,以ArcGIS10.2为例,采用python脚本自定义ArcGIS工具,实现批量操作的目的。

m0_59216200的博客 1818

Android性能优化–Systrace工具,总结到位

在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。

2401_84149743的博客 1675

Figure 03人形机器人与Helix端到端控制系统:具身智能突破深度解析

2026年5月,Figure AI的Figure 03人形机器人在一场震撼业界的直播中完成了长达200小时的连续全自动作业,分拣近25万个包裹,零故障。这一里程碑式的成就标志着人形机器人正式从「实验室展示」迈入「规模化商用」阶段。本文深入剖析Figure 03的核心技术——Helix端到端神经网络控制系统,包括System 0/1/2三层架构、视觉运动策略、全身协同控制等关键技术,并提供完整的Python/Go代码示例,帮助开发者理解具身智能的核心原理与实现路径。关键词。

shao.bing的专栏 998

WinForm布局

登录模板页面UILoginForm

m0_71541781的博客 470

Android性能优化–Systrace工具(1),retrofit面试

考虑到文章的篇幅问题,我把这些问题和答案以及我多年面试所遇到的问题和一些面试资料做成了PDF文档《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!ndroid)**考虑到文章的篇幅问题,我把这些问题和答案以及我多年面试所遇到的问题和一些面试资料做成了PDF文档[外链图片转存中…(img-Gn5wR6sJ-1712429398064)][外链图片转存中…(img-kAgKwF3Q-1712429398065)]

2401_84149733的博客 689

PyQt5自动化测试,让测试更加便利

PyQt5是一个Python的GUI编程工具包,帮助开发者可以更加简单、快捷地创建图形界面和处理用户输入。在PyQt5中有两种常见的测试方式:手动测试和自动化测试。手动测试需要通过点击、输入等交互操作进行测试,自动化测试则是通过程序模拟鼠标、键盘等操作进行测试。这段代码创建了一个简单的窗口,其中包含一个按钮。这段代码打开一个本地HTML文件,点击页面上的按钮并检查输出是否为“Button clicked”。以上就是在PyQt5中进行自动化测试的简单示例。使用PyQt5可以大大简化测试过程,提高测试效率。

PixelCoder的博客 710

Android性能优化–Systrace工具,kotlin参数默认值

获取报告 无时间限制,需要enter键开始 ./systrace.py -o trace.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res 加时间参数 ./systrace.py -o trace.html -t 12 sched freq idle am wm gfx view binder_driver hal dalvik camera input res 完成后使用chrome打开得到的文件即可

sa3221sa的博客 334

华为OD机试新系统真题-魔法咒语组合(Java/Py/C++/Go/C/Js)

华为OD机试 新系统真题【魔法咒语组合】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【魔法咒语组合】多语言题解

qq_45776114的博客 669

Cesium 实战 04 - 标绘功能系列之画点(draw point)

Cesium 实战 - 标绘功能之画点(draw point)。

非科班Java出身GISer的博客 1085

2024年Android最新Android性能优化–Systrace工具,2024年最新android ams面试题

找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。多练。(视频优势是互动感强,容易集中注意力)你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

2401_84563734的博客 895

基于HTML5的酒店在线预订系统设计与实现

1.背景介绍 酒店预订系统,作为现代酒店业务中的重要一环,其便捷性、智能化程度直接影响着酒店的服务质量和经营效果。近年来,随着互联网技术和移动设备的快速发展,以及消费者行为的日益电子化,酒店预订系统也正在经历一场深刻的变革。传统的酒店预订系统往往依赖于复杂的软件安装和硬件设备,而新一代的酒店预订系统则更加强调在线、移动和云端的特性。HTML5作为一种前

AI天才研究院 1909

EasyFlipView性能优化指南:让卡片翻转如丝般顺滑的5个实用技巧

EasyFlipView是一个强大的Android卡片翻转动画库,专门用于创建如信用卡、扑克牌等双面视图的流畅翻转效果。本指南将分享5个关键的EasyFlipView性能优化技巧,帮助开发者提升应用的动画体验和性能表现。 ## 🚀 为什么需要优化EasyFlipView性能? 在移动应用中,动画性能直接影响用户体验。EasyFlipView虽然提供了出色的卡片翻转功能,但在复杂场景或低端设备

gitblog_00463的博客 370

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Unity手游性能体检:基于真实场景的病理级优化指南

Unity手游性能问题本质是多维耦合的系统性‘病症’,而非单一技术模块缺陷。其原理根植于CPU/GPU协同瓶颈、内存管理机制与渲染管线特性,技术价值在于将模糊体验(如卡顿、闪退)转化为可量化、可复现、可干预的工程指标。典型应用场景覆盖启动黑屏、UI重建卡顿、粒子GPU过载、热更新内存泄漏等上线高频故障。通过机型基线、Unity版本锚定与Systrace+Profiler交叉诊断,实现从症状到根因的临床式定位。本文聚焦Unity手游性能‘体检’方法论,深度融合TextMeshPro优化与Shader Vari

weixin_27945229的博客 221

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: Android性能调优工具TraceView
下一篇: Android 架构篇----------Framework初识
augfun
博客等级 码龄10年 311粉丝 662原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值