Zdroid 0.3.0
Install
Download Zdroid-0.3.0.apk below and open it on your Android device. Allow "install from unknown sources" when prompted, then tap the Zdroid icon.
For dev iteration: adb install -r Zdroid-0.3.0.apk.
This is an in-place upgrade over v0.2.x, same signing cert and your existing data dir is preserved. Users on v0.1.x still need to uninstall before installing (different cert from the 0.1 line).
Notice for early v0.3.0 installs
The original v0.3.0 build (commit 4ce680200b) had a broken in-app updater: APKs were written to <filesDir>/cache/updater/ while the FileProvider XML declared <cache-path> (a different directory), so the system installer refused every hand-off with Failed to find configured root that contains .... The APK at this release has been re-uploaded with the fix (commit 3402b3174f). If you already had v0.3.0 installed, your in-app updater can't reach this build because of that same bug, so this is a one-time manual sideload. Future versions auto-update cleanly.
What's new
-
Multi-window IME. Settings, runtime picker, and any other spawned window now gets its own soft keyboard. The Rust side carries
window_idend-to-end on every IME event so commits route to the rightPlatformInputHandler; per-tick IME state moved from app-global to per-AndroidWindowState; the reconcile loop iterates every open window independently. Before this, focusing a text input in any non-main window did nothing. -
Programming keys row. Termux-style row above the soft keyboard with
Esc,Tab,Ctrl,Alt, and arrow keys.CtrlandAltare sticky modifiers (tap once for next key, double-tap to lock until untapped). Press-and-hold on arrows auto-repeats at the system key-repeat cadence so cursor navigation matches desktop. Ctrl+letter combos with soft-keyboard input intercept Gboard'scommitTextand re-fire as a realKeyEventwith the modifier, soCtrl+Cin the terminal sends^Cthe same as a hardware keyboard. Newandroid_input.programming_extras_rowsetting (default on, exposed in Android Input settings page). -
Virtual trackpad mode. VNC-style touch trackpad: drag moves an on-screen cursor, tap clicks, two-finger tap is right-click, two-finger drag scrolls. Replaces direct touch while active. New tab-bar toggle (crosshair icon) and
android_input.trackpad_modesetting (default off). Hold-to-drag for text selection works through the virtual mouse. -
120Hz fix.
ANativeWindow_setFrameRate(0.0, DEFAULT)was previously interpreted as "I'm inactive" by Samsung's adaptive panel, dropping the display to 30Hz and producing visible stutter on scroll / resize. Switched to passing a positive target (120Hz). Compositor downgrades transparently on panels that can't deliver, so the value is safe across the device matrix. Measured:vsync_interval p50went from 33ms to 8.33ms. -
Pixel-smooth dock drag. Terminal panel resize splitter no longer ticks by row height during the drag. Snap-to-row policy now applies only on mouse-up so the gesture feels smooth, then the dock settles to the nearest row boundary at rest.
-
Cursor coherence. Hardware-pointer cursor sprite hides on direct touch / keyboard input and reappears on the next pointer activity (process-wide modality flag). Sprite is focus-gated so only the foreground window draws it (no more duplicate sprites with settings open). Style changes (IBeam, Hand, etc.) fan out to every Activity so a focused ExtraWindowActivity gets the same updates as the main window. Hot-spot offset is re-anchored on style swaps so the pointing tip stays put across Hand/IBeam transitions. The Arrow flicker that gpui's
cursor_styleproduces during click events is debounced (80ms) so rapidly tapping a button no longer flashes the cursor shape.
Fixes
-
Auto-updater FileProvider path. Pre-fix the updater wrote downloaded APKs to
<filesDir>/cache/updater/zdroid-X.Y.Z.apkbutres/xml/updater_file_paths.xmlmaps<cache-path>to<cacheDir>/updater/(a sibling directory, not a child of files). FileProvider.getUriForFile failed with "Failed to find configured root" andMainActivity.launchPackageInstallerreturned false on every update attempt. Cache dir is now resolved via JNI throughContext.getCacheDir(), matching the FileProvider declaration. One-time cleanup wipes the old wrong directory on first run so the 225 MB stale APK doesn't sit on disk. -
Auto-updater asset-name candidate walk. Updater now tries
Zdroid-X.Y.Z.apkfirst and falls back toapp-release.apkon 404 so future asset-name conventions don't silently break the download. This release publishes the APK under both names for compatibility with older clients. -
Settings window duplication. Two rapid
OpenSettingsdispatches both passed the existing-window check before either'scx.deferopened a window, spawning duplicates in Recents. Re-check inside the deferred closure too. -
Pane toggle visibility on welcome screen. Bottom-dock terminal panel uses its own custom tab-bar render that bypassed the editor pane's default, so the keyboard/crosshair toggles never appeared before opening a project. Inlined the same buttons into
TerminalPanel. -
android_input.on_screen_keyboardgate during onboarding. Setting was previously mirrored fromworkspace::panerender only. With no Pane visible during onboarding the gate atomic stayed at itstruedefault; toggling the setting off had no effect until you opened a project. Now mirrored via aSettingsStoreobserver so the gate stays current regardless of which window is up. -
Trackpad icon clarity. Pane tab-bar trackpad-mode button was
ArrowUpRight(read as expand). Swapped toCrosshairso the precision-pointer intent is unambiguous. -
Cursor on direct touch. Desktop convention: hardware-pointer cursor hides while the user is touch-typing. Now does.
Caveats
- First install (or after a clean uninstall) needs you to grant "Install unknown apps" for Zdroid in Android Settings so the in-app updater can hand future APKs to the system installer.
- Floating-mode Gboard support is unfinished: the programming keys row stays anchored at the screen bottom and won't follow a detached IME. Toggle
android_input.programming_extras_rowoff if you use floating mode. - The "Please update Zed to Collaborate" badge in the title bar calls
auto_update::checkdirectly instead of dispatching the action, so it still surfaces upstream's package-manager prompt. Use the Zdroid menu's Check for Updates entry.
Verification
- APK SHA-256:
66d3103f7da27deb05d047fa426075d35366022ca64c2fe3b777c10b1c7c1492 - Signing cert SHA-256:
25:68:A2:A3:81:2D:8B:C3:A4:E8:E7:56:68:5C:5C:F7:25:40:EA:A2:94:37:F4:C1:25:8A:0C:81:73:BF:AB:4E(same as v0.2.x) - Built from commit
3402b3174f - versionCode 10, versionName "0.3.0"
- Bootstrap: bootstrap-2026.05.06-r2