35

Android デバイスでアプリケーションを実行しているときに、エミュレーターに表示されないクラッシュがいくつか見つかりました。そのため、Logcat をデバイスのメモリまたは SD カードのテキスト ファイルに保存する必要があります。これを行うための良い方法を教えてください。

4

9 に答える 9

84

アプリの冒頭で Application クラスを使用します。これにより、適切なファイルとログの処理が可能になります。

以下のコードは、次の場所にログ ファイルを作成します。

/ExternalStorage/MyPersonalAppFolder/logs/logcat_XXX.txt

XXX はミリ秒単位の現在の時刻です。アプリを実行するたびに、新しい logcat_XXX.txt ファイルが作成されます。

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 + "/logs" );
            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" />

<application
    android:name=".MyPersonalApp"
    ... >

編集:

特定のアクティビティのみのログを保存したい場合..

交換:

process = Runtime.getRuntime().exec("logcat -f " + logFile);

と:

process = Runtime.getRuntime().exec( "logcat -f " + logFile + " *:S MyActivity:D MyActivity2:D");
于 2016-05-31T09:16:27.557 に答える
15
adb shell logcat -t 500 > D:\logcat_output.txt

ターミナル/コマンド プロンプトに移動し、adb が含まれるフォルダーに移動します (環境変数にまだ追加されていない場合)。このコマンドを貼り付けます。

t は、表示する必要がある行数です。

D:\logcat_output.txt は、logcat が保存される場所です。

于 2013-10-24T12:23:58.750 に答える
2

マニフェストのアクセス許可を追加します。

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);
}
于 2013-10-24T13:36:49.900 に答える
1

(コーディングなしで) logcat を保存するだけでよい場合は、Google Play のアプリケーションを使用aLogrecできます。aLogcat

Google Play ストア: aLogcat & aLogrec

于 2014-01-09T08:19:39.820 に答える