如何为 libusb android 应用程序授予 /dev/bus/usb 权限?

Posted

技术标签:

【中文标题】如何为 libusb android 应用程序授予 /dev/bus/usb 权限?【英文标题】:How to give /dev/bus/usb permissions for libusb android applications? 【发布时间】:2011-11-16 22:31:12 【问题描述】:

我正在开发一个通过 jni 使用 libusb 的应用程序。 此应用程序目前仅针对有根的 USB 主机 android 3+ 机器。

场景如下:

<java Activity>
       loads <jni_wrapper.so>
               which wraps <my_main_lib.so>
                       that uses <libusb.so>
                               that needs rw access to: /dev/bus/usb/<device>

所有 .so 本机库都是我在 /system/lib 上安装(以 root 身份)的基础架构的一部分, 然后可以由简单用户运行的 java 活动使用。

这意味着整个usb通信必须从本机端完成。

我得到了一切正常工作,除了一个问题 - USB 权限: /dev/bus/usb/ 条目的默认权限是 (0660, uid= root, gid= usb)。

显然,运行本机代码的标准 java 进程不满足上述任何要求,迫使我“chmod 666”相应的 /dev 条目,以使其正常工作。

不过,这个解决方案不是很好,因为它无法在重新启动或拔出/重新插入设备后继续存在(权限返回 0660)。

我正在寻找的解决方案需要:

在重新启动/重新插入时幸存 由 root 安装~一次~,无需每次都打扰用户获取权限 通用并在所有(/大多数)android 3+ 机器上运行 [非强制性] 提供必要的最少凭据

我想到的方向:

在 /init.rc 或 /ueventd.rc 中更改权限 --> 每次重新启动时都会覆盖两者 使用 devmode=0666 安装 usbfs /proc/bus/usb --> 重新插入后仍然存在,但不会重新启动 让我的进程加入“usb”组? --> 我尝试了 android.permission.ACCESS_USB,但它不起作用/不支持...:/

有什么想法吗? :-)

谢谢!

【问题讨论】:

这里有同样的问题。对任何解决方案都非常感兴趣。 嗨,你让它工作了吗?我正在做类似的事情并使用无根电话。 【参考方案1】:

我遇到了同样的问题,我在 ndk 中解决了这个问题,将 /proc/bus/usb 更改为你的情况下安装 usb 的位置。希望能帮助到你。

r = system("su -c \"chmod -R 777 /proc/bus/usb/\"");
if(r!=0) 
    LOGD("Could not grant permissions to USB\n");
    eturn CANT_GRAN_PERMISSION_USB;

【讨论】:

【参考方案2】:

libusb 开发团队提供了一些方法。就我而言,我选择第一种方法。

来自:https://github.com/libusb/libusb/blob/master/android/README

运行时权限:

大多数 Android 设备上的默认系统配置不允许 访问 USB 设备。有几个选项可以改变这一点。

如果您可以控制系统映像,则可以修改 ueventd.rc 在图像中用于更改权限 /dev/bus/usb//。如果使用这种方法,那么建议 创建一个新的 Android 权限来保护对这些文件的访问。它 不建议给所有应用程序读写权限 到这些文件。

对于 root 设备,使用 libusb 的代码可以作为 root 执行 使用“su”命令。另一种方法是使用“su” 命令更改相应 /dev/bus/usb/ 上的权限 文件。

用户报告使用 android.hardware.usb.UsbManager 成功 请求使用 UsbDevice 的权限,然后打开 设备。这种方法的难点在于不能保证 它将在未来的 Android 版本中继续工作,它 需要调用 Java API 并运行代码以匹配每个 android.hardware.usb.UsbDevice 到 libusb_device。

【讨论】:

【参考方案3】:

编辑:

重新阅读问题后,很明显我误解了主机运行的是Android。由于 udev 在 Android 中不存在,因此下面的答案不能回答问题。如果有人正在寻找有关让非 Android linux 主机 PC 识别 Android 设备的信息,我将在此处留下这个答案。

结束编辑

这些驱动程序 (/dev/bus/usb/###/###) 的默认权限由 udev 确定。特别是,它会按数字顺序解析 /etc/udev/rules.d 和 /lib/udev/rules.d 中的配置文件以确定默认值。

要覆盖默认值,您需要创建自己的 udev .rules 文件。为此,您需要要授予权限的设备的供应商 ID。 lsusb 将打印出任何特定设备的设备 ID,如果您想要所有供应商的列表,您可以尝试this。

因此,在您的 /etc/udev/rules.d/99-android.rules 文件中,为您要支持的每个供应商填写以下行:

SUBSYSTEM=="usb", ATTRSidVendor=="04e8", MODE:="0666"

请注意,在上面链接的示例中,他们使用 = 而不是 := 和 SYSFS 而不是 ATTRS。我不知道为什么,但我发现该文件在我的机器上无法逐字运行。

写入文件后,

restart usbserial 

并重新插入您的设备。它现在应该默认为 666 权限。

【讨论】:

为什么投反对票?它没有工作吗?不回答问题?请发表评论。 也许不赞成是因为 usbserial 是用于 USB 到串行转换器设备的,他正在谈论使用较低级别的 libusb。然而,udev 规则听起来是更改权利的正确场所,而且……实际上这就是 udev 的目的。使用 su 更改权限更像是安全问题。 这个答案是无关紧要的,因为 Android 不使用 udev。这是一个非常非典型的 Linux 用户空间。【参考方案4】:

我在没有root设备的情况下找到了解决方案。

在 Android 4.2.2 内核版本 3.3.39 上测试

您需要做的就是将您的应用程序添加到“usb”组中

没有root你可以使用/system/etc/permissions/platform.xml中的权限文件

选择一项您不使用的权限,例如“android.permission.CAMERA”。

像这样修改/system/etc/permissions/platform.xml:

<permissions>
...
    <permission name="android.permission.CAMERA" >
        <group gid="camera" />
    </permission>

    <permission name="android.permission.CAMERA" >
        <group gid="usb" />
    </permission>
...
</permissions>

所以,将&lt;uses-permission android:name="android.permission.CAMERA" /&gt; 添加到您的应用程序清单文件中,享受 libusb 可访问的 USB!

【讨论】:

Choose one permission you don't use => 我不是安卓开发者,但对我来说这似乎是一个非常糟糕的做法...... 如果没有root,如何修改/system/etc/permissions/platform.xml? 其实我觉得这是一个好方法,如果我改变/dev/bus/usb的权限那么任何应用程序都可以读/写它,这是不安全的,对于我一个系统映像开发人员来说,是个好办法。

以上是关于如何为 libusb android 应用程序授予 /dev/bus/usb 权限?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式为 Android 服务授予权限

如何为我的移动应用程序的 REST API 调用授予 Angular 授权

如何为 zeppelin 用户授予正确的权限

如何为整个子网授予对 MySQL 的远程访问权限?

如何为朋友函数中定义的类授予友谊?

如何为 npx 命令授予 mkdir 权限