Ubuntu 下使用 ADB 调试 Android 应用时的设备识别问题

Posted _Lyux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ubuntu 下使用 ADB 调试 Android 应用时的设备识别问题相关的知识,希望对你有一定的参考价值。

在 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", ATTRidVendor=="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

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

CompanyUSB Vendor ID
Acer0502
ASUS0b05
Dell413c
Foxconn0489
Fujitsu04c5
Fujitsu Toshiba04c5
Garmin-Asus091e
Google18d1
Haier201E
Hisense109b
HP03f0
HTC0bb4
Huawei12d1
Intel8087
K-Touch24e3
KT Tech2116
Kyocera0482
Lenovo17ef
LG1004
Motorola22b8
MTK0e8d
NEC0409
Nook2080
Nvidia0955
OTGV2257
Pantech10a9
Pegatron1d4d
Philips0471
PMC-Sierra04da
Qualcomm05c6
SK Telesys1f53
Samsung04e8
Sharp04dd
Sony054c
Sony Ericsson0fce
Sony Mobile Communications0fce
Teleepoch2340
Toshiba0930
ZTE19d2


并非所有(国内)常见制造商都在官方表中被列出. 自己收集了其他常见的 vendor id (持续增加, 欢迎补充):

CompanyUSB 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", ATTRidVendor=="1ebf", MODE="0666", GROUP="plugdev"

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

我的 udev rule 文件

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

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

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


参考:
Run Apps on a Hardware Device
writing udev rules

以上是关于Ubuntu 下使用 ADB 调试 Android 应用时的设备识别问题的主要内容,如果未能解决你的问题,请参考以下文章

android 无线模式下使用ADB调试

Android 通过ADB Wireless无线调试应用

Ubuntu下adb的使用及常见问题处理

Android 通过ADB Wireless无线调试应用

Android 通过ADB Wireless无线调试应用

Android 通过ADB Wireless无线调试应用