为开发设置设备(????????????无权限)

299

我正在使用三星 Galaxy Nexus 手机(Android 4.0平台)。

我在 Ubuntu Linux 操作系统上开发 Android 应用程序。我想直接在三星手机设备上运行我的应用程序,因此执行了以下设置步骤:

  1. 在我的项目 AndroidManifest.xml 文件中,在 <application> 元素中添加 android:debuggable="true"

  2. 在设备中,进入设置>安全,启用未知来源

  3. 在设备中,进入设置>开发者选项,启用USB调试

  4. 在我的计算机上,创建了 /etc/udev/rules.d/51-android.rules 文件,并添加以下内容:

SUBSYSTEM=="usb", ATTR{idVendor}=="04E8", MODE="0666", GROUP="plugdev" 
  • 在我的电脑上运行命令chmod a+r /etc/udev/rules.d/51-android.rules

  • 然后,在我的电脑上打开终端并执行命令adb devices,我得到:

    List of devices attached 
    ????????????    no permissions
    

    由于我只看到了???????????? no permissions,没有看到我的设备,所以我运行了以下命令:

     adb kill-server
     adb start-server
     adb devices
    

    但我仍然得到:

    List of devices attached 
    ????????????    no permissions
    

    为什么?我错过了什么吗?


    执行 adb kill-server 后,您是否收到了“* daemon未运行。在端口5037上启动它。”和“* daemon成功启动 *”的消息?如果没有,请尝试多次执行直到收到该消息。 - Andro Selva
    2
    尝试检查您的用户是否在“plugdev”组中。 - Sergey Glotov
    2
    运行 => sudo adb start-server(使用 root 访问来运行 adb) - Confused
    最后我在这个链接中找到了适合我的解决方案: https://github.com/snowdream/51-android - Abdulrahman Gamal
    请查看我在下面的2022年更新,还有一个快速评论:这里的一些旧解决方案可能会使Linux系统变砖。 - bsautner
    31个回答

    478

    我的解决方法是杀死并重新启动adb服务器。在Linux上: sudo adb kill-server,然后sudo adb start-server。然后它将自动检测几乎所有设备。


    1
    我在<android-SDK>/platform-tool/下使用root执行命令“adb devices”,但是却出现了“No command 'adb' found”的错误,为什么? - Leem.fin
    8
    确保你的adb具有可执行权限"+x",例如:"-rwxrwxr-x 1 martin martin 156K 2011-11-09 15:40 adb"。尝试直接进入该目录,并通过"sudo ./adb devices"命令启动。如果你能够在不使用sudo的情况下运行它,那么你也应该能够使用sudo来运行它。我不确定你可能会遇到什么问题。 - WarrenFaith
    8
    如果您的udev权限设置正确,就不需要以root身份运行adb。请参考下面的grebulons答案或参考安卓文档:http://developer.android.com/tools/device.html。 - gnac
    5
    一个重要的建议是断开USB电缆,这样你就可以重置ADB,重新连接电缆,然后它就可以工作了。在我的情况下,当我保持电缆连接时,这个方法对我不起作用。 - androidevil
    6
    以下是翻译的结果:命令如下: adb kill-server sudo adb start-server 检查: adb devices - Asim
    显示剩余3条评论

    360

    在我找到这里的答案之前,没有任何方法能解决我的问题:

    http://ptspts.blogspot.co.il/2011/10/how-to-fix-adb-no-permissions-error-on.html

    如果网页内容将来消失了,我在这里复制了文字。

    创建一个名为 /tmp/android.rules 的文件,并且将以下内容添加进去(十六进制供应商编号参考自供应商列表页面):

    SUBSYSTEM=="usb", ATTRS{idVendor}=="0bb4", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="0e79", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="0502", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="0b05", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="413c", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="0489", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="091e", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="18d1", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="0bb4", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="12d1", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="24e3", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="2116", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="0482", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="17ef", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="1004", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="22b8", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="0409", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="2080", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="0955", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="2257", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="10a9", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="1d4d", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="0471", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="04da", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="05c6", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="1f53", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="04e8", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="04dd", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="0fce", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="0930", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="19d2", MODE="0666"
    SUBSYSTEM=="usb", ATTRS{idVendor}=="1bbb", MODE="0666"
    

    运行以下命令:

    sudo cp /tmp/android.rules /etc/udev/rules.d/51-android.rules
    sudo chmod 644   /etc/udev/rules.d/51-android.rules
    sudo chown root. /etc/udev/rules.d/51-android.rules
    sudo service udev restart
    sudo killall adb
    

    拔掉手机和电脑之间的USB连接线。

    重新连接手机。

    运行adb devices以确认现在已经有权限访问手机。

    请注意,可以在.rules文件中使用, USER="$LOGINNAME"代替, MODE="0666",将$LOGINNAME替换为您的登录名,即id -nu打印的内容。

    在某些情况下,可能需要给udev规则文件一个靠近末尾的名称,例如z51-android.rules


    7
    注意:对于Ubuntu Precise版本,文件名为 70-android.rules,根据此帖子:http://esausilva.com/2010/05/13/setting-up-adbusb-drivers-for-android-devices-in-linux-ubuntu/。同时,感谢您告诉我们需要重新启动 udev 并杀死所有的adb进程。非常有效! - Eduard Luca
    一种类似的方法已经在http://developer.android.com/tools/device.html上得到官方文档记录。 - bjunix
    4
    这个方法效果不错,但是正如 @luciana 在另一个回答中指出的那样,如果仅仅重启服务器还不够,你可能需要调用 sudo udevadm control --reload-rules 命令来刷新udev规则。 - serjlee
    4
    这应该被标记为正确答案,因为在 Linux 中使用 sudo adb 不应是必需的。 - Zac
    1
    这是这里唯一正确的答案。谢谢!此外,我们可以查看lsusb输出以确保所需的供应商已包括在内。最奇怪的是,在升级到Android 7.1.2后,只有我的一个设备(OnePlus One)突然停止工作(即使以root身份运行adb),但在按照上述添加udev规则之后,它又可以正常工作了。 - user1209216
    显示剩余8条评论

    88

    输入以下命令:

    # cd to adb for sudo
    cd `which adb | sed -e "s/adb//"`
    adb kill-server
    sudo ./adb start-server
    ./adb devices
    
    This happens when you are not running adb server as root.  
    

    5
    虽然这个想法与被接受的答案相同,但由于提供的示例,这个帮助了我。谢谢。 - Dmitry Koroliov
    1
    @user907860 其实这个回答比被采纳的回答更好,因为它解释了为什么你应该写sudo :) (当我看到被接受的答案时,我并没有这样做) - stan0
    顺便问一下,你知道为什么adb应该以root权限运行吗? - stan0
    抱歉,我不记得了。 - iancrowther
    3
    adb不应该以root权限运行。如果需要这样做,那么你的系统配置有误。不要随意在所有命令前添加"sudo",这会带来巨大的安全风险。 - hackel

    60
    尝试了上述所有方法,均无效...最后当我将连接方式从MTP切换为相机(PTP)时,终于成功了。

    3
    对于那些想知道如何操作的人... 系统设置 > 存储 > 右上角按钮:USB电脑连接 > 连接方式 > 选择相机(PTP),而不是媒体设备(MTP)。 - Thaddeus Albers
    3
    我找了两个小时的解决方法,在Ubuntu 16.04上这个方案对我有用,谢谢。 - Jorius
    这应该是首先要检查的事情。对我来说有效。 - m50

    35

    在这个问题的回答中,有很多糟糕的答案,包括坚持将 adb 作为 root 运行(这不应该被宣传为唯一或甚至是推荐的解决方案),以及解决完全无关的问题。

    下面是一个最简单、最通用的权限处理方法,可以同时处理所有 adbfastboot 设备:

    echo 'ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{ID_USB_INTERFACES}=="*:ff420?:*", MODE="0666"' | sudo tee /etc/udev/rules.d/99-android.rules
    sudo udevadm control --reload-rules
    sudo udevadm trigger --verbose --action=add --subsystem-match=usb
    

    或者你可以使用我在这个gist上发布的略长版本。

    至于OP在他的问题中做错的具体事情——他没有在编辑.rules文件后重新加载udev规则。

    此外,OP没有说他手机上安装了哪个Android版本(即ROM)。idVendor的值是由软件设置的,因此它取决于ROM。因此,在他的原始规则中使用04E8这个值只适用于带有三星原生ROM的设备。但是对于这个udev规则来说,这不是一个问题——它匹配所有具有adbfastboot接口的设备,而不管它们的VendorID是什么。


    只需要在adb devices之前执行adb kill-server,就可以看到它的工作情况了。 - mstrange
    1
    这在Android 8.1上似乎不再起作用了。你是怎么找出adb报告的设备ID的? - Cachapa
    在我的 Android 7.1.2 上有效。 - Amerzilla
    @Cachapa,它适用于所有Android版本。即使是最新的(在我写这篇文章时)Android P预览版4也使用相同的adb接口ID-https://android.googlesource.com/platform/system/core/+/android-p-preview-4/adb/adb.h#190 - Alex P.
    仍然适用于Android 11 https://android.googlesource.com/platform/system/core/+/android-r-preview-4/adb/adb.h#198 - Alex P.

    17

    在 Archlinux 中这种情况有时会发生。修复方法:

    $ sudo -s
    # adb kill-server
    # adb start-server
    

    我不确定那是唯一让它工作的事情...我尝试了上面的东西。但是没有这篇文章,VBox上的Ubuntu无法使我的LG G3获得授权。谢谢Keenan。 - lastboy
    我不知道为什么,但是 sudo adb kill-server; sudo adb start-server 没有起作用,但这个可以。 - Hritik

    9
    对于使用Debian的用户,Ubuntu下设置设备以创建文件“/etc/udev/rules.d/51-android.rules”的指南无法使用。我按照这里的说明操作。这里提供相同的参考内容。
    作为超级用户编辑此文件。
    sudo nano /lib/udev/rules.d/91-permissions.rules
    

    查找类似于此的文本

    # usbfs-like devices 
    SUBSYSTEM==”usb”, ENV{DEVTYPE}==”usb_device”, \ MODE=”0664″
    

    然后将模式更改为0666,如下所示

    # usbfs-like devices 
    SUBSYSTEM==”usb”, ENV{DEVTYPE}==”usb_device”, \ MODE=”0666

    这样可以让adb工作,但是我们仍然需要设置设备以便其被识别。我们需要以超级用户的身份创建此文件,

    sudo nano /lib/udev/rules.d/99-android.rules
    

    并输入

    SUBSYSTEM==”usb”, ENV{DEVTYPE}==”usb_device”, ATTRS{idVendor}==”0bb4″, MODE=”0666

    上述行代码适用于HTC,完整列表请参考@grebulon的帖子。
    保存文件后,以超级用户身份重新启动udev。
    sudo /etc/init.d/udev restart
    

    通过USB连接手机,在编译和运行项目时应该能够检测到它。


    5
    我遇到了同样的问题,解决方法如下:(顺便说一句,您不需要root您的设备。)
    1. 输入“su”以切换到超级用户。
    2. your-path/adb kill-server
    3. your-path/adb start-server
    4. 如果没有错误发生,您可以在root帐户中使用“your-path/adb devices”查看设备列表。
    5. 退出超级用户。
    6. 现在您可以在您的账户中执行“adb devices”。
    祝您使用愉快。

    1
    如果您无法使用 su 登录,请使用 sudo su。我也是这样做的。另外,如果您不知道如何退出用户,请使用 exit - Pijusn

    4

    我曾经遇到过Galaxy S3的同样问题。 我的问题是idVendor04E8不正确。 为了找到正确的值,请将您的智能手机连接到计算机并在终端中运行lsusb。它会列出您的智能手机如下:

    Bus 002 Device 010: ID 18d1:d002 Google Inc.
    

    因此,正确的 idVendor 值是 18d1。而在 /etc/udev/rules.d/51-android.rules 文件中的行应该是:

    SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev" 
    

    然后我运行了 sudo udevadm control --reload-rules,一切都正常工作了!

    1
    你是不是可能想说的是:ATTR{idVendor}=="18d1" - Tanasis

    4
    I know this might be a little late but here is a very good article on how to manually add Android ADB USB Driver. 在Ubuntu 14.04 LTS中手动添加Android ADB USB驱动程序 Edited to Add Link Content

    步骤

    Note: 确保您已将Android设备连接到USB调试模式。 打开终端(CTRL + ALT + T)并输入命令:lsusb 现在您可能会得到类似于这样的回复:
    Bus 002 Device 013: ID 283b:1024 Note: 参考此处的Bus 002 Device 008: ID 283b:1024
    {idVendor}==”283b” {idProduct}==”1024″ 现在输入以下命令:
    sudo gedit /etc/udev/rules.d/51-android.rules
    这将创建 Android 规则文件(51-android.rules)或打开指定位置中的现有文件(/etc/udev/rules.d)。

    向此文件添加一行:
    SUBSYSTEM==”usb”, ATTRS{idVendor}==”283b”, ATTRS{idProduct}==”1024″, MODE=”0666″

    注意:要使用您的设备值编辑 idVendoridProduct。保存并关闭。

    现在输入以下命令:
    sudo chmod a+rx /etc/udev/rules.d/51-android.rules - 授予读取/执行权限
    sudo service udev restart - 重新启动 udev 服务。

    现在我们需要将 idVendor 添加到 adb_usb.ini 中。输入以下命令:
    cd ~/.android
    gedit adb_usb.ini

    添加以下值:
    0x283b

    这只是0x(idVendor值)。根据您的设备值替换该值即可,同时保留HTML标签。保存并关闭文件。
    现在输入以下命令:
    sudo service udev restart 拔掉Android设备,重新连接。
    现在输入以下命令:
    adb kill-server
    adb devices 完成!您的设备必须已列出。 摘自在Ubuntu 14.04 LTS中手动添加Android ADB USB驱动程序
    对我有用。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接