在 Ubuntu 下使用 Android ADB 调试时如果出现错误提示:
insufficient permissions for device: verify udev rules
等等… 以及各种各样的奇怪问题, 总之就是不能用或不好用.
这都可能是 udev rules 问题. 可以优先尝试如下解决方案:
udev rules
这是谷歌官方给出的 Ubuntu 下使用 ADB 调试的配置方法, 链接在:https://developer.android.com/studio/run/device.html
只说说其具体操作步骤:
首先, 以 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 |
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 |
并非所有(国内)常见制造商都在官方表中被列出. 自己收集了其他常见的 vendor id (持续增加, 欢迎补充):
Company | USB Vendor ID |
---|---|
酷派 | 1ebf |
小米 | 2717 |
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 调试时手机端会有一个授权对话框. 没有在手机端点击确认的话, 也是无法进行调试的. 本文可不是在教大家绕过这个东西.
这段说明可能略废话, 但为了不至引起误解, 想象还是加上吧.