Jacky's blog
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)
  • tutorial
  • jetpack

  • components

  • androidx

  • 动态化
  • apm

  • module

  • harmony

  • tool

    • adb
      • 基础知识
        • 核心概念
        • 运行原理
      • 安装与配置
        • 安装 ADB
        • 环境配置
        • 设备连接
      • 基础命令
        • 设备管理
        • 文件操作
        • 网络配置
      • 系统信息查询
        • 设备属性 (getprop)
        • 系统信息 (cat)
        • 进程管理 (ps)
      • 应用管理
        • 包管理器 (pm)
        • 应用操作
      • 系统监控
        • 系统转储 (dumpsys)
        • 基础用法
        • Activity 管理
        • 性能监控
        • 网络和连接
        • 性能分析
      • 日志管理
        • 日志查看 (logcat)
        • 基础用法
        • 日志级别过滤
        • 日志格式控制
        • 日志缓冲区
        • 实用技巧
      • 输入模拟
        • 输入事件 (input)
        • 基础输入
        • 常用按键码
        • 高级用法
      • 调试工具
        • 崩溃分析
        • 性能分析
        • 内存分析
      • 高级功能
        • 端口转发
        • 网络代理
        • 无线调试
      • 实际应用案例
        • 1. 自动化测试
        • 应用安装和启动
        • 性能测试
        • 2. 应用调试
        • 日志收集
        • 内存泄漏检测
        • 3. 设备管理
        • 批量设备操作
        • 设备信息收集
        • 4. 网络调试
        • 网络连接测试
        • 代理配置
      • 性能优化技巧
        • 1. 命令优化
        • 批量操作优化
        • 输出重定向优化
        • 2. 网络优化
        • 无线连接优化
        • 端口转发优化
        • 3. 日志优化
        • 日志过滤优化
        • 日志文件管理
      • 常见问题解决
        • 1. 连接问题
        • 设备未识别
        • 无线连接失败
        • 2. 权限问题
        • 文件访问权限
        • 系统权限
        • 3. 性能问题
        • 命令执行缓慢
        • 内存不足
      • 最佳实践
        • 1. 脚本编写
        • 错误处理
        • 日志记录
        • 2. 安全考虑
        • 权限最小化
        • 数据保护
        • 3. 性能监控
        • 资源使用监控
      • 调试技巧
        • 1. 问题诊断
        • 连接诊断
        • 应用诊断
        • 2. 性能分析
        • CPU分析
        • 内存分析
        • 3. 自动化测试
        • UI自动化测试
        • 压力测试
      • 扩展资源
        • 1. 相关工具
        • 图形化工具
        • 命令行工具
        • 2. 学习资源
        • 官方文档
        • 社区资源
        • 3. 实用脚本库
        • 自动化脚本
        • 4. 故障排除指南
        • 常见错误及解决方案
        • 性能优化建议
      • 总结
        • 关键要点
        • 持续学习
    • fastboot
  • other

  • kotlin

  • 《android》
  • tool
Jacky
2023-04-28
目录

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

# 安装与配置

# 安装 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

# 环境配置

# 添加到 PATH
export PATH=$PATH:$ANDROID_HOME/platform-tools

# 验证安装
adb version
1
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

# 基础命令

# 设备管理

# 查看设备信息
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

# 文件操作

# 推送文件到设备
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

# 网络配置

# 查看网络接口
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

# 系统信息查询

# 设备属性 (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

# 系统信息 (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

# 进程管理 (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

# 应用管理

# 包管理器 (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

# 应用操作

# 强制停止应用
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

# 系统监控

# 系统转储 (dumpsys)

dumpsys 用于转储系统服务信息,是调试和性能分析的重要工具。

# 基础用法

# 查看所有可用服务
adb shell dumpsys -l

# 转储特定服务
adb shell dumpsys <service_name>
1
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

# 性能监控

# 内存信息
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

# 网络和连接

# 网络统计
adb shell dumpsys netstats

# 连接信息
adb shell dumpsys connectivity

# WiFi 信息
adb shell dumpsys wifi
1
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

# 日志管理

# 日志查看 (logcat)

logcat 是 Android 系统日志查看工具,提供丰富的过滤和格式化选项。

# 基础用法

# 查看帮助
adb logcat -h

# 清除日志缓存
adb logcat -c

# 设置缓冲区大小
adb logcat -G 16M
1
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

