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", 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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容