そのため、プロファイリングセッション中に例外をログに記録できる必要があるプロファイラーを作成しています。私の計画は、logcatを使用してSDカードまたは内部ストレージ上のファイルにダンプし、プロファイリングセッションが完了したら、ファイルを圧縮してサーバーに送信することでした。マニフェストにを追加しましたandroid.permission.READ_LOGS
。コードは次のとおりです。
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はProcessexceptionLogger.destroy()
オブジェクトであり、プロファイリングセッションが完了したときに呼び出します。
私が見ている動作は、ファイルが指定した場所に作成されているが、ファイルにログ出力がないことです。エミュレーターで開発ツールアプリケーションを使用して、未処理の例外を強制的にログに表示していますが、logcat出力ファイルは空のままです。何かご意見は?
編集:したがって、adbシェルに移動し、次にSUをアプリケーションに割り当てられたユーザーアカウントに移動すると、logcatを実行すると次のように表示されます。
Unable to open log device '/dev/log/main': Permission denied
アプリにマニフェスト権限を追加すると、これが可能になると思っていましたか?