8

我需要有关在 SDK 模拟器中跟踪 Android 应用程序的帮助。

这是我的设置:

我有一个 Android SDK 模拟器,运行连接到模拟器的 Android API 4.03 ADB shell。

我可以使用 ADB install filename.apk 安装 APK

我能够使用 ADB shell 运行应用程序am start -a android.intent.action.Main -n com.akproduction.notepad/com.akproduction.notepad.NoteList

我尝试使用(ADB shell)进行 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命令通常用作 instrace commandname command args并启动commandname- 很简单,但在这个 Android 用例中,没有帮助。但是,strace 有一个-p对您有帮助的选项:strace -p <process id>将让您开始使用指定的 id 跟踪进程。

如果您ps在 Android 系统上键入,您可以使用名称找到进程com.akproduction.notepad(可能;默认情况下,进程以其 Android 包命名,但可以在清单中更改它)。然后你可以开始追踪它,无论它在哪里。

如果您需要在流程的早期捕获事物,您需要修改代码以使其延迟,直到您准备好跟踪它,或者您至少需要在开始之前让流程运行活动。第二个选项通常与启动活动一样简单,然后使用后退按钮,然后准备好跟踪,然后再次启动活动——但这始终是特定于应用程序的代码。

于 2012-08-28T20:27:43.157 回答
9

Android 应用程序实际上是通过 fork zygote 进程启动的,因此您可以通过跟踪 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

这是我今天用来解决这个问题的一个丑陋的单线黑客。假设程序有一些已知的名称,只要它一出现就尝试附加到该进程。在此示例中,我对所有打开调用感兴趣。

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 回答
4

这是一个单行程序,它在启动应用程序后立即获取进程 ID并将其通过管道传输到 strace 。am您不会执行前几条指令,但它足够早地满足我的需要。

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

于 2014-08-19T20:48:08.147 回答
2

我建议在启动您的应用程序之前在 zygote 进程上启动 strace 并遵循分叉。Zygote 进程是 Android 中每个新进程的主要进程,包括您的应用程序。然后,您可能希望根据您感兴趣的 PID 过滤日志。示例:

ps合子

得到zygote PID,然后

strace -f -p < zygote_PID >

于 2015-09-23T22:14:11.843 回答
1

我找到了一个棘手的方法来做到这一点,并保证所有的系统调用都会被捕获。即使应用程序不可调试,也可以这样做:

  • 设置活动管理器am-w
  • 手动启动应用程序(您只需单击其图标上的屏幕或调用它am start
  • 在应用程序停止的情况下,获取其 PID
  • 得到它的 PID,调用 strace 来跟踪这个进程
  • 最后,附加调试器以便开始执行。

以下是步骤:

adb shell # shell into the device
am set-debug-app -w com.package.name # put app to debug mode
am start com.package.name/com.path.to.MainActivity # start the app
ps -A | grep com.package.name # this will show you the PID
strace -p <PID> > appoutput.txt 2> appstrace.txt 
# strace the program and record its output and strace in txt files

现在只需附加调试器并享受,例如,您可以在 Android Studio 或 Eclipse 中执行此操作。从这一点开始执行将开始,您将能够从第一行代码开始跟踪它。

于 2018-10-09T03:03:25.597 回答
0

如果您具有 root 访问权限或设备在未启用 SELinux 的情况下运行,那么您可以按照 Android 站点的方式进行操作:

设置设备,以便您可以运行 strace。您需要成为 root,禁用 SELinux,然后重新启动运行时以删除 seccomp 过滤器,否则会阻止 strace 运行: adb root adb shell setenforce 0 adb shell stop adb shell start

为 strace 日志设置一个全局可写目录,因为 strace 将在应用程序的 uid 下运行: adb shell mkdir -m 777 /data/local/tmp/strace

选择要跟踪的进程并启动它: adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'

正常启动该过程。

https://source.android.com/devices/tech/debug/strace#app-strace

于 2019-11-20T01:16:00.630 回答