Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Detect chrome remote debug targets over ADB like chrome://inspect #37

Open
auchenberg opened this issue Feb 21, 2015 · 9 comments
Open

Comments

@auchenberg
Copy link
Owner

By browsing the Stetho source code, it seems like chrome://inspect is using Unix sockets to discover remote debug endpoints on the network.

At least Stetho opening a socket on stetho_PROCESSNAME_devtools_remote, which seem to be the convention used by chrome://inspect, so it should be possible to emulate this behavior by simply probing on sockets with the suffix _devtools_remote.

Link: https://github.com/facebook/stetho/blob/master/stetho/src/main/java/com/facebook/stetho/server/LocalSocketHttpServer.java

@gingermusketeer
Copy link
Contributor

I had a quick look at all the open sockets on my machine using lsof. Was not able to find anything that looked like it would help.

Did a bit of digging into the chrome://inspect page and that page is being updated from c++ directly (not over the network). This is the function being called https://code.google.com/p/chromium/codesearch#chromium/src/chrome/browser/resources/inspect/inspect.js&q=PopulateTargets&sq=package:chromium&l=100&type=cs

It looks like it is being called from here https://code.google.com/p/chromium/codesearch#chromium/src/chrome/browser/ui/webui/inspect_ui.cc&q=PopulateTargets&sq=package:chromium&l=514&type=cs

I tried to trace that back to where it is being called. Looks like there is some sort of internal notification centre which it is subscribing to for updates https://code.google.com/p/chromium/codesearch#chromium/src/chrome/browser/devtools/devtools_targets_ui.cc&sq=package:chromium&rcl=1424438238&l=195&type=cs

My c++ foo is very weak but hopefully this info might help

@auchenberg
Copy link
Owner Author

For Android it looks like it binds to the port cast_shell_devtools_remote https://code.google.com/p/chromium/codesearch#chromium/src/chrome/browser/android/dev_tools_server.cc&q=_devtools_remote&sq=package:chromium&dr=C&l=65

I still haven't found the discovery.

@auchenberg
Copy link
Owner Author

@auchenberg
Copy link
Owner Author

Debugged this further. We need to use ADB in order to connect to the device, then run a port query, and then use ADB to setup a forward:

Steps how to find remote debug devices using ADB:

adb devices
<choose device>
adb -s <device> shell “cat /proc/net/unix |grep devtools_remote”
adb -s <device> forward tcp:9222 local abstract:<service name>
http://localhost:9222/json 
Bam!

@auchenberg auchenberg changed the title Emulate behavior of chrome://inspect by listening to unix sockets Detect chrome remote debug targets over ADB like chrome://inspect Mar 11, 2015
@auchenberg
Copy link
Owner Author

@gingermusketeer
Copy link
Contributor

Nice!!

@jasonLaster
Copy link

For the curious of heart:

Here's the diff off of master
https://github.com/auchenberg/chrome-devtools-app/compare/adb-devices

@auchenberg
Copy link
Owner Author

Yeah, I wrote a little node module to abstract the ADB communication away, https://github.com/auchenberg/adb-devtools-devices

@yuriteixeira
Copy link

Just to make things crystal clear:

  1. If you just have one device connected, you don't need the -s option, therefore adb <cmd> is a useful short

  2. To get the service name `adb shell "cat /proc/net/unix | grep devtools_remote", which will give you something like this output:

00000000: 00000002 00000000 00010000 0001 01 423897 @webview_devtools_remote_18279
  1. Now we need to make a port forwarding between the open socket on the android device and your local machine: adb forward tcp:9222 localabstract:webview_devtools_remote_18279 (assuming that webview_devtools_remote_18279 was returned by the command on step 2.

  2. To make sure it worked, just open http://localhost:9222 in your browser, and you should see something like this

screenshot 2018-08-28 10 32 19

  1. Now you can curl the JSON endpoint to get the so much desired webSocketDebuggerUrl: curl localhost:9222/json or curl localhost:9222/json/version (varies depending on the Chrome/Chromium version)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants