2013-06-04 84 views
0

我已經授予UsbDevice訪問,得到了他的設備名稱(/dev/bus/usb/002/002),並將其傳遞到執行過程中與USB設備(AVRDUDE更詳細)工作從android應用程序執行的進程是否與android應用程序具有相同的權限?

Process process = Runtime.getRuntime().exec(commandArray); 

,並獲得「許可被拒絕 「錯誤:

W/System.err(9368): avrdude: ser_open(): can't open device "/dev/bus/usb/002/002": Permission denied 
W/System.err(9368): ioctl("TIOCMGET"): Invalid argument 

AVRDUDE是在應用程序沙箱(/data/data/%package%),所以它不需要生根只是執行AVRDUDE(確定)。我相信如果我授予訪問UsbDevice android應用程序進程和所有子進程(avrdude)獲得對USB設備文件的訪問權限。

有什麼想法?生根是不受歡迎的。

+0

UPDATE:應用程序甚至得到允許後UsbDevice不能讀/寫的USB設備文件: '文件usbDeviceFile =新的文件(usbDevice.getDeviceName()); logger.debug(「{} exists,canRead = {},canWrite = {}」,new Object [] {usbDeviceFile.exists()?「」:「NOT」,usbDeviceFile.canRead(),usbDeviceFile。 canWrite()});' 回報: 'd/ArduinoDroid(2350):設備名稱=的/ dev /總線/ USB/002/002 d/ArduinoDroid(2350):存在,的CanRead =假,canWrite = false' – 4ntoine

+0

是的,它們是相同的,但是這裏的問題在於,您嘗試在本機端使用不同的API,因爲該應用程序和其UID下運行的可執行文件都沒有權限。除unix組級別實現的一小部分權限(例如網絡連接)外,實際上它們都是基於Binder IPC的API的啓用碼,除非您可以通過某種方式向Binder註冊,否則本地可執行文件不可用。 –

+0

根據我的更新android應用程序本身沒有文件的權限。所以無論如何嘗試從子進程(avrdude)訪問它是沒有意義的。不可能? – 4ntoine

回答

2

看起來,Android USB主機API是訪問USB設備所必需的,您可能無法像使用普通Linux系統那樣直接從本機代碼訪問設備文件。

鑑於此限制,我認爲有幾種可能的解決方法。您的ArduinoDroid應用程序需要從Java讀取/寫入USB,所以問題是如何在avrdude和ArduinoDroid之間傳遞數據。根據我的經驗,一個好方法是通過網絡連接。本地主機:6800 -D -Uflash:W:firmware.hex:例如以下AVRDUDE命令將使用本地主機在端口6800

AVRDUDE -v -patmega328p -carduino -Pnet編程的Arduino我

我有通過連接到我的串行鏡像應用程序和通過藍牙對Arduino進行編程,在Linux上運行avrdude時自己完成此任務。我已經在這個演示中解釋了這個過程。

http://jeffboody.net/sparkfun-lunch-and-learn-20130124.pdf

我的串行鏡的應用程序的源代碼可以在這裏。

https://github.com/jeffboody/spp-mirror

如果與「執行」援引AVRDUDE不給你可能需要建立AVRDUDE作爲一個庫,使其具有相同的權限您的應用程序的網絡權限。 Android本機代碼支持套接字。

我能想到的第二個選擇是爲avrdude提供一個JNI接口來通過Java讀取/寫入USB。我認爲這會更困難,因爲它可能需要對avrdude進行重大更改。

+0

通常使用unix域套接字而不是TCP更清潔,並避免需要網絡權限,但是。至於執行與鏈接,諸如網絡的Linux級別權限將是相同的,因爲UID將是相同的。 –

+0

感謝您的建議!但是,所有這些似乎都沒用,因爲我已經有純java編寫的上傳器,所以它似乎像avrdude一樣執行stk500,它對於某些硬件配置(android device + arduino board)不起作用。所以低級(文件訪問)似乎是我需要的 – 4ntoine

+0

我沒有想到域套接字,但你可能必須破解avrdude來替換TCP套接字。 – user2038378

1

關於文件描述符,你可以通過JNI將它傳遞給本機。

// java

private native void NativePassFd(int fd);

// C

JNIEXPORT空隙JNICALL Java_com_MyName_MyPackage_MyClass_NativePassFd(JNIEnv的*的env,jobject OBJ,jint FD);

從本機代碼,你應該能夠使用讀/寫功能。這些應該與fread/fwrite行爲相同,除了它們將使用fd而不是FILE指針。重要的是,該fd是無效的在另一個進程(在特殊機制,比如Android的活頁夾機構後,除了

ssize_t供讀取(INT FD,無效* buf中,爲size_t計數);

爲ssize_t寫(INT FD,常量無效* buf中,爲size_t計數);

+0

最好使用'javah'實用程序生成標題以避免錯誤 – 4ntoine

相關問題