You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

USB连接时Bash脚本无法正常实现ADB无线调试功能

解决udev自动触发ADB无线调试脚本失效的问题

问题场景

我编写了位于/bin/device_added.sh的Bash脚本,手动运行可正常开启TCPIP端口并完成ADB无线调试设备连接。但通过/etc/udev/rules.d/80-test.rules中的规则SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_added.sh"触发时,脚本虽执行(日志已记录执行时间)但无法完成连接:

  • 初始报错line 3: adb: command not found,指定adb绝对路径后错误消失
  • 仍无法完成ADB端口连接,且adb devices输出中离线模拟器不再显示

核心原因

udev执行脚本的环境和手动运行存在本质差异:

  1. udev以root身份执行,PATH环境变量极简,默认无法找到adb;且root运行adb会创建独立的adb server,和普通用户的adb进程不互通
  2. USB刚插入时设备未完全初始化,脚本执行时机过早导致无法识别设备
  3. 无用户上下文,adb无法关联到普通用户的设备权限

修复步骤

1. 修正udev规则:指定用户+延迟执行

修改/etc/udev/rules.d/80-test.rules,添加用户切换和延迟,确保设备初始化完成且用普通用户权限执行:

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/bin/su pranil -c '/bin/bash -c \"sleep 2 && /bin/device_added.sh\"'"
  • su pranil:切换到你的普通用户执行脚本,避免root运行adb导致的server冲突
  • sleep 2:给设备留足初始化时间,防止脚本执行时设备未就绪

2. 完善脚本中的ADB调用逻辑

确保脚本使用绝对路径调用adb,且处理多设备场景:

#!/bin/bash
# 日志输出到固定文件便于排查
LOG_FILE="/tmp/adb_wireless_trigger.log"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 脚本启动" >> $LOG_FILE

# 指定adb绝对路径
ADB="/home/pranil/Android/Sdk/platform-tools/adb"

# 确保使用当前用户的adb server
$ADB kill-server >> $LOG_FILE 2>&1
$ADB start-server >> $LOG_FILE 2>&1

# 过滤出在线设备序列号(排除离线/未授权设备)
DEVICE_SERIAL=$($ADB devices | grep -v "List of devices" | grep -v "offline" | grep -v "unauthorized" | awk '{print $1}')
if [ -z "$DEVICE_SERIAL" ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 未检测到可用在线设备" >> $LOG_FILE
    exit 1
fi

# 开启TCPIP端口
$ADB -s $DEVICE_SERIAL tcpip 5555 >> $LOG_FILE 2>&1
# 获取设备WiFi IP(适配多数Android设备,若设备WiFi接口不是wlan0需调整)
DEVICE_IP=$($ADB -s $DEVICE_SERIAL shell ip addr show wlan0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
if [ -n "$DEVICE_IP" ]; then
    $ADB -s $DEVICE_SERIAL connect $DEVICE_IP:5555 >> $LOG_FILE 2>&1
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 已尝试连接设备 $DEVICE_SERIAL ($DEVICE_IP:5555)" >> $LOG_FILE
else
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 未获取到设备WiFi IP" >> $LOG_FILE
fi

3. 重新加载规则并测试

执行以下命令重载udev规则,然后插入USB设备验证:

sudo udevadm control --reload-rules
sudo udevadm trigger --subsystem-match=usb --action=add

可通过查看/tmp/adb_wireless_trigger.log排查执行细节。

额外优化建议

  • 缩小udev规则范围:通过lsusb获取目标设备的厂商ID和产品ID,添加ATTR{idVendor}=="XXXX", ATTR{idProduct}=="XXXX"到规则中,避免触发所有USB设备
  • 确保用户权限:将pranil加入plugdev组(sudo usermod -aG plugdev pranil),提升设备访问权限

内容的提问来源于stack exchange,提问作者Pro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:55:31