解决Ubuntu下adb/fastboot权限问题:深入解析udev规则与plugdev组配置

张开发
2026/4/14 18:10:50 15 分钟阅读

分享文章

解决Ubuntu下adb/fastboot权限问题:深入解析udev规则与plugdev组配置
1. 为什么你的Android设备在Ubuntu上总提示no permissions每次在Ubuntu上连接Android设备准备调试时最烦人的就是看到那个no permissions的报错。我刚开始用Linux开发时这个问题困扰了我整整两周。后来才发现这其实是Linux系统权限管理机制在作怪。Linux系统对USB设备访问有着严格的安全控制。当你用普通用户身份执行adb或fastboot命令时系统会检查当前用户是否属于能访问设备的用户组通常是plugdev组设备节点是否设置了正确的访问权限通过udev规则控制举个例子上周我的同事小王在调试一台新的Android TV盒子时adb devices始终显示no permissions。他反复检查了USB调试开关和连接线最后发现是udev规则没配置好。这种情况在开发中特别常见尤其是当你换用新设备时。2. 快速诊断权限问题的四步检查法2.1 第一步确认设备连接状态先运行这个命令查看设备是否被系统识别lsusb你会看到类似这样的输出Bus 003 Device 020: ID 1782:4003 Spreadtrum Communications Inc.重点记下ID后面的两个数字1782:4003前四位是厂商ID后四位是产品ID。2.2 第二步检查用户组归属在终端输入groups看看输出中是否包含plugdev。如果没有需要把当前用户加入这个组sudo usermod -aG plugdev $USER然后注销重新登录生效。2.3 第三步验证当前权限查看设备节点的实际权限ls -l /dev/bus/usb/003/020注意把003/020换成你设备实际的Bus和Device编号2.4 第四步检查现有udev规则看看系统里是否已经存在相关规则ls /etc/udev/rules.d/*android*如果没有任何输出说明需要新建规则文件。3. 手把手教你编写udev规则3.1 创建规则文件用你喜欢的编辑器新建规则文件sudo nano /etc/udev/rules.d/51-android.rules我习惯用51开头这样能确保它在其他可能存在的规则之后加载。3.2 规则内容详解写入以下内容根据你的设备ID修改SUBSYSTEMusb, ATTR{idVendor}1782, ATTR{idProduct}4003, MODE0660, GROUPplugdev, SYMLINKandroid%n这个规则的意思是当USB子系统检测到指定厂商和产品ID的设备时将设备节点权限设置为0660所有者和管理组可读写设备归属于plugdev组创建符号链接方便访问3.3 特殊情况的处理如果你的设备在fastboot模式下使用不同ID需要添加第二条规则。比如SUBSYSTEMusb, ATTR{idVendor}18d1, MODE0660, GROUPplugdev这里18d1是Google的厂商ID大多数Android设备在fastboot模式下都会使用这个ID。4. 让新规则立即生效的完整流程4.1 重新加载udev规则执行以下命令让系统重新加载规则sudo udevadm control --reload-rules sudo udevadm trigger4.2 重启adb服务有时候还需要重启adb服务adb kill-server adb start-server4.3 验证配置是否成功最后检查设备是否正常识别adb devices fastboot devices如果看到设备序列号而不是权限错误说明配置成功了。5. 常见问题排查指南5.1 设备仍然不识别试试这些步骤拔掉USB线重新连接在开发者选项里关闭再打开USB调试检查是否安装了正确的USB驱动lsusb能看到设备就不需要5.2 规则修改后无效可能是规则文件命名问题。udev会按文件名顺序加载规则建议使用50-99开头的文件名确保没有其他规则覆盖你的设置5.3 多设备同时连接怎么处理可以写通用规则匹配所有Android设备SUBSYSTEMusb, ENV{DEVTYPE}usb_device, ENV{ID_USB_INTERFACES}*:ff420?:*, MODE0660, GROUPplugdev这个规则会匹配所有ADB接口的设备。6. 更安全的权限配置方案虽然MODE0666可以解决问题但会给所有用户开放权限。更安全的做法是创建专门的android-dev组sudo groupadd android-dev sudo usermod -aG android-dev $USER修改规则文件使用新组SUBSYSTEMusb, ATTR{idVendor}1782, MODE0660, GROUPandroid-dev7. 永久解决方案自动化配置脚本我写了个自动配置脚本可以一键完成所有设置#!/bin/bash # 自动检测并配置Android设备udev规则 VENDOR_ID$(lsusb | grep -i android | awk {print $6} | cut -d: -f1) PRODUCT_ID$(lsusb | grep -i android | awk {print $6} | cut -d: -f2) if [ -z $VENDOR_ID ]; then echo 未检测到Android设备请确认已连接并开启USB调试 exit 1 fi RULE_FILE/etc/udev/rules.d/51-android.rules echo SUBSYSTEM\usb\, ATTR{idVendor}\$VENDOR_ID\, ATTR{idProduct}\$PRODUCT_ID\, MODE\0660\, GROUP\plugdev\ | sudo tee $RULE_FILE sudo usermod -aG plugdev $USER sudo udevadm control --reload-rules sudo udevadm trigger echo 配置完成请重新插拔USB设备

更多文章