在我的应用程序中,我创建了一个进程,用于将从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进程保持活着
答案 0 :(得分:1)
我怀疑如果您使用被黑客攻击的su
填充程序以root身份启动进程,那么要真正杀死它,您还必须使用su
启动kill
命令为了杀死它,因为普通用户(例如你的应用程序进程)不能杀死root拥有的进程。
另一种可能性是看是否有某些东西可以使该过程自行退出。