Какой формат журналов Android?

8

Я пытаюсь собрать данные о моем телефоне, анализируя файлы журнала в /dev/log. Я специально смотрю на /dev/log/main. Я всегда думал, что любой нормальный формат журнала - это простой текст, но эти файлы выглядят либо двоичными, либо в некотором наборе символов, который не может определить ни я, ни мои текстовые редакторы Linux.

Какой формат?

Вот пара скриншотов:

  • Во-первых, вот фрагмент журнала, интерпретируемый как vim( ^@относится к нулевому байту; я не уверен насчет других цветных управляющих последовательностей): напор

  • Далее, вот как выглядит журнал в шестнадцатеричном редакторе: шестнадцатеричный редактор

Я использую Galaxy Nexus под управлением Jelly Bean. Журналы были собраны с использованием root и эмулятора терминала, поскольку aLogcat, похоже, не использует root и, следовательно, не может получить доступ ко всей информации журналирования.

Скотт Северанс
источник

Ответы:

6

Если вам нужна вменяемая информация, я рекомендую вменяемые команды :) (без обид, просто шучу). Поэтому вопрос должен гласить:

Как получить информацию журнала с устройства Android?

И теперь мы на лучшей стороне. Существует несколько подходов, которые можно использовать:

  • использовать приложения для отображения (с цветовой кодировкой) информации журнала
  • использовать ADB (часть Android SDK) для удаленного извлечения той же информации
  • используйте ssh с удаленного компьютера (или приложения локального терминала) для получения информации непосредственно с устройства

Чтобы полностью разобраться с этой темой, требуется нечто большее, чем этот простой ответ (если вы заинтересованы, например, вы можете найти более подробную информацию на многих веб-сайтах или в книге Эндрю Хуга « Криминалистика Android: расследование, анализ и мобильная безопасность для Google Android» , где я честь переводить на немецкий. Вероятно, есть и много других источников.

Поэтому я приведу несколько примеров, чтобы вы могли начать:

Использование приложений

Вероятно, самым известным приложением в этом контексте является aLogcat , доступное бесплатно в игровом магазине (и разработчик с радостью примет ваше пожертвование для другого варианта того же приложения). Вы найдете скриншот ниже 1 . Приложение позволяет фильтровать журналы, запускать / останавливать запись сообщений журнала и даже сохранять записанные фрагменты на SD-карту - конечно, в виде простого текста, как вы и просили.

Другое приложение в этом разделе - Log Collector , который просто пытается захватить весь доступный журнал и отправить его через меню общего доступа 2 .

aLogCat Лог Коллектор

Android Debug Bridge (ADB)

Комплект разработчика программного обеспечения Android (SDK) включает adbкоманду для различных задач. Среди многих других, он предлагает adb shellвыполнять команды на устройстве. Используя это, вы также можете собрать желаемую информацию журнала: просто введите префикс ниже команд с adb shell.

Командная строка на устройстве

С помощью приложения терминала (например, Android Terminal Emulator или Terminal IDE ) вы можете получить доступ к журналам прямо из командной строки, локально на вашем устройстве. Немного более удобно, это можно сделать, запустив на своем устройстве ssh-сервер (например, DroidSSHd или DropBear SSH Server ) и получить к нему доступ со своего компьютера. Таким образом, вы можете работать на большом экране, изучая ваши журналы.

Команды для доступа к вашей информации журнала

Существует множество мощных команд, которые вы можете использовать для доступа к информации журнала из командной строки, и я приведу здесь лишь несколько примеров.

dmesg

Команда dmesgизвлекает журнал ядра:

$ dmesg
<6>[82839.126586] PM: Syncing filesystems ... done.
<7>[82839.189056] PM: Preparing system for mem sleep
<4>[82839.189361] Freezing user space processes ... (elapsed 0.05 seconds) done.
<4>[82839.240661] Freezing remaining freezable tasks ... (elapsed 0.00 seconds) done.
<7>[82839.242279] PM: Entering mem sleep
<4>[82839.242889] Suspending console(s) (use no_console_suspend to debug)
<7>[82839.252410] vfp_pm_save_context: saving vfp state
<6>[82839.252716] PM: Resume timer in 26 secs (864747 ticks at 32768 ticks/sec.)
<6>[82842.091369] Successfully put all powerdomains to target state
<6>[82842.092468] wakeup wake lock: wifi_wake

LogCat

С помощью logcatвы можете получить доступ ко многим данным журналов, но в большинстве случаев для этого потребуется root. Он имеет некоторые параметры для фильтрации информации, например, путем выбора буфера журнала для чтения -b. Пожалуйста, прочитайте информацию, предоставленную на странице разработчиков на LogCat для деталей. Чтобы дать вам два примера: logcat -b eventsперечислите события или logcat -b radioинформацию о модуле радиосвязи вашего устройства.

dumpsys и dumpstate

Две команды dumpsysи dumpstateдают вам подробную информацию о системе:

$ dumpsys
Currently running services:
    LocationProxyService
    SurfaceFlinger
    accessibility
    account
    activity
<snip>
DUMP OF SERVICE account:
Accounts: 1
    Account {name=xxxxxxx@googlemail.com, type=com.google}
<snip>
DUMP OF SERVICE alarm:

$ dumpstate
========================================================
== dumpstate: 2012-08-18 23:39:53
========================================================
Build: Gingerbread GWK74 - CyanogenMilestone2
Bootloader: 0x0000
Radio: unknown
<snip>
------ MEMORY INFO (/proc/meminfo) ------
MemTotal: 487344 kB
MemFree:   10436 kB
Buffers:   14136 kB
Cached:    145460 kB
<snip>

отчет об ошибке

И если вам лень вспоминать их все, просто используйте bugreportкоманду, которая вызывает все вышеперечисленное и связывает ее для красивого, хм, сообщения об ошибках для разработчика ...

Конечно, вы можете перенаправить вывод всех этих команд в файл для копирования на ваш компьютер, и в большинстве случаев вам следует это сделать - так как ваш экранный буфер будет слишком мал, чтобы справиться со всем этим: bugreport > /mnt/sdcard/bugreport.txtэто будет один пример для эта часть.

Иззи
источник
$ dmesgили dmsg? Должна быть опечатка в одном из них :)
jadkik94
@ jadkik94 это мой любимый способ проверить, замечает ли кто-нибудь ... Нет, забудьте про вторую часть - и спасибо, что заметили :) Исправлено.
Иззи
Я всегда забываю, какой из них правильный :), и всегда
ленюсь
3
Все приветствуют автоматическое завершение bash :) Более того: я скопировал примеры из своей книги, куда я скопировал их из реального примера, так что я знал, какая из них должна быть правильной версией. ..
Иззи
2
Изменение было связано с новым разрешением, необходимым для чтения журналов из других приложений. В настоящее время aLogcat может читать только свои логи. Чтобы заставить его читать журналы из других приложений, вам нужно вручную дать ему эти новые разрешения, например, так:adb shell pm grant com.nolanlawson.logcat android.permission.READ_LOGS
Chahk
4

