2011-06-02 14 views
0

プロファイリングセッション中に例外を記録する必要があるプロファイラを作成しています。私の計画は、logcatを使用してSDカードまたは内部ストレージのいずれかにファイルをダンプし、プロファイリングセッションが完了したときにファイルを圧縮してサーバーに送信することでした。私は私のマニフェストにandroid.permission.READ_LOGSを追加し、次のように私のコードは次のとおりです。Androidはアプリケーションからlogcatを実行できません

public void startLoggingExceptions() { 
    String filename = null; 
    String directory = null; 
    String fullPath = null; 
    String externalStorageState = null; 

    // The directory will depend on if we have external storage available to us or not 
    try { 
     filename = String.valueOf(System.currentTimeMillis()) + ".log"; 
     externalStorageState = Environment.getExternalStorageState(); 

     if (externalStorageState.equals(Environment.MEDIA_MOUNTED)) { 
      if(android.os.Build.VERSION.SDK_INT <= 7) { 
       directory = Environment.getExternalStorageDirectory().getAbsolutePath(); 
      } else { 
       directory = ProfilerService.this.getExternalFilesDir(null).getAbsolutePath(); 
      } 
     } else { 
      directory = ProfilerService.this.getFilesDir().getAbsolutePath(); 
     } 

     fullPath = directory + File.separator + filename; 

     Log.w("ProfilerService", fullPath); 
     Log.w("ProfilerService", "logcat -f " + fullPath + " *:E"); 

     exceptionLogger = Runtime.getRuntime().exec("logcat -f " + fullPath + " *:E"); 
    } catch (Exception e) { 
     Log.e("ProfilerService", e.getMessage()); 
    } 
} 

exceptionLoggerが、私はその後、プロファイリングセッションが完了したときにexceptionLogger.destroy()を呼び出すProcessオブジェクトです。

私が見ている動作は、ファイルが指定された場所に作成されますが、ファイルに出力されることはありません。エミュレータでdevツールアプリケーションを使用して、未処理の例外を強制的にログに表示していますが、logcat出力ファイルは空のままです。何かご意見は?

EDIT:logcatを実行しているときに、私はadbのシェルに行くとき、その後、SU自分のアプリケーションに割り当てられているユーザーアカウントに、私は以下を参照してください。

Unable to open log device '/dev/log/main': Permission denied 

私は追加することを考えていました私のアプリへの明示的な許可は私にこれを可能にするでしょうか?

+0

これは不思議です、あなたの 'Runtime.getRuntime()。exec(" ... ")の部分は私のデバイス上で動作します。 – inazaruk

答えて

13

そして物語の道徳は:あなたのマニフェストファイルのあなたの許可がREAD_LOGSだけでなくREAD_LOGSを実際に言っているかを再確認してください。

+9

+1フェイスパーム –

1

念の誰かでは私が持っていた同じ問題に実行されます:ユニットテストからlogcatを読み取ろうとすると、アクセス権は、テスト対象のアプリケーションではなく、テストプロジェクトに追加する必要があります。テストプロジェクトにのみ権限を追加すると、権限エラーが発生します。

関連する問題