Androidデバイスモニター(ADM)のサブセット機能を備えたAndroidアプリ(PCプログラムではありません)を作成したいと思います。電話機がどのコンピュータにも接続されておらず、ネットワークにアクセスしていない間に、詳細な情報(ADMが取得できるスタックトレースと時間などのすべての情報)を使用して、プロセスを選択してメソッド呼び出しをトレースします。Androidアプリは、デベロッパーオプションを有効にした電話で、別のプロセス/アプリのメソッドトレースを取得するにはどうすればよいですか?
私はandroid.os.Debug.startMethodTracing*
を検索しましたが、現在のプロセスだけをトレースすることができ、結果はファイルに書き込むことができます(私はメモリ内の情報が必要です)。
実装が見つかりませんでしたが、dalvik.system.VMDebug.startMethodTracing*
が見つかりましたが、アプリケーションでは使用できないようだし、pid
も指定する方法も見つかりませんでした。 JNI関数を呼び出すように見えますが、実装が見つかりませんでした。
おそらく、Linux perfイベント(perf_event_open(2)
)を使用して、より低いレベルの方法で情報を取得できます。しかし、これを行う前に、純粋にJavaで実装できるような種類の機能があるかどうかを知りたがっています(おそらく、「システムマネージャ」プロセスまたは「デバッグサーバー」プロセスとやりとりしたり、CLIツールを呼び出してstdoutを取得したり) ?
私はrootアクセス権を持っていれば、その情報を取得できますか?もしそうなら、どうですか?アプリは開発者によってのみ内部で使用されるので、私はそのようなことを気にしない。 – Giumo
はい、ルートアクセスが可能でなければなりません。 ADMソースとADBデーモンのソースを見て、どのような機能をADMが(adbデーモン経由で)実行しているかを理解する必要があります。そして、あなた自身のバイナリ/シェルスクリプト/ etcを使ってこれを模倣できるはずです。デバイス上でルートとして実行しています。 – JesusFreke
たとえば、https://android.googlesource.com/platform/tools/base/+/908b391a9c006af569dfaff08b37f8fdd6c4da89/ddmlib/src/main/java/com/android/ddmlib/Client.java#283を開始するとよいでしょう調査中。メソッドトレースを開始するために、プロセスにJDWPコマンドを送信するようです。最初のタスクは、JDWPをデバイス上で動作させる方法を理解することでしょう。 – JesusFreke