[システム]アンドロイドAndroidシステムのアップグレードプロセス分析(4)---アップグレードログデバッグ方法の間に回復

免責事項:この記事はブロガーオリジナル記事ですが、許可ブロガーなく再生してはなりません。https://blog.csdn.net/twk121109281/article/details/90898861

前の記事では、我々はリカバリモードのアップグレードプロセスを導入し、スクリプトの基本的な構文をアップグレードします。今日、私たちはどのようにアップグレードプロセスを見て、我々はより便利なデバッグ情報を取得する方法、デバッグ情報を追加する必要があります。


基本的な環境

Androidのバージョン:アンドロイド6.0

チップのハードウェア:H6チー

一般的なログ取得モード

私たちは、リカバリアップグレードをデバッグ、私たちは多くの場合、ログの回復を確認する必要があり、Googleの私たちが取得する必要があるコマンドを入力し、プリミティブロジック、回復ログはシリアルポートに直接出力されていない、我々は、以下の3つの方法があります。

    最初:回復、コマンドを入力して、猫の/tmp/recovery.log

    第二:次のandroid、入力したコマンド、猫/キャッシュ/回復/ last_log

この環境では、私は、あなたがデバッグ情報を再起動するために必要とされるビューので、毎回コマンドを入力し、[を通じてプロセスを参照する2番目の方法をログに記録することはできません。まだデバッグ情報を取得するための便利な方法はもうありません。はい、それはシリアルポートに直接ログ出力されます。

シリアルポートへの出力

時には我々は、我々は次の回復にコードを変更する必要があり、ターミナルのシリアルポートに直接回復ログ出力を配置する必要があります。

コードパス:ブート可能/回復/ recovery.cpp

出典:

static const char *TEMPORARY_LOG_FILE = "/tmp/recovery.log";
static void redirect_stdio(const char* filename) {
    // If these fail, there's not really anywhere to complain...
... ...
    //重定向输出
    freopen(filename, "a", stdout); setbuf(stdout, NULL);
    freopen(filename, "a", stderr); setbuf(stderr, NULL);
... ...
}
 
Int main(int argc, char **argv) {
    ... ...
    redirect_stdio(TEMPORARY_LOG_FILE);
    ... ...
}

レビュー:

私達はちょうどすることができ「は/ dev /コンソール」に変更「/tmp/recovery.log」があり、関数のパラメータをredirect_stdioする必要があります。

static const char *TEMPORARY_LOG_FILE = ”/dev/console”;

あなたが最初に確認することができますので、異なるプラットフォームは、異なる場合があります

エコー「111111111」>は/ dev /コンソール

シリアルポートに通常のプリント出力の下でテストするかどうか。

もちろん、私のいくつかのポットの友人が自宅でもあり、外部の画面がありますので、さらに便利にログを表示します。

画面に出力

インタフェース内のコールの回復は、画面に直接印刷することができます。

パス:

bootable/recovery/updater/install.h

void uiPrintf(State* state, const char* format, ...);

例:

uiPrintf(state, "%s: failed to mount %s at %s: %s\n",name, location, mount_point, strerror(errno));

出典:

static void uiPrint(State* state, const std::string& buffer) {
    UpdaterInfo* ui = reinterpret_cast<UpdaterInfo*>(state->cookie);

    // "line1\nline2\n" will be split into 3 tokens: "line1", "line2" and "".
    // So skip sending empty strings to UI.
    std::vector<std::string> lines = android::base::Split(buffer, "\n");
    for (auto& line: lines) {
        if (!line.empty()) {
            fprintf(ui->cmd_pipe, "ui_print %s\n", line.c_str());
            fprintf(ui->cmd_pipe, "ui_print\n");
        }
    }

    // On the updater side, we need to dump the contents to stderr (which has
    // been redirected to the log file). Because the recovery will only print
    // the contents to screen when processing pipe command ui_print.
    fprintf(stderr, "%s", buffer.c_str());
}

__attribute__((__format__(printf, 2, 3))) __nonnull((2))
void uiPrintf(State* state, const char* format, ...) {
    std::string error_msg;

    va_list ap;
    va_start(ap, format);
    android::base::StringAppendV(&error_msg, format, ap);
    va_end(ap);

    uiPrint(state, error_msg);
}

上記のリカバリーモードのアプリケーションで話していることのアップデータスクリプトスクリプト言語のプリントの見え方を見てみましょう、印刷する方法です。

アップデータスクリプトスクリプトのデバッグ情報

ui_print()メソッドを介して直接、一般的な印刷のデバッグ情報。次のように使用します。

構文:

ui_print( "STR");

説明:

スクリーン印刷出力「STR」

例えば:

ui_print("It's ready!");

スクリーン印刷は、それは準備ができています!

結論

これらは、私たちが助けることを願って、アップグレードプロセスのデバッグログです。興味がある学生は、当社のマイクロチャネル公共番号を集中することができます。

奨è¿éå¥Ã|þçÃ|è¿°

前:[]アンドロイドAndroidシステムのアップグレードプロセス分析システム(C)---更新スクリプトの構文(紙テール分析を含む実施例)

次へ:目次

おすすめ

転載: blog.csdn.net/twk121109281/article/details/90898861