我需要帮助在SDK模拟器中支持Android应用程序。
这是我的设置:
我有一个运行Android API 4.03 ADB shell的Android SDK模拟器连接到模拟器。
我可以使用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 am start -a android.intent.action.Main -n com.akproduction.notepad/com.akproduction.notepad.NoteList
但我什么都没得到!
如何跟踪Android应用及其安装的运行时行为?
(P.S。测试应用程序位于here。
答案 0 :(得分:10)
“am start”命令不会直接运行您的应用程序;它只是告诉Android做任何必要的事情,在你的例子中,开始一个特定的活动。
strace
命令通常用于strace commandname command args
,它会启动commandname
- 很简单,但在此Android用例中,没有帮助。但是,strace有一个-p
选项对您有帮助:strace -p <process id>
将允许您开始使用指定的ID跟踪进程。
如果您在Android系统上键入ps
,则可以找到名为com.akproduction.notepad
的进程(可能;默认情况下,进程是以其Android程序包命名的,但可以在清单中更改)。然后你可以开始对它进行支撑,无论它发生在哪里。
如果你需要在过程的早期发现事情,你需要修改代码以使其延迟,直到你准备好追踪它,或者你至少需要在开始活动之前使进程运行。第二个选项通常就像启动活动一样简单,然后使用后退按钮,然后准备好跟踪,然后再次启动活动 - 但这始终是应用程序特定于代码。
答案 1 :(得分:8)
Android应用程序实际上是通过分配zygote进程启动的,因此您可以通过跟踪zygote进程和跟踪子进程(&#39; -f&#39;)来跟踪应用程序初始化:
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
答案 2 :(得分: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
答案 3 :(得分:3)
这是grabs the process id的单行,并在am
启动应用后立即对其进行管道处理。你不会得到执行的前几条指令,但它会尽早开始,以满足我的需求。
am start -n com.packagename.here\.ActivityName && set `ps | grep com.packagename.here` && strace -p $2
答案 4 :(得分:1)
我建议您在启动应用程序之前先启动zygote进程并跟踪分叉。 Zygote流程是Android中每个新流程分叉的主要流程,包括您的应用程序。然后,您可能希望根据您感兴趣的PID过滤日志。示例:
ps zygote
获取zygote PID,然后
strace -f -p&lt; zygote_PID&gt;
答案 5 :(得分:1)
我已经找到了一种技巧,可以确保所有的系统调用都可以被捕获。即使该应用不可调试也可以做到:
am
),以使用-w
选项将应用置于调试模式,该选项将暂停其执行,直到将其附加到调试器为止。am start
调用它以下是步骤:
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中进行操作。从这一点开始,将开始执行,并且从第一行代码开始,您就可以对其进行跟踪。
答案 6 :(得分:0)
如果您具有root用户访问权限,或者设备在未启用SELinux的情况下运行,那么您可以从Android网站上进行操作:
设置设备,以便您可以运行strace。您需要是root用户,禁用SELinux,然后重新启动运行时以删除seccomp过滤器,否则它将阻止strace运行: 亚行根 亚行shell setenforce 0 亚行外壳停止 adb shell启动
为strace日志设置世界可写目录,因为strace将在应用程序的uid下运行: 亚行外壳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