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执行脚本的环境和手动运行存在本质差异:
- udev以root身份执行,PATH环境变量极简,默认无法找到adb;且root运行adb会创建独立的adb server,和普通用户的adb进程不互通
- USB刚插入时设备未完全初始化,脚本执行时机过早导致无法识别设备
- 无用户上下文,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
相关产品推荐
相关产品推荐

