尝试使用su执行命令时出现SyncFailedException

时间:2014-06-20 14:49:59

标签: c# android xamarin.android

我尝试使用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.

造成此问题的原因是什么方法可以解决此问题?

1 个答案:

答案 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