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

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

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

Вот несколько скриншотов:

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

  • Далее, это то, что выглядит журнал в шестнадцатеричном редакторе: hex editor «> </a> </p> </li>
</ul>
<p> Я использую Galaxy Nexus для запуска Jelly Bean. Журналы были собраны с использованием root и эмулятора терминала, поскольку aLogcat, похоже, не использует root и, следовательно, не может получить доступ ко всей информации о регистрации. </p></body></html>

8 голосов | спросил Scott Severance 1 +04002012-10-01T19:54:13+04:00312012bEurope/MoscowMon, 01 Oct 2012 19:54:13 +0400 2012, 19:54:13

2 ответа


6

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

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

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

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

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

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

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

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

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

aLogCat Log Collector

Мост отладки Android (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 {[email protected], 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 - которая вызывает все вышеперечисленное и связывает ее для хороший, humm, сообщение об ошибке разработчику ...

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

ответил Izzy 2 +04002012-10-02T00:23:49+04:00312012bEurope/MoscowTue, 02 Oct 2012 00:23:49 +0400 2012, 00:23:49
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 logs msg интерпретируется следующим образом ( источник ):

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

Если это сообщение усечено, может отсутствовать конечный \0.

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

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

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132