Для разработчиков (или других заинтересованных сторон), которым необходимо проанализировать этот необработанный файл, вот несколько ресурсов:

Фактический формат формата журнала детализирован в:

Копия соответствующих частей, слегка аннотированная и переупорядоченная для вашего удобства:

#define LOGGER_ENTRY_MAX_LEN (5*1024)

struct log_msg {
    union {
        /* Maximum size of entry: 5121 bytes */
        unsigned char buf[LOGGER_ENTRY_MAX_LEN + 1];

        struct logger_entry_v3 entry;
        struct logger_entry_v3 entry_v3;
        struct logger_entry_v2 entry_v2;
        struct logger_entry entry_v1;
    } __attribute__((aligned(4)));
}
/*
 * The userspace structure for version 1 of the logger_entry ABI.
 * This structure is returned to userspace by the kernel logger
 * driver unless an upgrade to a newer ABI version is requested.
 */
struct logger_entry {
    uint16_t    len;    /* length of the payload */
    uint16_t    __pad;  /* no matter what, we get 2 bytes of padding */
    int32_t     pid;    /* generating process's pid */
    int32_t     tid;    /* generating process's tid */
    int32_t     sec;    /* seconds since Epoch */
    int32_t     nsec;   /* nanoseconds */
    char        msg[0]; /* the entry's payload */
} __attribute__((__packed__));

/*
 * The userspace structure for version 2 of the logger_entry ABI.
 * This structure is returned to userspace if ioctl(LOGGER_SET_VERSION)
 * is called with version==2; or used with the user space log daemon.
 */
struct logger_entry_v2 {
    uint16_t    len;    /* length of the payload */
    uint16_t    hdr_size; /* sizeof(struct logger_entry_v2) */
    int32_t     pid;    /* generating process's pid */
    int32_t     tid;    /* generating process's tid */
    int32_t     sec;    /* seconds since Epoch */
    int32_t     nsec;   /* nanoseconds */
    uint32_t    euid;   /* effective UID of logger */
    char        msg[0]; /* the entry's payload */
} __attribute__((__packed__));

struct logger_entry_v3 {
    uint16_t    len;    /* length of the payload */
    uint16_t    hdr_size; /* sizeof(struct logger_entry_v3) */
    int32_t     pid;    /* generating process's pid */
    int32_t     tid;    /* generating process's tid */
    int32_t     sec;    /* seconds since Epoch */
    int32_t     nsec;   /* nanoseconds */
    uint32_t    lid;    /* log id of the payload */
    char        msg[0]; /* the entry's payload */
} __attribute__((__packed__));

Различия между версиями можно различить, взглянув на третий и четыре байта. Формат, по-видимому, также зависит от порядкового номера вашей платформы. Для сообщений v1 __padравно 0. сообщения v2 (и v3) используют 24 ( 0x18).

Для получения main, radioи systemжурналы msgполе интерпретируется следующим образом ( источник ):

  • приоритет: 1 байт
  • тег: 0 или более байтов
  • буквально \0как разделитель
  • сообщение: 0 или более байтов
  • буквально \0как терминатор

Если это сообщение обрезано, трейлинг \0может отсутствовать.

Для eventsжурнала, однако, msgполе содержит следующие двоичные данные:

  • Тег: 4-байтовый целочисленный ключ из файла "/ system / etc / event-log-tags".
  • Сообщение: сериализованное дерево, начиная с корневого узла. Каждый узел дерева начинается с 1-байтового значения из перечисления AndroidEventLogType:
    • EVENT_TYPE_INT - значение узла составляет 4 байта
    • EVENT_TYPE_LONG - значение узла составляет 8 байтов
    • EVENT_TYPE_STRING - значение узла составляет 4 байта целое length, за которым следуют lengthбайты, содержащие строку в кодировке UTF8
    • EVENT_TYPE_LIST - значение узла является однобайтовым length, за которым следуют lengthузлы дерева, каждый из которых имеет свои собственные AndroidEventLogType.
Lekensteyn
источник