2010-12-29 5 views
1

Ich will Android Systemebene Protokoll lesen file.So Ich verwende den folgenden Code ein:Wie starte ich einen Prozess zum Ausführen von Logcat auf Android?

 Process mLogcatProc = null; 
    BufferedReader reader = null; 
    try { 
     mLogcatProc = Runtime.getRuntime().exec(
       new String[] { "logcat", "-d", 
         "AndroidRuntime:E [Your Log Tag Here]:V *:S" }); 

     reader = new BufferedReader(new InputStreamReader(mLogcatProc 
       .getInputStream())); 

     String line; 
     final StringBuilder log = new StringBuilder(); 
     String separator = System.getProperty("line.separator"); 

     while ((line = reader.readLine()) != null) { 
      log.append(line); 
      log.append(separator); 
     } 

    } 

    catch (IOException e) {} 
    finally { 
     if (reader != null) 
      try { 
       reader.close(); 
      } catch (IOException e) {} 

    } 

ich auch in AndroidManifest.xml verwendet. Aber ich kann keine Zeile lesen. Das StringBuilder-Protokoll ist leer. Und die Methode mlogcatProc.waitFor gibt 0 zurück.

Also wie kann ich das Protokoll lesen?

+0

Kannst du bitte die ": V *: S" Parameter erklären? – Behnam

Antwort

2

Sie kann nicht tun dies aus einer normalen (nicht suid) Android-Anwendung.

Dies ist, weil ein Prozess als root (oder von adb) ausgeführt werden muss, um die Logcat-Datei in Android zu lesen. Wenn auf Ihrem [gerooteten] Telefon ein Terminalemulator installiert ist, versuchen Sie, logcat auszuführen - es verweigert Ihnen die Berechtigung für den Protokollpuffer, es sei denn, Sie haben su als root.

Der Grund, dass Ihr StringBuffer leer ist, liegt daran, dass der Prozess die Fehlermeldung an stderr ausgibt (und Sie lesen stdin über Ihren BufferedReader).

+0

Danke. Aber ich lese Fehlermeldung nach Ihrem Vorschlag. Der StringBuilder ist immer noch leer. Der Code befindet sich übrigens in der onCreate-Methode einer Aktivität. – tangjie

+0

Sorry, ich sollte sagen, dass Sie das Protokoll nicht von einer normalen Android-Anwendung lesen können, da es als root ausgeführt werden muss. –

2

Der Code in ursprünglicher Post funktioniert, wenn Sie die entsprechende Berechtigung zu AndroidManifest.xml hinzufügen

<uses-permission android:name="android.permission.READ_LOGS" /> 

PS: Sie haben die "[Ihr Log Tag hier]" in Ihrem Code mit Ihrem tatsächlichen TAG ersetzen natürlich ;-)