解决Ubuntu下adb 显示insufficient permissions for device的问题
用USB线连接设备后抓取log时,在命令行输入:adb root
后出现了error:insufficient permissions for device
这显然是不正常的
我们再在命令行上输入adb device
出现了:
List of devices attached
???????????? no permissions
这就可以知道了,出问题了,从上面给出的提示翻译成中文是”设备权限不足“,adb devices给出的提示 ”No permission“,所以我们要解决非标设备默认无法被识别的问题。
来看我操作一波:
- 1、打开文件路径,到/etc/udev/rules.d 下:
cd /etc/udev/rules.d
- 2、来到之后在这里创建一个51-android.rules文件:
sudo vim 51-android.rules
- 3、然后在文件中添加如下配置:
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0666"
- 4、保存退出
这时候就只差最后一步 - 5、再为51-android.rules加上权限
sudo chmod a+x 51-android.rules
- 6、最后
将设备拔下来再连接上就可以了,记得回到主目录下再进行adb root
,
如果不放心就adb devices
一下看看
以下是扩展部分:
问题是解决了,但跟着这种傻瓜操作我们又能得到什么呢。作为一个热衷学习的人我们应该了解我们为什么这么做。为什么要在这个路径上添加这么个文件;为什么要在这个文件上加上这么一段命令呢;接下来就来探讨以下。
1、为什么在这个路径下 /etc/udev/rules.d
答:/etc/udev/rules.d这个目录存储的是以.rules结束的文件。下面可能有好几个udev规则文件,每一个文件处理一系列规则来帮助udev分配名字给设备文件以保证能被内核识别。
2、为什么输入以上文本
答:规则文件里的规则有一系列的键/值对组成,键/值对之间用逗号(,)分割。每一个键或者是用户匹配键,或者是一个赋值键。匹配键确定规则是否被应用,而赋 值键表示分配某值给该键。这些值将影响udev创建的设备文件。赋值键可以处理一个多值列表。匹配键和赋值键操作符解释见下表:
udev 键/值对操作符
操作符 | 匹配或赋值 | 解释 |
== | 匹配 | 相等比较 |
!= | 匹配 | 不等比较 |
= | 赋值 | 分配一个特定的值给该键,他可以覆盖之前的赋值。 |
+= | 赋值 | 追加特定的值给已经存在的键 |
:= | 赋值 | 分配一个特定的值给该键,后面的规则不可能覆盖它。 |
这有点类似我们常见的编程语言,比如C语言。只是这里的键一次可以处理多个值。有一些键在udev规则文件里经常出现,这些键的值可以使用通配符(*,?,甚至范围,比如[0-9]),这些常用键列举如下:
常用udev键
键 | 含义 |
ACTION | 一个时间活动的名字,比如add,当设备增加的时候 |
KERNEL | 在内核里看到的设备名字,比如sd*表示任意SCSI磁盘设备 |
DEVPATH | 内核设备录进,比如/devices/* |
SUBSYSTEM | 子系统名字,比如sound,net |
BUS | 总线的名字,比如IDE,USB |
DRIVER | 设备驱动的名字,比如ide-cdrom |
ID | 独立于内核名字的设备名字 |
SYSFS{ value} | sysfs属性值,他可以表示任意 |
ENV{ key} | 环境变量,可以表示任意 |
PROGRAM | 可执行的外部程序,如果程序返回0值,该键则认为为真(true) |
RESULT | 上一个PROGRAM调用返回的标准输出。 |
NAME | 根据这个规则创建的设备文件的文件名。注意:仅仅第一行的NAME描述是有效的,后面的均忽略。 如果你想使用使用两个以上的名字来访问一个设备的话,可以考虑SYMLINK键。 |
SYMLINK | 根据规则创建的字符连接名 |
OWNER | 设备文件的属组 |
GROUP | 设备文件所在的组。 |
MODE | 设备文件的权限,采用8进制 |
RUN | 为设备而执行的程序列表 |
LABEL | 在配置文件里为内部控制而采用的名字标签(下下面的GOTO服务) |
GOTO | 跳到匹配的规则(通过LABEL来标识),有点类似程序语言中的GOTO |
IMPORT{ type} | 导入一个文件或者一个程序执行后而生成的规则集到当前文件 |
WAIT_FOR_SYSFS | 等待一个特定的设备文件的创建。主要是用作时序和依赖问题。 |
PTIONS | 特定的选项: last_rule 对这类设备终端规则执行; ignore_device 忽略当前规则; ignore_remove 忽略接下来的并移走请求。all_partitions 为所有的磁盘分区创建设备文件。 |
我们输入的文本是:SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0666"
所以我们可以知道:子系统名字为”USB“,环境变量为”usb_device“,设备权限为”0666“