Androidデバイスでエミュレータを表示していないときにアプリケーションを実行中にいくつかのクラッシュを発見しました。そのため、LogcatをデバイスのメモリまたはSDカードのテキストファイルに保存する必要があります。これを行うための良い方法を教えてください?
アプリの先頭でApplicationクラスを使用します。これにより、適切なファイルとログの処理が可能になります。以下に例を示します。このコードは、「MyPersonalAppFolder」という名前の新しいフォルダーと「log」という名前の別のフォルダーをパブリック外部ストレージに追加します。その後、logcat出力が消去され、新しいlogcat出力がlogcatXXX.txtという新しいファイルに書き込まれます。XXXは、現時点でのミリ秒の時間です。
public class MyPersonalApp extends Application {
/**
* Called when the application is starting, before any activity, service, or receiver objects (excluding content providers) have been created.
*/
public void onCreate() {
super.onCreate();
if ( isExternalStorageWritable() ) {
File appDirectory = new File( Environment.getExternalStorageDirectory() + "/MyPersonalAppFolder" );
File logDirectory = new File( appDirectory + "/log" );
File logFile = new File( logDirectory, "logcat" + System.currentTimeMillis() + ".txt" );
// create app folder
if ( !appDirectory.exists() ) {
appDirectory.mkdir();
}
// create log folder
if ( !logDirectory.exists() ) {
logDirectory.mkdir();
}
// clear the previous logcat and then write the new one to the file
try {
Process process = Runtime.getRuntime().exec("logcat -c");
process = Runtime.getRuntime().exec("logcat -f " + logFile);
} catch ( IOException e ) {
e.printStackTrace();
}
} else if ( isExternalStorageReadable() ) {
// only readable
} else {
// not accessible
}
}
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if ( Environment.MEDIA_MOUNTED.equals( state ) ) {
return true;
}
return false;
}
/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if ( Environment.MEDIA_MOUNTED.equals( state ) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals( state ) ) {
return true;
}
return false;
}
}
.manifestファイルに正しい権限が必要です:
<uses-permission Android:name="Android.permission.READ_LOGS" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
アプリケーションを実行し、「/ your external storage/MyPersonalAppFolder/logs /」に移動します
そこにログファイルがあります。
ソース: http://www.journal.deviantdev.com/Android-log-logcat-to-file-while-runtime/
編集:
特定のアクティビティのみのログを保存する場合。
交換:
process = Runtime.getRuntime().exec("logcat -f " + logFile);
で:
process = Runtime.getRuntime().exec( "logcat -f " + logFile + " *:S MyActivity:D MyActivity2:D");
adb Shell logcat -t 500 > D:\logcat_output.txt
ターミナル/コマンドプロンプトに移動し、adbが含まれるフォルダーに移動します(環境変数にまだ追加されていない場合)。このコマンドを貼り付けます。
tは、表示する必要がある行数です
D:\ logcat_output.txtは、logcatが保存される場所です。
クラスのlogcatで-fオプションを使用します。
Runtime.getRuntime().exec("logcat -f" + " /sdcard/Logcat.txt");
これにより、ファイルが保存されたデバイスにログがダンプされます。
パス「/ sdcard /」はすべてのデバイスで使用できるわけではないことに注意してください。 外部ストレージにアクセスするための標準API を使用する必要があります。
まだコメントできないので、これを回答として投稿します
@HeisenBergが言ったように私はうまくいきましたが、Android 6.0以降では 許可を求める 実行時に必要なので、以下を追加する必要がありました:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if(checkSelfPermission(Android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}
そして電話する
process = Runtime.getRuntime().exec("logcat -f " + logFile);
コールバックのみonRequestPermissionsResult
マニフェストのアクセス許可を追加します。
uses-permission Android:name="Android.permission.READ_LOGS"
private static final String COMMAND = "logcat -d -v time";
public static void fetch(OutputStream out, boolean close) throws IOException {
byte[] log = new byte[1024 * 2];
InputStream in = null;
try {
Process proc = Runtime.getRuntime().exec(COMMAND);
in = proc.getInputStream();
int read = in.read(log);
while (-1 != read) {
out.write(log, 0, read);
read = in.read(log);
}
}
finally {
if (null != in) {
try {
in.close();
}
catch (IOException e) {
// ignore
}
}
if (null != out) {
try {
out.flush();
if (close)
out.close();
}
catch (IOException e) {
// ignore
}
}
}
}
public static void fetch(File file) throws IOException {
FileOutputStream fos = new FileOutputStream(file);
fetch(fos, true);
}
どうやらAndroid.permission.READ_LOGSはAndroidの最新バージョンのシステムアプリにのみ付与されます。
Logcatを(コーディングなしで)保存するだけの場合は、Google PlayのaLogrec
またはaLogcat
アプリケーションを使用できます。
Google Playストア: aLogcat&aLogrec