Androidのログの形式は何ですか?


8

のログファイルを分析して、電話に関するデータを収集しようとしています/dev/log。私は特に見てい/dev/log/mainます。常識的なログ形式はプレーンテキストであると常に思っていましたが、これらのファイルはバイナリであるか、私もLinuxテキストエディタでも識別できない文字セットのように見えます。

形式は何ですか?

ここにいくつかのスクリーンショットがあります:

  • 最初に、ここで解釈されるログのスニペットを示しますvim^@nullバイトを参照します。他の色付きのコントロールシーケンスについてはわかりません)。 vim

  • 次に、これは16進エディタでのログの外観です。 16進エディタ

私はジェリービーンを実行しているギャラクシーネクサスを使用しています。aLogcatはrootを使用していないように見えるため、すべてのログ情報にアクセスできないため、ログはrootおよび端末エミュレータを使用して収集されました。

回答:


6

健全な情報が必要な場合は、健全なコマンドをお勧めします:)(攻撃を意味するものではなく、冗談です)。したがって、質問は次のようになります。

Androidデバイスからログ情報を取得するにはどうすればよいですか?

そして今、私たちはより良い側にいます。使用できる複数のアプローチがあります:

  • アプリを利用して(色分けされた)ログ情報を表示する
  • ADB(Android SDKの一部)を利用して、まったく同じ情報をリモートで抽出する
  • リモート(またはローカルターミナルアプリ)からsshを使用して、デバイスから直接情報を取得する

このトピックを完全に処理するには、この単純な答え以上のものが必要です(興味がある場合は、たとえば、多くのWebサイト、またはAndrew Hoogの著書Android Forensics:Investigation、Analysis and Mobile Security for Google Androidを参照してください)ドイツ語に翻訳できることを光栄に思います。

だから、私はあなたが始めるためにここにいくつかの例をあげます:

アプリの活用

このコンテキストでおそらく最もよく知られているアプリはaLogcatで、プレイストアで無料で入手できます(開発者は同じアプリの他のバリアントへの寄付を喜んで受け入れます)。下のスクリーンショットをご覧ください1。アプリを使用すると、ログをフィルタリングしたり、ログメッセージの記録を開始/停止したり、記録されたスニペットをSDカードに保存したりできます。もちろん、要求どおりにプレーンテキストで保存できます。

このセクションのもう1つのアプリはログコレクターです。これは、利用可能なログ全体を取得し、共有メニューから送信しようとするだけです2

aLogCat ログコレクター

Android Debug Bridge(ADB)

Androidソフトウェア開発キット(SDK)には、adbさまざまなタスク用のコマンドが含まれています。他の多くの中で、それはadb shellデバイス上でコマンドを実行することを提供します。これを使用して、必要なログ情報を収集することもできますadb shell。以下のコマンドの前にを付けます。

デバイスのコマンドプロンプト

ターミナルアプリ(AndroidターミナルエミュレーターターミナルIDEなど)を使用すると、デバイスのローカルのコマンドプロンプトでログに直接アクセスできます。もう少し快適ですが、これはデバイスでsshサーバー(DroidSSHdDropBear SSHサーバーなど)を実行して、コンピューターからアクセスできます。このようにして、ログを調査しながら、大画面で作業できます。

ログ情報にアクセスするためのコマンド

コマンドラインからログ情報にアクセスするために使用できる強力なコマンドはたくさんあります。ここではほんの数例を示します。

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開発者向けページで提供されている情報をお読みください。あなたに2つの例を与えるために:あなたはあなたのデバイスの無線モジュールに関するlogcat -b eventsイベントまたはlogcat -b radio情報をリストアップするでしょう。

dumpsysとdumpstate

2つのコマンドdumpsysdumpstate詳細なシステム情報を提供します。

$ 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これは、誰かが気づいたかどうかを確認するための私のお気に入りの1つです...いいえ、2番目の部分を忘れてください。
イジー

私はいつも正しいものを忘れてしまいます:)そして常にそれを検索するのが
面倒

3
すべてbash-auto-completionに敬意を表します:)さらに、私は自分の本の例をコピーして実際の例からコピーして貼り付けたので、どちらが正しいバージョンである必要があるかがわかりました。 ..
イジー

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

3バイト目と4バイト目を見れば、バージョンの違いを区別できます。形式は明らかにプラットフォームのエンディアンにも依存しています。v1メッセージの場合、__padと同じです0。v2(およびv3)メッセージは24(0x18)を使用します。

ためmainradioおよびsystemログmsgフィールドは、(以下のように解釈されるソース)。

  • 優先度:1バイト
  • タグ:0バイト以上
  • \0セパレーターとしてのリテラル
  • メッセージ:0バイト以上
  • \0ターミネーターとしてのリテラル

このメッセージが切り捨てられた場合、末尾\0が欠落している可能性があります。

eventsただし、ログの場合、msgフィールドには次のバイナリデータが含まれます。

  • タグ:「/ system / etc / event-log-tags」ファイルからの4バイトの整数キー。
  • メッセージ:ルートノードから始まるシリアル化されたツリー。各ツリーノードは、AndroidEventLogType列挙からの1バイトの値で始まります。
    • EVENT_TYPE_INT-ノード値は4バイト整数です
    • EVENT_TYPE_LONG-ノード値は8バイト整数です
    • EVENT_TYPE_STRING-ノード値は4バイト整数でlength、その後にlengthUTF8エンコードされた文字列を含むバイトが続きます
    • EVENT_TYPE_LIST-ノード値は1バイトでlength、その後にlengthそれぞれ独自のツリーノードが続きAndroidEventLogTypeます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.