在 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 |
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 除錯時手機端會有一個授權對話方塊. 沒有在手機端點選確認的話, 也是無法進行除錯的. 本文可不是在教大家繞過這個東西.
這段說明可能略廢話, 但為了不至引起誤解, 想象還是加上吧.