Systrace 工具抓取trace方式

19 阅读6分钟

本文主要介绍通过 shell 方式用 systrace 抓取某个应用的 trace 文件,包括调整 PACKAGE 参数指定包名,并详细列举了 systrace 相关的命令选项及模块解释,如抓取时间、业务模块、选项说明、模块分类等。

1、抓取 trace 文件方式

# media 参数是包名的简称,脚本会自动转换成对应的包名
./systrace.sh media

2、脚本内容

以下是抓取 trace 文件的具体脚本内容,通过调整 PACKAGE 参数,可以指定抓取某个包名的数据;

#!/bin/bash -i

# 定义包名
MEDIA_PACKAGE="com.example.media"

param1=$1
echo -e "param1: $param1"

# 外部传入缩写,转换成指定包名
function getPackage(){
        # 此处可以继续拓展其他的包名转换逻辑
        if [ "$param1" == "media" ];then
            echo $MEDIA_PACKAGE
        fi
}

function help() {
	echo "抓取时间 10S"
	echo "图形显示:gfx view webview wm"
	echo "输入交互:input"
	echo "系统管理:am sm pm ss res"
	echo "多媒体:audio video camera"
	echo "硬件底层:hal rs bionic power irq irqoff premptoff i2c freq idle disk mmc sync workq memreclaim regulators binder_driver binder_lock pagecache memory ion"
	echo "其他:database network adb vibrator aidl nnapi rro pdx sched"
}

function now() {
	date +"%Y-%m-%d_%H-%M-%S"
}

function modules() {
	echo "gfx view webview wm input am sm pm ss res audio video disk idle memory binder_driver binder_lock network database aidl sched"
}

function startSystrace() {
	# 查看 systrace 的命令
	# adb shell atrace --help
	# 查看 systrace 命令支持抓取的业务模块
	# adb shell atrace --list_categories
	package=$(getPackage)
	modules=$(modules)
	now=$(now)
	fileName=result/systrace/systrace_${param1}_${now}.html
	echo "package: $package"
	echo "modules: $modules"
	echo "outfile: $fileName"
        # 通过 alias 命令定义 systrace.py 脚本的别称,将其写入 ~/.bashrc 文件即可
  # alias st_start='python /opt/platform-tools_r31.0.3-linux/platform-tools/systrace/systrace.py'
	st_start --time=10 $modules -b 8192 -o $fileName -a $package
}

startSystrace

# adb shell atrace 命令解释

#  adb shell atrace
#  [options]:表示可以使用的可选参数,用于配置跟踪的行为。
#  [categories...]:表示要跟踪的类别,可以指定多个类别,用空格分隔。
#  选项说明
#  
#  -a appname
#  作用:为以逗号分隔的命令行列表启用应用级跟踪。* 是通配符,可匹配任何进程。
#  示例:atrace -a com.example.app 会对 com.example.app 应用进行跟踪。
#  
#  -b N
#  作用:设置跟踪缓冲区的大小为 N KB。
#  示例:atrace -b 1024 会将跟踪缓冲区大小设置为 1024 KB。
#  
#  -c
#  作用:将跟踪数据写入一个循环缓冲区。
#  
#  -f filename
#  作用:从文件中读取要跟踪的类别,文件中的类别以空格分隔。
#  示例:atrace -f categories.txt 会从 categories.txt 文件中读取类别进行跟踪。
#  
#  -k fname,...
#  作用:跟踪指定的内核函数。
#  示例:atrace -k function1,function2 会跟踪 function1 和 function2 这两个内核函数。
#  
#  -n
#  作用:忽略信号,确保跟踪过程不会被信号中断。
#  
#  -s N
#  作用:在开始跟踪前等待 N 秒,默认值为 0 秒。
#  示例:atrace -s 5 会在开始跟踪前等待 5 秒。
#  
#  -t N
#  作用:指定跟踪的持续时间为 N 秒,默认值为 5 秒。
#  示例:atrace -t 10 会进行 10 秒的跟踪。
#  
#  -z
#  作用:对跟踪数据进行压缩。
#  
#  --async_start
#  作用:启动循环跟踪并立即返回,不等待跟踪完成。
#  
#  --async_dump
#  作用:转储当前循环跟踪缓冲区的内容。
#  
#  --async_stop
#  作用:停止跟踪并转储当前循环跟踪缓冲区的内容。
#  
#  --stream
#  作用:将跟踪数据实时输出到标准输出。需要注意的是,这会占用大量 CPU 时间,适合用于测量不受 CPU 性能影响的指标,如页面缓存使用情况。
#  
#  --list_categories
#  作用:列出可用的跟踪类别。
#  
#  -o filename
#  作用:将跟踪数据写入指定的文件,而不是输出到标准输出。
#  示例:atrace -o trace.txt 会将跟踪数据写入 trace.txt 文件。


