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

来源:互联网 发布:淘宝手机详情页模板 编辑:程序博客网 时间:2024/05/16 01:02

在 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


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

Company USB Vendor ID 酷派 1ebf 小米 2717

lsusb

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

$ lsusbBus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hubBus 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 是产品IDLinux Foundation 3.0 : 生产商root hub : 设备名

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

$ lsusbBus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hubBus 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

0 0