Android L | Libusb_init devuelve LIBUSB_ERROR_OTHER (-99)
Estoy tratando de usar libusb
en Nexus 5 no enraizada como se aconseja en este enfoque (mediante la transferencia de descriptor de archivo usb de java a lado nativo).
Mi solicitud solicita permiso a través de UsbManager.requestPermission
y luego ejecuta el método nativo que llama a libusb_init
para crear libusb_context
.
- ¿Cómo dar permisos / dev / bus / usb para aplicaciones libusb android?
- Lectura de Android El accesorio USB lanza ENODEV IOException
- Uso de libusb en Android sin enraizamiento
- ¿Cómo utilizar el dispositivo USB en Android Versión inferior como Android 2.2?
- Android ADK con PC como host USB con libusb, error de transferencia masiva
Pero libusb_init
devuelve el código LIBUSB_ERROR_OTHER
(-99). Después de excavar en el código veo por qué sucede esto. Libusb reporta 'could not find usbfs'
porque opendir("/dev/bus/usb")
devuelve 0
.
También desde adb shell
no puedo realizar ls /dev
, extraño porque tengo derechos (en Huawei U8950-1 con los mismos derechos que puedo hacer esto):
drwxr-xr-x root root 2014-09-04 10:26 dev
Parece que el enfoque descrito a continuación no funciona para todos los dispositivos de Android. ¿Puede alguien explicar por qué?
- Software basado en Android accesorio en Windows
- Android L 5.0 y libusb 1.0.9 - sin permisos?
- Modificar libusb para aceptar descriptor de archivo
- El permiso USB obtenido a través de android.hardware.usb no se aplica a NDK
Ya hay una corrección en esta bifurcación libusb:
https://github.com/martinmarinov/rtl_tcp_andro-
Ahora, no sólo necesitará pasar el descriptor de archivo, también tendrá que pasar la ruta del archivo del dispositivo vía UsbDevice.getDeviceName ().
Parece que Android L
tiene una restricción adicional sobre el acceso al directorio /dev
. No tengo más ideas sobre esto
Actualizar
Mejoras de seguridad en Android 5.0
…
Sandbox Android reforzado con SELinux . Android ahora requiere SELinux en el modo de aplicación para todos los dominios. SELinux es un sistema de control de acceso obligatorio (MAC) en el kernel de Linux que se usa para aumentar el modelo de seguridad de control de acceso discrecional (DAC) [ http://en.wikipedia.org/wiki/Discretionary_access_control ]. Esta nueva capa proporciona protección adicional contra posibles vulnerabilidades de seguridad.
…
Soluciones alternativas
- Instale SELinuxModeChanger y cambie el modo SELinux a
permissive
- https://github.com/Gritzman/libusb
Hay una libusb personalizada 1.0 que es capaz de resolver este problema haciendo LibusbInit pasando la ruta del dispositivo usb, esto puede anular el comando readdir http://www.libusb.org/ download desde la propia página web.