虽然可以像其他人所描述的那样开发可以直接从 shell 启动的独立应用程序,但听起来您的代码在 Android 应用程序框架中运行。因此,您没有可执行文件,而是有一个 APK,其中包含您的 Dalvik 类文件以及其他资源,包括您的本机共享对象。
在 APK 中启动应用程序涉及几个步骤
- system_server 进程接收到请求您的应用程序的意图。
- zygote 进程被告知分叉一个新进程并运行您的类的方法。
- 您的应用程序在新进程中运行。
虽然您不能通过将可执行文件传递给 gdbserver 来直接启动 APK,但使用该am
命令从 shell 触发启动它相当容易。
$ adb -d shell
# am
usage: am [subcommand] [options]
start an Activity: am start [-D] <INTENT>
-D: enable debugging
send a broadcast Intent: am broadcast <INTENT>
start an Instrumentation: am instrument [flags] <COMPONENT>
-r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT)
-e <NAME> <VALUE>: set argument <NAME> to <VALUE>
-p <FILE>: write profiling data to <FILE>
-w: wait for instrumentation to finish before returning
start profiling: am profile <PROCESS> start <FILE>
stop profiling: am profile <PROCESS> stop
<INTENT> specifications include these flags:
[-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
[-c <CATEGORY> [-c <CATEGORY>] ...]
[-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
[--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
[-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
[-n <COMPONENT>] [-f <FLAGS>] [<URI>]
# am start -n com.android.browser/.BrowserActivity
Starting: Intent { cmp=com.android.browser/.BrowserActivity }
#
一旦您的应用程序运行,gdbserver --attach <pid>
请像以前一样使用。如果幸运的话,您的应用程序会在调用您的本机代码之前等待一些用户交互,以便您有机会在 GDB 中附加和设置断点。