车载测试学习指南
已学 0/0 ✎ 自测
第 6 篇

第六篇:测试工具(ADB 与 Linux)

本篇共 7 个小节,覆盖 ADB 基础认知、ADB 常用命令速查、Linux 命令速查(底层 Shell)、日志解析与解读(核心)、Monkey 压力测试、工程模式与 U 盘抓日志实战。

ADB 基础认知ADB 常用命令速查Linux 命令速查(底层 Shell)日志解析与解读(核心)Monkey 压力测试工程模式与 U 盘抓日志实战

6.1 ADB 基础认知

6.1.1 什么是 ADB

  • ADB(Android Debug Bridge,Android 调试桥) 是一个 C/S 架构 的命令行工具,用于与 Android 设备(真机、模拟器、车机)进行通信和交互。
  • 它是 Android 开发工具包(SDK)的核心组件,支持安装应用、调试程序、传输文件、抓取日志等。
  • 车载场景定位:ADB 是连接「表层(系统 / 应用软件)」与「底层(Linux 内核)」的中间工具。表层每次操作,底层都会实时产生大量日志;开发只有通过日志才能定位产品缺陷或软件缺陷,因此 拉日志是测试定位 BUG 的核心手段

6.1.2 车载日志来源(为什么要拉日志)

  • 中控软件系统(如骁龙 8155 平台)内部有底软版本,中控主机 CDC 实时产生大量日志;
  • 动力、底盘、车身、智能驾驶等各域也实时产生日志;
  • 当任一域出现 BUG 时,必须给出 准确时间 + 日志 LOG 作为分析依据。

6.1.3 环境配置(Windows,精简版)

⚠️ adb 不兼容汉字:命令、文件路径、文件名中不能包含中文。
  1. platform-tools 目录(含 adb.exe 等)路径加入系统 / 用户 PATH 环境变量;
  2. 三种打开方式:① 任务栏搜索「编辑系统环境变量」;② 此电脑 → 属性 → 高级系统设置 → 环境变量;③ 控制面板 → 系统和安全 → 系统 → 高级系统设置。
  3. 验证:Win+R → 输入 cmd → 输入 adb 回车,出现版本号即配置成功
  4. 注意:环境变量中已有 adb 则无需重复添加;每个命令输入后注意保留空格。

6.2 ADB 常用命令速查

格式约定:<...> 为必填参数,[...] 为可选参数。命令示例基于车载 Android / 模拟器实测。

6.2.1 连接与设备管理