# adb shell atrace --list_categories 模块解释

#  1. 图形与显示相关
#  gfx:图形渲染相关的操作,包括 OpenGL、SurfaceFlinger 等图形系统的活动。有两个 gfx 类别,其中一个可能是与 HAL(硬件抽象层)相关的图形操作。
#  view:视图系统,涉及 Android 应用中视图的创建、布局和绘制等操作。
#  webview:WebView 组件的操作,用于在 Android 应用中显示网页内容。
#  wm:窗口管理器,负责管理窗口的创建、显示、隐藏和调整大小等操作。
#  
#  2. 输入与交互相关
#  input:输入系统,包括触摸屏、键盘、鼠标等输入设备的事件处理。
#  
#  3. 系统管理相关
#  am:活动管理器,负责管理 Android 应用中的活动(Activity)的生命周期和切换。
#  sm:同步管理器,用于管理系统中的数据同步操作。
#  pm:包管理器,负责应用的安装、卸载、更新等操作。
#  ss:系统服务,涉及 Android 系统服务器的各种操作。
#  res: 资源加载。
#  
#  4. 多媒体相关
#  audio:音频处理,包括音频的播放、录制和编解码等操作。
#  video:视频处理,包括视频的播放、录制和编解码等操作。
#  camera:相机相关的操作,包括相机的启动、预览和拍照等。
#  
#  5. 硬件与底层相关
#  hal:硬件抽象层,涉及与硬件设备交互的抽象接口。
#  rs:RenderScript,一种用于在 Android 设备上进行高性能计算的 API。
#  bionic:Bionic C 库,是 Android 系统中使用的 C 标准库。
#  power:电源管理,涉及设备的电源状态和功耗管理。
#  irq:中断请求事件,用于处理硬件设备的中断信号。
#  irqoff:中断禁用代码段的跟踪,用于分析中断禁用对系统性能的影响。
#  preemptoff:抢占禁用代码段的跟踪,用于分析抢占禁用对系统性能的影响。
#  i2c:I2C 总线事件,用于与 I2C 设备进行通信。
#  freq:CPU 频率,用于跟踪 CPU 频率的变化。
#  idle:CPU 空闲状态,用于跟踪 CPU 的空闲时间。
#  disk:磁盘 I/O 操作,包括文件系统的读写操作。
#  mmc:eMMC 命令,用于与 eMMC 存储设备进行通信。
#  sync:同步操作,涉及线程同步和锁机制。
#  workq:内核工作队列,用于处理内核中的异步任务。
#  memreclaim:内核内存回收,用于跟踪内核内存的回收过程。
#  regulators:电压和电流调节器,用于管理设备的电源供应。
#  binder_driver:Binder 内核驱动,用于 Android 系统中的进程间通信。
#  binder_lock:Binder 全局锁跟踪,用于分析 Binder 通信中的锁竞争情况。
#  pagecache:页面缓存,用于跟踪文件系统的页面缓存使用情况。
#  memory:内存管理,涉及系统内存的分配和释放。
#  ion:ION(通用内存分配器)分配,用于跟踪硬件加速相关的内存分配。
#  
#  6. 其他相关
#  database:数据库操作,包括 SQLite 数据库的读写操作。
#  network:网络操作,包括网络连接、数据传输等。
#  adb:Android Debug Bridge(ADB)相关的操作。
#  vibrator:振动器相关的操作,用于控制设备的振动。
#  aidl:Android Interface Definition Language(AIDL)调用,用于进程间通信的接口定义。
#  nnapi:神经网络 API,用于在 Android 设备上进行神经网络推理。
#  rro:运行时资源覆盖,用于动态替换应用的资源。
#  pdx:PDX 服务,用于 Android 系统中的进程间通信。
#  sched:CPU 调度,用于跟踪 CPU 任务的调度情况。