Ubuntu 下使用 ADB 除錯 Android 應用時的裝置識別問題

Lyux發表於2018-04-08

在 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

相關文章