I am trying to interactively debug system Android applications in the Android 14 and Android 15 emulator such as com.android.phone
but I am unable to connect via JDWP.
My host PC is:
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
In Android 14 emulator it hangs on running adb jdwp
and errors out when trying to connect:
$ 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.
In Android 13 emulator the same commands work:
$ 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 ...
>
It appears that Google changed AOSP starting with Android 14 to make userdebug
builds produce system APKs that do not have debuggable
set to true in the manifest. It can be verified by running adb shell dumpsys package
.
This makes it impossible to use JDWP to connect adn debug system apps due to this code in jdwp_service.cpp
:
// Don't allow JDWP connection to a non-debuggable process.
if (!proc->process.debuggable) continue;
Perhaps there is some work-around for a prebuilt userdebug
emulator (we do have root after all), but I don't know of one off-hand.
For now I am building my own eng
build AOSP emulator and I'm able to debug system apps with that.