3

Androidルートにinit.rcを追加しています:

service logcat /system/bin/logcat -v long -f /mnt/sdcard/logcat.log

このソリューションでは、ログは生成されません。logcat.log ファイルが存在しません。

init.rc を介して logcat 出力の収集を開始するにはどうすればよいですか?

4

2 に答える 2

5

上記の問題を引き起こしている可能性のあるいくつかの事柄: 1. サービスを logcat と呼ぶように定義した。これは、予約済みまたは既存の名前に非常に近いように見えます。私なら、より際立ったサービス名を選びます。2. サービスの明示的な開始トリガーがないため、サービスが定義されているコンテキスト (つまり、どの init フェーズ) に完全に依存しています。間違ったフェーズを選択すると (つまり、早すぎる)、/mnt が存在しないことさえあります。3. サービスはデフォルトで root として実行されるため、logcat.log ファイルは root によってのみ rw されます。ルートとしてプロセスを実行するのは良くありません。また、ログ ファイルを読み取るためにリーダーを強制的に root にするのは良くありません。

ここでは、あなたが探していることを達成するために私が使用したアプローチを示します。

問題: 通常、Android のログ メッセージはカーネルの (揮発性) メモリにのみ残るため、再起動後は保持されません。

解決策: これらのログ メッセージを再起動後も保持するには、それらを永続的なストレージ (つまり、ファイル システム) に書き込む必要があります。次のコードは、初期化中に Android によって開始されるサービスを定義します。

ステップ 1、このアクティビティを実行するために Android init プロセスが生成するサービスを定義します。これは init.rc に入ります。

service persistentLogging /system/bin/logcat -r 1024 -n 9 -v threadTime -f /cache/logs/log
    user system
    group system log
    disabled

上記に関する注意事項:

  1. start トリガーによって、persistentLogging というサービス (以下の 2 番目のステップで参照) を作成します。
  2. logcat に、ディレクトリ /cache/logs (つまり、log、log.1、log.2、… log.9) でローリング ログ ファイル (それぞれ 1Mb の 10 個のファイルで構成される) を作成するように要求します。ニーズに合わせて調整します。
  3. サービスはシステムユーザーとして実行されます。これは、ログ ファイルがシステムによってのみ読み書き可能になることを意味します。アプリにシステム権限がある場合は、ログ ファイルを読み取ることができます。また、サービスをログ グループにも定義しました。これは適切と思われるためです。
  4. サービスは最初は無効になっています。以下に定義されたトリガーによって開始されます
  5. サービスはワンショットではありません。したがって、それが停止した場合、Android は再起動を試みます。

ステップ 2、サービスを開始するためのトリガーを定義します。これは init.rc ファイルにも含まれます。

on post-fs
    mkdir /cache/logs 0775 system log
    start persistentLogging

上記に関する注意事項:

  1. コマンドは「post-fs」フェーズ中にトリガーされるため、ファイルシステム パーティションがマウントされた後、および他のシステム ディレクトリの権限が変更されたときに実行されます。理想的には、このサービスは重要ではなく、他のスタートアップ アクティビティでも使用されないため、できるだけ遅く開始する必要があります。
  2. トリガーは、サービスを開始する前に、まずターゲット ディレクトリを作成します。mkdir コマンド構文は、init.rc 言語によって定義されていることを思い出してください。Android では、この構文は sh 構文によく似ていますが、sh 構文ではありません。
  3. 上記のログ サービスは init の post-fs フェーズまで開始されませんが、これらのログ メッセージは既にカーネル バッファーにあり、このログ サービスは単にそれらのメッセージをコピーしているだけであるため、カーネルの起動開始以降のすべてのログ情報をダンプします。ファイルに。
  4. 上記の両方のコード フラグメントは、最終的には init.rc ファイルに含める必要がありますが、デバイス用に定義された init.${ro.hardware}.rc ファイルにこれらの追加を行うと、より保守しやすくなります。たとえば、init.rc によって自動的にインクルードされる init.freescale.rc です。
于 2014-08-27T17:14:40.270 に答える