oem unlock
并对其进行root(就像我通常在新设备上所做的那样;)问题是,尽管设备上启用了USB调试功能,并且/etc/udev/rules.d/51-android.rules
存在,而adb devices
看不到该设备。我知道在此站点周围散布了几个答案,但它们要么很难找到,要么仅覆盖特定设备,要么不覆盖所有设备我终于需要的步骤。因此,我借此机会提出了一个规范的,独立于设备的问题,并在下面给出了详细的答案:
我如何让
adb
在Linux上看到并使用我的Android设备?#1 楼
在设备上启用USB调试这是在“设置”›“开发”中完成的。如果您的设置菜单中没有该条目,请转到设置›关于,滚动到“内部版本号”,然后像猴子一样锤打,直到您的设备祝贺您成为开发人员。返回“设置”菜单的主页,并靠近底部,您现在应该会看到“开发”(或“开发人员”)设置。输入它,然后在此处启用USB调试。
识别设备
首先,我们需要知道设备如何在USB总线上进行标识。为此,在未连接Android设备的情况下,抓住外壳并运行命令
lsusb
。然后连接设备并再次运行命令。发现新行。对于Wileyfox Swift,这是一个“无名设备”:Bus 004 Device 003: ID 2970:2282
设置ADB规则
我们现在需要在上一行的结尾:
2970:2282
。这些指定供应商(2970)和设备本身(2282)。有了这些细节,我们需要Linux机器上的根shell来编辑(或创建,如果尚不存在)/etc/udev/rules.d/51-android.rules
文件。在其中,为您的设备添加一行。以下示例行显示了Wileyfox Swift的外观:¹SUBSYSTEMS=="usb", ATTRS{idVendor}=="2970", ATTRS{idProduct}=="2282", MODE="0666" GROUP="androiddev", SYMLINK+="android%n"
如果您使用的是其他设备,请用上面找到的替换供应商和产品ID当运行
lsusb
时。该行的简短说明:SUBSYSTEMS=="usb"
:显然,该规则仅适用于USB;)ATTRS{idVendor}=="2970"
:设备的供应商ID此规则适用于ATTRS{idProduct}=="2282"
:设备ID MODE="0666"
:设备节点应获得的权限。 0666
非常宽松,为系统上的每个用户提供了读取和写入权限–因此,如果您担心,可以尝试用0660
替换它(仅授予所有者和组读写权限,并拒绝其他人使用)。GROUP="androiddev"
:设备节点应属于哪个组。这应该是打算与该设备一起使用的用户所属的组。SYMLINK+="android%n"
:只是给节点起一个好听的名字,所以您可以在/dev
中找到它更容易(在我的情况下,稍后再说在此处显示为/dev/android5
)在
/etc/udev/rules.d/51-android.rules
中输入了该规则,我们必须告诉udev
使用它。最安全的方法(在重新启动之后;)是重新启动udev
服务。根据您的Linux发行版,可以通过service udev restart
或/etc/init.d/udev restart
完成此操作。完成此操作,保留根shell。断开并重新连接您的Android设备,然后重试
adb devices
。现在,大多数设备都出现了,但Wileyfox Swift却没有出现,它显然想要一些额外的拥抱。如果遇到这种情况,请打开(或创建不存在的文件)文件~/.android/adb_usb.ini
并在其中添加一行,并用上面的lsusb
命名找到的供应商;对于Swift,它将是0x2970
(是的,在这里,您需要在0x
前面加上前缀以指出它是一个十六进制数)。然后重新启动ADB服务器:adb kill-server && adb start-server
。再次断开并重新连接设备。现在adb devices
应该可以看到它。连接设备
您可能已经注意到
adb devices
告诉您类似0123456789ABCDEF unauthorized
的信息。没关系,并且为了您(设备)的安全:必须首先授权您的计算机才能访问该设备。因此,只需立即发出adb shell
-将随error: device unauthorized. Please check the confirmation dialog on your device.
一起退出(遵循该建议(可选地,选中复选框以永久授权您的计算机)),您就可以完成:现在,您可以使用adb访问您的设备。更新:
¹请注意,在更高的Linux版本中,UDEV规则的语法略有变化,例如jcomeau_ictx在他的评论中指出。对于我们在上面发现的值,将是:
SUBSYSTEM=="usb", ATTR{idVendor}=="2970", ATTR{idProduct}=="2282", MODE="0666", GROUP="plugdev", SYMLINK+="android%n"
有两个区别:现在是
SUBSYSTEM
(无复数),并且组已经从androiddev
更改为plugdev
(前者在最近的系统上不存在,后者在并且通常至少分配给了第一个用户)。另外,您可能需要将vendorID添加到
~/.android/adb_usb.ini
(每行一个ID,以十六进制表示):# ANDROID 3RD PARTY USB VENDOR ID LIST
# 1 USB VENDOR ID PER LINE.
0x2970
评论
在我的Jessie系统上,udev规则的格式是不同的:jcomeau @ aspire:〜$ tail -n 1 /etc/udev/rules.d/99-android.rules SUBSYSTEM ==“ usb”,ATTR {idVendor} == “ 0e8d”,ATTR {idProduct} ==“ 201d”,MODE =“ 0666”,GROUP =“ plugdev”,SYMLINK + =“ android%n” jcomeau @ aspire:〜$ cat〜/ .android / adb_usb.ini#ANDROID 3RD PARTY USB供应商ID列表-请勿编辑。 #使用'android update adb'生成。每行1个USB供应商ID。 0x0e8d我不得不忽略运行android update adb的建议,并按照您的说明手动输入。
– jcomeau_ictx
17年5月15日在2:29
@jcomeau_ictx感谢您的反馈!据您的评论所见,它只是使用了一个不同的用户组(plugdev而不是androiddev)。未经验证,但我想说的重要一点是,您的用户(您想与之一起使用USB)也属于该用户组。
– Izzy♦
17年5月15日在6:17
还有SUBSYSTEM而不是SUBSYSTEM,ATTR而不是ATTRS,在MODE =“ 0666”之后的逗号不确定是否所有必要的更改都是必要的,但这是可行的。
– jcomeau_ictx
17年5月15日在7:22
哦–谢谢,错过了那些小的朋友@jcomeau_ictx –好点!
– Izzy♦
17年5月15日在13:21
对于Linux非精明人员来说,sudo wget -O /etc/udev/rules.d/51-android.rules从这里为我的Xiaomi Mi A1工作。当然学习更好,但是最好是懒惰:)
– beeshyams
18年8月25日在11:02
#2 楼
来自较新的Linux发行版的一些评论。装有Nexus 5X或诺基亚7.1(Android One)手机的Fedora29。首先断开手机(如果已连接)。
安装android-tools将提供ADB(
sudo dnf install android-tools
)复制udev规则(
sudo cp /usr/share/doc/android-tools/51-android.rules /etc/udev/rules.d
)重新加载udev规则(
sudo udevadm control --reload-rules
)重新启动ADB以确保(
sudo systemctl restart adb
)现在连接电话并从命令行运行
adb devices
。您可能会看到列出的设备带有“无权限”。很好。如果未列出该设备,则必须将设备添加到udev规则文件中,但对我而言,经过测试的设备仅适用于预定义的规则。运行
adb shell
和希望您会在电话上收到安全通知,询问您是否要信任计算机,请选择“是”。如果计算机显示“错误:设备权限不足”,则需要确保在电话上已设置USB端口改为“传输文件”模式,而不是“为此设备充电”。在Android 8.1上,该文件位于“连接的设备”>“ USB”下的设置中。如果发生这种情况,请先检查设备上的USB端口设置,该设置可能已更改回充电模式,如果失败,请撤消设备上的USB调试授权(在“开发人员”选项下的设置中),希望您能将其弹出再次运行adb shell
时。-这样,我就可以运行Android Studio并在连接的设备上运行。
评论
我总是对批评家开放-但是没有解释的投票很难解释。那么请下降投票者解释一下在这个问题上应该改进什么?我保证不会滥用我的mod权力进行惩罚:)我想选民没有意识到您是在张贴问题来自己回答问题(不一定在回答中注意到您)。由于在该问题或评论中没有暗示出于自我回答的目的而发布的内容,投票者可能反对倒数第二段(表示懒惰,如果在任何普通用户及其问题的上下文中阅读)。到目前为止,我还没有其他原因。
@Firelord听起来很有说服力(对问题进行了一些编辑,以防止出现其他失败步骤)。但是,那个用户应该已经回答了。还是我也想念那里的东西? ;)