it-swarm.com.ru

Сохранение Logcat в текстовый файл на устройстве Android

Я обнаружил некоторые сбои при запуске приложения на устройстве Android, которое не отображается в эмуляторе. Поэтому мне нужно сохранить Logcat в текстовом файле в памяти моего устройства или на SD-карте. Не могли бы вы предложить мне хороший способ сделать это?

18
Nithin Michael

используйте класс 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" />

Теперь запустите ваше приложение и перейдите к «/ ваше внешнее хранилище/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");
59
HeisenBerg
adb Shell logcat -t 500 > D:\logcat_output.txt

Перейдите в свой терминал/командную строку и перейдите в папку с adb, если она еще не добавлена ​​в переменные среды, и вставьте эту команду. 

т это число строк, которые нужно просмотреть 

D:\logcat_output.txt - это место, где будет храниться ваш logcat.

12
smophos

Используйте опцию -f с logcat в вашем классе:

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

Это сбросит журналы на файл, сохраненный устройством.

Обратите внимание, что путь "/ sdcard /" может быть доступен не на всех устройствах. Вы должны использовать стандартные API для доступа к внешнему хранилищу .

10
Green goblin

Пока я не могу комментировать, я опубликую это как ответ

Я сделал, как сказал @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

6
Carlos Eduardo Millani

Добавьте разрешение манифеста:

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

Если вам нужно только сохранить logcat (без вашей кодировки), вы можете использовать приложения aLogrec или aLogcat из Google Play.

Магазин Google Play: aLogcat & aLogrec

1
Tapa Save

Видимо Android.permission.READ_LOGS предоставляется системным приложениям только в последних версиях Android.

0
Pablo Valdes