8

SDK エミュレーターでの Android アプリのトレースについてサポートが必要です。

これが私のセットアップです:

エミュレーターに接続された Android API 4.03 ADB シェルを実行している Android SDK エミュレーターがあります。

ADB install filename.apk を使用して APK をインストールできます

ADB シェルを使用してアプリを実行できますam start -a android.intent.action.Main -n com.akproduction.notepad/com.akproduction.notepad.NoteList

(ADBシェル)を使用してstraceしようとしましstrace am start -a android.intent.action.Main -n com.akproduction.notepad/com.akproduction.notepad.NoteListたが、何も得られません!

Android アプリの実行時の動作とそのインストールをどのようにトレースしますか?

(PS テスト アプリはここにあります

4

7 に答える 7

10

「am start」コマンドはアプリケーションを直接実行しません。あなたの例では、特定のアクティビティを開始するために必要なことは何でもするようにAndroidに指示するだけです。

このstraceコマンドは通常、次のように使用され、strace commandname command args起動しますcommandname-- 簡単ですが、この Android の使用例では役に立ちません。ただし、strace に-pは便利なオプションがありますstrace -p <process id>。指定された ID でプロセスのトレースを開始できます。

Android システムで入力psすると、その名前でプロセスを見つけることができますcom.akproduction.notepad(おそらく、デフォルトではプロセスの名前は Android パッケージにちなんで付けられますが、マニフェストで変更することができます)。その後、たまたまどこにいても追跡を開始できます。

プロセスの早い段階で問題をキャッチする必要がある場合は、コードを変更してトレースの準備が整うまで遅延させるか、少なくともプロセスを開始する前にプロセスを実行する必要があります。アクティビティ。2 番目のオプションは、多くの場合、アクティビティを開始して [戻る] ボタンを使用し、トレースを準備してからアクティビティを再開するのと同じくらい簡単ですが、これは常にアプリケーション固有のコードです。

于 2012-08-28T20:27:43.157 に答える
9

Android アプリは、実際には zygote プロセスを fork することによって開始されるため、zygote プロセスをトレースし、子プロセス (「-f」) をたどることで、アプリの初期化をトレースできます。

setenforce 0  # In Android 4.3 and later, if SELinux is enabled, strace will fail with "strace: wait: Permission denied"

set `ps | grep zygote` ; strace -p $2 -f -tt -T -s 500 -o /sdcard/strace.txt
于 2014-10-28T14:29:21.877 に答える
4

これは、プロセス IDamを取得し、アプリの起動直後に strace にパイプするワンライナーです。最初のいくつかの命令は実行されませんが、私のニーズには十分早い段階で開始されます。

am start -n com.packagename.here\.ActivityName && set `ps | grep com.packagename.here` && strace -p $2

于 2014-08-19T20:48:08.147 に答える
4

これは、この問題を解決するために今日使用したいワンライナー ハックです。プログラムに既知の名前があると仮定すると、プロセスが表示されたらすぐにプロセスに接続してみてください。この例では、open へのすべての呼び出しに関心があります。

while true; do
  while ! ps  | grep -q -i MyProgram; do :; done;
  ps | grep -i MyProgram | while read a b c; do
   strace -e open -f -p $b;
  done;
done
于 2013-06-13T14:18:07.543 に答える
2

アプリを開始する前に、zygote プロセスで strace を開始し、フォークに従うことをお勧めします。Zygote プロセスは、アプリを含め、Android ですべての新しいプロセスがフォークされるメイン プロセスです。次に、関心のある PID に基づいてログをフィルター処理することができます。例:

ps受精卵

受精卵の PID を取得し、次に

strace -f -p < zygote_PID >

于 2015-09-23T22:14:11.843 に答える