adb进阶实战:文件传输、截屏与录屏的高效自动化

张开发
2026/4/11 4:39:28 15 分钟阅读

分享文章

adb进阶实战:文件传输、截屏与录屏的高效自动化
1. 为什么需要adb文件传输与屏幕操作自动化第一次接触adb时你可能觉得这不过是个普通的调试工具。但当我真正把它用在实际项目中才发现adb简直就是安卓开发的瑞士军刀。特别是在需要频繁传输文件、截取屏幕或录制操作视频时手动操作不仅效率低下还容易出错。想象一下这样的场景你正在测试一个购物应用需要反复验证商品详情页的UI适配情况。传统做法是手动截图然后通过数据线或聊天工具传到电脑再重命名归档。这个过程不仅耗时文件名还容易混乱。而用adb命令一个简单的脚本就能自动完成截图、命名、传输全流程。更实用的场景是自动化测试。我们团队在做兼容性测试时需要在20多台不同型号的设备上执行相同操作并收集截图。手动操作几乎不可能完成而通过adb脚本我们实现了全自动的批量截图和文件归档测试效率提升了10倍不止。2. 文件传输的高阶玩法2.1 基础命令的隐藏技巧adb pull和adb push看似简单但有几个实用参数很多人不知道。比如-a参数可以保留文件时间戳这在需要对比文件版本时特别有用adb pull -a /sdcard/logs/app.log ./logs/更实用的是-z和-Z参数它们分别支持压缩传输和禁用压缩。当传输大量小文件时压缩能显著提升速度adb push -z ./assets/ /sdcard/game/assets/2.2 批量文件传输实战处理多个文件时直接使用通配符可能会遇到路径问题。我的经验是结合find命令更可靠# 将手机DCIM目录下所有.jpg文件拉取到本地 adb shell find /sdcard/DCIM -name *.jpg | xargs -I {} adb pull {} ./photos/对于需要定期同步的目录可以编写一个简单的同步脚本#!/bin/bash DEVICE_DIR/sdcard/project/assets LOCAL_DIR./mobile_assets # 比较本地和设备的文件差异 diff (adb shell ls -R $DEVICE_DIR) (ls -R $LOCAL_DIR) # 同步更新过的文件 adb shell find $DEVICE_DIR -type f -newermt 1 day ago | while read file; do adb pull $file $LOCAL_DIR/${file##*/} done3. 截屏自动化进阶技巧3.1 定时截屏的实现方案基础的screencap命令只能手动执行但结合定时任务就能实现自动截屏。在Linux/macOS上可以使用watch命令# 每5秒截屏一次 watch -n 5 adb shell screencap -p /sdcard/$(date %s).png对于更复杂的场景比如需要在特定界面状态时截屏可以结合adb shell dumpsys检测当前Activitywhile true; do if adb shell dumpsys window | grep -q com.example.targetapp; then adb shell screencap -p /sdcard/$(date %Y%m%d_%H%M%S).png sleep 1 fi done3.2 高质量截屏参数优化默认的screencap输出有时会出现色差或质量损失特别是对于AMOLED屏幕。通过指定-d参数可以改善adb shell screencap -d 32 -p /sdcard/high_quality.png对于需要精确像素对比的UI测试建议使用无损的PNG格式并禁用压缩adb shell screencap -p | sed s/\r$// screenshot.png4. 录屏功能深度优化4.1 专业级录屏参数配置基础的screenrecord已经能满足日常需求但通过调整参数可以获得更专业的录制效果。这是我常用的高清录制参数adb shell screenrecord --size 1080x1920 --bit-rate 8000000 --time-limit 60 /sdcard/demo.mp4重要参数说明--size推荐使用设备原生分辨率--bit-rate8Mbps适合大多数场景复杂动画可提升到12Mbps--time-limit超过3分钟建议分段录制4.2 条件触发录屏方案在自动化测试中经常需要只在出现特定条件时开始录屏。这个脚本会在检测到错误日志时开始录制# 监控日志关键词 adb logcat | grep --line-buffered CRASH | while read; do # 开始录屏 adb shell screenrecord /sdcard/crash_record.mp4 RECORD_PID$! # 录制30秒后停止 sleep 30 kill $RECORD_PID # 保存录屏文件 adb pull /sdcard/crash_record.mp4 ./logs/ done5. 综合自动化脚本实战5.1 一键测试套件示例将文件操作、截屏和录屏组合起来可以创建强大的测试脚本。这是我为UI测试开发的一键脚本#!/bin/bash # 初始化测试目录 TEST_DIR./test_$(date %Y%m%d_%H%M%S) mkdir -p $TEST_DIR # 安装测试APK adb install -t ./app-debug.apk # 启动应用并开始录屏 adb shell am start -n com.example.app/.MainActivity adb shell screenrecord /sdcard/ui_test.mp4 RECORD_PID$! # 执行测试步骤 source ./test_steps.sh # 停止录屏 kill $RECORD_PID wait $RECORD_PID # 收集结果 adb pull /sdcard/ui_test.mp4 $TEST_DIR/ adb shell screencap -p /sdcard/final_state.png adb pull /sdcard/final_state.png $TEST_DIR/ # 打包测试结果 zip -r $TEST_DIR.zip $TEST_DIR5.2 错误处理与日志收集完善的自动化脚本需要健壮的错误处理。这个模板包含了超时控制和错误收集#!/bin/bash MAX_RETRY3 TIMEOUT60 function run_test() { local attempt0 while [ $attempt -lt $MAX_RETRY ]; do timeout $TIMEOUT adb shell am instrument -w com.example.test/androidx.test.runner.AndroidJUnitRunner if [ $? -eq 0 ]; then return 0 fi attempt$((attempt1)) adb shell screencap -p /sdcard/error_$attempt.png adb pull /sdcard/error_$attempt.png ./errors/ done return 1 } # 执行测试并收集日志 run_test adb pull /sdcard/logs/ ./test_logs/6. 性能优化与实用技巧6.1 提升文件传输速度大文件传输时可以尝试这些优化方法使用USB 3.0以上接口传输前关闭设备屏幕避免同时运行其他adb命令对大文件使用分块传输# 分块传输大文件 split -b 50M large_file.zip large_file_part. for part in large_file_part.*; do adb push $part /sdcard/temp/ adb shell cat /sdcard/temp/$part /sdcard/large_file.zip done6.2 跨平台兼容性处理不同设备对adb命令的支持可能有差异。这是我总结的兼容性处理方案检测设备型号DEVICE_MODEL$(adb shell getprop ro.product.model)根据设备选择不同参数if [[ $DEVICE_MODEL *Pixel* ]]; then SCREENRECORD_OPTIONS--size 1080x1920 else SCREENRECORD_OPTIONS--size 720x1280 fi adb shell screenrecord $SCREENRECORD_OPTIONS /sdcard/record.mp47. 安全注意事项与最佳实践文件权限管理避免向系统敏感目录写入文件传输完成后及时删除设备上的临时文件adb shell rm /sdcard/temp_*.png资源清理长时间运行脚本时注意内存泄漏定期重启adb服务adb kill-server adb start-server错误恢复添加网络中断重试机制对关键操作添加验证步骤adb push config.json /sdcard/ adb shell md5sum /sdcard/config.json | grep $(md5sum config.json | cut -d -f1)

更多文章