Как открыть узел устройства (/dev/hidraw0) в приложении для Android (через С++)?

В настоящее время я переношу коммуникационную библиотеку C++ с Linux на Android с помощью JNI/NDK. Устройство представляет собой USB-детектор для проведения научных измерений. Это просто необработанный HID, который отображается как «/dev/hidraw0».

Мне нужно получить дескриптор файла ('_fileHandle') на устройство, что я делаю через:

_fileHandle = open(_devicePath.c_str(), O_RDONLY | O_NONBLOCK);

где _devicePath — это узел устройства «/dev/hidraw0». К сожалению, у меня возникла проблема с Android (скорее всего, с разрешениями/SELinux), и я получаю следующую ошибку в своем логарифме сразу после попытки выполнить команду open(...):

type=1400 audit(0.0:41): avc: denied { read } for name="hidraw0" dev="tmpfs" ino=229381 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:device:s0 tclass=chr_file permissive=0

«ls -l» в «/dev/hidraw0»:

crw------- 1 root root 229

Как заставить устройство открываться?

Я попытался просто изменить разрешения на узле, и изменения не сохраняются (Android сразу отменяет их).

Спасибо!


person Chemik    schedule 28.12.2016    source источник
comment
ПРИМЕЧАНИЕ 1. Даже если вам удастся изменить разрешения с помощью chmod, SELinux заблокирует вас. ПРИМЕЧАНИЕ 2: Если у вас есть root, вы можете отключить SELinux с помощью setenforce 0.   -  person y30    schedule 06.01.2017
comment
Аналогичный вопрос: stackoverflow.com/ вопросы/37486349/   -  person y30    schedule 06.01.2017


Ответы (2)


Существует API для прямой работы с USB-устройствами. Взгляните на: https://developer.android.com/guide/topics/connectivity/usb/host.html

Удовлетворяет ли это вашу потребность?

person Daniel    schedule 05.01.2017

@y30 был прав.

Используя корневые команды из моего приложения, я заработал, установив SELinux в режим «Permissive» с помощью команды «setenforce 0», а затем я могу отправить команду «chmod 666 /dev/hidraw0» и палку разрешений — Затем я могу успешно общаться с устройством из своего приложения.

Тем не менее, время от времени он все еще немного нестабилен - иногда я обнаруживаю, что разрешения не устанавливаются из моего приложения, хотя я не получаю никаких ошибок после запуска команд при запуске моего приложения, и мне нужно перейти к терминал, чтобы вручную выполнить команды от имени пользователя root, а затем вернуться к моему приложению.

Спасибо за помощь!

person Chemik    schedule 12.01.2017