2

Logcatが最後の行しか出力しないという苦情を誰かが見たことがあります。最後の行だけを出力するこの条件をどのように生成できるかという予備の質問をしたいと思います。

これは、スレッドを開始してログを読み取る方法です。

public class ReadLog implements Runnable{
        private boolean running = true;

        public void stop(){
            running = false;
        }

        @Override
        public void run() {
            Process proc = null;
            try {
                //Runtime.getRuntime().exec("/system/bin/logcat -c");
                proc = Runtime.getRuntime().exec("/system/bin/logcat ");
              }catch(IOException e) {
                   e.printStackTrace();
            }
            if(proc != null){
                BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                String line= null;
                try {
                    while((line=reader.readLine())!=null && running){
                        if(line.contains("specific word")){
                            doSomething();//do something base on log
                            running = false;
                        }
                    }
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
                finally{
                    proc.destroy();
                }
            }
        }
    }

最新の行だけを読みたい。Runtime.getRuntime().exec("/system/bin/logcat -c");問題は、実行を開始する前にログをクリアする行を追加しない限り、「特定の単語」が最後の行にない場合でも、doSomething()がトリガーされることです。

確かに、もう1つ追加while((line=reader.readLine())!=null && running){}して、実行を開始する前にBufferedReaderを最後の行に移動させることができますが、時間がかかり、遅すぎる可能性があります。

私は試しましたが、stdinを受け入れRuntime.getRuntime().exec("/system/bin/logcat | tail -n 1"); ない運はありません。tailstdoutの最後の行を。のようにすばやく出力するコマンドを求めていますtail -n 1 FILE

4

1 に答える 1

1

試すRuntime.getRuntime().exec("/system/bin/logcat -d | tail -n 1");

logcatのドキュメントによると->-d:「ログを画面にダンプして終了します。」

次に、readlineは最後の新しい行を返します。(私はそれをテストしませんでした)。

編集 :

実際| tail -n 1、「exec」では効果がありませんが、「-d」を使用すると、最後のログ行を簡単に取得できます。

try {
    //Executes the command.
    Process process = Runtime.getRuntime().exec(
        "/system/bin/logcat -d");

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

    String output;
    String lastLine = null;
    while ((output = reader.readLine()) != null) {
        lastLine = output;
    }
    reader.close();

    //Waits for the command to finish.
    process.waitFor();

    if(lastLine != null)
        System.out.println("Last log line : " + lastLine);
} catch (IOException e) {
    throw new RuntimeException(e);
} catch (InterruptedException e) {
    throw new RuntimeException(e);
}

マニフェストにREAD_LOGS権限を追加することを忘れないでください

<uses-permission android:name="android.permission.READ_LOGS" />
于 2012-05-11T01:29:31.887 に答える