如何配置Android设备的ADB访问?

我正在使用Ubuntu 12.10,并且已经安装了Android SDK,将其路径设置在我的用户.bashrc中,它可以正常工作。
问题是我的手机要求以root权限运行adb,但是使用sudo运行adb时出现以下错误:
sudo: adb: command not found
我尝试简单地使用sudo -E adb start-server,但是它不起作用。尝试将导出路径行添加到/root/.bashrc(意识到没有帮助后)和/etc/bash.bashrc中。
我记得在我的Arch Linux上可以设置它,但我想现在我的问题与Ubuntu的root账户行为不符合我的期望有关。
我不明白的是以下内容:
这些不起作用:
martin@alyx:~$ sudo adb devices
sudo: adb: command not found

这是(输入完整路径):
martin@alyx:~$ sudo /opt/android-sdk-linux/platform-tools/adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached 
CM7-Blade   device

使用sudo时,这个方法行不通(使用-E参数)。
martin@alyx:~$ sudo -E adb devices
sudo: adb: command not found

这个是有效的(作为root用户):
martin@alyx:~$ sudo su
root@alyx:/home/martin# adb devices
List of devices attached 
CM7-Blade   device

我现在完全困惑了,希望能得到一些关于如何设置sudo路径或其他解决问题的指导。
(请不要说adb不应该以root身份运行。)
提前感谢!
编辑: 我所说的需要root权限是因为如果没有它们,我会遇到以下问题:
$ adb devices 
List of devices attached 
????????????    no permissions

不会以超级用户身份发生。如果有误解,对不起。

我注意到在Windows和Ubuntu系统中,如果您将Android设备插入USB 3端口,则通常不会出现,将它们插入非USB 3端口可以缓解此问题。 - Paul Gregoire
从文档中:https://source.android.com/source/initializing.html#configuring-usb-access - Paschalis
9个回答

请先阅读以下内容:如何设置Android ADB?

配置USB访问权限

首先,如果您已经正确设置了权限,就不需要root权限来运行ADB。AOSP网站提供了Pixel/Nexus设备的配置USB访问权限示例。对于非Nexus设备,您可以使用以下方案:

SUBSYSTEM=="usb", ATTR{idVendor}=="xxxx", ATTR{idProduct}=="xxxx", MODE="0600", OWNER="<username>"

通过使用lsusb命令并搜索您的设备,可以获取供应商和产品ID。(注意:实际上该设备是一台Galaxy Nexus手机。)
$ lsusb | grep -i samsung
Bus 002 Device 103: ID 04e8:6860 Samsung Electronics Co., Ltd GT-I9100 Phone [Galaxy S II]

所以我的`/etc/udev/rules.d/51-android.rules` udev规则是这样的:
# adb protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="username"

你可能需要根据需要重复这个步骤,比如对于fastboot等其他手机状态。为了让更改生效,可以重新加载udev(sudo udevadm control --reload)或者重新启动(推荐)。

使程序可用

我建议不要修改路径变量,而是在~/bin/(仅限用户)或者/usr/local/bin/(系统范围)中添加一个可执行文件的符号链接。

mkdir ~/bin/
ln -s /opt/android-sdk-linux/platform-tools/adb ~/bin/

1我试过为我的手机添加udev规则,但没有帮助,所以我想也许我没有清楚表达我的问题。如果你有时间,请看一下我问题的最后部分。 - Martin Fejes
你是否添加了正确的ID?http://www.modaco.com/topic/329317-guide-ubuntu-and-the-blade/ 之后重新启动了你的机器吗?adb devices 对我来说不需要root权限就可以使用。 - LiveWireBT
4太好了,它终于可以工作了!我把udev规则添加到了/etc/udev/rules.d/51-android-rules,但显然这是个错误。在使用/lib/udev/rules.d/11-android.rules之后,一切都正常了!我不需要root权限!非常感谢! - Martin Fejes
遇到了相同的权限问题,你的回答解决了它,谢谢。 - Panthro
由于某种原因,它在这里无法工作,我不得不使用sudo启动adb服务器;您有任何想法在哪里可以查看为什么它没有工作吗? - Aquarius Power
无论使用sudo还是不使用sudo,这个解决方案在Ubuntu 14.04上都无法正常工作。设备列表始终为空。 - Luís de Sousa
https://developer.android.com/studio/run/device.html - CrandellWS
在过去一年多的使用Ubuntu 16的时间里,我根本不需要这些。这个答案可能已经过时了。adb 在三星S7、Nexus 5X、Pixel和Pixel 2上都能正常工作。 - Dan Dascalescu
@DanDascalescu 它应该可以直接使用,只有当它不能正常工作时,人们才会寻找答案,并且关于udev规则的建议仍然是正确的,只要我知道对于特定设备不存在。 - LiveWireBT

我在中国买的一款平板电脑(一个奇怪的制造商)也遇到了同样的问题。
除了/etc/udev/rules.d/51-android.rules文件外,我还需要修改~/.android/adb_usb.ini文件。
在终端上运行以下命令;
sudo gedit ~/.android/adb_usb.ini

