在 Ubuntu 下使用 Android ADB 调试时如果出现错误提示: insufficient permissions for device: verify 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 有问题时, 可以优先尝试以上解决办法.
这张表是谷歌官方给出的, 里面的数据就是填写在 ATTR{idVendor} 属性中各个制造商的 idVendor 的值.
CompanyUSB Vendor IDAcer0502ASUS0b05Dell413cFoxconn0489Fujitsu04c5Fujitsu Toshiba04c5Garmin-Asus091eGoogle18d1Haier201EHisense109bHP03f0HTC0bb4Huawei12d1Intel8087K-Touch24e3KT Tech2116Kyocera0482Lenovo17efLG1004Motorola22b8MTK0e8dNEC0409Nook2080Nvidia0955OTGV2257Pantech10a9Pegatron1d4dPhilips0471PMC-Sierra04daQualcomm05c6SK Telesys1f53Samsung04e8Sharp04ddSony054cSony Ericsson0fceSony Mobile Communications0fceTeleepoch2340Toshiba0930ZTE19d2并非所有(国内)常见制造商都在官方表中被列出. 自己收集了其他常见的 vendor id (持续增加, 欢迎补充):
CompanyUSB Vendor ID酷派1ebf小米2717这个 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 调试, 就可以正常使用了.
自己挑了几个常见的设备商, 都写进 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