我尝试在this approach中建议使用libusb
未植根的Nexus 5(通过将usb文件描述符从java传输到本机端)。
我的应用程序通过UsbManager.requestPermission
请求权限,然后运行调用libusb_init
的原生方法来创建libusb_context
。
但是libusb_init
会返回LIBUSB_ERROR_OTHER
代码(-99)。在挖掘代码后,我明白为什么会发生这种情况。 libusb报告'could not find usbfs'
因为opendir("/dev/bus/usb")
返回0
。
同样来自adb shell
我无法执行ls /dev
,这很奇怪,因为我有权利(在华为U8950-1上我有同样的权利):
drwxr-xr-x root root 2014-09-04 10:26 dev
看起来下面描述的方法不适用于所有Android设备。有人可以解释原因吗?
答案 0 :(得分:3)
这个libusb fork已经有了修复:
https://github.com/martinmarinov/rtl_tcp_andro-
现在,您不仅需要传递文件描述符,还需要通过UsbDevice.getDeviceName()传递设备文件路径。
答案 1 :(得分:2)
看起来Android L
对访问/dev
目录有额外的限制。我对此没有更多的想法
<强>更新强>
Security Enhancements in Android 5.0
...
使用SELinux加强Android沙箱。 Android现在在所有域的强制模式下都需要SELinux。 SELinux是Linux内核中的mandatory access control (MAC) system,用于扩充现有的[自主访问控制(DAC)安全]模型](http://en.wikipedia.org/wiki/Discretionary_access_control)。这个新层提供了额外的保护,以防止潜在的安全漏洞。
...
<强>变通方法强>
permissive
答案 2 :(得分:0)
有一个自定义libusb 1.0能够通过传递usb设备的路径来执行LibusbInit来解决这个问题,这可以绕过来自主页网页的readdir命令http://www.libusb.org/下载。