2012-05-14 3 views
2

다음 코드를 사용하여 PID에서 애플리케이션 이름을 가져옵니다.Android IO 프로세스를 실행하려고 할 때 예외가 발생합니다.

private static Pattern pidPattern = Pattern.compile("(\\d+).+?\\s+[DNRSTZ]\\s+(.+)$"); 

private final Map<Integer, String> pidNames = new HashMap<Integer, String>(); 

private void getAppNames() { 
    // Bad command: String commandLine = "adb shell ps"; 
    String line; 
    try { 
     Process process = Runtime.getRuntime().exec("ps"); 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
     Matcher matcher; 

     pidNames.clear(); 
     while((line = bufferedReader.readLine()) != null) { 
      matcher = pidPattern.matcher(line); 
      if(matcher.find()) { 
       int pid = Integer.valueOf(matcher.group(1)); 
       String name = matcher.group(2); 
       pidNames.put(pid, name); 
       Log.i(TAG, "Pid=" + pid + " Name=" + name); 
      } 
     } 
     bufferedReader.close(); 
     process.destroy(); 
    } 
    catch (IOException e) { 
     Log.e(TAG, "getAppNames failed", e); 
    } 
} 

그리고 I :
쉘 명령은

C:\android-sdk-windows\platform-tools>adb shell ps 
USER  PID PPID VSIZE RSS  WCHAN PC   NAME 
root  1  0  312 220 c009b74c 0000ca4c S /init 
root  2  0  0  0  c004e72c 00000000 S kthreadd 
root  3  2  0  0  c003fdc8 00000000 S ksoftirqd/0 
root  4  2  0  0  c004b2c4 00000000 S events/0 
root  27 1  740 316 c0158eb0 afd0d8ac S /system/bin/sh 
system 28 1  812 292 c01a94a4 afd0db4c S /system/bin/servicemanager 
root  29 1  3736 568 ffffffff afd0e1bc S /system/bin/vold 
system 68 33 191096 38680 ffffffff afd0db4c S system_server 
radio  131 33 147680 22868 ffffffff afd0eb08 S com.android.phone 
app_25 134 33 148784 25740 ffffffff afd0eb08 S com.android.launcher 
app_0  160 33 135560 20956 ffffffff afd0eb08 S android.process.acore 
root  316 40 740 332 c003da38 afd0e7bc S /system/bin/sh 
root  317 316 888 336 00000000 afd0d8ac R ps 

내 자바 코드는 (그들은 모두 모두 봐, 그냥 쉘 프롬프트에서 작동 보여, 내가 선을 많이 정돈)입니다 다음 메시지를 받으십시오.

05-14 17:09:00.220: E/BackTask(698): getAppNames failed 
05-14 17:09:00.220: E/BackTask(698): java.io.IOException: Error running exec(). Command: [adb shell ps, android.com] Working Directory: null Environment: [ANDROID_SOCKET_zygote=10, ANDROID_BOOTLOGO=1, EXTERNAL_STORAGE=/mnt/sdcard, ANDROID_ASSETS=/system/app, ASEC_MOUNTPOINT=/mnt/asec, PATH=/sbin:/system/sbin:/system/bin:/system/xbin, ANDROID_DATA=/data, BOOTCLASSPATH=/system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar, ANDROID_PROPERTY_WORKSPACE=9,32768, ANDROID_ROOT=/system, LD_LIBRARY_PATH=/system/lib] 
05-14 17:09:00.220: E/BackTask(698): at java.lang.ProcessManager.exec(ProcessManager.java:226) 
05-14 17:09:00.220: E/BackTask(698): at java.lang.ProcessBuilder.start(ProcessBuilder.java:201) 
05-14 17:09:00.220: E/BackTask(698): at com.delta.app.BackTask.getAppNames(BackTask.java:180) 
05-14 17:09:00.220: E/BackTask(698): at com.delta.app.BackTask.doInBackground(BackTask.java:65) 
05-14 17:09:00.220: E/BackTask(698): at com.delta.app.BackTask.doInBackground(BackTask.java:1) 
05-14 17:09:00.220: E/BackTask(698): at android.os.AsyncTask$2.call(AsyncTask.java:185) 
05-14 17:09:00.220: E/BackTask(698): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
05-14 17:09:00.220: E/BackTask(698): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
05-14 17:09:00.220: E/BackTask(698): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
05-14 17:09:00.220: E/BackTask(698): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
05-14 17:09:00.220: E/BackTask(698): at java.lang.Thread.run(Thread.java:1096) 
05-14 17:09:00.220: E/BackTask(698): Caused by: java.io.IOException: Permission denied 
05-14 17:09:00.220: E/BackTask(698): at java.lang.ProcessManager.exec(Native Method) 
05-14 17:09:00.220: E/BackTask(698): at java.lang.ProcessManager.exec(ProcessManager.java:224) 
05-14 17:09:00.220: E/BackTask(698): ... 10 more 

질문은 무엇입니까? 허가가 거부 되었습니까? 프로세스 호출 자체?

편집 : 당신은 안드로이드 OS 내에서 명령 줄을 실행하면

답변

3

, 당신은 "ADB 쉘 PS"를 실행하지 말아야 같은 IOException이 결과로

Process process = Runtime.getRuntime().exec(commandLine); 

; 라인을 시도 "ps"를 실행해야합니다!

장치 측면에는 "adb"실행 파일이 없습니다.

또한, 프로세스를 생성 할 수있는 더 좋은 방법과 같이이다 :

process = Runtime.getRuntime().exec("ps");

+0

은 언제나처럼, 내가 직접 발견 한하지 않는 바보 같은 느낌! 그것은 너무 간단했지만 내가 게시하기 전에 그것을 알아내는 데 2 ​​시간을 낭비했고 대답에서 9 문자 떨어져있었습니다. – ilomambo

+1

우리 중 최고 일입니다! –

관련 문제