JDB无法附加运行中Android进程,Android Studio却可行的问题求助
问题描述
我通过USB连接已Root(Magisk)的物理设备,尝试附加调试器到运行中的Android应用。已用resetprop将ro.debuggable设为1,确保所有应用可调试。以计算器应用(com.android.calculator2)为例,操作步骤如下:
- 执行
adb kill-server重启adb服务; - 执行
adb devices确认设备已授权; - 启动计算器应用;
- 执行
adb shell ps | grep calculator获取进程ID(4445); - 执行
adb jdwp | grep 4445确认进程在可调试列表; - 执行
adb forward tcp:7777 jdwp:4445完成端口转发; - 执行
jdb -attach localhost:7777尝试连接。
遇到的问题:
- 最后一步
jdb -attach无任何反应,JDB既不退出也不连接,输入命令也无输出; - 尝试Android Studio手动配置远程JVM连接(参数
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:7777)同样无反应,但使用Attach Debugger to Android Process选项却能成功连接调试; - 用
am set-debug-app让应用启动前等待调试器时,JDB或手动远程JVM连接时应用不恢复,而Android Studio的Attach选项连接时应用正常恢复。
请问为何JDB无法附加,我哪里操作有误?
原因分析与解决方法
1. JDB版本与ART虚拟机不兼容
Android应用运行在ART虚拟机上,系统默认JDK自带的JDB是针对标准JVM开发的,ART的JDWP协议实现和标准JVM存在差异,尤其是高版本Android(Android 8+)对协议兼容性要求更严格。Android Studio的调试工具专门适配ART,因此能正常连接,而原生JDB不行。
解决方法:
使用Android SDK自带的jdb工具,路径通常在$ANDROID_HOME/platform-tools/或$ANDROID_HOME/build-tools/<具体版本号>/目录下,替代系统默认的JDB。
2. 连接命令缺少ART适配参数
直接执行jdb -attach localhost:7777缺少ART所需的适配参数,导致连接请求无法被ART识别。
修正后的连接命令:
如果有应用源码,指定源码路径:
jdb -attach localhost:7777 -sourcepath <你的应用源码根目录>
若无源码,可尝试跳过默认JVM选项:
jdb -nooptions -attach localhost:7777
3. 高版本Android的JDWP安全拦截
即使ro.debuggable=1,Android 10及以上版本对JDWP连接有额外安全校验,原生JDB的连接请求可能被ART拦截,而Android Studio的调试器会发送符合要求的认证信息。
补充操作步骤:
先强制停止应用并启动调试模式,再进行连接:
adb shell am force-stop com.android.calculator2 adb shell am start -D com.android.calculator2/.Calculator
之后重新执行JDWP进程查找、端口转发和JDB连接,应用主动开启调试模式后更容易建立连接。
4. am set-debug-app的参数遗漏
使用am set-debug-app时,必须添加-w参数才能让应用持续等待调试器连接,原生JDB才能触发应用恢复运行的信号。
正确命令:
adb shell am set-debug-app -w com.android.calculator2
启动应用后,用Android SDK配套的JDB连接,应用即可恢复运行。
内容的提问来源于stack exchange,提问作者g00dds

