Skip to content

WIP: Add live device screen streaming to the Screen Capture window v2 - #224

Open
todi1856 wants to merge 19 commits into
masterfrom
livestream
Open

todi1856 wants to merge 19 commits into
masterfrom
livestream

Conversation

@todi1856

@todi1856 todi1856 commented Sep 23, 2026 •

Copy link
Copy Markdown
Member

Yamato CI

Type of change:

  • Bug fix
  • Improvement
  • Code refactor
  • Breaking change
  • Documentation update
  • Other (please describe)

Description

The main logcat window is not affected by this change, only screen capture window is affected

How to test? Go to https://yamato.ds.unity3d.com/project/277/branch/livestream/jobDefinition/.yamato%2Fwrench%2Fpackage-pack-jobs.yml%23package_pack_-_mobile_android-logcat/recent-jobs , take latest artifacts, extract them, and add com.unity.mobile.android-logcat-1.5.0.tgz package to Unity. tgz file will have the necessary jar inside.

Video

You can now watch the device's screen live in the Screen Capture window, and click, scroll and type into it from the Editor.

Also, it's not accessible via Window->Analysis->Android Screen Capture

Capturing needs something on the device: External/UnityLogcatServer is a small Gradle project that builds a 17 KB jar, run through app_process as the shell user. It mirrors a display into an ImageReader, JPEG-encodes each frame and writes it over an abstract socket that adb forward exposes. Frames are only produced when the screen changes, so an idle device costs almost nothing.

Input travels back up the same socket: touch, scroll wheel, keys (through the device's own keyboard layout), and Ctrl/Cmd + A, C, V for select-all/copy/paste on the device. Back / Home / Overview buttons sit beside the image, which is the only way in on gesture-navigation devices.

The window was reorganised around it. Screenshots used to overwrite one file in Temp; they're now kept in Library/AndroidLogcat/Screenshots and listed down the left, with the live view as the first row — arrow keys to cycle, F2 rename, Del delete, right-click for Show In Explorer / Open / Save As, Reconnect on the Live row, Ctrl+Shift+S to capture. The window also opens from Window > Analysis > Android Screen Capture. Stream size, JPEG quality and frame rate cap are in Preferences > Analysis > Android Logcat Settings.

Improved screenshot window

image

Settings

image

Checklist for PR maker

  • Have you added a backport label? (new feature, no backport intended — confirm)
  • Have you updated the Changelog?
  • Have you added or updated the Documentation to your PR?

Testing status

  • Existing or new automation tests - what automation was added, changed
  • New tests are covering
    • start/stop live steam
    • frame delivery
    • touch, keys
    • scroll
    • restart
    • streaming against a device that was asleep
    • screenshot list, delete, rename and external-change tests.

Devices:

  • Pixel 2 (Android 10)
  • Pixel 9 Pro Fold (Android 16)
    • Folding/Unfolding while viewing
  • CPH1831 (Android 8.1).

Testing checklist

  • Built and run editor Locally or Yamato
  • Run on device Android/iOS (if applicable)
  • All items have tooltips?

todi1856 and others added 5 commits September 23, 2026 15:40
A small Java server, built with Gradle into a dex jar and pushed to the device,
that mirrors a display into an ImageReader, encodes each frame as JPEG and writes
it to an abstract unix socket. It also reads control messages back up the same
socket and injects touch, scroll, key and text events.

The jar is a build output and is not committed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The window now lists saved screenshots beside a Live row that mirrors the device.
Selecting Live starts the server on the device, shows its frames, and forwards
touch, scroll, keyboard and text back to it.

Along with it: a shared zoom and pan viewer for the live view and screenshot
previews, a details file written beside each capture, a stats column, device
rotation, and settings for the stream's size, quality and frame rate.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Integration tests covering the stream end to end: frames arriving, injected
touch, scroll, keys and text taking effect on the device, streaming a device
that was asleep, and an unknown display id. Edit mode coverage for the details
file written beside a screenshot.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The jar the live stream pushes to the device is a build output and is not
committed, so a clone has none. A build_server_jar job produces it and the pack
job now depends on it, which is also what puts it in the tarball the test jobs
install.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@todi1856

Copy link
Copy Markdown
Member Author

/review

@u-pr

u-pr Bot commented Sep 23, 2026

Copy link
Copy Markdown
Contributor

ℹ️ Skipped — a harness review for this commit (5aced5d) already ran or is in flight. Same-commit re-runs are paused for 10 min; push a new commit, or re-comment /harness-review in ~10 min to force a fresh one.

🤖 Helpful? 👍/👎

@u-pr u-pr Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Harness Review

Needs changes

The streaming pipeline is thoughtfully integrated, but several reachable UI, persistence, and startup edge cases can leave the displayed or saved content inconsistent or prevent streaming.

Reviewed commit 5aced5d

🤖 Helpful? 👍/👎

Comment thread com.unity.mobile.android-logcat/Editor/AndroidLogcatScreenshotList.cs Outdated
Comment thread com.unity.mobile.android-logcat/Editor/AndroidLogcatLiveStream.cs
@todi1856

Copy link
Copy Markdown
Member Author

/review

@u-pr u-pr Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Harness Review

Needs changes

The new capture workflow has state-management issues when device selection changes or a live-stream reader does not terminate promptly.

Reviewed commit 6508758

🤖 Helpful? 👍/👎

Comment thread com.unity.mobile.android-logcat/Editor/AndroidLogcatScreenCaptureWindow.cs Outdated
Comment thread com.unity.mobile.android-logcat/Editor/AndroidLogcatLiveStream.cs
@todi1856

Copy link
Copy Markdown
Member Author

/review

@u-pr u-pr Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Harness Review

Needs changes

The new live-view and persistent screenshot workflow has correctness gaps on reachable edge paths.

Reviewed commit f1d921f

🤖 Helpful? 👍/👎

Comment thread com.unity.mobile.android-logcat/Editor/AndroidLogcatLiveStream.cs
@todi1856

Copy link
Copy Markdown
Member Author

/review

@u-pr u-pr Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Harness Review

Needs changes

The live-stream feature is broadly cohesive, but keyboard shortcut forwarding can emit an unmatched key-down event for a normal release order.

Reviewed commit c58dc0f

🤖 Helpful? 👍/👎

Comment thread com.unity.mobile.android-logcat/Editor/AndroidLogcatLiveStream.cs
@todi1856

Copy link
Copy Markdown
Member Author

/review

@u-pr u-pr Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Harness Review

Needs changes

The streaming and screenshot-management implementation is broadly cohesive, but saving metadata-less screenshots can preserve incorrect provenance.

Reviewed commit b5bf917

🤖 Helpful? 👍/👎

@todi1856

Copy link
Copy Markdown
Member Author

/design-consistency

@todi1856
todi1856 requested a review from IGuscin September 25, 2026 09:12
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

Successfully merging this pull request may close these issues.

1 participant