adb
# 基础知识
Android Debug Bridge (adb) 是一个功能强大的命令行工具,允许您与 Android 设备进行通信。adb 命令可以执行各种设备操作,如安装和调试应用程序。adb 提供了对 Unix shell 的访问,您可以在设备上运行各种命令。
# 核心概念
- adb client: 在开发机器上运行的客户端程序
- adb server: 在开发机器上运行的后台进程,管理客户端与设备的通信
- adbd: 在 Android 设备上运行的守护进程
# 运行原理
adb 的运行原理是 PC 端的 adb server 与手机端的守护进程 adbd 建立连接,然后 PC 端的 adb client 通过 adb server 转发命令,adbd 接收命令后解析运行。
# 连接流程
adb client → adb server → adbd (设备端)
1
2
2
# 安装与配置
# 安装 ADB
# macOS (使用 Homebrew)
brew install android-platform-tools
# Ubuntu/Debian
sudo apt-get install android-tools-adb
# Windows
# 下载 Android SDK Platform Tools
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 环境配置
# 添加到 PATH
export PATH=$PATH:$ANDROID_HOME/platform-tools
# 验证安装
adb version
1
2
3
4
5
2
3
4
5
# 设备连接
# 查看连接的设备
adb devices
# 无线连接
adb tcpip 5555
adb connect <device_ip>:5555
# 断开连接
adb disconnect <device_ip>:5555
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 基础命令
# 设备管理
# 查看设备信息
adb devices -l
# 重启 adb 服务
adb kill-server
adb start-server
# 指定端口启动服务
adb -P <port> start-server
# 重启设备
adb reboot
adb reboot bootloader
adb reboot recovery
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 文件操作
# 推送文件到设备
adb push <local_file> <remote_path>
# 从设备拉取文件
adb pull <remote_file> <local_path>
# 安装 APK
adb install -r <apk_path>
# 卸载应用
adb uninstall <package_name>
# 查看设备存储
adb shell df
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 网络配置
# 查看网络接口
adb shell ip address show wlan0
adb shell ifconfig | grep "inet "
# 查看网络状态
adb shell "su -c ifconfig"
# 设置网络代理
adb shell settings put global http_proxy <host>:<port>
# 清除HTTP代理设置
# 方法1:设置为空值(推荐)
adb shell settings put global http_proxy :0
# 方法2:删除设置
adb shell settings delete global http_proxy
# 方法3:设置为null
adb shell settings put global http_proxy null
# 查看当前代理设置
adb shell settings get global http_proxy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 系统信息查询
# 设备属性 (getprop)
# 查看所有属性
adb shell getprop
# 查看特定属性
adb shell getprop ro.product.model # 手机型号
adb shell getprop ro.product.brand # 品牌
adb shell getprop ro.product.device # 设备代号
adb shell getprop ro.build.version.release # 系统版本
adb shell getprop ro.product.cpu.abi # CPU架构
# 高级选项
adb shell getprop -T # 显示属性类型
adb shell getprop -Z # 显示属性上下文
# 批量查询
adb shell getprop | grep -E 'ro.product.model|ro.product.brand|ro.product.device'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 系统信息 (cat)
# CPU信息
adb shell cat /proc/cpuinfo
# 内存信息
adb shell cat /proc/meminfo
# 系统版本
adb shell cat /proc/version
# 设备树
adb shell cat /proc/device-tree/model
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 进程管理 (ps)
# 查看所有进程
adb shell ps -A
# 查看用户进程
adb shell ps -a
# 按内存排序
adb shell ps -r
# 显示详细信息
adb shell ps -u -p
# 过滤特定进程
adb shell ps | grep <package_name>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 应用管理
# 包管理器 (pm)
# 列出所有应用
adb shell pm list packages
# 列出第三方应用
adb shell pm list packages -3
# 列出系统应用
adb shell pm list packages -s
# 显示应用路径
adb shell pm list packages -f
# 获取特定应用路径
adb shell pm path <package_name>
# 清除应用数据
adb shell pm clear <package_name>
# 禁用/启用应用
adb shell pm disable-user <package_name>
adb shell pm enable <package_name>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 应用操作
# 强制停止应用
adb shell am force-stop <package_name>
# 启动应用
adb shell am start -n <package_name>/<activity_name>
# 启动应用并传递数据
adb shell am start -n <package_name>/<activity_name> -d 
# 发送广播
adb shell am broadcast -a <action>
adb shell am broadcast -a <action> -e <key> <value>
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 系统监控
# 系统转储 (dumpsys)
dumpsys 用于转储系统服务信息,是调试和性能分析的重要工具。
# 基础用法
# 查看所有可用服务
adb shell dumpsys -l
# 转储特定服务
adb shell dumpsys <service_name>
1
2
3
4
5
2
3
4
5
# Activity 管理
# 查看前台 Activity
adb shell dumpsys activity activities
adb shell dumpsys activity top
# 查看特定 Activity 信息
adb shell dumpsys activity <activity_name>
# 查看广播接收器
adb shell dumpsys activity broadcasts | grep <package_name>
# 查看服务
adb shell dumpsys activity services [<package_name>]
# 查看最近任务
adb shell dumpsys activity recents
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 性能监控
# 内存信息
adb shell dumpsys meminfo <process_name_or_pid>
# 图形渲染信息
adb shell dumpsys gfxinfo <process_name>
# SurfaceFlinger 延迟
adb shell dumpsys SurfaceFlinger --latency
# 窗口信息
adb shell dumpsys window | grep mCurrentFocus
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 网络和连接
# 网络统计
adb shell dumpsys netstats
# 连接信息
adb shell dumpsys connectivity
# WiFi 信息
adb shell dumpsys wifi
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 性能分析
# 启动性能分析
adb shell am profile start <process> <file>
# 停止性能分析
adb shell am profile stop <process>
# 转储堆内存
adb shell am dumpheap <process> <file>
# 设置调试应用
adb shell am set-debug-app -w <package>
adb shell am set-debug-app -w --persistent <package>
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 日志管理
# 日志查看 (logcat)
logcat 是 Android 系统日志查看工具,提供丰富的过滤和格式化选项。
# 基础用法
# 查看帮助
adb logcat -h
# 清除日志缓存
adb logcat -c
# 设置缓冲区大小
adb logcat -G 16M
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 日志级别过滤
# 按级别过滤
adb logcat *:V # Verbose (所有级别)
adb logcat *:D # Debug 及以上
adb logcat *:I # Info 及以上
adb logcat *:W # Warning 及以上
adb logcat *:E # Error 及以上
adb logcat *:F # Fatal 及以上
adb logcat *:S # Silent (静默模式)
# 按标签过滤
adb logcat -s "TAG_NAME"
adb logcat *:E -s "TAG_NAME" # Error级别且包含标签
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 日志格式控制
# 不同格式选项
adb logcat -v time # 显示时间戳
adb logcat -v threadtime # 显示时间戳、线程ID和优先级
adb logcat -v long # 显示所有元数据字段
adb logcat -v brief # 显示优先级、标签和PID
1
2
3
4
5
2
3
4
5
# 日志缓冲区
# 选择缓冲区
adb logcat -b main # 主缓冲区(默认)
adb logcat -b system # 系统缓冲区
adb logcat -b radio # 无线缓冲区
adb logcat -b events # 事件缓冲区
adb logcat -b all # 所有缓冲区
adb logcat -b crash # 崩溃日志
1
2
3
4
5
6
7
2
3
4
5
6
7
# 实用技巧
# 保存日志到文件
adb logcat > log.txt
adb logcat -d > log.txt # 转储后退出
adb logcat -f log.txt # 持续写入
# 日志文件管理
adb logcat -r 1024 -n 10 # 设置文件大小1024KB,最多保存10个文件
# 过滤特定信息
adb logcat | grep -i "crash\|exception\|error"
adb logcat | grep -i "anr"
adb logcat | grep -i "outofmemory"
# 按标签过滤并显示详细时间
adb logcat -v threadtime | grep -i "your_tag"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 输入模拟
# 输入事件 (input)
input 命令用于模拟各种输入事件,包括点击、按键、滑动和文本输入。
# 基础输入
# 模拟点击
adb shell input tap <x> <y>
# 模拟按键
adb shell input keyevent <keycode>
# 模拟滑动
adb shell input swipe <x1> <y1> <x2> <y2> [duration]
# 模拟文本输入
adb shell input text "your_text"
# 长按按键
adb shell input keyevent --longpress <keycode>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 常用按键码
# 系统按键
adb shell input keyevent 3 # HOME
adb shell input keyevent 4 # BACK
adb shell input keyevent 24 # VOLUME_UP
adb shell input keyevent 25 # VOLUME_DOWN
adb shell input keyevent 26 # POWER
adb shell input keyevent 27 # CAMERA
# 导航按键
adb shell input keyevent 19 # DPAD_UP
adb shell input keyevent 20 # DPAD_DOWN
adb shell input keyevent 21 # DPAD_LEFT
adb shell input keyevent 22 # DPAD_RIGHT
adb shell input keyevent 23 # DPAD_CENTER
# 功能按键
adb shell input keyevent 82 # MENU
adb shell input keyevent 84 # SEARCH
adb shell input keyevent 85 # MEDIA_PLAY_PAUSE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 高级用法
# 连续点击
for i in {1..10}; do
adb shell input tap 500 500
sleep 0.1
done
# 滑动解锁
adb shell input swipe 300 1000 300 500
# 输入特殊字符
adb shell input text "Hello\ World" # 转义空格
adb shell input text "Hello%20World" # URL编码
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 调试工具
# 崩溃分析
# 生成完整设备报告
adb bugreport crash.txt
# 获取 ANR 信息
adb shell
run-as <package_name>
kill -s SIGQUIT <pid>
1
2
3
4
5
6
7
2
3
4
5
6
7
# 性能分析
# 启动性能监控
adb shell am profile start <process> /sdcard/profile.trace
# 停止性能监控
adb shell am profile stop <process>
# 拉取性能数据
adb pull /sdcard/profile.trace .
# 使用 Android Studio 分析
# 打开 Android Studio → Profiler → Load APK Snapshot
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 内存分析
# 转储堆内存
adb shell am dumpheap <process> /sdcard/heap.hprof
# 拉取堆内存文件
adb pull /sdcard/heap.hprof .
# 使用 MAT 或 Android Studio 分析
1
2
3
4
5
6
7
2
3
4
5
6
7
# 高级功能
# 端口转发
# 本地端口转发
adb forward tcp:<local_port> tcp:<remote_port>
# 反向端口转发
adb reverse tcp:<remote_port> tcp:<local_port>
# 示例:转发 ADB 端口
adb forward tcp:5555 tcp:5555
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 网络代理
# 设置 HTTP 代理
adb shell settings put global http_proxy <host>:<port>
# 清除代理设置
adb shell settings put global http_proxy :0
# 查看当前代理
adb shell settings get global http_proxy
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 无线调试
# 启用无线调试
adb tcpip 5555
# 连接到设备
adb connect <device_ip>:5555
# 断开连接
adb disconnect <device_ip>:5555
# 查看连接状态
adb devices
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 实际应用案例
# 1. 自动化测试
# 应用安装和启动
#!/bin/bash
# 自动化测试脚本
PACKAGE_NAME="com.example.app"
ACTIVITY_NAME="com.example.app.MainActivity"
APK_PATH="./app-debug.apk"
echo "开始自动化测试..."
# 安装应用
echo "安装应用..."
adb install -r "$APK_PATH"
# 启动应用
echo "启动应用..."
adb shell am start -n "$PACKAGE_NAME/$ACTIVITY_NAME"
# 等待应用启动
sleep 3
# 执行测试操作
echo "执行测试操作..."
adb shell input tap 500 500 # 点击屏幕中心
sleep 1
adb shell input text "test_input" # 输入文本
sleep 1
adb shell input keyevent 4 # 返回键
# 停止应用
echo "停止应用..."
adb shell am force-stop "$PACKAGE_NAME"
echo "测试完成"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 性能测试
#!/bin/bash
# 性能测试脚本
PACKAGE_NAME="com.example.app"
TEST_DURATION=60 # 测试时长(秒)
echo "开始性能测试..."
# 启动应用
adb shell am start -n "$PACKAGE_NAME/.MainActivity"
# 开始性能监控
adb shell am profile start "$PACKAGE_NAME" /sdcard/performance.trace
# 执行测试操作
for i in {1..10}; do
echo "执行第 $i 轮测试..."
adb shell input swipe 300 1000 300 500
sleep 2
adb shell input tap 500 500
sleep 1
done
# 停止性能监控
adb shell am profile stop "$PACKAGE_NAME"
# 拉取性能数据
adb pull /sdcard/performance.trace ./performance_$(date +%Y%m%d_%H%M%S).trace
echo "性能测试完成"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 2. 应用调试
# 日志收集
#!/bin/bash
# 日志收集脚本
PACKAGE_NAME="com.example.app"
LOG_FILE="app_logs_$(date +%Y%m%d_%H%M%S).txt"
echo "开始收集日志..."
# 清除旧日志
adb logcat -c
# 设置日志级别
adb shell setprop log.tag.Main D
adb shell setprop log.tag.MessageFragment D
# 启动应用
adb shell am start -n "$PACKAGE_NAME/.MainActivity"
# 收集日志
echo "收集日志到 $LOG_FILE..."
adb logcat -v threadtime | grep -E "$PACKAGE_NAME|crash|exception|error|anr" > "$LOG_FILE" &
LOG_PID=$!
# 等待用户操作
echo "请在设备上执行操作,完成后按 Ctrl+C 停止日志收集"
trap "kill $LOG_PID; echo '日志收集完成'; exit" INT
wait $LOG_PID
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 内存泄漏检测
#!/bin/bash
# 内存泄漏检测脚本
PACKAGE_NAME="com.example.app"
HEAP_FILE="heap_$(date +%Y%m%d_%H%M%S).hprof"
echo "开始内存泄漏检测..."
# 启动应用
adb shell am start -n "$PACKAGE_NAME/.MainActivity"
sleep 5
# 执行可能导致内存泄漏的操作
for i in {1..20}; do
echo "执行第 $i 轮操作..."
adb shell input tap 500 500
sleep 1
adb shell input keyevent 4
sleep 1
done
# 转储堆内存
echo "转储堆内存..."
adb shell am dumpheap "$PACKAGE_NAME" "/sdcard/$HEAP_FILE"
# 拉取堆内存文件
adb pull "/sdcard/$HEAP_FILE" "./$HEAP_FILE"
echo "内存泄漏检测完成,堆文件: $HEAP_FILE"
echo "请使用 MAT 或 Android Studio 分析堆文件"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 3. 设备管理
# 批量设备操作
#!/bin/bash
# 批量设备操作脚本
echo "批量设备操作..."
# 获取所有连接的设备
DEVICES=$(adb devices | grep -E "device$" | awk '{print $1}')
if [ -z "$DEVICES" ]; then
echo "没有找到连接的设备"
exit 1
fi
# 遍历所有设备
for device in $DEVICES; do
echo "处理设备: $device"
# 在设备上执行操作
adb -s "$device" shell echo "Hello from $device"
adb -s "$device" shell input keyevent 26 # 锁屏
adb -s "$device" shell input keyevent 26 # 解锁
echo "设备 $device 处理完成"
done
echo "批量操作完成"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 设备信息收集
#!/bin/bash
# 设备信息收集脚本
OUTPUT_FILE="device_info_$(date +%Y%m%d_%H%M%S).txt"
echo "收集设备信息到 $OUTPUT_FILE..."
{
echo "=== 设备信息报告 ==="
echo "生成时间: $(date)"
echo ""
echo "=== 连接设备 ==="
adb devices -l
echo ""
echo "=== 设备属性 ==="
adb shell getprop | grep -E 'ro\.product\.|ro\.build\.|ro\.version\.'
echo ""
echo "=== 系统信息 ==="
adb shell cat /proc/version
echo ""
echo "=== 存储信息 ==="
adb shell df
echo ""
echo "=== 内存信息 ==="
adb shell cat /proc/meminfo | head -10
echo ""
echo "=== 已安装应用 ==="
adb shell pm list packages -3 | head -20
echo ""
} > "$OUTPUT_FILE"
echo "设备信息收集完成: $OUTPUT_FILE"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 4. 网络调试
# 网络连接测试
#!/bin/bash
# 网络连接测试脚本
echo "网络连接测试..."
# 获取设备IP
DEVICE_IP=$(adb shell ip route | grep wlan0 | awk '{print $9}')
echo "设备IP: $DEVICE_IP"
# 测试网络连通性
echo "测试网络连通性..."
adb shell ping -c 4 8.8.8.8
# 测试DNS解析
echo "测试DNS解析..."
adb shell nslookup google.com
# 测试端口连通性
echo "测试端口连通性..."
adb shell nc -zv google.com 80
# 查看网络接口
echo "网络接口信息..."
adb shell ip addr show wlan0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 代理配置
#!/bin/bash
# 代理配置脚本
PROXY_HOST="192.168.1.100"
PROXY_PORT="8080"
echo "配置网络代理..."
# 设置HTTP代理
adb shell settings put global http_proxy "$PROXY_HOST:$PROXY_PORT"
# 验证代理设置
CURRENT_PROXY=$(adb shell settings get global http_proxy)
echo "当前代理设置: $CURRENT_PROXY"
# 测试代理连接
echo "测试代理连接..."
adb shell curl -x "$PROXY_HOST:$PROXY_PORT" http://httpbin.org/ip
echo "代理配置完成"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 性能优化技巧
# 1. 命令优化
# 批量操作优化
# 低效方式:多次单独执行
adb shell ls /sdcard/
adb shell ls /data/
adb shell ls /system/
# 高效方式:一次执行多个命令
adb shell "ls /sdcard/ && ls /data/ && ls /system/"
1
2
3
4
5
6
7
2
3
4
5
6
7
# 输出重定向优化
# 避免在循环中使用管道
# 低效方式
for i in {1..100}; do
adb shell echo "test" | grep "test"
done
# 高效方式
adb shell "for i in {1..100}; do echo 'test'; done" | grep "test"
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 2. 网络优化
# 无线连接优化
# 使用USB连接进行初始设置
adb tcpip 5555
# 使用无线连接进行日常操作
adb connect <device_ip>:5555
# 定期检查连接状态
adb devices | grep -q "<device_ip>" || adb connect <device_ip>:5555
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 端口转发优化
# 设置反向端口转发,避免防火墙问题
adb reverse tcp:8080 tcp:8080
# 使用本地端口转发进行调试
adb forward tcp:9222 localabstract:chrome_devtools_remote
1
2
3
4
5
2
3
4
5
# 3. 日志优化
# 日志过滤优化
# 使用精确的标签过滤
adb logcat -s "MyApp" -s "MyTag"
# 使用正则表达式进行复杂过滤
adb logcat | grep -E "(ERROR|FATAL|ANR)" | grep -v "spam_tag"
# 使用日志级别减少输出
adb logcat *:W # 只显示警告及以上级别
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 日志文件管理
# 使用循环日志文件
adb logcat -r 1024 -n 5 -f /tmp/android.log
# 按时间分割日志
adb logcat -v time | awk '{print strftime("%Y%m%d_%H%M%S"), $0}' > "log_$(date +%Y%m%d).txt"
1
2
3
4
5
2
3
4
5
# 常见问题解决
# 1. 连接问题
# 设备未识别
# 检查USB连接
lsusb | grep -i android
# 重启ADB服务
adb kill-server
adb start-server
# 检查设备权限
ls -la ~/.android/adbkey
# 重新生成ADB密钥
rm ~/.android/adbkey*
adb start-server
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 无线连接失败
# 检查网络连通性
ping <device_ip>
# 检查端口是否开放
nc -zv <device_ip> 5555
# 重新启用无线调试
adb tcpip 5555
adb connect <device_ip>:5555
# 使用反向端口转发
adb reverse tcp:5555 tcp:5555
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 2. 权限问题
# 文件访问权限
# 访问应用私有目录
adb shell run-as <package_name> ls /data/data/<package_name>/
# 使用root权限(需要设备已root)
adb shell su -c "ls /data/data/"
# 修改文件权限
adb shell chmod 755 /sdcard/test.txt
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 系统权限
# 授予应用权限
adb shell pm grant <package_name> <permission>
# 撤销应用权限
adb shell pm revoke <package_name> <permission>
# 查看应用权限
adb shell dumpsys package <package_name> | grep permission
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 3. 性能问题
# 命令执行缓慢
# 使用后台执行
adb shell "nohup <command> > /dev/null 2>&1 &"
# 使用异步执行
adb shell "<command> &"
# 优化命令结构
adb shell "command1 && command2 && command3"
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 内存不足
# 清理应用缓存
adb shell pm clear <package_name>
# 清理系统缓存
adb shell rm -rf /data/local/tmp/*
adb shell rm -rf /sdcard/Android/data/*/cache/*
# 重启设备
adb reboot
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 最佳实践
# 1. 脚本编写
# 错误处理
#!/bin/bash
# 带错误处理的脚本
set -e # 遇到错误立即退出
# 检查设备连接
check_device() {
if ! adb devices | grep -q "device$"; then
echo "错误:没有找到连接的设备"
exit 1
fi
}
# 检查应用是否安装
check_app() {
local package_name=$1
if ! adb shell pm list packages | grep -q "$package_name"; then
echo "错误:应用 $package_name 未安装"
exit 1
fi
}
# 主函数
main() {
check_device
check_app "com.example.app"
echo "开始执行操作..."
# 执行具体操作
}
main "$@"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 日志记录
#!/bin/bash
# 带日志记录的脚本
LOG_FILE="adb_script_$(date +%Y%m%d_%H%M%S).log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log "脚本开始执行"
# 执行操作并记录日志
if adb install app.apk; then
log "应用安装成功"
else
log "应用安装失败"
exit 1
fi
log "脚本执行完成"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 2. 安全考虑
# 权限最小化
# 只授予必要的权限
adb shell pm grant <package_name> android.permission.CAMERA
# 使用临时权限
adb shell pm grant <package_name> android.permission.WRITE_EXTERNAL_STORAGE
# 操作完成后撤销
adb shell pm revoke <package_name> android.permission.WRITE_EXTERNAL_STORAGE
1
2
3
4
5
6
7
2
3
4
5
6
7
# 数据保护
# 加密敏感数据
adb shell "echo 'sensitive_data' | openssl enc -aes-256-cbc -a"
# 安全删除文件
adb shell shred -u /sdcard/sensitive_file.txt
# 使用临时目录
adb shell mkdir -p /data/local/tmp/secure_workspace
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 3. 性能监控
# 资源使用监控
#!/bin/bash
# 资源监控脚本
monitor_resources() {
while true; do
echo "=== $(date) ==="
echo "CPU使用率:"
adb shell top -n 1 | head -10
echo ""
echo "内存使用:"
adb shell cat /proc/meminfo | head -5
echo ""
echo "存储使用:"
adb shell df /sdcard
echo "=================="
sleep 30
done
}
monitor_resources
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 调试技巧
# 1. 问题诊断
# 连接诊断
#!/bin/bash
# 连接诊断脚本
echo "=== ADB连接诊断 ==="
# 检查ADB版本
echo "1. ADB版本:"
adb version
# 检查设备连接
echo "2. 设备连接状态:"
adb devices -l
# 检查网络连接
echo "3. 网络连接:"
if [ -n "$DEVICE_IP" ]; then
ping -c 3 "$DEVICE_IP"
else
echo "未设置设备IP"
fi
# 检查端口状态
echo "4. 端口状态:"
netstat -an | grep 5555
# 检查USB设备
echo "5. USB设备:"
lsusb | grep -i android
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 应用诊断
#!/bin/bash
# 应用诊断脚本
PACKAGE_NAME=$1
if [ -z "$PACKAGE_NAME" ]; then
echo "用法: $0 <package_name>"
exit 1
fi
echo "=== 应用诊断: $PACKAGE_NAME ==="
# 检查应用是否安装
echo "1. 应用安装状态:"
adb shell pm list packages | grep "$PACKAGE_NAME"
# 检查应用权限
echo "2. 应用权限:"
adb shell dumpsys package "$PACKAGE_NAME" | grep -A 10 "requested permissions"
# 检查应用进程
echo "3. 应用进程:"
adb shell ps | grep "$PACKAGE_NAME"
# 检查应用数据
echo "4. 应用数据目录:"
adb shell run-as "$PACKAGE_NAME" ls -la /data/data/"$PACKAGE_NAME"/
# 检查应用日志
echo "5. 应用日志:"
adb logcat -d | grep "$PACKAGE_NAME" | tail -20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 2. 性能分析
# CPU分析
#!/bin/bash
# CPU性能分析脚本
PACKAGE_NAME=$1
DURATION=${2:-60}
echo "开始CPU性能分析..."
# 启动应用
adb shell am start -n "$PACKAGE_NAME/.MainActivity"
# 收集CPU使用数据
adb shell "top -d 1 -n $DURATION" | grep "$PACKAGE_NAME" > cpu_usage.txt
# 分析CPU使用情况
echo "CPU使用统计:"
awk '{sum+=$9; count++} END {print "平均CPU使用率:", sum/count "%"}' cpu_usage.txt
# 生成CPU使用图表
echo "生成CPU使用图表..."
gnuplot << EOF
set terminal png
set output 'cpu_usage.png'
set title 'CPU Usage Over Time'
set xlabel 'Time (s)'
set ylabel 'CPU Usage (%)'
plot 'cpu_usage.txt' using 9 with lines title 'CPU Usage'
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 内存分析
#!/bin/bash
# 内存性能分析脚本
PACKAGE_NAME=$1
echo "开始内存性能分析..."
# 获取初始内存使用
INITIAL_MEM=$(adb shell dumpsys meminfo "$PACKAGE_NAME" | grep "TOTAL" | awk '{print $2}')
echo "初始内存使用: $INITIAL_MEM KB"
# 执行内存密集型操作
for i in {1..10}; do
echo "执行第 $i 轮操作..."
adb shell input tap 500 500
sleep 2
# 记录内存使用
CURRENT_MEM=$(adb shell dumpsys meminfo "$PACKAGE_NAME" | grep "TOTAL" | awk '{print $2}')
echo "第 $i 轮内存使用: $CURRENT_MEM KB"
done
# 获取最终内存使用
FINAL_MEM=$(adb shell dumpsys meminfo "$PACKAGE_NAME" | grep "TOTAL" | awk '{print $2}')
echo "最终内存使用: $FINAL_MEM KB"
echo "内存增长: $((FINAL_MEM - INITIAL_MEM)) KB"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 3. 自动化测试
# UI自动化测试
#!/bin/bash
# UI自动化测试脚本
PACKAGE_NAME="com.example.app"
TEST_SCENARIOS=(
"点击登录按钮"
"输入用户名"
"输入密码"
"提交表单"
"验证登录成功"
)
echo "开始UI自动化测试..."
# 启动应用
adb shell am start -n "$PACKAGE_NAME/.MainActivity"
sleep 3
# 执行测试场景
for scenario in "${TEST_SCENARIOS[@]}"; do
echo "执行测试场景: $scenario"
case "$scenario" in
"点击登录按钮")
adb shell input tap 500 800
;;
"输入用户名")
adb shell input tap 300 400
adb shell input text "testuser"
;;
"输入密码")
adb shell input tap 300 500
adb shell input text "testpass"
;;
"提交表单")
adb shell input keyevent 66 # Enter键
;;
"验证登录成功")
# 检查是否跳转到主页面
sleep 2
CURRENT_ACTIVITY=$(adb shell dumpsys activity activities | grep mResumedActivity | awk '{print $4}')
if [[ "$CURRENT_ACTIVITY" == *"MainActivity"* ]]; then
echo "✓ 登录成功"
else
echo "✗ 登录失败"
fi
;;
esac
sleep 1
done
echo "UI自动化测试完成"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 压力测试
#!/bin/bash
# 压力测试脚本
PACKAGE_NAME="com.example.app"
TEST_DURATION=300 # 5分钟
INTERVAL=1 # 1秒间隔
echo "开始压力测试..."
# 启动应用
adb shell am start -n "$PACKAGE_NAME/.MainActivity"
sleep 3
# 记录开始时间
START_TIME=$(date +%s)
# 执行压力测试
while [ $(($(date +%s) - START_TIME)) -lt $TEST_DURATION ]; do
# 随机点击屏幕
X=$((RANDOM % 1000))
Y=$((RANDOM % 2000))
adb shell input tap $X $Y
# 随机按键
KEYCODE=$((RANDOM % 100))
adb shell input keyevent $KEYCODE
# 随机滑动
X1=$((RANDOM % 1000))
Y1=$((RANDOM % 2000))
X2=$((RANDOM % 1000))
Y2=$((RANDOM % 2000))
adb shell input swipe $X1 $Y1 $X2 $Y2
sleep $INTERVAL
done
echo "压力测试完成"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 扩展资源
# 1. 相关工具
# 图形化工具
- Android Studio: 集成开发环境,提供ADB图形化界面
- ADB GUI: 轻量级ADB图形化工具
- Scrcpy: 通过ADB显示和控制Android设备
- Vysor: 在电脑上显示Android设备屏幕
# 命令行工具
- Fastboot: 用于刷机和设备恢复
- ADB WiFi: 无线ADB连接工具
- ADB Backup: 设备备份和恢复工具
- 自定义脚本: 基于官方ADB的自动化脚本
# 2. 学习资源
# 官方文档
- Android Debug Bridge (adb) (opens new window)
- ADB Command Line Tools (opens new window)
- Android Debug Bridge (opens new window)
# 社区资源
- awesome-adb (opens new window): ADB命令大全
- ADB Cheat Sheet (opens new window)
- Android ADB Commands (opens new window)
- Android开发者文档 (opens new window)
- Android Studio (opens new window)
# 3. 实用脚本库
# 自动化脚本
# 批量安装APK
#!/bin/bash
for apk in *.apk; do
echo "安装 $apk..."
adb install -r "$apk"
done
1
2
3
4
5
6
2
3
4
5
6
# 批量截图
#!/bin/bash
for i in {1..10}; do
adb shell screencap -p /sdcard/screenshot_$i.png
adb pull /sdcard/screenshot_$i.png .
sleep 2
done
1
2
3
4
5
6
7
2
3
4
5
6
7
# 设备信息收集
#!/bin/bash
adb shell getprop > device_properties.txt
adb shell cat /proc/cpuinfo > cpu_info.txt
adb shell cat /proc/meminfo > memory_info.txt
1
2
3
4
5
2
3
4
5
# 4. 故障排除指南
# 常见错误及解决方案
| 错误信息 | 可能原因 | 解决方案 |
|---|---|---|
device not found | 设备未连接或驱动问题 | 检查USB连接,重启ADB服务 |
insufficient permissions | 权限不足 | 使用sudo或检查设备权限 |
connection refused | 端口被占用 | 更改端口或重启服务 |
timeout | 网络连接问题 | 检查网络设置,使用USB连接 |
# 性能优化建议
- 使用USB连接: 无线连接可能不稳定,建议使用USB连接进行调试
- 批量操作: 将多个命令合并执行,减少通信开销
- 日志过滤: 使用精确的过滤条件,减少不必要的数据传输
- 定期清理: 定期清理设备缓存和临时文件
# 总结
ADB是Android开发中不可或缺的工具,掌握其使用方法可以大大提高开发效率。本文档涵盖了ADB的基础知识、常用命令、高级功能、实际应用案例、性能优化技巧、调试方法等内容。
# 关键要点
- 理解ADB架构: 掌握client-server-adbd的三层架构
- 熟练基础命令: 掌握设备管理、文件操作、应用管理等基础命令
- 善用高级功能: 利用dumpsys、logcat、input等工具进行调试
- 编写自动化脚本: 提高重复性工作的效率
- 注意性能优化: 合理使用命令,避免不必要的资源消耗
# 持续学习
ADB功能强大且不断更新,建议:
- 定期查看官方文档更新
- 参与社区讨论,分享经验
- 实践项目中的实际应用
- 关注新版本的功能变化
通过不断学习和实践,您将能够更好地利用ADB工具进行Android开发和调试工作。
上次更新: 2025/10/09, 23:53:03