本文主要介绍通过 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 任务的调度情况。