Как дать / dev / bus / usb разрешения для приложений libusb android? - PullRequest
14 голосов
/ 14 сентября 2011

Я занимаюсь разработкой приложения, которое использует libusb через jni.в настоящее время это приложение предназначено только для корневых компьютеров Android 3+ с USB-хостом.

сценарий выглядит следующим образом:

<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 являются частью инфраструктуры, котораяЯ устанавливаю (как root) в / system / lib, который затем может быть использован java Activity, запущенным простыми пользователями.

, что означает, что вся связь через usb должна выполняться с нативной стороны.

у меня все работает нормально, кроме одной проблемы - разрешений usb: разрешения по умолчанию для / dev / bus / usb / records (0660, uid = root, gid = usb).

очевидно, что стандартный процесс Java, работающий с нативным кодом, не удовлетворяет ни одному из перечисленных выше требований, вынуждая меня выполнить команду "chmod 666" для соответствующей записи / dev.

это решение не так хорошотем не менее, поскольку он не переживает перезагрузку или отключение / повторное подключение устройства (разрешения возвращаются к 0660).

решение, которое я ищу, должно:

  • пережить ребoot / replugging
  • быть установленным ~ один раз ~ корневым пользователем, и не требовать, чтобы пользователь каждый раз получал разрешения
  • быть универсальным и работать на всех (/ большинстве) устройствах Android 3+
  • [не обязательно] дает минимальные необходимые учетные данные

указания, о которых я думал:

  • изменение разрешений в /init.rc или /ueventd.rc --> оба переопределяются при каждой перезагрузке
  • монтирование usbfs / proc / bus / usb с помощью devmode = 0666 -> переживает повторное подключение, но не перезагружается
  • , заставляя мой процесс присоединиться к группе "usb"?-> Я попробовал android.permission.ACCESS_USB, но он не работает / поддерживается ...: /

Есть идеи?: -)

спасибо!

Ответы [ 4 ]

2 голосов
/ 11 февраля 2015

Есть несколько методов от команды разработчиков libusb.для моего случая я выбираю первый метод.

из: https://github.com/libusb/libusb/blob/master/android/README

Разрешения времени выполнения:

Конфигурация системы по умолчанию на большинстве устройств Android не будетразрешить доступ к USB-устройствам.Есть несколько вариантов для изменения этого.

Если у вас есть контроль над образом системы, вы можете изменить ueventd.rc, используемый в образе, чтобы изменить разрешения для / dev / bus / usb / /.При использовании этого подхода рекомендуется создать новое разрешение Android для защиты доступа к этим файлам.Не рекомендуется давать всем приложениям права на чтение и запись для этих файлов.

Для корневых устройств код, использующий libusb, может быть выполнен от имени пользователя root с помощью команды "su".Альтернативой может быть использование команды "su" для изменения разрешений соответствующих файлов / dev / bus / usb /.

Пользователи сообщают об успешном использовании android.hardware.usb.UsbManager для запроса разрешения наиспользуйте UsbDevice и затем откройте устройство.Сложность этого метода заключается в том, что нет гарантии, что он продолжит работать в будущих версиях Android, для этого требуется вызов API-интерфейсов Java и запуск кода для сопоставления каждого android.hardware.usb.UsbDevice с libusb_device.*

2 голосов
/ 28 октября 2011

У меня та же проблема, и я решил ее, выполнив это в 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 голос
/ 04 июня 2014

Я нашел решение без рута устройства.

Проверено на 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>

Итак, добавьте <uses-permission android:name="android.permission.CAMERA" /> в файл манифеста приложения и наслаждайтесь доступным через usb libus!

1 голос
/ 07 декабря 2011

Редактировать:

После перечитывания вопроса становится ясно, что я неправильно понял, что на хост-машине работала Android. Поскольку udev не существует в Android, ответ ниже не отвечает на вопрос. Я оставляю этот ответ здесь на тот случай, если кто-то ищет информацию о распознавании устройств Android на хосте Linux, не являющемся Android.

Конец редактирования

Разрешения по умолчанию для этих драйверов (/ dev / bus / usb / ### / ###) определяются udev. В частности, он анализирует файлы конфигурации в /etc/udev/rules.d и /lib/udev/rules.d в числовом порядке, чтобы определить значения по умолчанию.

Чтобы переопределить значения по умолчанию, вам нужно будет создать собственный файл udev .rules. Для этого вам понадобится идентификатор поставщика устройства, на которое вы хотите дать разрешение. lsusb распечатает идентификатор устройства для любого конкретного устройства, и если вы хотите получить список всех поставщиков, вы можете попробовать this .

Итак, в своем файле /etc/udev/rules.d/99-android.rules заполните следующую строку для каждого поставщика, которого вы хотите поддержать:

SUBSYSTEM=="usb", ATTRS{idVendor}=="04e8", MODE:="0666"

Обратите внимание, что в приведенном выше примере они используют = вместо: = и SYSFS вместо ATTRS. Я не знаю почему, но я обнаружил, что этот файл не работает дословно на моей машине.

После записи файла,

restart usbserial 

и снова подключите ваше устройство. Теперь по умолчанию должно быть 666 разрешений.

...