プロファイリングセッション中に例外を記録する必要があるプロファイラを作成しています。私の計画は、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
私は追加することを考えていました私のアプリへの明示的な許可は私にこれを可能にするでしょうか?
これは不思議です、あなたの 'Runtime.getRuntime()。exec(" ... ")の部分は私のデバイス上で動作します。 – inazaruk