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

    xiaoxiao2021-03-25  147

    在 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 的值.

    CompanyUSB Vendor IDAcer0502ASUS0b05Dell413cFoxconn0489Fujitsu04c5Fujitsu Toshiba04c5Garmin-Asus091eGoogle18d1Haier201EHisense109bHP03f0HTC0bb4Huawei12d1Intel8087K-Touch24e3KT Tech2116Kyocera0482Lenovo17efLG1004Motorola22b8MTK0e8dNEC0409Nook2080Nvidia0955OTGV2257Pantech10a9Pegatron1d4dPhilips0471PMC-Sierra04daQualcomm05c6SK Telesys1f53Samsung04e8Sharp04ddSony054cSony Ericsson0fceSony Mobile Communications0fceTeleepoch2340Toshiba0930ZTE19d2

    并非所有(国内)常见制造商都在官方表中被列出. 自己收集了其他常见的 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", 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

    转载请注明原文地址: https://ju.6miu.com/read-9125.html

    最新回复(0)