adb 使用技巧和常见问题解决方案

记录一些使用 adb 时的技巧和常见问题解决方案。

adb 经常断开

一般在 Windows 平台上比较常见,一些工具包里面会自带一个 adb,这个 adb 的版本跟平时主要用的 adb 版本不一致,跨版本使用 adb 可能会导致 adb 服务重启,解决办法就是统一 adb 版本。

WSL 用户也要确保 adb 版本和 Windows 平台的一致。

顺带附上 adb 最新版下载地址及更新日志

Android Studio

关闭 Android Studio 项目后也会导致其它进程使用的 adb 断开,尽管使用的是同一个 adb 和端口。

ROM adb 不兼容

也可能和系统版本有关,参考 BV1vT4y1o7BX

From M2011K2C MIUI 12.5.13.0 稳定版

同时连接多台设备

连接了多台设备时执行 adb 命令:

  • 断开其它不用的设备。

  • 执行命令时指定设备序列号:

    1
    2
    adb -s <serial> shell
    adb -s <serial> ...
  • 使用别名:

    1
    2
    3
    alias adb="adb -s $(adbs serial)"
    adb shell ...
    adb ...
  • 指定环境变量:

    1
    2
    3
    export ANDROID_SERIAL=$(adbs serial)
    adb shell ...
    adb ...

注:adbs 脚本仅供参考。

WSL 2 使用 adb

WSL 2 自带了一个虚拟网卡,无法像 WSL 1 那样直接使用 adb 命令,民间有两种解决方案:

1
alias adb='adb.exe'

这种方法兼容性很差,不建议使用,看看另一种方法:

1
2
3
4
5
6
# win
adb -a -P 5037 nodaemon server

# WSL 2
export ADB_SERVER_SOCKET=tcp:192.168.100.5:5037
adb devices

具体实现参考 WSL#4619.

远程服务器使用 adb

使用 ssh 将本地端口转发到服务器:

1
2
3
4
5
# 单人使用:
ssh -R 0.0.0.0:5037:localhost:5037 <user>@<ip> -Nf

# 多人使用:
ssh -R 0.0.0.0:<port>:localhost:5037 <user>@<ip> -Nf

当有多个人都需要转发时,避免端口冲突请修改 <port> 为自己喜欢的端口。

登录服务器后执行以下命令:

1
2
3
4
5
# 不推荐使用别名,可能会跟自动补全冲突
# alias adb="adb -P <port>"

# 这个是我目前在用的
export ADB="/usr/bin/adb -P <port>" && alias adb="adbs"

这个命令可以想办法在登录后自动执行,例如 Xshell 用户可以使用「登录脚本」功能来自动执行命令。

adb shell 搜索结果高亮显示

adb shell 打开的终端里面使用 grep 等命令不会有高亮显示,可以用 adb shell <cmd> | grep <regex>,例如:

1
2
3
4
# 无高亮
adb shell "ls /sdcard/ | grep Android"
# 有高亮
adb shell ls /sdcard/ | grep Android

logcat 刷屏

当遇到 logcat 有大量重复且无意义的日志时,可以暂时屏蔽对应的 TAG:

1
adb shell setprop log.tag.<TAG> A

更多详情请参考这里

无线调试提示未授权

1
2
$ adb connect 192.168.1.196
failed to authenticate to adb connect 192.168.1.196

在看这个问题之前先复习一下无线调试,在 Android 11 之前无线调试有两种办法:

  1. 无 root 版,需要先用数据线连接一次电脑:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ adb devices
    List of devices attached
    e4955074 device
    $ adb tcpip 5555
    # 拔掉数据线
    $ adb connect 192.168.1.196
    $ adb devices
    List of devices attached
    192.168.1.196:5555 device
  2. 有 root 版,无需用数据线连接电脑:

    1
    2
    3
    4
    5
    su
    setprop service.adb.tcp.port 5555
    stop adbd && start adbd

    adb connect 192.168.1.196

在 Android 11 以后可以免 root 开启无线调试,有需要的小伙伴可以看这里

回到刚才那个问题,看起来是个很常见也很好解决的问题,直接在手机上点击授权按钮即可。

就这?

那如果手机屏幕坏了没法点击授权,或者手机压根没有显示屏只是一块开发板,或者系统有 bug 不弹出授权框,这种情况下怎么授权?

手动授权大法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cat ~/.android/adbkey.pub | xclip

# 数据线连接或其它方式
adb shell
su
mkdir -p /data/misc/adb
# 把 '' 中的内容替换为 adbkey.pub 的内容
echo 'ADB_KEY_PUB' >> /data/misc/adb/adb_keys
setprop service.adb.tcp.port 5555
stop adbd && stop adbd
# 改权限(可选)
chmod 640 /data/misc/adb/adb_keys
chown system:shell /data/misc/adb/adb_keys
chcon u:object_r:adb_keys_file:s0 /data/misc/adb/adb_keys

adb connect 192.168.1.196

如果没有找到 adbkey.pub 文件可以手动生成一个:

1
2
3
4
$ adb keygen test
... generate_key(test)...
$ ls
test test.pub

如果是用别人提供的 key 但是又不想覆盖原有的 key,这种情况可以使用 ADB_VENDOR_KEYS 环境变量解决:

1
2
3
export ADB_VENDOR_KEYS=$PWD/test
adb kill-server
adb connect 192.168.1.196