设置设备进行开发(????????????没有权限)

Posted

技术标签:

【中文标题】设置设备进行开发(????????????没有权限)【英文标题】:set up device for development (???????????? no permissions) 【发布时间】:2012-03-01 21:09:43 【问题描述】:

我使用的是三星 Galaxy nexus 手机(Android 4.0 平台)。

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

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

    在设备上,在设置>安全中启用未知来源

    在设备上,在设置>开发者选项中启用了USB调试

    在我的电脑上,创建了/etc/udev/rules.d/51-android.rules 文件,内容如下:

    SUBSYSTEM=="usb", ATTRidVendor=="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 not running 的消息。现在在端口 5037 上启动它 * * 守护进程已成功启动 * --- 如果不尝试,直到你得到这个消息 尝试检查您的用户是否在plugdev 组中。 Run =>sudo adb start-server (使用root权限运行adb) 最后我在这个链接github.com/snowdream/51-android中找到了适合我的解决方案 【参考方案1】:

输入以下命令:

# 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.  

【讨论】:

虽然这个想法与接受的答案相同,但由于提供的示例,这个想法对我有帮助。谢谢 @user907860 它实际上比接受的答案更好,因为它解释了为什么你应该写 sudo :) (当我看到接受的答案时我没有这样做) 顺便说一句,为什么 adb 应该以 root 身份运行? 对不起,我不记得了 adb 不应以 root 身份运行。如果需要这样做,则说明您的系统配置错误。不要在所有东西前面都扔“sudo”,这会带来巨大的安全隐患。【参考方案2】:

当您将 USB 连接到计算机时,它会询问您是否信任计算机来调试手机上的应用程序。点击是解决了问题

【讨论】:

【参考方案3】:

仅适用于 Ubuntu/Debian 用户: ubuntu 需要做一些具体的事情来使 USB 调试工作: 这里描述: https://developer.android.com/studio/run/device 这是提到的两个步骤。在终端运行这两个命令:

sudo usermod -aG plugdev $LOGNAME
sudo apt-get install android-sdk-platform-tools-common

【讨论】:

【参考方案4】:
sudo usermod -aG plugdev $LOGNAME

这个命令对我有用

【讨论】:

【参考方案5】:

这个问题有很多不好的答案,从坚持将adb 运行为root(不应被吹捧为唯一甚至推荐的解决方案)到解决完全不相关的问题。

这是同时处理所有adbfastboot 设备权限的最短且最通用的方法:

echo 'ACTION=="add", SUBSYSTEM=="usb", ENVDEVTYPE=="usb_device", ENVID_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 kill-server 在 adb devices 之前。 这似乎不再适用于 Android 8.1。您是如何发现 adb 报告的设备 ID 的? 在 Android 7.1.2 上为我工作 @Cachapa,它适用于所有 Android 版本。即使是最新的(在我撰写本文时)Android P Preview 4 也使用相同的 adb 接口 ID - android.googlesource.com/platform/system/core/+/… 仍然适用于 Android 11 android.googlesource.com/platform/system/core/+/…【参考方案6】:

我遇到了同样的问题,我按照以下步骤操作:

# Clone this repository
git clone https://github.com/M0Rf30/android-udev-rules.git
cd android-udev-rules
# Copy rules file
sudo cp -v 51-android.rules /etc/udev/rules.d/51-android.rules
# OR create a sym-link to the rules file - choose this option if you'd like to update your udev rules using git.
sudo ln -sf "$PWD"/51-android.rules /etc/udev/rules.d/51-android.rules
# Change file permissions
sudo chmod a+r /etc/udev/rules.d/51-android.rules
# If adbusers group already exists remove old adbusers group
groupdel adbusers
# add the adbusers group if it's doesn't already exist
sudo mkdir -p /usr/lib/sysusers.d/ && sudo cp android-udev.conf /usr/lib/sysusers.d/
sudo systemd-sysusers # (1)
# OR on Fedora:
groupadd adbusers
# Add your user to the adbusers group
sudo usermod -a -G adbusers $(whoami)
# Restart UDEV
sudo udevadm control --reload-rules
sudo service udev restart
# OR on Fedora:
sudo systemctl restart systemd-udevd.service
# Restart the ADB server
adb kill-server
# Replug your Android device and verify that USB debugging is enabled in developer options
adb devices
# You should now see your device

上述步骤在android-udev-rules 上进行了描述。它对我有用。

请务必确认重新插入后手机屏幕上将显示的对话框。

【讨论】:

【参考方案7】:
    按照http://developer.android.com/guide/developing/device.html(存档链接)的说明进行操作

    /etc/udev/rules.d/51-android.rules 中的0bb4 的供应商ID 替换为18d1

    或者添加另一行:

    SUBSYSTEM=="usb", SYSFSidVendor=="18d1", MODE="0666"
    
    重新启动计算机或仅重新启动 udev 服务。

