我想将调试器附加到通过USB连接的物理设备上运行的android应用程序。该设备使用magisk进行了根操作。ro.debuggable
属性也使用resetprop
设置为1
,以使所有应用程序都可调试。
例如,该应用程序将是计算器(com.android.calculator2
(。
我做的确切步骤:
-
adb kill-server
请确保重新启动adb服务器。 -
adb devices
再次启动服务器,并确保设备已获得授权。 -
运行应用程序(在我的例子中是计算器(。
-
adb shell ps | grep calculator
查找应用程序ID。u0_a88 4445 16282 4193244 133532 0 0 S com.android.calculator2
应用程序ID为4445。
-
adb jdwp | grep 4445
确保应用程序id在可调试的应用程序列表中。输出:4445
。因此该应用程序是可调试的。 -
adb forward tcp:7777 jdwp:4445
将7777
本地tcp端口转发给jdwp。 -
jdb -attach localhost:7777
将JDB连接到端口。
问题就在这里。最后一步什么也没发生。JDB既不退出也不连接,而且它不会在任何输入命令上输出任何内容。
我也试过安卓工作室。我试了两种选择。手动添加配置以连接到远程JVM,并使用Attach Debugger to Android Process
选项。第一个选项(连接到远程JVM配置(不起作用。我使用了以下命令行标志:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:7777
。端口转发也是以同样的方式完成的。Android Studio也不会连接、退出或打印错误。什么都没有。
但Attach Debugger to Android Process
选项效果很好。它成功地连接到了应用程序,我可以调试它并按预期设置断点。
我还想提到,我之前使用了am set-debug-app
命令,使应用程序在启动前等待调试器连接。当使用命令行的jdb
或Android Studio远程连接到JVM选项时,应用程序不会恢复,因此Android似乎根本看不到调试器。但是,当我通过Attach Debugger to Android Process
连接调试器时,应用程序会在按预期附加调试器后恢复运行。
为什么JDB不连接到应用程序,而Android Studio通过选项Attach Debugger to Android Process
连接?我做错了什么?
如果同时运行Android Studio,就会发生这种情况。Studio通过track-jdwp
监控所有可调试的进程,并将jdwp流量重定向到它自己,以监视应用程序的生命周期(通过DDMS(。
关闭Android Studio,然后再次尝试相同的jdb
命令。