2010-08-10 38 views
1

我正在開發一個不打算作爲標準應用程序發佈的應用程序。它將運行在一個單一的根設備上。Android:寫入/ sys /目錄

我需要能夠寫入/ sys /目錄中的文件。有問題的文件由root擁有,並具有-rw-rw-rw-權限。

我知道,我的代碼運行時可能會限制VM運行,禁止寫入文件系統的這個區域,但我觀察到另一個應用程序顯然是這樣做的。

這可能嗎?它如何實現?手機是否需要植入並不重要(我使用的是開發者)。


我看着簡單地用一個FileWriter寫入文件,導致在.flush()以下錯誤:

java.io.IOException: Invalid argument 
at org.apache.harmony.luni.platform.OSFileSystem.writeImpl(Native Method) 

我也試着從Java執行shell命令,都與沒有「su」。其中分別返回「拒絕請求」和「拒絕權限」。

Process process = Runtime.getRuntime().exec("echo 'hello' > /sys/file"); 

最後我使用NDK和JNI在機箱C一些如何神奇地成功地寫入該文件嘗試。當試圖fflush到這個文件時,我收到一個EOF(意思是發生了一個錯誤)。


所有建議非常歡迎!

回答

7

Runtime.getRuntime()。exec(String)方法將輸入字符串簡單地視爲可執行文件的文件名。它不會接受你的回聲命令。 您應該使用Runtime.getRuntime().exec(String [])代替,如:

String [] cmd = {「/ system/bin/sh」,「-c」,「echo xxx>/sys/somefile「,};
Runtime.getRuntime()。exec(cmd);

或者,要將某些內容寫入sys文件,應該使用java.io.PrintWriter類。 請參閱http://www.netmite.com/android/mydroid/frameworks/base/core/java/android/os/Debug.java並搜索'startNativeTracing()'示例。

因爲,如果sys文件對於您的應用程序是可寫的,以上所有都只能工作。

+1

這個答案爲我節省了大量的時間,因爲我在使用IBM的J9 JVM(它與Apache Harmony共享一個通用的代碼譜系)的Debian變體原子板上遇到類似的問題。要求PrintWriter的原因是因爲echo在最後添加了換行符。如果你要cat> somesysfile,輸入一個有效的值,然後點擊Ctrl-D,你會看到一個類似的錯誤(至少我做過)。當我做同樣的事情並在有效值後按回車,然後Ctrl-D,sys文件接受正確的值。注意:並非我寫的所有sys文件都需要在我正在使用的主板上使用此換行符,但仍不確定原因。 – 2011-02-21 14:53:37

0

您必須修改清單,以便程序要求root用戶訪問。

http://developer.android.com/reference/android/Manifest.permission.html

公共靜態最終字符串FACTORY_TEST 自:API級別1

運行作爲一個工廠測試程序,運行根用戶。僅當設備在製造商測試模式下運行時纔可用。 常數值:「android.permission.FACTORY_TEST」

+1

「僅當設備在製造商測試模式下運行時纔可用。」這可能不會幫助他。 – Joshua 2010-08-10 17:47:09

1

我想你將不得不分享實際的代碼並告訴我們你真的想要做什麼。 「無效參數」對應於寫入(2)與EINVAL失敗,當您嘗試寫入不適合的內容時發生。不是權限的東西;一個類型的事情。這個文件不是普通文件,是嗎?

+0

我的總體目標是在HTC設備上寫入/ sys/class/htc_accessory/fm/flag。所以我的理解是,這不是一個普通的文件,正如你所說的。 – bdls 2010-08-26 15:22:09

+0

沒錯,所以你需要閱讀實現該文件的內核源代碼,以瞭解你應該如何使用它。 – 2010-08-28 18:01:12