How to give /dev/bus/usb permissions for libusb android applications?

Nulldef picture Nulldef · Sep 14, 2011 · Viewed 17.6k times · Source

i am developing an Application that uses libusb via jni. this application is currently targeted only to rooted, usb-host Android 3+ machines.

the scenario is as follows:

<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>

all the .so native libraries are part of an infrastructure that i install (as root) on /system/lib, which then can be used by java Activities, run by the simple users.

that means that the whole usb communication must be done from the native side.

i got everything to work fine, except for one issue - the usb permissions: the default permissions of /dev/bus/usb/ entries are (0660, uid= root, gid= usb).

obviously, a standard java process running a native code does not meet any of the above requirements, forcing me to "chmod 666" the corresponding /dev entry, to get this working.

this solution is not so good, though, because it does not survive reboot, or unplugging/replugging of the device (permissions go back to 0660).

the solution i'm looking for needs to:

  • survive reboot/replugging
  • be installed ~once~ by the root, and not involve bothering the user every time to gain permissions
  • be generic and run on all (/most) android 3+ machines
  • [not mandatory] gives the minimal credentials necessary

directions i thought of:

  • changing permissions in /init.rc or /ueventd.rc --> both are overridden on every reboot
  • mounting usbfs /proc/bus/usb with devmode=0666 --> survives replugging, but not reboot
  • making my process join the "usb" group? --> i tried android.permission.ACCESS_USB, but it doesnt work/supported... :/

any ideas? :-)

thanks!

Answer

Pedro Fraca picture Pedro Fraca · Oct 28, 2011

I've same problem and I solve it doing this in the ndk, changing /proc/bus/usb for where usb is mounted in your case. Hope it helps.

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;
}