it-swarm.com.de

Logcat in einer Textdatei auf einem Android-Gerät speichern

Ich hatte einige Abstürze beim Ausführen der Anwendung auf einem Android-Gerät gefunden, das im Emulator nicht angezeigt wird. Ich muss also den Logcat in einer Textdatei im Speicher oder auf der SD-Karte meines Geräts speichern. Könnten Sie mir bitte eine gute Methode vorschlagen?

18
Nithin Michael

verwenden Sie eine Anwendungsklasse am Anfang Ihrer App. Dies ermöglicht eine korrekte Datei- und Protokollverarbeitung. Hier ist ein Beispiel. Dieser Code fügt einen neuen Ordner mit dem Namen "MyPersonalAppFolder" und einen weiteren Ordner mit dem Namen "log" zum öffentlichen externen Speicher hinzu. Danach wird die logcat-Ausgabe gelöscht und die neue logcat-Ausgabe in eine neue Datei namens logcatXXX.txt geschrieben, wobei XXX die Millisekundenzeit zu diesem Zeitpunkt ist.

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;
    }
}

sie benötigen die richtigen Berechtigungen in Ihrer .manifest-Datei:

<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" />

Führen Sie nun Ihre Anwendung aus und gehen Sie zu "/ Ihrem externen Speicher/MyPersonalAppFolder/logs /".

Sie finden dort eine Logdatei.

source: http://www.journal.deviantdev.com/Android-log-logcat-to-file-while-runtime/

Bearbeiten:

wenn Sie das Protokoll nur für bestimmte Aktivitäten speichern möchten.

ersetzen:

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

mit:

process = Runtime.getRuntime().exec( "logcat -f " + logFile + " *:S MyActivity:D MyActivity2:D");
59
HeisenBerg
adb Shell logcat -t 500 > D:\logcat_output.txt

Gehen Sie zu Ihrem Terminal/zur Eingabeaufforderung und navigieren Sie zu dem Ordner mit adb, falls dieser noch nicht zu Ihren Umgebungsvariablen hinzugefügt wurde, und fügen Sie diesen Befehl ein. 

t sind die Nummernzeilen, die Sie anzeigen müssen 

D:\logcat_output.txt wird Ihr Logcat gespeichert.

12
smophos

Verwenden Sie die Option -f mit logcat in Ihrer Klasse:

Runtime.getRuntime().exec("logcat -f" + " /sdcard/Logcat.txt");

Dadurch werden die Protokolle auf das gespeicherte Gerät gespeichert.

Beachten Sie, dass der Pfad "/ sdcard /" möglicherweise nicht auf allen Geräten verfügbar ist. Sie sollten die Standard-APIs verwenden, um auf den externen Speicher zuzugreifen .

10
Green goblin

Da ich noch nicht kommentieren kann, werde ich dies als Antwort posten

Ich habe es wie @HeisenBerg gesagt, es funktionierte gut für mich, aber seit Android 6.0 müssen wir um Erlaubnis fragen zur Laufzeit muss ich folgendes hinzufügen:

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);
    }
}

Und Ruf an

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

Nur beim Rückruf onRequestPermissionsResult

Fügen Sie die Manifest-Berechtigung hinzu:

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);
}
2
d3n13d1

Wenn Sie nur das Logcat (ohne Ihre Codierung) speichern müssen, können Sie aLogrec oder aLogcat-Anwendungen von Google Play verwenden.

Google Play Store: aLogcat & aLogrec

1
Tapa Save

Anscheinend wird Android.permission.READ_LOGS nur System-Apps in den neuesten Android-Versionen gewährt.

0
Pablo Valdes