2014-05-29 7 views
1

내 애플리케이션에서 logcat에서 추출한 로그 파일을 Android 디바이스에 기록하는 프로세스를 만듭니다. 이렇게하려면 을 사용하여 을 su 권한으로 실행하고 사용자가 로그를 취소 할 수 있도록이 프로세스에 대한 참조를 유지합니다.Android (Jelly Bean)에서 프로세스를 종료하는 방법

이 문제는 내 안드로이드 버전 (4.1)에 내가 this을 확인한 후 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) 

를 호출 할 때 나는이 예외를 얻을, 그래서 내 코드, 제안 된 솔루션을 내 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(); 
    } 
} 
,369을 같이하다

고마워요!

편집 :이 코드는 루팅 된 장치에서 실행될 예정이므로 su은 문제가되지 않습니다.

또한, 나는 내가 killall logcat처럼 뭔가를 할 수 알고 있지만 나는 살아

+0

'su'는 대부분의 Android 기기에서 사용할 수 없습니다. 이것은 루팅 된 장치에만 해당되는 것입니까? – Karakuri

+0

기본적으로 루트가있는 특정 안드로이드 장치를위한 것입니다 –

+0

프로세스 PID를 가져 와서'kill '명령을 보내려고 했습니까? – m0skit0

답변

1

난 당신이 루트로 프로세스를 시작하기 위해 해킹 su 심을 사용하는 경우, 다음 문자 그대로 당신을 죽일 것으로 의심되는 또 다른 로그 캣 프로세스를 유지하려면 일반 사용자 (예 : 응용 프로그램 프로세스)가 root가 소유 한 프로세스를 종료 할 수 없기 때문에 su을 사용하여 kill 명령을 실행해야합니다.

다른 가능성은 프로세스가 자체적으로 종료 될 수있는 것이 있는지 확인하는 것입니다.

+0

아직 테스트하지 않았지만 당신이 옳다고 생각합니다.이 앱을 시스템 애플리케이션으로 실행하여 작동하는지 확인합니다. 그 동안 나는 "killall logcat"을 사용하여 귀하의 회신에 감사드립니다. –

+0

"시스템 앱"은 루트와 아무 관련이 없습니다. –