AndroidBench 不是一个单一的命令行工具,而是一个基于 Android 性能分析框架(如 ADB, am, dumpsys 等)的自动化测试脚本集合,它的核心思想是定义一套标准化的测试流程和指标,然后通过脚本来自动化执行这些流程并收集数据。
它的“参数”可以分为几个层面:
- 配置文件参数:这是最核心的参数,通过修改配置文件来定义测试场景、应用包名、测试时长等。
- 命令行执行参数:用于控制脚本的执行,如启动、停止、指定配置文件等。
- ADB 命令参数:脚本内部会大量使用 ADB 命令,这些命令的参数也会影响最终结果。
下面我们逐一进行详细说明。
核心:配置文件参数
这是你自定义测试内容的主要方式,AndroidBench 的配置通常是 JSON 格式的文件(config.json),你通过修改这个文件来告诉脚本“要测试什么”、“怎么测试”。
一个典型的 config.json 文件包含以下主要部分:
基本配置
这部分定义了测试的基本信息。
test_name: 测试任务的名称,用于生成报告时区分。duration: (关键参数) 每个测试场景的持续时间,单位是秒。300表示运行5分钟。iterations: 每个测试场景重复执行的次数。warmup_iterations: 在正式开始收集数据前,应用的预热轮数,这很重要,可以排除应用冷启动带来的干扰。package_name: 被测试应用的包名(com.example.myapp)。main_activity: 被测试应用的主 Activity 类名(com.example.myapp.MainActivity)。
示例:
{
"test_name": "MyApp_Performance_Test",
"duration": 600, // 运行10分钟
"iterations": 3, // 每个场景跑3遍
"warmup_iterations": 1, // 预热1遍
"package_name": "com.example.myapp",
"main_activity": "com.example.myapp.MainActivity"
}
测试场景
这是配置文件的核心,定义了要执行的具体性能测试,通常是一个数组,你可以定义多个场景,脚本会按顺序执行。
每个场景对象通常包含:
name: 场景名称("Scrolling", "Video Playback")。actions: 该场景下要执行的一系列操作,AndroidBench 通过adb shell am命令来模拟用户操作。
actions 中的常见操作参数:
command: ADB 命令,通常是am(Activity Manager) 的子命令。am start -n <package_name>/<activity_name>: 启动一个 Activity。am force-stop <package_name>: 强制停止应用。am broadcast ...: 发送广播。
args: 传递给command的参数。delay: 执行完该操作后等待的时间,单位是毫秒,这对于模拟用户操作间隔至关重要。type: 操作的类型,有时用于分类或特殊处理。
示例:一个滚动测试场景
"scenarios": [
{
"name": "Vertical_Scroll_List",
"actions": [
{
"command": "am",
"args": ["start", "-n", "com.example.myapp/com.example.myapp.MainActivity"],
"delay": 2000
},
{
"command": "input",
"args": ["swipe", "500", "1500", "500", "500", "300"], // 从下往上滑动
"delay": 1000
},
{
"command": "input",
"args": ["swipe", "500", "500", "500", "1500", "300"], // 从上往下滑动
"delay": 1000
}
// ... 可以重复滑动动作
],
"duration": 300 // 这个场景总共持续5分钟
}
]
命令行执行参数
当你运行 AndroidBench 的主脚本(通常是 Python 脚本,如 run.py)时,可以通过命令行参数来控制其行为。
--config或-c: (最常用) 指定要使用的配置文件路径。python run.py --config /path/to/your/config.json
--output-dir或-o: 指定测试结果的输出目录,如果不指定,通常会使用默认目录(如results/)。python run.py -c config.json -o ./my_test_results
--verbose或-v: 启用详细输出模式,在控制台打印更多调试信息。python run.py -c config.json -v
--device-id或-d: 指定要连接的设备 ID,如果你有多个连接的 Android 设备,这个参数必不可少。# 先用 'adb devices' 查看设备 ID python run.py -c config.json -d emulator-5554
--help或-h: 显示帮助信息,列出所有可用的命令行参数。
ADB 命令参数(脚本内部使用)
虽然这些不是你直接传给 AndroidBench 的参数,但理解它们有助于你更好地配置测试,AndroidBench 脚本会执行一系列 ADB 命令来收集性能数据,这些命令的参数决定了数据的维度和精度。
CPU 使用率
脚本通常使用 adb shell top 或 adb shell dumpsys cpuinfo 来获取 CPU 数据。
adb shell top -n 1 -d 1 -s cpu: 每秒刷新一次,按 CPU 使用率排序,只显示一轮。-n是迭代次数,-d是延迟,-s是排序字段。- 关注点:脚本会解析输出,提取目标应用的
USER和KERNELCPU 使用率,计算总和。
内存使用情况
脚本使用 adb shell dumpsys meminfo <package_name>。
- 关注的关键参数:
Pss: 这是最重要的指标,表示应用实际占用的物理内存,包含了共享库按比例分摊的部分。Private Dirty: 应用私有的、被修改过的内存,这部分无法被交换出去,对性能影响较大。Shared_Dirty: 应用与其他进程共享的、被修改过的内存。
功耗
功耗测量比较复杂,通常需要硬件支持或特定系统接口。
adb shell dumpsys batterystats: 可以获取详细的电池统计信息,包括每个应用的耗电情况。adb shell dumpsys power: 获取电源状态信息。- 注意:精确的功耗测量通常需要像 Monsoon Power Meter 这样的硬件设备。
帧率
这是衡量应用流畅度的关键指标。
adb shell dumpsys gfxinfo <package_name>: 这是获取 FPS 数据的主要方式。- 脚本会定期执行此命令,并关注其中的
Frames部分,特别是janky(卡顿) 帧的数量。 - 关键参数:
total frames,janky frames,60fps,59fps,58fps等,FPS =total frames / duration。
- 脚本会定期执行此命令,并关注其中的
网络流量
adb shell cat /proc/<pid>/net/dev: 获取指定进程的网络 I/O 统计。- 脚本需要在测试开始和结束时分别获取一次,然后计算差值,得到上传和下载的总字节数。
tx_bytes(发送),rx_bytes(接收)。
总结与实际操作建议
- 从配置文件开始:你的首要任务是编写一个
config.json文件,明确你要测试的应用、测试场景(如滚动、点击、后台切换)以及每个场景的持续时间。 - 理解
actions:熟练使用adb shell am和adb shell input命令来构建你的测试场景,可以先手动在命令行里执行这些命令,确认效果无误后再写入配置文件。 - 使用命令行参数:
-c(指定配置) 和-d(指定设备) 是最常用的两个启动参数。 - 分析报告:测试完成后,AndroidBench 会生成一个包含所有数据的报告(通常是 CSV 或 JSON 格式),你需要用 Excel、Python Pandas 或其他工具来分析这些数据,绘制图表,找出性能瓶颈。
AndroidBench 的参数体系是:
命令行参数(控制脚本) ->配置文件参数(定义测试内容) ->ADB 命令参数(执行具体操作和收集数据)
掌握这三层,你就可以灵活地使用 AndroidBench 来进行各种自动化性能测试了。
