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

时间:2011-09-14 11:10:13

标签: android permissions usb android-ndk libusb

我正在开发一个通过jni使用libusb的应用程序。 此应用程序目前仅针对rooted,usb-host 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 / entries的默认权限是(0660,uid = root,gid = usb)。

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

但是,这个解决方案并不是那么好,因为它不会在重启或设备拔出/重新插入后继续存在(权限会回到0660)。

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

  • 生存重启/重新插入
  • 由root安装〜一次,并且不涉及每次获取权限而打扰用户
  • 是通用的,可在所有(/大多数)android 3+机器上运行
  • [非强制性]提供必要的最低凭证

我想到的方向:

  • 更改/init.rc或/ueventd.rc中的权限 - &gt;每次重启都会覆盖两者
  • 使用devmode = 0666安装usbfs / proc / bus / usb - &gt;幸存下来,但没有重新启动
  • 让我的流程加入“usb”群组? - &GT;我试过android.permission.ACCESS_USB,但它不起作用/支持......:/

任何想法? : - )

谢谢!

4 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,我在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;
}

答案 1 :(得分:2)

libusb开发团队有一些方法。对于我的情况,我选择第一种方法。

从:https://github.com/libusb/libusb/blob/master/android/README

  

运行时权限:

     

大多数Android设备上的默认系统配置都不允许   访问USB设备。有几种方法可以改变这种情况。

     

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

     

对于有根设备,使用libusb的代码可以以root身份执行   使用&#34; su&#34;命令。另一种方法是使用&#34; su&#34;   命令更改相应/ dev / bus / usb /上的权限   文件。

     

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

答案 2 :(得分:1)

修改:

重新阅读问题之后,很明显我误解了主机正在运行Android。由于Android中不存在udev,下面的答案不能回答这个问题。我在这里留下这个答案,万一有人正在寻找有关获取非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", ATTRS{idVendor}=="04e8", MODE:="0666"

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

写完文件后,

restart usbserial 

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

答案 3 :(得分:1)

我找到了解决方案而没有生根设备。

在Android 4.2.2内核版本3.3.39上测试

您需要做的就是将您的申请表添加到论坛&#34; usb&#34;

如果没有root,您可以使用/system/etc/permissions/platform.xml

中的权限文件

选择一个您不会使用的权限,例如&#34; android.permission.CAMERA&#34;。

修改/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>

因此,将<uses-permission android:name="android.permission.CAMERA" />添加到您的应用程序清单文件中,并享受libusb access usb!