第 6 篇
第六篇:测试工具(ADB 与 Linux)
本篇共 7 个小节,覆盖 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 不兼容汉字:命令、文件路径、文件名中不能包含中文。
- 将
platform-tools目录(含adb.exe等)路径加入系统 / 用户 PATH 环境变量; - 三种打开方式:① 任务栏搜索「编辑系统环境变量」;② 此电脑 → 属性 → 高级系统设置 → 环境变量;③ 控制面板 → 系统和安全 → 系统 → 高级系统设置。
- 验证:
Win+R→ 输入cmd→ 输入adb回车,出现版本号即配置成功; - 注意:环境变量中已有 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(exit 或 Ctrl+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.txt | monkey 跑自动化时实时导出日志到桌面(见 6.5) |
监控日志常用关键字:
error、crash、Exception、ANR。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 top | top -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.txt;rm -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 1234;kill -9 1234) |
chmod / chown | 修改权限 / 属主 |
free / df / du | 内存 / 磁盘空间 / 目录占用 |
dmesg | 查看内核日志 |
clear | 清屏 |
6.3.3 权限提示
- 普通
adb shell(提示符$)权限受限,访问系统级目录(/mnt下子目录、/data、fstab.*、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 等):见下表;
- 模块名 / 标签(如
BatteryExternalStatsWorker、POWERCT):产生日志的系统模块; - 日志内容:具体事件描述。
6.4.2 日志详细级别
| 级别 | 名称 | 含义与适用场景 |
|---|---|---|
| F | Fatal(致命) | 系统发生不可恢复的严重错误,直接导致崩溃、功能完全失效,需立即处理 |
| E | Error(错误) | 功能执行失败、数据丢失等严重异常,系统未完全崩溃,仅部分功能不可用 |
| W | Warning(警告) | 存在潜在问题或不符合预期,但当前功能仍可正常运行,需关注后续风险 |
| I | Info(信息) | 记录系统正常运行的关键事件(功能启动、状态切换),用于跟踪流程 |
| D | Debug(调试) | 开发 / 调试阶段的详细信息(变量值、流程步骤),通常仅测试环境启用 |
| V | Verbose(冗余) | 最详细的日志,含大量细粒度调试信息(函数调用、参数传递),用于深度排查 |
6.4.3 日志条目解析示例
| # | 示例日志 | 模块 | 级别 | 含义 |
|---|---|---|---|---|
| 1 | ... 1708 1726 E BatteryExternalStatsWorker: no controller energy info supplied for wifi | BatteryExternalStatsWorker(电量统计) | E | WiFi 控制器未提供能耗信息,电量统计模块拿不到 wifi 能耗数据(模拟器/无 WiFi 设备常见) |
| 2 | ... 1566 1795 I chatty: uid=0(root) Binder:1566_4 identical 4 lines | chatty(日志压缩模块) | I | 提示后续有 4 条与 Binder:1566_4 相关的重复日志被合并,避免日志冗余 |
| 3 | ... 1566 1795 D gralloc_nox: gralloc_alloc: Creating ashmem region of size 503808 | gralloc_nox(图形内存分配器) | D | 系统为图形显示分配了一块 503808 字节的共享内存(ashmem),用于图像数据存储与传输 |
| 4 | ... 1878 1878 I vol.Events: writeEvent dismiss_dialog timeout | vol.Events(音量事件模块) | I | 音量对话框因超时自动关闭,记录了该事件 |
| 5 | ... 1878 2083 I vol.Events: writeEvent active_stream_changed UNKNOWN_STREAM_-1 | vol.Events(音量事件模块) | I | 音频活跃流发生变化,但新流标识为「未知流(UNKNOWN_STREAM_-1)」,可能是音频源切换异常 |
| 6 | ... 1566 2205 W SurfaceFlinger: Attempting to destroy on removed layer: 3c73adc VolumeDialogImpl#0 | SurfaceFlinger(显示服务) | W | 系统尝试销毁已被移除的「音量对话框」显示层,属非预期操作,可能是显示层管理逻辑小问题 |
其他常见日志释义
| 示例日志 | 模块 | 含义 |
|---|---|---|
DnsSocket: SSL_connect error 5, errno=111 | DnsSocket | DNS 连接失败(网络未就绪 / 服务器不可达) |
ConnectivityService: Can't set TCP buffer sizes ... tcp_min No such file | ConnectivityService | 网络模块读取 TCP 内核参数失败,配置类问题 |
TrafficController: Failed to tag the socket: Bad file descriptor, fd: -1 | TrafficController | socket 打标失败,网络统计功能异常 |
vold: Vold 3.0 (the awakening) firing up / e4crypt_init_user0 | vold | 存储卷管理 / 文件加密初始化日志(系统启动常见,属正常) |
POWERCT: battery service init failed | POWERCT | 电源管理服务初始化失败,需关注电源域 |
SELinux: avc: denied ... permissive=1 | SELinux | SELinux 权限拒绝(permissive 模式下仅告警不拦截) |
6.4.4 日志分析方法
- 先看级别:优先关注 E / W 级别日志;
- 按模块 / 标签过滤:用
grep过滤包名或模块名(如adb logcat | grep 包名); - 对齐时间戳:日志时间精确到毫秒,与 BUG 发生时间点对齐;
- 关注异常栈:重点检索 Crash / ANR / Exception / FATAL 关键字段;
- 结合底层:
adb shell进入 Linux 后用dmesg、logcat -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 盘抓日志流程
- 将 U 盘插入 CDC 主机;
- 进入工程模式(设置 → 系统 → 连续点击版本号 10 次进入开发者 / 工程模式);
- 在左侧工程栏目找到「日志管理」;
- 勾选要保存的日志类型(T-Box 日志 / CDC 日志),打开「详细日志」开关;
- 点击「导出」,将日志考到 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 | 事件间隔 |