别再乱点屏幕了!用Monkey黑白名单精准测试你的Android App(附完整配置文件)
别再乱点屏幕了!用Monkey黑白名单精准测试你的Android App(附完整配置文件)
当你的测试设备上安装了十几个应用——自家产品、系统工具、竞品App混杂在一起,每次运行Monkey测试就像在玩俄罗斯轮盘赌:不知道下一秒随机事件会触发哪个应用,导致测试数据污染或意外跳转。这种失控状态让测试工程师们头疼不已。
其实Android早就提供了精准控制的解决方案。通过--pkg-whitelist-file和--pkg-blacklist-file这两个杀手级参数,配合简单的文本配置文件,你完全可以像手术刀般精确划定测试范围。下面我将用真实项目经验,带你掌握这套组合拳的实战用法。
1. 为什么需要黑白名单机制
想象这样一个场景:你正在测试电商App的支付流程稳定性,Monkey突然切换到短信应用发送了验证码,或是打开了相册浏览照片。这些"误伤"不仅污染测试数据,更可能引发隐私问题。黑白名单机制就是为解决这类问题而生:
- 白名单:只允许测试指定包名的应用,其他应用完全绝缘
- 黑名单:禁止测试特定包名的应用,其余应用正常接收事件
实际项目中,我推荐优先使用白名单模式。黑名单更适合需要排除少量干扰应用的场景,比如屏蔽系统设置或拨号盘这类高危应用。
2. 配置文件实战指南
2.1 创建黑白名单文件
新建whitelist.txt文件,内容格式如下:
# 这是测试目标应用 com.example.shoppingapp # 这是关联的登录服务 com.example.authservice # 每行一个包名,#开头为注释关键要点:
- 使用
adb shell pm list packages查看完整包名 - 测试前用
adb install确认应用已安装 - 文件建议放在
/sdcard/目录避免权限问题
2.2 推送文件到设备
adb push whitelist.txt /sdcard/ adb shell ls /sdcard/whitelist.txt # 验证文件存在遇到过的一个坑:部分国产机型需要改用/data/local/tmp/目录,否则会提示文件不存在。
2.3 执行精准测试命令
基础白名单测试:
adb shell monkey --pkg-whitelist-file /sdcard/whitelist.txt \ --throttle 300 \ -v -v 5000增强版命令(带异常处理和事件分布调整):
adb shell monkey --pkg-whitelist-file /sdcard/whitelist.txt \ --ignore-crashes \ --ignore-timeouts \ --pct-touch 40 \ --pct-motion 20 \ --throttle 200 \ -v -v -v 100003. 高阶配置技巧
3.1 动态包名管理
在持续集成环境中,可以编写脚本动态生成名单文件:
# generate_whitelist.py import subprocess target_packages = ["com.example.app", "com.example.lib"] with open("whitelist.txt", "w") as f: for pkg in target_packages: f.write(f"{pkg}\n") subprocess.run(["adb", "push", "whitelist.txt", "/sdcard/"])3.2 多设备并行测试
通过序列号区分设备:
# 设备A测试主App adb -s emulator-5554 shell monkey --pkg-whitelist-file /sdcard/whitelist_app.txt 5000 # 设备B测试配套服务 adb -s emulator-5556 shell monkey --pkg-whitelist-file /sdcard/whitelist_service.txt 50003.3 事件类型精细控制
推荐的事件比例分配:
| 事件类型 | 参数 | 推荐比例 | 适用场景 |
|---|---|---|---|
| 触摸事件 | --pct-touch | 30-40% | 常规UI测试 |
| 滑动事件 | --pct-motion | 15-20% | 列表滑动验证 |
| 应用切换 | --pct-appswitch | 5-10% | 多任务稳定性测试 |
| 系统按键 | --pct-syskeys | 1-2% | 按键兼容性测试 |
4. 避坑指南
最近在小米设备上遇到一个典型问题:即使正确配置了白名单,Monkey仍然会触发系统桌面。解决方案是额外黑名单:
# blacklist.txt com.miui.home com.android.launcher其他常见问题:
包名错误:特别是预装应用,不同厂商可能修改包名
- 解决方案:
adb shell pm list packages | grep keyword
- 解决方案:
文件权限问题:出现"Can't open whitelist file"错误
- 尝试路径:
/data/local/tmp/或/mnt/sdcard/
- 尝试路径:
Monkey提前退出:添加
--ignore-security-exceptions参数事件分布不均:通过
--pct-*参数调整比例,用-v -v -v查看详细日志
在华为EMUI系统上测试时,发现需要额外禁用系统优化:
adb shell settings put global hidden_api_policy_pre_p_apps 1 adb shell settings put global hidden_api_policy_p_apps 1这些实战经验都是踩了无数坑才总结出来的。记得第一次使用黑白名单时,因为没注意文件换行符格式,导致整晚的测试全跑在了系统应用上。现在我的自动化脚本里一定会先做文件验证:
# 验证文件有效性 adb shell cat /sdcard/whitelist.txt | grep -v "^#" | while read pkg; do adb shell pm path $pkg || echo "Invalid package: $pkg" done