Android не может запустить logcat из приложения - PullRequest
0 голосов
/ 02 июня 2011

Итак, я пишу профилировщик, который должен иметь возможность регистрировать исключения во время сеанса профилирования. Мой план состоял в том, чтобы использовать 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 - это объект Process , который я затем вызываю exceptionLogger.destroy() после завершения сеанса профилирования.

Поведение, которое я наблюдаю, заключается в том, что файл создается там, где я его укажу, но в файле никогда не выводятся данные журнала. Я использую приложение dev tools в эмуляторе, чтобы принудительно отображать необработанное исключение в журналах, но мой выходной файл logcat остается пустым. Есть мысли?

РЕДАКТИРОВАТЬ: Поэтому, когда я захожу в оболочку adb, а затем SU для учетной записи пользователя, которая назначена моему приложению, я вижу следующее при запуске logcat:

Unable to open log device '/dev/log/main': Permission denied

Я думал, что добавление разрешения манифеста в мое приложение позволит мне сделать это?

Ответы [ 2 ]

13 голосов
/ 02 июня 2011

Мораль этой истории такова: дважды проверьте, что в вашем разрешении в файле манифеста действительно указано READ_LOGS, а не только READ_LOG.

image

1 голос
/ 18 декабря 2012

На всякий случай, если кто-то столкнется с той же проблемой, с которой я столкнулся: при попытке прочитать logcat из модульного теста необходимо добавить разрешение в тестируемое приложение, а не в тестовый проект. Добавление разрешения только в тестовый проект все равно приведет к ошибкам разрешения.

...