3

Android systrace ロギング システムは素晴らしいものですが、コードの Java 部分でしか機能しませTrace.beginSection()Trace.endSection()。コードの C/C++ NDK (ネイティブ) 部分では、JNI を介してのみ使用できます。これは、Java 環境のないスレッドでは遅いか使用できません...

イベントをメインの systrace トレース バッファに追加したり、ネイティブ C コードから別のログを生成したりする方法はありますか?

この古い質問では、Android の systrace が使用する内部システムとして atrace/ftrace について言及しています。これは(簡単に)利用できますか?

おまけ: トレース コールはパフォーマンスが重要なセクションにあることが多いため、実際のイベント時間の後にコールを実行できることが理想的です。つまり、呼び出し自体をポーリングするのではなく、ログに記録する時間を指定できるようにしたいと考えています。しかし、それはケーキのアイシングにすぎません。

4

3 に答える 3

7

NDKから公開されているとは思いません。

ソースを見ると、android.os.Trace クラスがネイティブ コードを呼び出して実際の作業を行っていることがわかります。そのコードは、cutilsライブラリのヘッダーで宣言されている と をatrace_begin()呼び出します。atrace_end()

完全なソース ツリーからヘッダーを抽出し、内部ライブラリにリンクすると、atrace 関数を直接使用できる場合があります。atrace_begin()ただし、単純なヘッダーから次のことがわかります。

static inline void atrace_begin(uint64_t tag, const char* name)
{
    if (CC_UNLIKELY(atrace_is_tag_enabled(tag))) {
        char buf[ATRACE_MESSAGE_LENGTH];
        size_t len;
        len = snprintf(buf, ATRACE_MESSAGE_LENGTH, "B|%d|%s", getpid(), name);
        write(atrace_marker_fd, buf, len);
    }
}

イベントは、トレース ファイル記述子に直接書き込まれます。(タイムスタンプはイベントの一部ではないことに注意してください。これは自動的に追加されます。)コードで同様のことを行うことができます。ファイルがどのように開かれるかを確認するatrace_init_once() には、.c ファイルを参照してください。

atrace が NDK の一部として公開されていない限り、atrace を使用するコードは移植性がなく、Android の過去または将来のバージョンで失敗する可能性があることに注意してください。ただし、systrace はデバッグ ツールであり、実際にアプリで有効にして出荷したいものではないため、互換性はおそらく問題になりません。

于 2015-01-19T02:19:16.373 に答える