在 Ubuntu 下使用 Android ADB 调试时如果出现错误提示:
insufficient permissions for device: verify udev rules
等等... 以及各种各样的奇怪问题, 总之就是不能用或不好用.
这都可能是 udev rules 问题. 可以优先尝试如下解决方案:

udev rules

这是谷歌官方给出的 Ubuntu 下使用 ADB 调试的配置方法, 链接在此 (需翻墙) .
只说说其具体操作步骤:

  • 首先, 以 root 权限创建文件 /etc/udev/rules.d/51-android.rules .

    $ sudo touch /etc/udev/rules.d/51-android.rules

  • 然后, 为每个制造商创建一条规则.

SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", MODE="0666", GROUP="plugdev"
上面这条规则中的 vendor ID 是 HTC 的. MODE 参数指定了读写权限; GROUP 属性指定设备节点的拥有组.
编辑 /etc/udev/rules.d/51-android.rules 文件. 如果这个文件是空的, 就加入这条规则. 如果有内容, 就把这行追加到文件最后.

  • 最后, 为该文件增加读权限:

    $ chmod a+r /etc/udev/rules.d/51-android.rules

  • 最最后, 重新插拔手机, 就可以愉快的调试了.
并非所有的手机都需要走上面这一套才可以调试. 具体啥样的手机需要这样做, 我就不知道了...
总之 Ubuntu 下遇到 ADB 有问题时, 可以优先尝试以上解决办法.

设备制造商 Vendor ID

这张表是谷歌官方给出的, 里面的数据就是填写在 ATTR{idVendor} 属性中各个制造商的 idVendor 的值.

Company USB Vendor ID
Acer 0502
ASUS 0b05
Dell 413c
Foxconn 0489
Fujitsu 04c5
Fujitsu Toshiba 04c5
Garmin-Asus 091e
Google 18d1
Haier 201E
Hisense 109b
HP 03f0
HTC 0bb4
Huawei 12d1
Intel 8087
K-Touch 24e3
KT Tech 2116
Kyocera 0482
Lenovo 17ef
LG 1004
Motorola 22b8
MTK 0e8d
NEC 0409
Nook 2080
Nvidia 0955
OTGV 2257
Pantech 10a9
Pegatron 1d4d
Philips 0471
PMC-Sierra 04da
Qualcomm 05c6
SK Telesys 1f53
Samsung 04e8
Sharp 04dd
Sony 054c
Sony Ericsson 0fce
Sony Mobile Communications 0fce
Teleepoch 2340
Toshiba 0930
ZTE 19d2



并非所有(国内)常见制造商都在官方表中被列出. 也有很多厂商的id其实就是平台解决方案提供商的id. 比如同事的 OPPO 手机用了高通平台, 其 vendor id 就用了高通的.
自己收集了其他常见的 vendor id (持续增加, 欢迎补充):

Company USB Vendor ID
酷派 1ebf
小米 2717
魅族 2a45

lsusb

这个 idVendor 的值也可以通过 lsusb 命令查看到.
博主自用的电脑上, 没插任何 USB 设备时, 这个命令输出如下:

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 5986:0708 Acer, Inc 
Bus 001 Device 003: ID 8087:0a2b Intel Corp. 
Bus 001 Device 002: ID 138a:0090 Validity Sensors, Inc. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

以第一条输出为例进行说明:

Bus 002 : 指明设备连接到哪 (哪条总线)
Device 001 : 表明这是连接到总线上的第一台设备
ID 1d6b:0003 : 设备的ID. 1d6b 是生产商ID (我们就是要这个), 0003 是产品ID
Linux Foundation 3.0 : 生产商
root hub : 设备名

博主手头有一部古老的酷派手机, 直接链接 Android Studio 总是无法调试. 而谷歌大大的表里又没有酷派的 Vendor ID, 只能自己找.
插上酷派手机后再执行 lsusb, 输出如下:

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 5986:0708 Acer, Inc 
Bus 001 Device 003: ID 8087:0a2b Intel Corp. 
Bus 001 Device 002: ID 138a:0090 Validity Sensors, Inc. 
Bus 001 Device 012: ID 1ebf:7027  
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

很明显, 多出来的那条, 就是没写生产商名字和设备名字的那条, 就是酷派手机的信息. (怪不得谷大表里不写, 自己都不上心给自己起个名字)

Bus 001 Device 012: ID 1ebf:7027

其中的 1ebf 就是我们要找的 Vendor ID.
根据这个 Vendor ID 在 /etc/udev/rules.d/51-android.rules 加入一条规则:

SUBSYSTEM=="usb", ATTR{idVendor}=="1ebf", MODE="0666", GROUP="plugdev"

然后重新插拔手机, 再次使用 Android Studio 调试, 就可以正常使用了.

我的 udev rule 文件

自己挑了几个常见的设备商, 都写进 rule list 里了, 免得以后再加麻烦.
我的 chmod a+r /etc/udev/rules.d/51-android.rules 文件长这样 (都是为调试 Android 而加入的):

SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="201E", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="109b", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="12d1", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="17ef", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="1004", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="0e8d", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="054c", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="0fce", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="19d2", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="8087", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="8087", MODE="0666", GROUP="plugdev"

注意: Android 4.2.2 及以上的设备, 连接 ADB 调试时手机端会有一个授权对话框. 没有在手机端点击确认的话, 也是无法进行调试的. 本文可不是在教大家绕过这个东西.
这段说明可能略废话, 但为了不至引起误解, 想象还是加上吧.
参考:
Run Apps on a Hardware Device
writing udev rules

Lyux
571 声望328 粉丝