Android:如何使用ADB shell启动应用程序

时间:2012-08-28 20:18:53

标签: android shell runtime adb strace

我需要帮助在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

7 个答案:

答案 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调用它
  • 应用程序暂停后,获取其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中进行操作。从这一点开始,将开始执行,并且从第一行代码开始,您就可以对其进行跟踪。

答案 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