如何杀死Android中的进程(Jelly Bean)

时间:2014-05-29 15:29:11

标签: android process su

在我的应用程序中,我创建了一个进程,用于将从logcat中提取的日志文件记录到Android设备中。为此,我使用Process只执行logcat -f log su权限,并保留对此过程的引用以允许用户取消日志。

问题是:在我的Android版本(4.1)中,当我尝试拨打process.destroy()

时出现此异常
I/System  ( 2948): Failed to destroy process 3134
D/dalvikvm( 2221): GC_CONCURRENT freed 499K, 12% free 6962K/7879K, paused 12ms+10ms, total 84ms
I/System  ( 2948): libcore.io.ErrnoException: kill failed: EPERM (Operation not permitted)
I/System  ( 2948):  at libcore.io.Posix.kill(Native Method)
I/System  ( 2948):  at libcore.io.ForwardingOs.kill(ForwardingOs.java:77)
I/System  ( 2948):  at java.lang.ProcessManager$ProcessImpl.destroy(ProcessManager.java:260)
I/System  ( 2948):  at com.blablabla.android.core.device.debug.DebugDevice.destroyProcess(DebugDevice.java:127)
I/System  ( 2948):  at com.blablabla.android.core.device.debug.DebugDevice.cancelLogcatToFile(DebugDevice.java:98)

检查this后,我使用建议的解决方案修改了cancelLogcatToFile,所以我的代码是这样的:

private void exportLogcatToFile(String fileName) {
    String command = new StringBuffer("logcat -f ").append(fileName)
        .append("\n").toString();
    try {
        logcatToFileProcess = Runtime.getRuntime().exec("su");
        final DataOutputStream os = new DataOutputStream(
                logcatToFileProcess.getOutputStream());
        os.writeBytes(command);

    } catch (IOException e) {
        Log.e(TAG, Log.getStackTraceString(e));
    }
}

要杀死这个过程:

private void cancelLogcatToFile() {
    if (logcatToFileProcess != null) {
        // logcatToFileProcess.destroy();
        destroyProcess(logcatToFileProcess);
        logcatToFileProcess = null;
        }
    }

private static void destroyProcess(Process process) {
    try {
        if (process != null) {
        // use exitValue() to determine if process is still running.
        process.exitValue();
        }
    } catch (IllegalThreadStateException e) {
        // process is still running, kill it.
        process.destroy();
    }
}

谢谢!

编辑:此代码将在有根设备中执行,因此su不会出现问题。

另外,我知道我可以做killall logcat之类的事情,但我想让另一个logcat进程保持活着

1 个答案:

答案 0 :(得分:1)

我怀疑如果您使用被黑客攻击的su填充程序以root身份启动进程,那么要真正杀死它,您还必须使用su启动kill命令为了杀死它,因为普通用户(例如你的应用程序进程)不能杀死root拥有的进程。

另一种可能性是看是否有某些东西可以使该过程自行退出。