Android:将Iperf作为单独的进程启动

时间:2013-04-17 03:32:49

标签: android networking process

您好我正在使用iperf测试网络吞吐量,因为我正在使用NDK创建iperf c代码的可执行文件,并且我成功地能够按如下方式启动该过程:

 Process process ;
 process = new ProcessBuilder().command(commandList).redirectErrorStream(true).start();

但我担心的是,如果我的应用程序在某些时候崩溃(因此没有崩溃,但万一它崩溃),那么外部进程继续运行,所以我需要一种方法来在任何时候销毁这个进程任何活动或服务的时间。 所以,如果有人有一些想法,请帮助。

1 个答案:

答案 0 :(得分:1)

嗯,JVM领域的常用解决方案是使用Runtime.addShutdownHook,但Android版本带有此警告:

  

请注意,在Android上,应用程序生命周期不包括VM终止,因此调用此方法无法确保运行代码。相反,您应该使用最合适的生命周期通知(例如,Activity.onPause)。

由于您关心崩溃,因此您可以在任何可能崩溃的线程上设置未捕获的异常处理程序以同时终止子进程(查找Thread.setUncaughtExceptionHandler)。

除此之外,如果你知道PID,你可以使用kill发送信号(因为我们没有pkill)。您可以尝试Runtime.getRuntime().exec("kill -SIGINT <PID-goes-here>");

如果您没有PID,Android的标准图片会附带ps的版本,但遗憾的是它不清楚它支持的语法,所以我建议改为解析其输出。 (另外,它在基本图像中的事实让我相信OEM构建也会拥有它)。

但是,这是一个不必要的方法来阻止一个过程。这只是你使用JVM-toh所需要付出的代价 - 你应该建立JNI桥,而不是启动外部流程。