移动端自动化测试实战:ADB + Monkey 从入门到精通
摘要:移动端应用测试已成为软件测试工程师的必备技能。本文基于华为云 ECS(Ubuntu 24.04)真实环境,从零搭建 Android 测试基础设施,系统讲解移动端测试基础概念、Android 系统架构、ADB 命令详解及 Monkey 自动化测试工具的完整使用流程。所有命令均附带真实终端输出,适合测试工程师快速入门移动端自动化测试。
目录
- 一、实验环境架构
- 二、预备章:移动端测试基础概念
- 三、第一章:移动端测试概述
- [四、第二章:Android 系统基础](#四、第二章:Android 系统基础)
- [五、第三章:ADB 命令实战](#五、第三章:ADB 命令实战)
- [六、第四章:Monkey 工具的使用](#六、第四章:Monkey 工具的使用)
- 七、踩坑记录
- 八、总结
一、实验环境架构
1.1 集群拓扑
┌─────────────────────────────────────────────────────────────────────┐
│ 移动端自动化测试集群 (ecs-916d) │
│ 华为云 可用区7 | Ubuntu 24.04 │
├────────────────┬────────────────┬────────────────┬───────────────────┤
│ itest-01 │ itest-02 │ itest-03 │ itest-04 │
│ 121.36.51.148 │ 119.3.175.121 │ 1.92.93.183 │ 120.46.82.41 │
│ 192.168.0.178 │ 192.168.0.246 │ 192.168.0.66 │ 192.168.0.222 │
├────────────────┼────────────────┼────────────────┼───────────────────┤
│ 被测应用节点 │ SDK 开发环境 │ ADB 主控节点 │ 报告/CI 节点 │
│ Flask API │ android.jar │ Monkey 执行 │ Ant + Report │
│ + adb 客户端 │ + 构建工具 │ + 测试脚本 │ │
└────────────────┴────────────────┴────────────────┴───────────────────┘
2vCPU / 4GiB | ac9.large.2 | 5Mbit/s BGP
1.2 硬件环境确认
bash
# itest-03 系统信息
root@itest-03:~$ uname -r
6.8.0-106-generic
root@itest-03:~$ free -h | grep Mem
Mem: 3.3Gi 538Mi 618Mi 2.5Mi 2.5Gi 2.8Gi
root@itest-03:~$ df -h / | tail -1
/dev/vda1 40G 4.7G 33G 13% /
# KVM 虚拟化检查(云服务器通常不支持嵌套虚拟化)
root@itest-03:~$ egrep -c '(vmx|svm)' /proc/cpuinfo
0
root@itest-03:~$ ls /dev/kvm
ls: cannot access '/dev/kvm': No such file or directory
⚡ 关键发现:华为云 ac9.large.2 实例不支持 KVM 嵌套虚拟化。这意味着无法运行 x86 Android 模拟器。本文聚焦 ADB 命令行工具与 Monkey 测试框架的使用,Android 模拟器的部署放在踩坑记录中说明替代方案。
二、预备章:移动端测试基础概念
2.1 什么是移动端应用测试
移动端应用测试(Mobile Application Testing)是对运行在智能手机、平板电脑等移动设备上的应用程序进行质量验证的过程。根据《2021 年移动市场报告》:
- 全球移动用户日均上网时间:6.8 小时
- 移动端流量占总流量:78.5%
- 2020 年全球移动应用下载量:2180 亿次(同比增长 7%)
- 中国市场下载量、用户支出、用户时长为全球第一
2.2 主流移动操作系统对比
| 特性 | Android | iOS | HarmonyOS |
|---|---|---|---|
| 开发商 | Apple | 华为 | |
| 内核 | Linux | XNU (Darwin) | 微内核 |
| 应用格式 | .apk / .aab | .ipa | .hap |
| 开发语言 | Java/Kotlin | Swift/Obj-C | ArkTS/JS |
| 市场份额(中国) | ~72% | ~25% | ~3% |
| 开放性 | 开源(AOSP) | 闭源 | 部分开源 |
2.3 移动端测试要点全景
移动端测试
├── 安装/卸载测试
│ ├── 首次安装、覆盖安装、升级安装
│ ├── 正常卸载、强制卸载
│ └── SD卡安装、空间不足安装
├── UI 测试
│ ├── 横竖屏切换、分辨率适配
│ ├── 多指触控、手势操作
│ └── 通知栏/控制中心兼容
├── 功能测试
│ ├── 前后台切换、杀进程恢复
│ ├── 网络切换(WiFi/4G/5G/飞行模式)
│ └── 多语言、深色模式
├── 安全性测试
│ ├── 权限管理、数据存储安全
│ ├── 网络传输加密(HTTPS/SSL Pinning)
│ └── 组件安全(ContentProvider泄漏等)
├── 兼容性测试
│ ├── 系统版本(Android 8~15, iOS 12~18)
│ ├── 屏幕尺寸/分辨率/DPI
│ └── 厂商ROM(MIUI/ColorOS/OneUI等)
├── 性能测试
│ ├── 启动时间(冷启动/热启动)
│ ├── CPU/内存/电量消耗
│ └── 流量消耗、帧率(FPS)
└── 专项测试
├── Monkey 随机压力测试
├── 弱网测试(2G/3G/丢包)
└── 中断测试(来电/短信/闹钟)
三、第一章:移动端测试概述
3.1 移动端测试流程
需求分析 → 测试计划 → 用例设计 → 环境搭建 → 执行测试 → 缺陷管理 → 测试报告
│ │
▼ ▼
确认测试范围 功能用例 + 兼容矩阵 + 性能指标
OS版本矩阵 安装卸载用例 + Monkey脚本 + 弱网场景
3.2 移动端测试类型速查
| 测试类型 | 测试目标 | 典型工具 |
|---|---|---|
| 功能测试 | 验证业务逻辑正确性 | Appium, UIAutomator |
| 兼容性测试 | 不同设备/OS下的表现 | 云测平台(Testin/百度MTC) |
| Monkey 测试 | 随机压力测试,发现崩溃/ANR | adb shell monkey |
| 性能测试 | CPU/内存/电量/流量 | adb shell dumpsys, PerfDog |
| 安全测试 | 数据安全、权限、加密 | Drozer, MobSF |
| 弱网测试 | 弱网环境下的功能与体验 | Fiddler, Charles, adb模拟 |
3.3 接口测试 vs 移动端测试
| 维度 | 接口测试 | 移动端测试 |
|---|---|---|
| 测试对象 | HTTP/gRPC/WebSocket 接口 | 移动 App |
| 测试环境 | Linux 服务器即可 | 需 Android/iOS 设备或模拟器 |
| 主要工具 | Postman, JMeter, curl | ADB, Monkey, Appium |
| 自动化成本 | 低(纯命令行) | 中高(需驱动设备) |
| 典型产出 | 接口覆盖率报告 | 崩溃率、ANR率、性能基线 |
四、第二章:Android 系统基础
4.1 Android 系统架构
┌─────────────────────────────────────────────┐
│ System Apps (系统应用层) │
│ Dialer | Email | Calendar | Camera | ... │
├─────────────────────────────────────────────┤
│ Java API Framework (API框架层) │
│ Activity Manager | Window Manager | ... │
│ Content Providers | View System | ... │
├─────────────────────────────────────────────┤
│ Native C/C++ Libraries (原生库) | ART │
│ WebKit | OpenGL | SQLite | ... | 运行时 │
├─────────────────────────────────────────────┤
│ Hardware Abstraction Layer (HAL) │
├─────────────────────────────────────────────┤
│ Linux Kernel (内核层) │
│ Display | Camera | Audio | Binder | WiFi │
└─────────────────────────────────────────────┘
关键理解:Android 运行在 Linux 内核之上,这也是 ADB(Android Debug Bridge)能够在 Linux 服务器上运行的底层原因。
4.2 Android 四大组件
| 组件 | 英文名 | 作用 | 测试关注点 |
|---|---|---|---|
| 活动 | Activity | UI 界面,用户交互入口 | 生命周期(onCreate→onResume→onPause→onDestroy) |
| 服务 | Service | 后台长期运行任务 | 前台/后台服务切换、系统杀死后重启 |
| 广播接收器 | BroadcastReceiver | 接收系统/应用广播 | 网络变化广播、电量广播响应 |
| 内容提供者 | ContentProvider | 跨应用数据共享 | SQL注入、路径遍历、权限泄露 |
4.3 Android 权限系统
Android 权限分为三个保护级别:
| 级别 | 说明 | 示例 |
|---|---|---|
| Normal | 低风险,安装时默认授予 | INTERNET, ACCESS_NETWORK_STATE |
| Dangerous | 需用户显式授权 | CAMERA, READ_CONTACTS, LOCATION |
| Signature | 仅同签名应用可获取 | 系统级权限 |
bash
# 通过 ADB 查看应用权限
adb shell dumpsys package com.example.app | grep permission
adb shell pm list permissions -g # 按组列出所有权限
4.4 Android 测试环境选择
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 真机测试 | 真实硬件、传感器完整 | 设备成本高、维护繁琐 | 兼容性、性能压测 |
| 第三方模拟器 | 免费、功能丰富 | 兼容性问题、性能损耗 | 开发调试(逍遥/夜神) |
| Android SDK 自带模拟器 | 官方支持、API 版本全 | 需要 KVM 硬件加速 | CI/CD 自动化测试 |
| 云测平台 | 海量设备、即开即用 | 成本高、数据安全顾虑 | 大规模兼容性测试 |
五、第三章:ADB 命令实战
ADB (Android Debug Bridge) 是 Android SDK 中的核心调试工具,通过 USB 或 TCP/IP 连接 Android 设备,支持应用安装、文件传输、日志查看、Shell 命令执行等操作。
5.1 ADB 安装
bash
# Ubuntu 24.04: 通过 apt 安装 ADB + platform-tools
root@itest-03:~$ apt-get install -y -qq adb android-sdk-platform-tools
root@itest-03:~$ adb version
Android Debug Bridge version 1.0.41
Version 34.0.4-debian
Installed as /usr/lib/android-sdk/platform-tools/adb
Running on Linux 6.8.0-106-generic (x86_64)
5.2 ADB 架构原理
┌──────────┐ ┌──────────┐ ┌──────────┐
│ adb │ TCP │ adb │ USB/ │ adbd │
│ client │◄───────►│ server │ TCP │ daemon │
│ (命令行) │ 5037 │ (守护进程)│◄───────►│ (设备端) │
└──────────┘ └──────────┘ └──────────┘
PC/Server PC Device
三大组件:
- adb client:命令行工具,用户直接交互
- adb server:后台守护进程,管理 client 与 daemon 的通信
- adbd:运行在 Android 设备上的守护进程
5.3 ADB 基础命令详解
5.3.1 设备连接管理
bash
# 查看已连接设备(无设备时输出 "List of devices attached" 后为空)
root@itest-03:~$ adb devices
List of devices attached
# 详细设备信息(包含型号、产品名等)
root@itest-03:~$ adb devices -l
List of devices attached
# 启动 ADB 服务端
root@itest-03:~$ adb start-server
* daemon not running; starting now at tcp:5037
* daemon started successfully
# TCP/IP 远程连接设备(默认端口 5555)
adb connect 192.168.1.100:5555
adb disconnect 192.168.1.100:5555
# 重启 ADB 服务
adb kill-server && adb start-server
5.3.2 应用安装与卸载
bash
# 安装 APK
adb install app.apk # 普通安装
adb install -r app.apk # 覆盖安装(保留数据)
adb install -t app.apk # 允许测试包
adb install -d app.apk # 允许降级安装
adb install -g app.apk # 授予所有运行时权限
# 多 APK 安装(App Bundle 场景)
adb install-multiple base.apk split_config_arm64.apk
# 卸载应用
adb uninstall com.example.app # 卸载(保留数据)
adb uninstall -k com.example.app # 卸载(清除所有数据)
5.3.3 设备信息查询
bash
# 获取设备 Android 版本
adb shell getprop ro.build.version.release
# 获取设备型号
adb shell getprop ro.product.model
# 获取 SDK 版本
adb shell getprop ro.build.version.sdk
# 获取屏幕分辨率
adb shell wm size
# 获取屏幕密度
adb shell wm density
# 获取 CPU 架构
adb shell getprop ro.product.cpu.abi
# 列出所有已安装应用
adb shell pm list packages # 所有应用
adb shell pm list packages -3 # 仅第三方应用
adb shell pm list packages -s # 仅系统应用
# 查看应用详细信息
adb shell dumpsys package com.example.app
5.3.4 文件传输
bash
# 推送文件到设备
adb push local_file.txt /sdcard/
# 拉取文件到本地
adb pull /sdcard/screenshot.png ./
# 批量推送
adb push ./test_data/ /sdcard/test_data/
5.3.5 日志查看 (logcat)
bash
# 实时查看日志
adb logcat
# 过滤指定标签
adb logcat -s ActivityManager
# 按级别过滤
adb logcat *:E # 仅 Error
adb logcat *:W # 仅 Warning 及以上
# 保存日志到文件
adb logcat -d > crash_log.txt
# 清除日志缓冲区
adb logcat -c
5.3.6 模拟操作
bash
# 模拟按键
adb shell input keyevent KEYCODE_HOME # Home 键
adb shell input keyevent KEYCODE_BACK # 返回键
adb shell input keyevent KEYCODE_MENU # 菜单键
adb shell input keyevent 26 # 电源键
# 模拟触摸
adb shell input tap 500 1000 # 点击坐标(x,y)
# 模拟滑动
adb shell input swipe 500 1000 500 300 # 从(500,1000)滑到(500,300)
# 模拟文本输入
adb shell input text "hello world"
5.3.7 屏幕截图与录屏
bash
# 截图
adb shell screencap -p /sdcard/screen.png
adb pull /sdcard/screen.png ./
# 录屏(Android 4.4+)
adb shell screenrecord /sdcard/demo.mp4
# Ctrl+C 停止录屏
adb pull /sdcard/demo.mp4 ./
5.3.8 性能指标获取
bash
# CPU 使用率
adb shell dumpsys cpuinfo | grep com.example.app
# 内存使用
adb shell dumpsys meminfo com.example.app
# 电量信息
adb shell dumpsys battery
# 流量统计
adb shell dumpsys netstats detail
# 帧率信息 (GPU呈现模式分析)
adb shell dumpsys gfxinfo com.example.app
5.4 Platform-Tools 完整工具清单
bash
root@itest-03:~$ ls -la /usr/lib/android-sdk/platform-tools/
total 1268
-rwxr-xr-x 1 root root 685888 adb # Android Debug Bridge
-rwxr-xr-x 1 root root 48280 dmtracedump # Dalvik 方法跟踪
-rwxr-xr-x 1 root root 24016 etc1tool # ETC1 纹理压缩工具
-rwxr-xr-x 1 root root 505784 fastboot # Bootloader 刷机工具
-rwxr-xr-x 1 root root 11424 hprof-conv # HPROF 格式转换
lrwxrwxrwx 1 root root 15 make_f2fs # F2FS 文件系统创建
lrwxrwxrwx 1 root root 12 mke2fs # ext 文件系统创建
lrwxrwxrwx 1 root root 16 mke2fs.conf # ext 文件系统配置
-rw-r--r-- 1 root root 979 package.xml # 包描述
lrwxrwxrwx 1 root root 16 sload_f2fs # F2FS 加载工具
-rw-r--r-- 1 root root 50 source.properties
lrwxrwxrwx 1 root root 20 sqlite3 # SQLite 命令行
关键工具说明:
adb:日常调试最常用工具fastboot:设备刷机/解锁 Bootloaderdmtracedump:方法调用耗时分析sqlite3:直接操作应用数据库
六、第四章:Monkey 工具的使用
6.1 什么是 Monkey
Monkey 是 Android SDK 自带的命令行压力测试工具,通过向设备发送伪随机的用户事件流(触摸、滑动、按键等),模拟用户操作的随机压力场景,用于检测应用的稳定性 和健壮性。
Monkey 工作流程:
┌─────────┐ 伪随机事件流 ┌──────────┐ 监控结果 ┌─────────┐
│ adb │ ──────────────────► │ Android │ ────────────► │ Monkey │
│ shell │ 触摸/滑动/按键... │ Device │ ANR/Crash │ Log │
└─────────┘ └──────────┘ └─────────┘
6.2 Monkey 基本用法
bash
# 基本语法
adb shell monkey [options] <event-count>
# 最简单的 Monkey 测试:发送 500 个随机事件
adb shell monkey 500
# 指定测试包名(强烈建议)
adb shell monkey -p com.example.app 1000
6.3 Monkey 命令参数详解
6.3.1 基础配置类参数
| 参数 | 说明 | 示例 |
|---|---|---|
-p <package> |
指定测试包名(可多次使用) | -p com.android.settings |
-v |
冗余输出等级(-v -v -v 最详细) | -v -v -v |
-s <seed> |
随机数种子(用于复现) | -s 12345 |
--throttle <ms> |
事件间隔(毫秒) | --throttle 300 |
bash
# 示例:指定包名 + 种子 + 事件间隔
adb shell monkey -p com.android.calculator2 -s 12345 --throttle 300 -v 1000
# 多包测试
adb shell monkey -p com.android.settings -p com.android.calculator2 -v 500
6.3.2 事件类型和频率参数
Monkey 通过百分比控制各类事件的发送比例,总和应为 100%:
| 参数 | 事件类型 | 默认占比 | 说明 |
|---|---|---|---|
--pct-touch |
触摸事件 | 15% | 屏幕某处的按下-抬起 |
--pct-motion |
滑动事件 | 10% | 屏幕某处的按下-移动-抬起 |
--pct-trackball |
轨迹球 | 15% | 轨迹球移动(含随机点击) |
--pct-nav |
导航事件 | 25% | 方向键(上/下/左/右) |
--pct-majornav |
主要导航 | 15% | 返回键、菜单键等 |
--pct-syskeys |
系统按键 | 10% | Home、音量、电源等 |
--pct-appswitch |
应用切换 | 2% | startActivity() 切换应用 |
--pct-anyevent |
其他事件 | 8% | 键盘、其他按键等 |
bash
# 提高触摸事件占比(适合测试 UI 交互)
adb shell monkey -p com.example.app \
--pct-touch 40 --pct-motion 25 --pct-nav 10 \
--pct-majornav 10 --pct-syskeys 5 \
--pct-appswitch 5 --pct-anyevent 5 \
-v 2000
6.3.3 约束限制类参数
| 参数 | 说明 |
|---|---|
--pkg-blacklist-file <file> |
黑名单:不测试这些包中的 Activity |
--pkg-whitelist-file <file> |
白名单:仅测试这些包中的 Activity |
-c <category> |
指定 Intent Category (如 android.intent.category.LAUNCHER) |
6.3.4 调试类参数(控制停止条件)
| 参数 | 说明 |
|---|---|
--ignore-crashes |
应用崩溃后继续发送事件(默认崩溃时停止) |
--ignore-timeouts |
ANR 后继续发送事件(默认 ANR 时停止) |
--ignore-security-exceptions |
忽略安全异常(如权限拒绝) |
--monitor-native-crashes |
监控并报告 Native 层崩溃 |
--kill-process-after-error |
出错后杀死应用进程 |
--hprof |
事件发送前后生成性能分析报告 |
bash
# 标准稳定性测试:忽略崩溃和超时,持续运行
adb shell monkey -p com.example.app \
--ignore-crashes --ignore-timeouts \
--ignore-security-exceptions \
--throttle 200 -v -v 10000
6.4 Monkey 测试实战示例
场景一:系统设置应用 Monkey 测试
bash
# 对系统设置应用执行 500 次随机事件
# -v 输出详细信息
# -s 固定种子确保可复现
adb shell monkey -p com.android.settings -s 42 --throttle 100 -v 500
预期输出示例:
:Monkey: seed=42 count=500
:AllowPackage: com.android.settings
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Event percentages:
// 0: 15.0%
// 1: 10.0%
// 2: 15.0%
// 3: 25.0%
// 4: 15.0%
// 5: 10.0%
// 6: 2.0%
// 7: 8.0%
:Switch: #Intent;action=android.intent.action.MAIN;...
:Sending Touch (ACTION_DOWN): 0:(320.0,800.0)
:Sending Touch (ACTION_UP): 0:(320.0,800.0)
:Sending Key (ACTION_DOWN): 23 // KEYCODE_DPAD_CENTER
:Sending Key (ACTION_UP): 23
...
Events injected: 500
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=51234ms (0ms mobile, 0ms wifi, 51234ms not connected)
// Monkey finished
场景二:计算器应用深度测试
bash
# 对计算器应用,增加触摸/滑动比例,减少系统按键
adb shell monkey -p com.android.calculator2 \
-s 9999 \
--throttle 150 \
--pct-touch 35 \
--pct-motion 20 \
--pct-nav 15 \
--pct-majornav 10 \
--pct-syskeys 5 \
--pct-appswitch 5 \
--pct-anyevent 10 \
--ignore-crashes \
--ignore-timeouts \
-v -v 2000
场景三:CI/CD 集成 Monkey 测试
bash
#!/bin/bash
# monkey_ci_test.sh --- Jenkins/GitLab CI 集成脚本
PACKAGE="com.example.app"
SEED=$(date +%s)
LOG_DIR="/opt/monkey-results/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$LOG_DIR"
echo "=== Monkey Test Start ==="
echo "Package: $PACKAGE"
echo "Seed: $SEED"
echo "Events: 5000"
# 执行 Monkey 测试
adb shell monkey -p "$PACKAGE" \
-s "$SEED" \
--throttle 200 \
--pct-touch 30 --pct-motion 15 \
--ignore-crashes --ignore-timeouts \
-v 5000 > "$LOG_DIR/monkey_output.log" 2>&1
# 分析结果
CRASH_COUNT=$(grep -c "CRASH" "$LOG_DIR/monkey_output.log")
ANR_COUNT=$(grep -c "ANR" "$LOG_DIR/monkey_output.log")
echo "=== Monkey Test End ==="
echo "Events injected: 5000"
echo "Crashes: $CRASH_COUNT"
echo "ANRs: $ANR_COUNT"
# 失败时返回非零退出码
if [ "$CRASH_COUNT" -gt 0 ] || [ "$ANR_COUNT" -gt 0 ]; then
echo "FAILED: App crashed or ANR detected"
exit 1
fi
echo "PASSED: No crashes or ANRs"
6.5 Monkey 日志分析
6.5.1 正常结束标志
// Monkey finished
6.5.2 异常日志特征
// 应用崩溃 (CRASH)
// CRASH: com.example.app (pid 12345)
// Short Msg: java.lang.NullPointerException
// Long Msg: java.lang.NullPointerException: Attempt to invoke...
// ANR (Application Not Responding)
// NOT RESPONDING: com.example.app (pid 12345)
ANR in com.example.app
Reason: Input dispatching timed out
// 安全异常
// SecurityException: Permission Denial
6.5.3 日志分析脚本
bash
#!/bin/bash
# analyze_monkey_log.sh
LOG_FILE="$1"
echo "=== Monkey 日志分析报告 ==="
echo ""
# 总事件数
TOTAL=$(grep -c "Sending" "$LOG_FILE")
echo "总事件数: $TOTAL"
# 崩溃次数
CRASHES=$(grep -c "CRASH:" "$LOG_FILE")
echo "崩溃次数: $CRASHES"
# ANR 次数
ANRS=$(grep -c "NOT RESPONDING" "$LOG_FILE")
echo "ANR 次数: $ANRS"
# 异常类型统计
echo ""
echo "异常详情:"
grep -E "CRASH:|NOT RESPONDING|Exception:" "$LOG_FILE" | head -20
# 种子值(用于复现)
SEED=$(grep "seed=" "$LOG_FILE" | head -1)
echo ""
echo "复现种子: $SEED"
6.6 Monkey 最佳实践
| 实践 | 说明 |
|---|---|
| 始终指定包名 | -p 避免 Monkey 操作其他应用或系统设置 |
| 固定随机种子 | -s 确保发现的 Bug 可以被复现 |
| 设置事件间隔 | --throttle 避免事件过快导致 ANR 误报 |
| 合理设置事件数 | 功能验证 500~2000,稳定性测试 10000~50000 |
| 忽略已知崩溃 | --ignore-crashes 避免测试提前终止 |
| 多轮循环 | 结合 Shell 脚本循环执行,夜间跑 Monkey |
| 保持设备唤醒 | 测试前 adb shell input keyevent 26 确保屏幕亮起 |
| 禁用系统更新 | 避免测试中被系统弹窗干扰 |
七、Android SDK 完整安装实战
7.1 APT 方式安装(推荐)
bash
# 在 itest-02 上安装完整 Android SDK
root@itest-02:~$ apt-get install -y -qq \
android-sdk \
android-sdk-build-tools \
android-sdk-platform-23 \
android-sdk-common
# 安装后的目录结构
root@itest-02:~$ tree /usr/lib/android-sdk/ -L 2
/usr/lib/android-sdk/
├── build-tools/
│ ├── debian/ # aapt, aapt2, apksigner, zipalign
│ └── 29.0.3/
├── licenses/
│ └── apache-2.0
├── platforms/
│ └── android-23/ # android.jar (API Level 23)
├── platform-tools/
│ ├── adb
│ ├── fastboot
│ ├── dmtracedump
│ └── ...
└── tools/
└── proguard/
# Android SDK API Level 23 (Android 6.0 Marshmallow)
root@itest-02:~$ ls -lh /usr/lib/android-sdk/platforms/android-23/android.jar
lrwxrwxrwx android.jar -> ../../../../share/java/com.android.android-23.jar
7.2 环境变量配置
bash
# 添加到 /etc/profile 或 ~/.bashrc
export ANDROID_HOME=/usr/lib/android-sdk
export PATH=$PATH:$ANDROID_HOME/platform-tools
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/build-tools/debian
# 验证
source /etc/profile
adb version
aapt version
7.3 APT 安装的包清单
bash
root@itest-02:~$ dpkg -l | grep 'android-sdk' | awk '{print $2, $3}'
android-sdk 28.0.2+9
android-sdk-build-tools 29.0.3+9
android-sdk-build-tools-common 29.0.3+9
android-sdk-common 28.0.2+9
android-sdk-platform-23 6.0.1+r72-6ubuntu1
android-sdk-platform-tools 28.0.2+9
android-sdk-platform-tools-common 28.0.2+9
说明 :Ubuntu APT 源中的 Android SDK 版本为 28.0.2,Build Tools 为 29.0.3,API Level 为 23 (Android 6.0)。如需更高版本 API,需要通过
sdkmanager下载(需要从 Google 服务器获取)。
八、踩坑记录
8.1 华为云 ECS 不支持 KVM 嵌套虚拟化
现象:
bash
root@itest-03:~$ ls /dev/kvm
ls: cannot access '/dev/kvm': No such file or directory
root@itest-03:~$ egrep -c '(vmx|svm)' /proc/cpuinfo
0
原因:华为云 ac9.large.2 实例运行在虚拟化层之上,不支持 KVM 嵌套虚拟化。而 Android 模拟器的 x86 系统镜像(性能最优方案)依赖 KVM 实现硬件加速。
解决方案:
| 方案 | 适用场景 | 说明 |
|---|---|---|
| 使用 ARM 系统镜像 | 无 KVM 环境 | 纯软件渲染,性能较差但可运行 |
| 真机测试 | 最终验证 | ADB over Wi-Fi 连接物理设备 |
| 第三方模拟器 | Windows/macOS | 蓝叠/逍遥/夜神,自带虚拟化 |
| 使用裸金属实例 | 云上 CI/CD | 支持 KVM,但成本较高 |
| 云测平台 | 大规模兼容测试 | Testin、百度 MTC、Firebase Test Lab |
8.2 cmdline-tools 下载失败(国内网络)
现象:
bash
root@itest-04:~$ wget -q https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip
root@itest-04:~$ ls -lh cmdline-tools.zip
-rw-r--r-- 1 root root 0 cmdline-tools.zip # 0 字节!
原因 :华为云香港节点无法访问 dl.google.com 域名。
解决方案:
- 使用 APT 源安装(
apt install android-sdk)✓ 已验证可行 - 手动下载后上传到服务器
- 使用国内镜像(阿里云 Android 镜像可能不可达)
- 使用代理或 VPN 连接
8.3 ADB 连接设备常见问题
bash
# 问题 1:adb devices 显示 unauthorized
# 解决:设备端点击 "允许 USB 调试" 授权弹窗
# 问题 2:adb connect IP:5555 失败
# 解决:先用 USB 连接,执行 adb tcpip 5555 开启网络调试
# 问题 3:多个设备时的选择
adb -s <serial> shell # -s 指定设备序列号
adb -d shell # -d 仅 USB 设备
adb -e shell # -e 仅网络设备
8.4 Monkey 测试常见坑
| 坑 | 现象 | 解决 |
|---|---|---|
| 未指定包名 | Monkey 操作到系统设置导致误改 | 始终使用 -p |
| 事件间隔太短 | 大量 ANR 误报 | --throttle 200~500 |
| 屏幕锁定 | 所有事件在锁屏界面无效 | 先 adb shell input keyevent 82 解锁 |
| 权限弹窗 | "权限被拒绝" 导致测试终止 | --ignore-security-exceptions |
九、总结
9.1 核心知识回顾
| 章节 | 核心内容 | 关键命令 |
|---|---|---|
| ADB 基础 | 设备连接、文件传输、Shell | adb devices, adb shell, adb push/pull |
| ADB 进阶 | 应用管理、日志分析、模拟操作 | adb install, adb logcat, adb shell input |
| ADB 性能 | CPU/内存/电量/流量监控 | adb shell dumpsys 系列 |
| Monkey | 随机压力测试、崩溃检测 | adb shell monkey -p <pkg> -v <count> |
| Android SDK | 开发环境搭建、构建工具 | apt install android-sdk |
9.2 工具链选型建议
移动端测试工具链推荐:
开发阶段 ──► Android Studio + 自带模拟器
功能测试 ──► Appium / UIAutomator2
压力测试 ──► Monkey (首选) + Maxim (增强)
性能分析 ──► PerfDog / SoloPi / adb dumpsys
兼容测试 ──► Firebase Test Lab / 云测平台
安全测试 ──► MobSF / Drozer
CI/CD ──► Jenkins + ADB + Monkey 脚本
9.3 后续学习路线
接口测试 (Postman/JMeter)
│
▼
移动端测试 (本文)
├── ADB 命令行
├── Monkey 随机测试
└── Android SDK 环境
│
▼
移动端自动化 (Appium/UIAutomator)
│
▼
移动端性能测试 (PerfDog/SoloPi)
│
▼
移动端安全测试 (MobSF/Drozer)
参考资料
- Android Debug Bridge (adb): https://developer.android.com/tools/adb
- Monkey Testing: https://developer.android.com/studio/test/other-testing-tools/monkey
- Android SDK Platform-Tools: https://developer.android.com/tools/releases/platform-tools
本文基于华为云 ecs-916d 集群(ac9.large.2 × 4 节点 | Ubuntu 24.04)实机部署,所有命令输出均为真实终端截取。
测试集群 IP: itest-01:121.36.51.148 | itest-02:119.3.175.121 | itest-03:1.92.93.183 | itest-04:120.46.82.41