我正在尝试在 Android 14 和 Android 15 模拟器中以交互方式调试系统 Android 应用程序,例如
com.android.phone
,但我无法通过 JDWP 连接。
我的主机是:
Ubuntu 22.04.5 LTS
Linux 6.8.0-49-generic #49~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Nov 6 17:42:15 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
在 Android 14 模拟器中,它会挂起运行
adb jdwp
,并在尝试连接时出错:
$ adb shell getprop | grep ro.build.fingerprint
[ro.build.fingerprint]: [Android/sdk_phone64_x86_64/emu64x:14/UE1A.230829.036.A1/11228894:userdebug/test-keys]
$ adb forward --remove-all
$ adb forward tcp:5005 jdwp:1161
$ adb forward --list
emulator-5554 tcp:5005 jdwp:1161
$ adb jdwp
... hangs forever ...
$ jdb -attach localhost:5005
java.io.IOException: handshake failed - connection prematurally closed
at com.sun.tools.jdi.SocketTransportService.handshake(SocketTransportService.java:136)
at com.sun.tools.jdi.SocketTransportService.attach(SocketTransportService.java:232)
at com.sun.tools.jdi.GenericAttachingConnector.attach(GenericAttachingConnector.java:116)
at com.sun.tools.jdi.SocketAttachingConnector.attach(SocketAttachingConnector.java:90)
at com.sun.tools.example.debug.tty.VMConnection.attachTarget(VMConnection.java:519)
at com.sun.tools.example.debug.tty.VMConnection.open(VMConnection.java:328)
at com.sun.tools.example.debug.tty.Env.init(Env.java:63)
at com.sun.tools.example.debug.tty.TTY.main(TTY.java:1083)
Fatal error:
Unable to attach to target VM.
在 Android 13 模拟器中,相同的命令可以工作:
$ adb shell getprop | grep ro.build.fingerprint
[ro.build.fingerprint]: [Android/sdk_phone64_x86_64/emulator64_x86_64:13/TE1A.220922.034/10940250:userdebug/test-keys]
$ adb forward --remove-all
$ adb forward tcp:5005 jdwp:961
$ adb forward --list
emulator-5554 tcp:5005 jdwp:961
$ adb jdwp
603
... etc ...
$ jdb -attach localhost:5005
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
>
Google 似乎从 Android 14 开始更改了 AOSP,以使
userdebug
构建生成的 APK 未在清单中将 debuggable
设置为 true。
由于
jdwp_service.cpp
中的这段代码,因此无法使用JDWP进行连接:
// Don't allow JDWP connection to a non-debuggable process.
if (!proc->process.debuggable) continue;
也许对于预建的
userdebug
模拟器有一些解决方法(毕竟我们确实有root权限),但我不知道有哪一个是临时的。
现在我正在构建自己的
eng
构建AOSP模拟器,我可以用它来调试系统应用程序。