解决 Ubuntu使用 ADB 设备权限问题:no permissions (missing udev rules?)

解决 ADB 设备权限问题:no permissions (missing udev rules?)

问题描述

在 Linux 系统(Ubuntu/Debian 等)中使用 adb devices 命令查看已连接的 Android 设备时,终端输出如下错误信息:

bash 复制代码
List of devices attached
0003001B0BA0020DB   no permissions (missing udev rules? user is in the plugdev group); see [http://developer.android.com/tools/device.html]

这表明设备已被系统识别,但 ADB 没有足够的权限访问设备,导致无法正常进行调试操作。

问题原因

这个问题的核心原因是 Linux 系统的设备权限管理

  1. Android 设备连接电脑后,会被识别为一个 USB 设备
  2. Linux 系统默认对 USB 设备有严格的权限控制
  3. 当前用户缺少访问该 Android 设备的权限,即使已加入 plugdev 组也可能因为缺少具体的 udev 规则而无法访问

解决方案:配置 udev 规则授予权限

前置条件

  • 已安装 ADB 工具(可通过 adb --version 验证)
  • 已将用户加入 plugdev 组(若未加入,执行 sudo usermod -aG plugdev $USER,需重启生效)
  • Android 设备已开启开发者选项和 USB 调试模式

解决步骤(共 5 步)

步骤 1:查看设备的 Vendor ID 和 Product ID

首先需要获取连接设备的 USB 识别信息,执行以下命令:

bash 复制代码
lsusb

终端会输出类似如下的设备列表,找到对应 Android 设备的条目(通常包含 "Android"、"Google"、"Huawei" 等品牌标识):

复制代码
Bus 001 Device 010: ID 18d1:4ee7 Google Inc. Nexus 5

重点记录 ID 后面的两个数值

  • Vendor ID(厂商 ID):18d1(示例值,你的设备可能不同)
  • Product ID(产品 ID):4ee7(示例值,你的设备可能不同)
步骤 2:创建 udev 规则文件

/etc/udev/rules.d/ 目录下创建一个新的规则文件,文件名建议以 51-android.rules 命名(数字前缀确保规则优先加载):

bash 复制代码
sudo touch /etc/udev/rules.d/51-android.rules
步骤 3:编辑 udev 规则文件

使用文本编辑器打开规则文件(以 vim 为例,也可使用 nano):

bash 复制代码
sudo vim /etc/udev/rules.d/51-android.rules

在文件中添加以下内容(请将 Vendor ID 替换为你步骤 1 中获取的实际值):

bash 复制代码
# 允许 plugdev 组用户访问 Android 设备
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee7", MODE="0666", GROUP="plugdev"
  • SUBSYSTEM=="usb":指定规则应用于 USB 设备
  • ATTR{idVendor}=="18d1":匹配你的设备厂商 ID(必须替换为实际值)
  • ATTR{idProduct}=="4ee7":匹配你的设备产品 ID(可选,不写则匹配该厂商所有设备)
  • MODE="0666":授予读写权限(666 表示所有用户可读写)
  • GROUP="plugdev":将设备归属到 plugdev 组

如果需要支持多个设备,可在文件中添加多行规则,每行对应一个设备的 Vendor ID 和 Product ID。

步骤 4:设置规则文件权限并重启 udev 服务

保存文件后,设置规则文件的正确权限(否则 udev 无法识别):

bash 复制代码
sudo chmod a+r /etc/udev/rules.d/51-android.rules

重启 udev 服务使规则生效:

bash 复制代码
sudo udevadm control --reload-rules
sudo udevadm trigger
步骤 5:重启 ADB 服务并验证

最后重启 ADB 服务,重新连接设备并验证:

bash 复制代码
# 杀死当前 ADB 进程
adb kill-server

# 以管理员权限启动 ADB(仅首次需要)
sudo adb start-server

# 查看设备列表
adb devices

如果配置成功,终端会显示设备状态为 device

bash 复制代码
List of devices attached
0003001B0BA0020DB   device

常见问题排查

  1. 规则文件权限错误 :确保执行了 chmod a+r 命令,否则 udev 无法读取规则
  2. 用户未加入 plugdev 组 :执行 groups $USER 查看当前用户组,若没有 plugdev,执行 sudo usermod -aG plugdev $USER 后重启电脑
  3. Vendor ID 填写错误 :重新执行 lsusb 确认设备的 Vendor ID,规则中必须完全匹配(区分大小写)
  4. ADB 服务未重启:修改规则后必须重启 ADB 服务,否则权限不会生效

总结

解决 ADB 设备权限问题的核心是 通过 udev 规则授予用户访问 USB 设备的权限,关键步骤如下:

  1. lsusb 获取设备的 Vendor ID(厂商 ID)
  2. /etc/udev/rules.d/ 下创建规则文件,配置设备权限
  3. 重启 udev 服务和 ADB 服务,验证设备连接状态
  4. 确保用户已加入 plugdev 组,规则文件权限正确

按照以上步骤操作后,即可正常使用 ADB 工具调试 Android 设备,无需每次都使用 sudo 权限运行 ADB 命令。

相关推荐
唐装鼠几秒前
Linux 下 malloc 内存分配机制详解
linux·malloc
予枫的编程笔记几秒前
【Linux入门篇】Linux运维必学:Vim核心操作详解,告别编辑器依赖
linux·人工智能·linux运维·vim操作教程·程序员工具·编辑器技巧·新手学vim
17(无规则自律)13 分钟前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件
中二病码农不会遇见C++学姐28 分钟前
Linux下的.run文件
linux
予枫的编程笔记31 分钟前
【Linux入门篇】摆脱权限混乱困境:Linux用户组管理+sudo提权,一步到位
linux·linux运维·后端开发·linux用户管理·linux权限配置·chmod命令·sudo配置
一个人旅程~37 分钟前
Dell n4020双系统分区步骤和linux优化操作
linux·windows·电脑
忆~遂愿41 分钟前
CANN metadef 深度解析:动态形状元数据管理、图编译器接口规范与序列化执行机制
大数据·linux
予枫的编程笔记42 分钟前
【Linux入门篇】Linux文件操作不用记满屏命令,掌握touch/cp/mv核心用法就够了
linux·tar·linux命令·tail·cat·linux文件管理·linux新手教程
learning-striving1 小时前
kali连不上网解决方法
linux·开发语言·网络·php·kali
阿钱真强道1 小时前
12 JetLinks MQTT直连设备事件上报实战(继电器场景)
linux·服务器·网络·数据库·网络协议