【讨论】:

【参考方案8】:

使用M0Rf30/android-udev-rules GitHub 社区维护的 udev-rules

https://github.com/M0Rf30/android-udev-rules/blob/master/51-android.rules

这是迄今为止我见过的最完整的 udev-rules 列表,甚至比目前推荐的 sudo apt-get install android-tools-adb on the official documentation 还要多,它为我解决了这个问题。

【讨论】:

当一个规则适用于所有人时,为什么还要“维护列表”呢? ***.com/a/45006231/1778421 @AlexP。谢谢我不知道那种方法。知道为什么官方指南不建议这样做吗? 主要是因为懒惰和知识惰性。最初的 Android 开发人员使用具有相同供应商 ID 的设备,因此他们采用了他们能想到的最简单的方法。当更多供应商创建更多设备时 - 开发人员只是不断向规则文件添加更多 ID。【参考方案9】:

无论如何,我做了什么来解决这个问题(在 Ubuntu 上)。

    定义在什么情况下我需要运行这些命令。对于大多数 ubuntu 用户来说,都有一个主文件夹(隐藏文件 .bashrc)。

    您可以在其中记录这些命令的启动。但是这些命令会在你在控制台输入bash命令时触发。

    因为我有一个 shell .zshrc,所以我做了以下事情:

    打开控制台:gedit .zshrc

当文件打开时,添加以下行:

./.add_device_permissions.sh

之后或之前,我们需要创建这个文件:.add_device_permissions.sh,我们在其中写入以下内容:

#!/bin/bash
# Add permissions
ADB="/home/vadimm/Android/Sdk/platform-tools/adb"
$ADB devices
$ADB kill-server
cat .permissions_redmi_note | sudo -S $ADB devices
$ADB kill-server
cat .permissions_redmi_note | sudo -S $ADB devices

我们还需要创建 .permissions_redmi_note 我们需要硬编码我们的密码。

    不要添加到文件.zshrc不必要的我们可以在启动系统时指定路径:Startup Applications Preferences

我们按下“添加”并写下我们的命令:/home/vadimm/.add_device_permissions.sh

    您也可以尝试在命令行中使用下一个命令: ./adb devices ./adb kill-server sudo ./adb devices ./adb kill-server ./adb devices

【讨论】:

【参考方案10】:

我的 Galaxy S3 也有同样的问题。 我的问题是idVendor04E8 不是正确的。 要找到合适的人,请将您的智能手机连接到计算机并在终端中运行lsusb。它会像这样列出您的智能手机:

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

所以正确的idVendor 值是18d1/etc/udev/rules.d/51-android.rules 中的行必须是:

SUBSYSTEM=="usb", ATTRidVendor=="18d1", MODE="0666", GROUP="plugdev" 

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

【讨论】:

您的意思是不是:ATTRidVendor=="18d1"【参考方案11】:

不要遵循建议使用sudo (sudo adb start-server) 的解决方案!这以 root(管理员)身份运行 adb,它不应该那样运行!!! 这是一个糟糕的解决方法

以root身份运行的所有东西都可以在您的系统中做任何事情,如果它创建或修改文件可以将其权限更改为仅供root使用。再说一遍,不要!

正确的做法是设置您的系统以使 USER 拥有权限,请查看 this guide 我写的如何正确执行此操作。

【讨论】:

【参考方案12】:

您不应该像其他答案所建议的那样以 root 身份运行 adb 服务器。相反,如果您使用的是 Arch Linux,请执行以下操作:

    使用 Pacman 安装 android-udev 软件包

    重新加载udev规则:

    # udevadm control --reload-rules
    

    将自己添加到adbusers 组,然后注销并登录:

    # usermod -aG adbusers $LOGNAME
    

来源:https://wiki.archlinux.org/index.php/android#Configuring_adb

【讨论】:

【参考方案13】:

如果有人在使用adb devices时遇到以下错误信息