而您的adb_usb.ini文件应该如下所示:

# ANDROID 3RD PARTY USB VENDOR ID LIST -- DO NOT EDIT.
# USE 'android update adb' TO GENERATE.
# 1 USB VENDOR ID PER LINE.
# ie 0x2207
0x<!!!Your Vendor ID here!!!>

断开并重新连接设备,并且还需要在终端上运行以下命令;
adb kill-server

and afterwards

adb start-server

设备已被检测到。

我也试了你的建议,但什么都没改变,你有什么想法在哪里可以看到为什么它在这里不起作用吗? - Aquarius Power
不错。对我有用。除此之外,我还得更新我的adb。 - Waffle's Crazy Peanut
这个解决方案在Ubuntu 14.04上不起作用。设备列表仍然为空。 - Luís de Sousa
1非常感谢你,Uygar,终于我找到了适合我的解决方案。 - Dmitry Popov
这就是我所缺少的。实际上,你例子中的 0x2207 是与我的设备使用相同的厂商ID。 - ssokolow

在我的情况下,一些智能手机不需要设置为MTP模式,而是需要设置为PTP模式,与大多数设备不同,这些设备需要MTP模式才能被我的Android Studio(v1.5.1)检测到。
所以,在不必要花费时间进行更复杂的Unix ADP配置并可能对其造成损害之前,请务必先尝试MTP和PTP两种模式。
在较新的设备上,您可以直接在开发者选项中选择,而在较旧的设备上,则在状态栏的USB连接选项中进行选择。
然而,对于我来说,最新的索尼Xperia Z5及以上型号无论使用哪种USB模式都无法工作。也许是因为我的Android Studio版本过旧,或者我还需要进一步研究Unix ADP配置。

按照以下步骤进行操作:
  1. 设置 Android 变量

    首先回到主页,按下 Ctrl + H 键,它会显示隐藏文件,现在找到 .bashrc 文件,用任何文本编辑器打开它,然后将以下行放置在文件末尾:

    export ANDROID_HOME=/myPathSdk/android-sdk-linux
    export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools
    
  2. 重新启动

  3. 使用设备进行调试

    监听连接:

    adb -a
    

    连接您的 Android 设备并授权:

    cordova run android --device
    

虽然接受的答案帮助我完成了任务,但我仍然对以下事情感到困惑:
martin@alyx:~$ sudo adb devices
sudo: adb: command not found

尤其是
martin@alyx:~$ sudo -E adb devices
sudo: adb: command not found

根据“sudo --help”命令的解释:
-E, --preserve-env          preserve user environment when running command

原来,在许多Linux发行版(包括Debian和Ubuntu)中,默认情况下启用了secure_pathenv_reset选项,它们会重置您的PATH变量并将其设置为secure_path。您可以使用visudo在/etc/sudoers文件中进行更改。
或者,您也可以运行:
sudo env PATH=$PATH adb devices

配置USB访问

推荐的方法是在/etc/udev/rules.d/51-android.rules创建一个文件。

请在终端中输入:

wget -S -O - http://source.android.com/source/51-android.txt | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules

那些新规则在下次插入设备时生效。因此,可能需要将设备拔出并重新插入电脑。

我个人遇到了一个问题,我的带有USB C接口的设备在lsusb中显示出来,但在adb设备中却没有显示出来。
我尝试了所有给出的解决方案,如adb kill-server命令,配置/etc/udev/rules.d/51-android.rules文件,~/.android/adb_usb.ini文件,设置adb规则https://github.com/M0Rf30/android-udev-rules并重新启动,但都没有起作用。
最后有效的方法是将设备连接到一个USB2.0接口上。我有一台新的台式机,所以大部分接口都是USB3.0。

我知道这听起来像巫术,但是买一根全新的高质量USB数据线。许多数据线只适用于充电。我花了很长时间遵循所有建议等等,但仍然经常出现连接丢失的问题,而一根好的高质量USB数据线就能解决这个问题。

尝试使用以下命令:sudo tools/android update sdk --no-ui SDK自述文件: 欢迎使用Android SDK!Android SDK存档最初只包含基本的SDK工具。它不包含Android平台或任何第三方库。事实上,它甚至没有开发应用程序所需的所有工具。要开始开发应用程序,您必须使用SDK管理器安装Platform-tools和至少一个Android平台版本。Platform-tools包含定期更新以支持Android平台中的新功能的构建工具(这就是为什么它们与基本SDK工具分开的原因),包括adb、dexdump等。要安装Platform-tools、Android平台和其他附加组件,您必须有互联网连接,因此,如果您计划在离线状态下使用SDK,请确保在联机状态下下载必要的组件。要启动SDK管理器,请执行"android"程序。您还可以通过命令行直接触发更新,执行:tools/android update sdk --no-ui

我不确定这是否解答了原始问题... - landroni