移动端自动化测试实战:ADB + Monkey 从入门到精通

移动端自动化测试实战:ADB + Monkey 从入门到精通

摘要:移动端应用测试已成为软件测试工程师的必备技能。本文基于华为云 ECS(Ubuntu 24.04)真实环境,从零搭建 Android 测试基础设施,系统讲解移动端测试基础概念、Android 系统架构、ADB 命令详解及 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
开发商 Google 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:设备刷机/解锁 Bootloader
  • dmtracedump:方法调用耗时分析
  • 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 域名。

解决方案

  1. 使用 APT 源安装(apt install android-sdk)✓ 已验证可行
  2. 手动下载后上传到服务器
  3. 使用国内镜像(阿里云 Android 镜像可能不可达)
  4. 使用代理或 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)

参考资料


本文基于华为云 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