我尝试使用su
执行命令并查看一些问题
在这里,
我决定尝试以下方法:
var command = "su -c 'touch /mnt/extsd/somefile'"; //Could be any command
using (var process = Java.Lang.Runtime.GetRuntime().Exec(command)) { }
在这种情况下,我试图通过将命令直接传递给su
来执行命令
在我的目标设备上,这意味着我必须传递-c参数,其他设备不需要这个。
虽然这不会引发任何类型的异常(不在应用程序中,不在系统中),但是 它实际上也没有做任何事情。它被忽略了。
var command = "touch /mnt/extsd/somefile";
using (var su = Java.Lang.Runtime.GetRuntime())
using (var process = su.Exec("su"))
using (var writer = new StreamWriter(process.OutputStream))
{
writer.WriteLine(command);
}
无论actuall命令是什么,结果总是相同的:
06-20 22:46:02.614 E/su-binary(27808): ----su-----
06-20 22:46:02.794 W/System.err(22894): java.io.SyncFailedException: fsync failed: EINVAL (Invalid argument)
06-20 22:46:02.794 W/System.err(22894): at java.io.FileDescriptor.sync(FileDescriptor.java:77)
06-20 22:46:02.804 W/System.err(22894): at java.io.FileOutputStream.flush(FileOutputStream.java:194)
06-20 22:46:02.804 W/System.err(22894): at dalvik.system.NativeStart.run(Native Method)
06-20 22:46:02.804 W/System.err(22894): Caused by: libcore.io.ErrnoException: fsync failed: EINVAL (Invalid argument)
06-20 22:46:02.804 D/TouchD ( 1471): Entering CheckVIDinlsusb()
06-20 22:46:02.814 D/TouchD ( 1471): Command busybox lsusb | grep 0eef output to /dev/null failed.
造成此问题的原因是什么方法可以解决此问题?
答案 0 :(得分:1)
编辑:删除原始错误答案
您似乎需要像这样阅读流程的输出:
var command = "touch '/mnt/extsd/someFile'";
using (var process = new JL.ProcessBuilder().Command("su", "-c", command)
.RedirectErrorStream(true)
.Start())
{
var buffer = new byte[256];
var read = 0;
do
{
read = process.InputStream.Read(buffer, 0, buffer.Length);
Console.WriteLine(ASCIIEncoding.ASCII.GetString(buffer, 0, read));
} while (read > 0);
}
重要的是,第二个命令的参数(本例中的触摸)包含在引号内。为了避免命名空间冲突,添加了以下using语句:
using JL=Java.Lang;
参考:http://developer.android.com/reference/java/lang/Process.html