安卓:将Iperf作为单独进程启动

3

您好,我正在使用iperf测试网络吞吐量。为此,我正在使用NDK创建iperf C代码的可执行文件,并成功地启动了进程,如下所示:

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

但我担心的是,万一我的应用程序在某个时候崩溃(虽然目前还没有崩溃),那么外部进程将继续运行,因此我需要一种方法来从任何活动或服务的任何时间点销毁该进程。因此,如果有人有什么想法,请帮忙。

1个回答

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的代价 - 你应该构建JNI桥接,而不是启动外部进程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接