gpt4 book ai didi

android - 如何在 Android (Jelly Bean) 中终止一个进程

转载 作者:行者123 更新时间:2023-11-30 02:52:19 25 4
gpt4 key购买 nike

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

问题是:在我的 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();
}
}

谢谢!

编辑:这段代码将在获得 root 权限的设备中执行,因此 su 不会有问题。

此外,我知道我可以做类似killall logcat 的事情,但我想让另一个 logcat 进程保持 Activity 状态

最佳答案

我怀疑如果您使用被黑的 su shim 以 root 身份启动该进程,那么要真正杀死它,您还必须使用 su 来启动 kill 命令来杀死它,因为普通用户(例如您的应用程序进程)无法杀死 root 拥有的进程。

另一种可能性是查看是否有任何东西可以使进程自行退出。

关于android - 如何在 Android (Jelly Bean) 中终止一个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23936986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com