# 日志格式控制

# 不同格式选项
adb logcat -v time        # 显示时间戳
adb logcat -v threadtime  # 显示时间戳、线程ID和优先级
adb logcat -v long        # 显示所有元数据字段
adb logcat -v brief       # 显示优先级、标签和PID
1
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

# 实用技巧

# 保存日志到文件
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

# 输入模拟

# 输入事件 (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

# 常用按键码

# 系统按键
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

# 高级用法

# 连续点击
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

# 调试工具

# 崩溃分析

# 生成完整设备报告
adb bugreport crash.txt

# 获取 ANR 信息
adb shell
run-as <package_name>
kill -s SIGQUIT <pid>
1
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

# 内存分析

# 转储堆内存
adb shell am dumpheap <process> /sdcard/heap.hprof

# 拉取堆内存文件
adb pull /sdcard/heap.hprof .

# 使用 MAT 或 Android Studio 分析
1
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

# 网络代理

# 设置 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

# 无线调试

# 启用无线调试
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

# 实际应用案例

# 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

# 性能测试

#!/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. 应用调试

# 日志收集

#!/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

# 内存泄漏检测

#!/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

# 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

# 设备信息收集

#!/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

# 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

# 代理配置

#!/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

# 性能优化技巧

# 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

# 输出重定向优化

# 避免在循环中使用管道
# 低效方式
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. 网络优化

# 无线连接优化

# 使用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

# 端口转发优化

# 设置反向端口转发,避免防火墙问题
adb reverse tcp:8080 tcp:8080

# 使用本地端口转发进行调试
adb forward tcp:9222 localabstract:chrome_devtools_remote
1
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

# 日志文件管理

# 使用循环日志文件
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

# 常见问题解决

# 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

# 无线连接失败

# 检查网络连通性
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. 权限问题

# 文件访问权限

# 访问应用私有目录
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

# 系统权限

# 授予应用权限
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

# 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

# 内存不足

# 清理应用缓存
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

# 最佳实践

# 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

# 日志记录

#!/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. 安全考虑

# 权限最小化

# 只授予必要的权限
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

# 数据保护

# 加密敏感数据
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

# 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

# 调试技巧

# 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

# 应用诊断

#!/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. 性能分析

# 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

# 内存分析

#!/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

# 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

# 压力测试

#!/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

# 扩展资源

# 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
# 批量截图
#!/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
# 设备信息收集
#!/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

# 4. 故障排除指南

# 常见错误及解决方案

错误信息 可能原因 解决方案
device not found 设备未连接或驱动问题 检查USB连接,重启ADB服务
insufficient permissions 权限不足 使用sudo或检查设备权限
connection refused 端口被占用 更改端口或重启服务
timeout 网络连接问题 检查网络设置,使用USB连接

# 性能优化建议

  1. 使用USB连接: 无线连接可能不稳定,建议使用USB连接进行调试
  2. 批量操作: 将多个命令合并执行,减少通信开销
  3. 日志过滤: 使用精确的过滤条件,减少不必要的数据传输
  4. 定期清理: 定期清理设备缓存和临时文件

# 总结

ADB是Android开发中不可或缺的工具,掌握其使用方法可以大大提高开发效率。本文档涵盖了ADB的基础知识、常用命令、高级功能、实际应用案例、性能优化技巧、调试方法等内容。

# 关键要点

  1. 理解ADB架构: 掌握client-server-adbd的三层架构
  2. 熟练基础命令: 掌握设备管理、文件操作、应用管理等基础命令
  3. 善用高级功能: 利用dumpsys、logcat、input等工具进行调试
  4. 编写自动化脚本: 提高重复性工作的效率
  5. 注意性能优化: 合理使用命令,避免不必要的资源消耗

# 持续学习

ADB功能强大且不断更新,建议:

  • 定期查看官方文档更新
  • 参与社区讨论,分享经验
  • 实践项目中的实际应用
  • 关注新版本的功能变化

通过不断学习和实践,您将能够更好地利用ADB工具进行Android开发和调试工作。

#adb#Android#debug#development
上次更新: 2025/10/09, 23:53:03
HarmonyOS 鸿蒙开发完整指南
fastboot

← HarmonyOS 鸿蒙开发完整指南 fastboot→

最近更新
01
npx 使用指南
10-12
02
cursor
09-28
03
inspect
07-20
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式