no permissions (verify udev rules); see [http://developer.android.com/tools/device.html]

执行以下操作

sudo -s 
adb kill-server
adb start-server

这解决了我在自定义构建 android 设备上的问题

【讨论】:

【参考方案14】:

以上都试过了,都没有用..当我将连接从 MTP 切换到相机(PTP)时终于工作了。

【讨论】:

对于那些想知道如何做到这一点的人... 系统设置 > 存储 > 右上角按钮:USB 计算机连接 > 连接为选择相机 (PTP) 而不是媒体设备 (MTP) 伙计,我正在寻找两个小时的解决方案,这在 ubuntu 16.04 上对我有用,谢谢 这应该是首先要检查的。为我工作【参考方案15】:

在我最终在这里找到答案之前,没有什么对我有用: http://ptspts.blogspot.co.il/2011/10/how-to-fix-adb-no-permissions-error-on.html

我把这段文字复制到这里,以防它以后消失。

创建一个名为 /tmp/android.rules 的文件,其内容如下(十六进制供应商编号取自供应商列表页面):

SUBSYSTEM=="usb", ATTRSidVendor=="0bb4", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="0e79", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="0502", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="0b05", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="413c", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="0489", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="091e", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="18d1", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="0bb4", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="12d1", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="24e3", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="2116", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="0482", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="17ef", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="1004", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="22b8", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="0409", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="2080", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="0955", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="2257", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="10a9", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="1d4d", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="0471", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="04da", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="05c6", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="1f53", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="04e8", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="04dd", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="0fce", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="0930", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="19d2", MODE="0666"
SUBSYSTEM=="usb", ATTRSidVendor=="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

【讨论】:

注意:对于 Ubuntu Precise,文件名是 70-android.rules,根据这篇文章:esausilva.com/2010/05/13/…。还感谢让我们知道您必须重新启动 udev 并终止所有 adb 进程。像魅力一样工作! developer.android.com/tools/device.html官方记录了类似的方法 这很好用,但正如@luciana 在另一个答案中所指出的那样,如果重新启动服务器还不够,您可能需要调用sudo udevadm control --reload-rules 来刷新 udev 规则。 这应该被标记为正确答案,因为 sudo-ing adb 不应该是 Linux 的要求 这是这里唯一正确的答案。谢谢你!此外,我们可以查看 lsusb 输出以确保包含所需的供应商。最奇怪的是,我只有一台设备(OnePlus One)在升级到 Android 7.1.2 后突然停止工作(即使以 root 身份运行 adb),在如上所述添加 udev 规则后,它又可以工作了。【参考方案16】:

无需拔掉电源

所有提供的答案都假定您能够拔下并重新连接 USB 电缆。在无法做到这一点的情况下(例如,当您处于远程状态时),您可以执行以下操作来基本上执行建议的 udev 规则在重新插入时会执行的操作:

lsusb

找到您关心的设备,例如:

Bus 003 Device 005: ID 18d1:4ee4 Google Inc. Nexus

记下它所在的总线号,然后执行,例如公交车003:

sudo chmod a+w /dev/bus/usb/003/*

显然,这可能比你想要的更宽松(可能连接的设备比这一个更多),但你明白了。

【讨论】:

在不重新连接设备的情况下应用新的udev 规则,只需使用udevadm trigger --verbose --action=add --subsystem-match=usb 命令。【参考方案17】:

我知道这可能有点晚了,但这里有一篇关于如何手动添加 Android ADB USB 驱动程序的非常好的文章。 Manually adding Android ADB USB driver in Ubuntu 14.04 LTS

已编辑以添加链接内容

步骤

注意: 确保您已在 USB 调试模式下连接您的 Android 设备

打开终端(CTRL + ALT + T)并输入命令: lsusb

现在您可能会收到类似的回复:Bus 002 Device 013: ID 283b:1024

注意: 参考这个Bus 002 Device 008: ID 283b:1024idVendor==”283b” idProduct==”1024″

现在输入以下命令: sudo gedit /etc/udev/rules.d/51-android.rules 这将创建 android 规则文件 (51-android.rules) 或在指定位置打开现有规则文件 (/etc/udev/rules.d)

在此文件中添加新行:SUBSYSTEM==”usb”, ATTRSidVendor==”283b”, ATTRSidProduct==”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 ~/.androidgedit adb_usb.ini

添加以下值 0x283b

这不过是 0x(idVendor 值)。因此将值替换为。尊重您的设备价值 保存并关闭文件。

现在输入以下命令:sudo service udev restart

拔出 Android 设备并重新连接。 现在输入以下命令:adb kill-server adb devices

给你!必须列出您的设备。

复制自 Manually adding Android ADB USB driver in Ubuntu 14.04 LTS

为我工作。

【讨论】:

【参考方案18】:

对我有用的是杀死并再次启动 adb 服务器。在 Linux 上:sudo adb kill-server,然后是 sudo adb start-server。然后它将检测到几乎所有开箱即用的设备。

【讨论】:

我使用root在/platform-tool/下执行命令“adb devices”,出现“No command 'adb' found”,为什么? 确保您的 adb 获得了 +x -rwxrwxr-x 1 martin martin 156K 2011-11-09 15:40 adb。尝试直接移动到目录并通过“sudo ./adb devices”启动。如果你可以在没有 sudo 的情况下运行它,你应该可以用 sudo 运行它......我不确定你的问题可能是什么...... 如果您的 udev 权限设置正确,则不需要以 root 身份运行 adb。请参阅下面的 grebulons 答案,或参考 android 文档:developer.android.com/tools/device.html 一个重要的建议是断开USB线,所以你重置adb,连接线就可以了。在我的情况下,虽然我在连接电缆的情况下执行该程序,但它对我不起作用。 而命令是:adb kill-serversudo adb start-server检查:adb devices【参考方案19】:

在 Archlinux 中,这种情况偶尔会发生。修复:

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

【讨论】:

我不确定这是否是使它起作用的唯一因素......我尝试了上述内容。但是在 VBox 上没有这篇文章 ubuntu 并没有使我的 LG G3 获得授权。谢谢基南 我不知道为什么,但sudo adb kill-server; sudo adb start-server 不起作用,但这个起作用了。【参考方案20】:

您也可以尝试编辑 adb_usb.ini 文件,该文件位于 /home/username/.android/。此文件包含您要连接的设备的 ID 供应商列表。您只需在新行中添加设备的 id 供应商(每行一个 id)。然后重新启动 adb 服务器并重新插入您的设备。

它在 Ubuntu 12.10 上对我有用。

【讨论】:

【参考方案21】:

我的设备是 POSITIVO,我的操作系统是 Ubuntu 14.04 LTS 所以,我的问题出在变量名上

我创建文件 /etc/udev/rules.d/51-android.rules 并输入SUBSYSTEM=="usb", SYSFSidVendor=="1662", MODE="0666"

我断开了设备 并执行:

$ sudo udevadm control --reload-rules
$ sudo service udev restart

在此之后,我再次以开发者模式连接了 android 设备并

$ adb devices

List of devices attached 
1A883XB1K   device

【讨论】:

【参考方案22】:

我使用了 su,它开始工作了。当我与普通用户一起使用 Jetbrains 时,我看到了这个问题,但是在 su 模式下重新启动 Jetbrains 后,我可以看到我的设备而无需执行任何操作。

我使用的是 Ubuntu 13.04 和 Jetbrains 12.1.4

【讨论】:

【参考方案23】:

在我的 ubuntu 12.04 LTS 上,我不得不将我的 HTC Incredible USB 模式从充电更改为媒体,然后设备出现在 adb 下。当然,这两种情况都已经在调试了。

【讨论】:

【参考方案24】:

对于使用 debian 的用户,在 Ubuntu 下设置设备以创建文件“/etc/udev/rules.d/51-android.rules”的指南不起作用。我按照here 的指示进行操作。放在这里供参考。

以超级用户身份编辑此文件

sudo nano /lib/udev/rules.d/91-permissions.rules

找到与此类似的文字

# usbfs-like devices 
SUBSYSTEM==”usb”, ENVDEVTYPE==”usb_device”, \ MODE=”0664″

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

# usbfs-like devices 
SUBSYSTEM==”usb”, ENVDEVTYPE==”usb_device”, \ MODE=”0666″

这允许 adb 工作,但是我们仍然需要设置设备以便可以识别它。我们需要以超级用户的身份创建这个文件,

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

然后输入

SUBSYSTEM==”usb”, ENVDEVTYPE==”usb_device”, ATTRSidVendor==”0bb4″, MODE=”0666″

以上行是针对 HTC 的,完整列表请关注@grebulon 的帖子。

保存文件,然后以超级用户身份重新启动 udev

sudo /etc/init.d/udev restart

通过USB连接手机,编译运行项目时应该会检测到。

【讨论】:

【参考方案25】:

我也遇到了同样的问题,解决方法是:(顺便说一句,你不必root你的设备。)

    输入“su”切换到超级用户。 your-path/adb kill-server. 你的路径/adb 启动服务器。 如果没有发生错误,您可以在 root 帐户中看到带有“your-path/adb devices”的设备列表。 退出超级用户。 现在您可以在您的帐户中执行“adb devices”。

享受吧。

【讨论】:

如果您无法使用su 登录,请使用sudo su。我做到了。此外,如果您不知道如何退出用户,请使用 exit【参考方案26】:

当你重启 udev 时,kill adb server & start adb server goto android sdk installation path & do all on sudo.然后运行 ​​adb devices 就可以解决权限问题了。

【讨论】:

【参考方案27】:

尝试使用用户的主组,而不是 GROUP="plugdev"

【讨论】:

我正在使用我的用户名,它没有帮助

以上是关于设置设备进行开发(????????????没有权限)的主要内容,如果未能解决你的问题,请参考以下文章

安装软件“没有进行此操作的权限”怎么办

安装软件“没有进行此操作的权限”怎么办

Android 经典蓝牙开发(一)

安卓app没有读写/dev下设备节点的权限

Android USB 开发:如何跳过USB权限询问

win7可移动设备拒绝访问也没有访问权限