C# 尝试使用su执行命令时SyncFailedException

C# 尝试使用su执行命令时SyncFailedException,c#,android,xamarin.android,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参数,其他设备不需要此参数 虽然这

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

是什么导致了这个问题?有什么办法解决这个问题吗?

编辑:删除了原来的错误答案

您似乎需要像这样读取流程的输出:

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;

参考:

免责声明:这不是一个打算在我正在测试的设备以外的任何设备上运行的应用程序。这不是应用商店的应用。此设备已根化。这不是一个移动应用程序。这不是一个平板电脑应用程序。让我们试试看,等等,这似乎不会改变任何事情。这其实很重要,因为代码的其余部分并不取决于执行结果。您的回答让我有足够的理由继续下去。确实需要修改引号并将Java代码转换为C代码,但您是正确的,谢谢!