命令说明
adb devices列出当前已连接的设备(含序列号与状态:device / offline / unauthorized)
adb devices -l长格式输出设备信息
adb version查看 adb 版本(冒烟验证能否使用)
adb connect <IP>:<端口>通过 TCP/IP 连接设备(默认端口 5555),如 adb connect 192.168.10.111:5555
adb disconnect [IP:端口]断开 connect 建立的连接(例:adb disconnect 192.168.10.111:5555
adb start-server / adb kill-server启动 / 停止 adb 服务(默认监听 tcp:5037)
adb shell进入设备底层 Linux shell(exitCtrl+D 退出返回 adb)
提示:首次执行 adb devices 会出现 * daemon not running; starting now at tcp:5037 / daemon started successfully,属正常现象。

6.2.2 日志相关(核心)

命令说明
adb logcat实时查看设备日志(Ctrl+C 退出)
adb logcat > 桌面\rizhi.txt将日志实时导出到文本文件(文件名不能含中文
adb logcat -c清空日志缓冲(clear)
adb shell logcat -b all -c清空所有 buffer 的日志
adb logcat -v time带时间戳输出
adb logcat -b <main/system/events/radio>指定日志缓冲分区(例:adb logcat -b system
adb logcat | grep -E "error|crash|Exception"按关键字过滤实时日志(例:adb logcat | grep -E "error|crash"
adb shell monkey ... & adb logcat > 1.txtmonkey 跑自动化时实时导出日志到桌面(见 6.5)
监控日志常用关键字:errorcrashExceptionANR

6.2.3 应用管理

命令说明
adb install <apk路径>安装 APK(如 adb install C:\...\apk\douyin.apk
adb uninstall <包名>卸载应用(例:adb uninstall com.ss.android.ugc.aweme.lite
adb shell pm list packages查看所有安装的应用包
adb shell pm list packages -3仅查看第三方 / 自己安装的包
adb shell pm list packages | grep <关键字>按关键字过滤包名(例:adb shell pm list packages | grep com.ss.android
adb shell am start -n <包名>/<Activity>启动指定应用 / 页面(例:adb shell am start -n com.android.settings/.Settings
adb shell am force-stop <包名>强制停止应用(例:adb shell am force-stop com.ss.android.ugc.aweme.lite
安装失败常见报错:Failure [INSTALL_FAILED_ABORTED: User rejected permissions] —— 设备端拒绝了安装授权,需在设备 / 模拟器上手动确认。

6.2.4 文件传输

命令说明
adb push <电脑路径> <设备路径>上传:把电脑文件推送到设备(如 adb push C:\...\2.txt /mnt
adb pull <设备路径> <电脑路径>下载:把设备文件拉到电脑(如 adb pull /mnt/rizhi.txt C:\...\Desktop
  • 成功标志:输出 1 file pushed, 0 skipped. xx KB/s,出现速率即成功;
  • 查看电脑文件完整路径:右键文件 → 属性,位置栏即为路径(或 Ctrl+Shift+C 复制文件地址);
  • 权限说明:非 root 状态推送到 /mnt/data 等系统目录可能报 Permission denied(如 remote couldn't create file),需确认目标目录可写(推荐 /sdcard)。

6.2.5 进程与性能

命令说明
adb shell toptop -o cpu按 CPU 排序;top -n 10输出 10 条
adb shell "ps -ef | grep <关键字>"查看进程并过滤关键字(例:adb shell "ps -ef | grep launcher"
adb shell kill <进程号>杀掉进程(例:adb shell kill 1234
adb shell kill -9 <进程号>强制杀掉进程(例:adb shell kill -9 1234
adb shell monkey ...Monkey 随机压力测试(详见 6.5)
top 输出要点:PID、USER、PR/NI(优先级)、VIRT/RES/SHR(虚拟/常驻/共享内存)、S(状态 S/R/Z)、%CPU、%MEM、TIME+、ARGS(进程名)。

6.2.6 设备控制与其他

命令说明
adb reboot重启设备
adb shell reboot -p关闭设备电源(poweroff)
adb shell screencap /sdcard/screen.png截图(adb shell screencap 为命令,/sdcard/screen.png 为保存路径)
adb shell screenrecord /sdcard/demo.mp4录屏
adb shell getprop查看系统属性
adb shell dumpsys <service>查看系统服务状态(例:adb shell dumpsys activity

6.3 Linux 命令速查(底层 Shell)

车载 Android 底层为 Linux 系统(内核即 Linux),开发调试基本都在 Linux 环境。adb shell 进入后即为 Linux shell。Windows 进目录靠点击,Linux 需要命令,这是两者最大区别。

6.3.1 目录与文件基础命令

命令说明
/根目录,总目录
ls查看目录内有哪些文件
ls -a查看所有文件(含隐藏文件)
pwd查看当前所在路径
cd <目录>进入对应目录(如 cd /mnt
cd ..返回上级目录
exit退出 Linux shell 返回 adb(Ctrl+D 快捷键解放双手)

6.3.2 常用进阶命令(拓展)

命令说明
mkdir <目录名>创建目录(例:mkdir /mnt/logs
touch <文件>创建空文件(例:touch /sdcard/1.txt
rm <文件>删除文件(例:rm /sdcard/1.txtrm -r 递归删目录,rm -f 强制删除)
cp <源> <目标>复制文件 / 目录(例:cp /sdcard/a.txt /sdcard/b.txt
mv <源> <目标>移动 / 重命名(例:mv /sdcard/a.txt /sdcard/b.txt
cat <文件>查看文件内容(例:cat /sdcard/1.txt
head / tail <文件>查看文件头部 / 尾部(例:tail -f /sdcard/rizhi.txt 实时跟踪)
grep <关键字>过滤查找文本(例:grep error /sdcard/rizhi.txt
top查看进程与资源占用
ps -ef / ps aux查看进程列表
kill <pid> / kill -9 <pid>结束进程 / 强制结束(例:kill 1234kill -9 1234
chmod / chown修改权限 / 属主
free / df / du内存 / 磁盘空间 / 目录占用
dmesg查看内核日志
clear清屏

6.3.3 权限提示

  • 普通 adb shell(提示符 $)权限受限,访问系统级目录(/mnt 下子目录、/datafstab.*init 等)会出现大量 Permission denied
  • root 设备(提示符 #)才可完全访问;adb root 可尝试切换 root 权限。

6.4 日志解析与解读(核心)

6.4.1 日志基础格式

每条日志包含 5 个要素:

代码plain
[日期] [时间] [进程ID] [线程ID] [日志级别] [标签/模块名] : [具体内容]
05-15 09:23:54.870 13015 13015 E POWERCT : battery service init failed
  • 时间戳(如 12-08 14:20:01.293):日志产生的时间;
  • 进程 ID / 线程 ID(如 1708 1726):产生日志的进程 / 线程标识;
  • 日志级别(E/W/I/D 等):见下表;
  • 模块名 / 标签(如 BatteryExternalStatsWorkerPOWERCT):产生日志的系统模块;
  • 日志内容:具体事件描述。

6.4.2 日志详细级别

级别名称含义与适用场景
FFatal(致命)系统发生不可恢复的严重错误,直接导致崩溃、功能完全失效,需立即处理
EError(错误)功能执行失败、数据丢失等严重异常,系统未完全崩溃,仅部分功能不可用
WWarning(警告)存在潜在问题或不符合预期,但当前功能仍可正常运行,需关注后续风险
IInfo(信息)记录系统正常运行的关键事件(功能启动、状态切换),用于跟踪流程
DDebug(调试)开发 / 调试阶段的详细信息(变量值、流程步骤),通常仅测试环境启用
VVerbose(冗余)最详细的日志,含大量细粒度调试信息(函数调用、参数传递),用于深度排查

6.4.3 日志条目解析示例

#示例日志模块级别含义
1... 1708 1726 E BatteryExternalStatsWorker: no controller energy info supplied for wifiBatteryExternalStatsWorker(电量统计)EWiFi 控制器未提供能耗信息,电量统计模块拿不到 wifi 能耗数据(模拟器/无 WiFi 设备常见)
2... 1566 1795 I chatty: uid=0(root) Binder:1566_4 identical 4 lineschatty(日志压缩模块)I提示后续有 4 条与 Binder:1566_4 相关的重复日志被合并,避免日志冗余
3... 1566 1795 D gralloc_nox: gralloc_alloc: Creating ashmem region of size 503808gralloc_nox(图形内存分配器)D系统为图形显示分配了一块 503808 字节的共享内存(ashmem),用于图像数据存储与传输
4... 1878 1878 I vol.Events: writeEvent dismiss_dialog timeoutvol.Events(音量事件模块)I音量对话框因超时自动关闭,记录了该事件
5... 1878 2083 I vol.Events: writeEvent active_stream_changed UNKNOWN_STREAM_-1vol.Events(音量事件模块)I音频活跃流发生变化,但新流标识为「未知流(UNKNOWN_STREAM_-1)」,可能是音频源切换异常
6... 1566 2205 W SurfaceFlinger: Attempting to destroy on removed layer: 3c73adc VolumeDialogImpl#0SurfaceFlinger(显示服务)W系统尝试销毁已被移除的「音量对话框」显示层,属非预期操作,可能是显示层管理逻辑小问题

其他常见日志释义

示例日志模块含义
DnsSocket: SSL_connect error 5, errno=111DnsSocketDNS 连接失败(网络未就绪 / 服务器不可达)
ConnectivityService: Can't set TCP buffer sizes ... tcp_min No such fileConnectivityService网络模块读取 TCP 内核参数失败,配置类问题
TrafficController: Failed to tag the socket: Bad file descriptor, fd: -1TrafficControllersocket 打标失败,网络统计功能异常
vold: Vold 3.0 (the awakening) firing up / e4crypt_init_user0vold存储卷管理 / 文件加密初始化日志(系统启动常见,属正常)
POWERCT: battery service init failedPOWERCT电源管理服务初始化失败,需关注电源域
SELinux: avc: denied ... permissive=1SELinuxSELinux 权限拒绝(permissive 模式下仅告警不拦截)

6.4.4 日志分析方法

  1. 先看级别:优先关注 E / W 级别日志;
  2. 按模块 / 标签过滤:用 grep 过滤包名或模块名(如 adb logcat | grep 包名);
  3. 对齐时间戳:日志时间精确到毫秒,与 BUG 发生时间点对齐;
  4. 关注异常栈:重点检索 Crash / ANR / Exception / FATAL 关键字段;
  5. 结合底层adb shell 进入 Linux 后用 dmesglogcat -b kernel(如可用)看内核级信息。

6.5 Monkey 压力测试

Monkey 是 Android 系统自带的随机压力测试工具,通过模拟用户随机操作(点击、滑动、输入等),检测 App 稳定性(如崩溃、ANR),无需复杂配置,适合快速做初期兼容性 / 稳定性验证。

6.5.1 基础用法

场景命令说明
全局测试adb shell monkey --throttle 100 5000对整个桌面 / 系统随机操作 5000 次(全局测试,所有界面都会被点击)
指定应用adb shell monkey --throttle 100 -p com.ss.android.ugc.aweme.lite 5000只对指定包名应用测试(操作数量建议小于两万

参数含义

  • adb shell:进入设备的命令行环境;
  • monkey:Android 自带的压力测试工具,可模拟随机触摸、点击、滑动等操作;
  • --throttle 100:设置事件之间的时间间隔(单位毫秒),100 即每两个模拟事件间隔 100ms,更接近真实用户交互节奏;
  • -p <包名>:指定要测试的应用包名(不加 -p 为全局性能测试,加 -p 为指定 APP 测试);
  • 5000:模拟执行的事件总数(5000 次随机操作)。
指定 APP 前需先查包名:adb shell pm list packages -3

6.5.2 企业级完整参数(长时间压力测试)

代码bash
adb shell monkey \
  -p com.seres.navi.bl -p com.seres.media.listen \   # 指定多个被测应用包名
  --ignore-crashes \                 # 遇到崩溃继续测试
  --ignore-timeouts \                # 遇到 ANR 继续测试
  --ignore-security-exceptions \     # 忽略安全异常
  --monitor-native-crashes \         # 监控原生代码崩溃
  --ignore-native-crashes \          # 忽略原生代码崩溃继续执行
  --pct-touch 80 \                   # 80% 触摸事件
  --pct-motion 10 \                  # 10% 滑动事件
  --pct-syskeys 0 \                  # 0% 系统按键(避免 Home/Back 等)
  --throttle 500 \                   # 事件间隔 500ms
  -v -v -v \                         # 详细日志级别(verbose 最高)
  864000                             # 执行 864000 个随机事件(长时间压测)

6.5.3 Monkey 与日志结合(跑自动化时实时导出)

代码bash
adb shell monkey --throttle 100 2000 -v -v -v & adb logcat > C:\Users\Administrator\Desktop\1.txt
  • 启动 Monkey 测试的同时,用 logcat 捕获系统日志并保存到电脑;
  • 日志更全面(Monkey 操作记录 + 系统底层响应,如应用崩溃时的错误原因);
  • 适合排查复杂问题(ANR、Crash)。

6.5.4 查询与杀掉 Monkey 进程

代码bash
adb shell "ps | grep monkey"   # 只有 monkey 运行过程中才能查到(主进程 + 子进程)
adb shell kill -9 <进程号>      # 强制杀掉(子进程也需杀掉)
monkey 常见报错:Injection Failed ... /dev/input/event0: open failed(模拟器无输入设备)、write failed: EINVAL(事件注入异常),不代表测试失败,以 Events injected: N 统计为准。

6.6 工程模式与 U 盘抓日志实战

与第四篇 4.16「日志管理与 BUG 提票」章节互补,本节补充工程模式界面要点。

6.6.1 U 盘抓日志流程

  1. 将 U 盘插入 CDC 主机;
  2. 进入工程模式(设置 → 系统 → 连续点击版本号 10 次进入开发者 / 工程模式);
  3. 在左侧工程栏目找到「日志管理」;
  4. 勾选要保存的日志类型(T-Box 日志 / CDC 日志),打开「详细日志」开关;
  5. 点击「导出」,将日志考到 U 盘。

6.6.2 工程模式日志管理界面要点

  • 左侧栏目:退出工程模式 / 日志管理 / 升级与维护 / 信息 / 功能测试 / ADB 模式 / DMS 离线激活;
  • 日志管理内:详细日志开关、T-Box 日志、CDC 日志、导出 / 取消。

6.6.3 ADB 设置页(工程模式内)

  • ADB 开关
  • ADB/USB 切换:USB 模式 / 网络模式;
  • 无线 ADB 开关
  • Log 等级:Verbose / Debug / Info / Warn / Error;
  • Log 跟随
  • Log 导出:未检测到 U 盘时会提示;支持导出原 log / 删除 log / 压缩文件。

6.7 补充技巧

6.7.1 快捷键与操作习惯

  • 上键(↑):快速调出之前输入过的命令(历史命令切换),省去重复输入;
  • 每个命令输入后注意保留空格
  • Ctrl+C 退出实时日志;Ctrl+D 退出 Linux shell。

6.7.2 CMD 与 PowerShell

  • CMD(命令提示符)和 PowerShell 都是 Windows 系统的命令行工具,用法差不多;
  • 核心区别:数据处理方式——CMD 基于文本,PowerShell 基于对象
  • PowerShell 中同样可执行 adb devices 等命令。

6.7.3 常用命令助记

命令含义
adb devices列出连接设备
adb shell进入设备内核(Linux),exit 退出
adb logcat显示设备日志
adb pull从设备下载文件
adb push上传文件到设备
adb install安装应用
adb uninstall卸载应用
adb shell pm list packages列出安装的应用包
adb reboot重启设备
adb shell reboot -p关闭设备
--throttle事件间隔