zed-android-port

Dylanmurzello活跃维护

把 Zed 代码编辑器原生移植到 Android,用 Vulkan 渲染 gpui 界面,集成 Termux 提供 LSP 和工具链,支持远程 SSH,可在平板和桌面模式上以 APK 运行。

Native Android port of the Zed code editor, gpui rendering through Vulkan, integrated Termux for LSPs and tooling, remote SSH support. Runs as an APK on tablets and Android desktop modes.

v0.4.3发布于 2026-11-07 22:12 UTC256star +2 / 7 天23fork同步于 2026-11-10 18:03 UTC

怎么上手

从 README 代码块原样提取,可能是其中一种安装方式
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal -c rust-analyzer
npm install -g @anthropic-ai/claude-code @openai/codex
cargo ndk -t arm64-v8a -P 31 -o android/app/src/main/jniLibs build
硬件要求

README 没有说明硬件要求。

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

这个项目的说明还在生成中,先参考下面「最近发版」和 README。

最近发版

5 个版本v0.4.3
  1. v0.4.3Zdroid 0.4.3最新正式版2026-11-07 · 2026-11-07 22:12 UTC

    Install

    Download Zdroid-0.4.3.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.4.3.apk.

    This is an in-place upgrade over 0.4.0 and the 0.3.x releases: same signing cert, your existing data dir is preserved. Android 12 or later is required. Once installed, an older release can only go back on after an uninstall.

    Thanks

    This release stands on the work of İlker Sığırcı (ilkersigirci): the catch-up to Zed 1.26.2 through eight release merges, the rework of pointer, touch and keyboard input, the updater, the Keystore credential store, Open with, Keep Running in Background and much more, delivered as pull request #19 to this repository and reviewed here commit by commit. Thank you.

    Highlights

    • Zed 1.27.0. The editor was on 1.16; the agent panel, the settings window, the onboarding flow and everything else upstream shipped in between are in.
    • ilkersigirci's fork is merged (pull request #19), reviewed commit by commit: his Android work from 0.10 through 0.13.1, with the fixes below applied on top.
    • Mice, trackpads and the S Pen go through Android's own pointer, so Android's speed, tap-to-click and scroll direction settings apply. The cursor sprite and pointer capture of earlier releases are gone.
    • Touch: wider targets on pane dividers, dock handles and scrollbars; two-finger tap opens the context menu; two-finger drag scrolls; tabs always show their close button.
    • Open with and Edit with from a Files app open the file in Zdroid: in place for files on shared storage and under the projects folder, as a copy under ~/received otherwise. Reveal in File Manager and Open in Default App hand files to other apps.
    • Keep Running in Background keeps language servers, terminals and agent sessions alive while another app is in front, with a notification that stops it. Battery Saver caps animation at 30 frames a second.
    • The in-app updater checks hourly, shows an Install button in the title bar when a release is newer, and installs through Android's package installer after its confirmation. It accepts only APKs signed with this release's key.
    • API keys and tokens live in the Android Keystore. Telemetry is off by default and the Privacy settings show the toggles.
    • The runtime keeps your home at /root, with ~/projects, ~/storage and ~/received leading to the folder the Files app shows. Reset Runtime keeps /root, so dotfiles, SSH keys and toolchains survive it. Settings > Android names the installed image and offers Install when the runtime is missing.

    Fixes

    • Upgrading from 0.3.x removes the old runtime files at first launch instead of asking to clear the app's data; settings, projects and keys stay.
    • Upgrading from 0.4.0 removes the terminal shell that release wrote into settings.json (it reached SSH remotes) and moves credentials into the Keystore.
    • A terminal opened without a project starts in ~.
    • Quit stops the background service and its notification whatever Keep Running in Background says.
    • A pen digitizer's fingers stay fingers; LatinIME's backspace over a selection deletes the selection.
    • A language server that keeps exiting stops after three restarts in ten minutes without taking the other servers on the same files with it.

    Caveats

    • App data is excluded from Android's cloud backup and device-to-device transfer, because the home folder holds SSH keys and tool logins. Move projects with git or by hand.
    • Release builds target the CPUs of 2022 and later (Snapdragon 8 Gen 1, Dimensity 9000, Exynos 2200, Tensor G3 and newer); older CPUs crash at launch. See the README.
    • /sdcard needs the All files access toggle, which the first launch opens; Settings > Android opens it again.
    • Android caps an app's child processes at 32 device-wide; the README lists the developer option that lifts it.
    • The in-app update from 0.4.0 to this releas
  2. v0.4.0Zdroid 0.4.02026-10-29 · 2026-10-29 05:04 UTC
    查看更新说明

    Install

    Download Zdroid-0.4.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.4.0.apk.

    In-place upgrade over v0.3.x: same signing cert, your projects and editor settings stay. The old Termux-style prefix under files/usr is removed on first launch.

    What changed

    • The runtime is Zdroid's own now. 0.3.x ran every tool through a patched Termux bootstrap; 0.4.0 runs a stock Ubuntu 26.04 arm64 rootfs, bundled in the APK, through a loader of our own: the kernel execs only the loader, the Ubuntu binaries are mapped as they are, and path syscalls are translated in a seccomp trap handler. No proot, no root, no Termux, no patched packages. apt install works the Ubuntu way, cargo, go, node, python are the distro's, and debuggers (codelldb, gdb, strace) use real ptrace.
    • First launch sets the runtime up in a few seconds with no network, then installs git and the CA certificates with apt in the background. DNS, the hostname and the device's time zone are seeded, so the first apt install does not stop at a time zone menu.
    • Language servers and terminals survive the background: a foreground service holds the process while children exist, a server killed by Android is restarted, Quit and a Recents swipe leave nothing behind. Settings > Android Runtime has Keep Awake, the battery exemption, Reset runtime, and the essentials install.
    • targetSdk 35: no "built for an older version of Android" warning at install, a real notification prompt, and the All files access toggle for /sdcard.
    • The /proc files Android hides from apps (stat, loadavg, uptime, version, net/*, sys/*) read as on Linux, so os.cpus(), uptime, top and npm's script queue work.

    Caveats

    • /sdcard needs All files access on Android 11+: turn it on when the toggle opens, or later from Settings > Android Runtime. Projects under the app's own files need nothing. The folder picker cannot pick the root of /sdcard or Download itself on Android 11+ (a system restriction); pick a subfolder.
    • /sdcard is mounted noexec: builds run from ~/projects (the Move chip copies a project there).
    • Android caps phantom child processes at 32 per device; Developer options > "Disable child process restrictions" lifts it on Android 14+.
    • chroot-era users start with fresh editor state (copy files/home/.zed-env/chroot/config/settings.json by hand if wanted).
    • SysV IPC is not emulated (PostgreSQL will not start); 16 KB page devices were verified on the emulator only.

    Next

    • An upstream Zed merge is planned for a later release. This build's editor base is the Zed tree merged on 2026-08-07.

    Verification

    • APK SHA-256: 00a348df3b371691a23931294129932aa5bae603aadf000680e7c1e719de307a
    • 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
    • Built from commit 9db96c0790
    • versionCode 20, versionName "0.4.0"
    • Rootfs image: ubuntu-base-26.04.1-base-arm64.tar.gz (bundled; name and SHA-256 in crates/zdroid_runtime/rootfs-image.properties)
  3. v0.3.3Zdroid 0.3.32026-08-07 · 2026-08-07 11:41 UTC
    查看更新说明

    Install

    Download Zdroid-0.3.3.apk, open it, allow "install from unknown sources".

    adb install -r Zdroid-0.3.3.apk for dev iteration. In-place upgrade over v0.2.x / v0.3.x.

    What's new

    • Fixed vim mode eating shifted symbols on hardware keyboards: *, #, $, %, ^, :, ?, {, }, ~ now resolve to the symbol instead of the base key (#12)

    Verification

    • APK SHA-256: f39e8bb7f47db5cc1c64f28a5077343ece5a827294a044bd8e69554e61c4671c
    • Built from commit 364af4b26e
    • versionCode 18, versionName "0.3.3"
    • Cert: same as v0.2.x / v0.3.x
  4. v0.3.2Zdroid 0.3.22026-06-05 · 2026-06-05 21:34 UTC
    查看更新说明

    Install

    Download Zdroid-0.3.2.apk, open it, allow "install from unknown sources".

    adb install -r Zdroid-0.3.2.apk for dev iteration. In-place upgrade over v0.2.x / v0.3.x.

    What's new

    • Fixed Bluetooth mouse under pointer capture
    • Added vim mode on the soft keyboard
    • Fixed the soft-keyboard Enter key
    • Added Shift to the programming keys row
    • Added invert-scroll option for trackpad and wheel
    • Smoother terminal scrollback scrolling
    • Synced with upstream Zed
    • Fixed chroot terminal losing /proc after reboot (zdroid-spawnd v1.1.7)

    Verification

    • APK SHA-256: 2425cb6e81ab7796c5a2b5e8eee5f3f3226dba87d9eca5d38e071bd04406b356
    • Built from commit 89e8070f15
    • versionCode 17, versionName "0.3.2"
    • Cert: same as v0.2.x / v0.3.x
  5. v0.3.1.1-diag.3v0.3.1.1-diag.3 (fix candidate: Tab S11 captured-pointer)pre-release2026-05-22 · 2026-05-22 03:00 UTC
    查看更新说明

    Install

    Download Zdroid-0.3.1.1-diag.3.apk, open it, allow "install from unknown sources". In-place upgrade over v0.3.1.1 / v0.3.1.1-diag.2. Pre-release; not promoted as Latest.

    Convention

    v0.3.1.1-diag.2 and v0.3.1.1-diag.3 serve different purposes:

    • diag.2 is the data-gathering build. Install it when I ask you to send a diagnostic dump. Probes-only, no behavior changes.
    • diag.3 is the fix-candidate build. Install it to test if a specific issue is fixed for you.

    What this build fixes (candidate)

    Tab S11 (Samsung SM-X7xx, One UI 8, Android 16, MediaTek) Bluetooth/USB mouse: cursor stays stuck after pairing, even though the system cursor correctly hides when Zdroid takes capture.

    Root cause confirmed via the diag.2 probe dump: framework grants requestPointerCapture but no motion events reach Activity.onGenericMotionEvent. The Samsung legacy bubble-up path that works on Tab S9 / One UI 7 is not honored on One UI 8 + Android 16. Canonical AOSP routes captured events through View.dispatchCapturedPointerEvent on the focused View instead.

    Fix: install View.OnCapturedPointerListener on the GameActivity SurfaceView. No focus-state manipulation (sidesteps the previous tint regression).

    Use this if

    You hit the "BT/USB mouse pairs but doesn't move the cursor" bug on Tab S11 or any non-Samsung Android 14+ device. Install diag.3, pair your mouse, the cursor should now follow motion. If it still doesn't, fall back to diag.2 and send me the dump.

    Verification

    • APK SHA-256: 98b9c7c3f1285498e36d3e7697459f99f315fc4282c5a78344589c727937af91
    • Built from commit f614d8b23d (debug branch)
    • versionCode 16, versionName 0.3.1.1-diag.3
    • Cert: same as v0.2.x / v0.3.x (in-place upgrade compatible)
    • Tab S9 Ultra regression verified: 576 captured events still flow through the legacy Activity path with the new View listener installed alongside.

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    Zdroid is an independent port of Zed for Android, not affiliated with Zed Industries. Zed's editing, workspace, search, Git, extension and terminal components run on a gpui_android platform backend with Android-specific adaptations and Vulkan rendering. The reference hardware and supported build configuration are documented in the platform workarounds. A stock Ubuntu rootfs bundled in the APK runs every tool (apt, bash, git, ssh, node, go, rust-analyzer, gdb) through the app's own userland chroot engine: a static loader and a seccomp trap path translator, no root, no patched packages.


    Vulkan via wgpu. AChoreographer-driven vsync, no JNI hop per frame. Opt-in 120Hz with Mailbox present mode. Glyph fallback into /system/fonts so Powerline arrows and CJK render without bundling fonts. Editing, projects, search, Git, extensions, and terminal UI use Zed's native implementations. The Rust .so is the app process. gpui composites every pixel (yes, you read that right) straight into the Adreno Vulkan driver. Multi-Activity OS-chromed extra windows so DeX freeform renders Settings and secondary editors with real chrome.

    A userland chroot without root or ptrace: the kernel only ever execs a 500 KB static loader shipped in the APK, which maps the Ubuntu binary and glibc's ld.so itself, installs a seccomp filter that traps path syscalls, and rewrites every guest path into the rootfs from an in-thread SIGSYS handler, three microseconds per translated syscall. Static binaries, Go, cargo, strace and lldb all run as on Linux because real ptrace stays free. Same engine answers the syscalls Android's own app filter refuses, which is why stock glibc starts at all. Mice, trackpads and the S Pen go through Android's own pointer, with its speed, tap-to-click and scroll direction settings. A DocumentsProvider exposes the projects folder as a system volume. HTTPS trusts the Mozilla root bundle (webpki-roots). In-app updater pulling signed APKs from GitHub Releases. Everything else is upstream. Deep-dives for the platform layer live in crates/gpui_android/docs/workarounds/.


     Install

    Grab the latest Zdroid-X.Y.Z.apk from the releases page and open it in your file manager. Android prompts for unknown-source installs the first time; grant it. Reinstalls upgrade in place because every release ships from the same signing cert.

    First launch

    1. Access to /sdcard. Projects under the app's own files need no permission. For anything under /sdcard the first launch opens Android's "All files access" toggle for Zdroid; turn it on, or later from Settings → Android → Allow Access to /sdcard.
    2. Runtime. The Ubuntu base image bundled in the APK is extracted into the app's private data dir behind the splash, a few seconds, no network. Then git, the SSH client and the CA certificates are installed with apt in the background; a notification shows progress and needs a network. If that step fails, Settings → Android → Install Essentials runs it again.
    3. Notifications and battery. Language servers and terminals keep running while Zdroid is in the background through a foreground service. Android asks once whether Zdroid may post notifications; declining keeps the service running with its notification hidden. Some skins (One UI's sleeping apps) still stop background apps unless Zdroid is excluded; Settings → Android → Allow Background Activity asks for the exemption.

    Setting up your shell environment

    Open the integrated terminal. You are root in a stock Ubuntu 26.04 (the ubuntu-base image: apt, dpkg, bash, perl, no compiler yet). Everything installs the Ubuntu way:

    apt update
    apt install -y build-essential curl python3 gdb
    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal -c rust-analyzer
    

    Zed downloads its own Node for the Node-based language servers (vtsls, eslint, json, tailwind) and for the agent panel's Claude Agent and Codex, so those work without installing Node; apt install -y nodejs npm gives you a system one for the terminal. The Claude Code and Codex CLIs, for example:

    apt install -y nodejs npm
    npm install -g @anthropic-ai/claude-code @openai/codex
    

    In the terminal, run Codex as codex --no-daemon (or add alias codex='codex --no-daemon' to ~/.bashrc): by default it starts a background server that sandboxes itself with bubblewrap, which needs namespaces that Android doesn't give an app. The agent panel's Codex doesn't use that server.

    Go comes from the official linux-arm64 tarball unpacked into /usr/local; gopls, delve, clangd and the rest install the way their docs say for Linux. Anything that lands in /usr/bin, /usr/local/bin, ~/.cargo/bin or ~/.local/bin shows up on the editor's PATH within a couple of seconds, so language servers start from the editor without configuration.

    Settings → Android → Reset Runtime extracts the bundled image again when you want a clean slate; your home folder, projects and editor settings stay.

    Working with projects

    Two storage realms underneath, with different exec rules.

    /data/data/com.zdroid/files/ is exec-mounted. cargo, go, node, anything you build can run there. This is where projects should live: files/home/projects/<name>, which the terminal reaches as ~/projects/<name>, is the default workspace root. ZedDocumentsProvider exposes files/home to other Android apps via the SAF sidebar (look for Zdroid in any system file picker).

    /storage/emulated/0/ (a.k.a. /sdcard/) is FUSE-mounted with noexec. Read, edit, and save all work; the kernel refuses to execute binaries written here. cargo run against a binary under /sdcard/... returns EACCES and there's no remount workaround (see docs/workarounds/android-noexec-mount.md for why).

    Three workflows that work with this constraint:

    • Project root under ~/projects/ is the happy path. git clone, cargo new, builds, debugs, terminal subprocesses all run. Browse there from any Android app via the Zdroid → projects SAF sidebar entry.
    • Open a folder anywhere on /sdcard/ is fine if you're only reading or editing. The title bar shows a yellow Builds won't run · Move chip; one tap pops a confirm dialog that copies the project into ~/projects/<basename> and reopens it from the exec side.
    • ~/storage/{shared,downloads,dcim,documents,…} are curated symlinks into /sdcard. Use them for "open and edit a single file" workflows where you don't want to copy a whole tree.

     Gestures & input

    Each surface toggles in Settings → Android (or on the first-run onboarding card).

    Touch (default)

    • Tap to position the cursor
    • Tap and drag to scroll
    • Two-finger tap for right-click
    • Long-press to select a word
    • Long-press and drag to extend the selection
    • Long-press and drag on a tab or a project panel entry moves it
    • Scrollbar tap and drag snaps the thumb to your finger and follows

    Hardware mouse / trackpad

    Plug in or pair a mouse, trackpad, or Book Cover Keyboard and it just works, with Android's pointer, pointer speed and tap to click.

    • Scroll wheel and two-finger trackpad scroll to scroll
    • Right-click or two-finger tap anywhere for context menus
    • Press until the pad clicks and slide to drag. Tap, touch again and slide does too, once Android's tap dragging is on: adb shell settings put system touchpad_tap_dragging 1

    Working on Samsung tablets and most Android devices we've tested. If your mouse pairs but doesn't move the cursor (seen on some OnePlus / Oppo Pad ColorOS builds), open an issue with adb shell dumpsys input output so we can triage.

    Soft keyboard

    Auto-opens on tap into the editor or terminal. The status bar has a keyboard toggle if you want it off.

    • Programming keys row above the keyboard with Esc, Tab, Ctrl, Alt, and arrows. Ctrl and Alt are sticky: tap once for the next key, double-tap to lock.
    • Ctrl + letter combos work in the terminal: Ctrl+C sends ^C, just like a hardware keyboard.

    Multi-window

    Settings and any other spawned window each open as their own Recents entries and get their own soft keyboard and input.


     Userland

    The editor is bionic-linked and runs as the Android app process. Every subprocess it spawns (bash, apt, language servers, debug adapters, formatters, terminal shells, git, ssh) runs inside a stock Ubuntu 26.04 rootfs extracted from the APK into the app's private data dir. No root, no Magisk, no second app.

    How that is possible without root: a distro binary bakes /usr, /lib and /etc into its rodata and its PT_INTERP, and no app-writable Android path is that short, so the rewrite cannot happen in the file. It happens at the syscall. The kernel only ever execs libzdload.so, a static loader that maps the Ubuntu binary and glibc's own ld.so, installs a seccomp filter that traps the path syscalls (openat, execve, stat, readlink, bind and the rest) and translates the guest path into the rootfs from an in-thread SIGSYS handler, then re-issues the syscall from inside the loader's own text, which the filter lets through. That is proot's idea driven by the kernel's trap instead of a second process and ptrace: three microseconds per translated path syscall instead of two cross-process stops, static binaries run, and real ptrace stays free, so gdb, lldb and strace work inside. The same handler answers the syscalls Android's own app filter refuses (rseq, set_robust_list, the termios2 ioctls, hard links on app data, netlink audit), which is why unmodified glibc, apt and dpkg run at all. Writeups: rootfs-engine-integration.md, rootfs-guest-env.md.

    Inside, you are root (a virtual identity the engine keeps for apt and dpkg; the files belong to the app uid), $HOME is the app's home folder (/data/user/0/com.zdroid/files/home, the one the Files app shows), which holds your projects and survives a reset, the app's files dir is visible at the same absolute path on both sides so project paths mean the same thing to the editor and to the tools, and /sdcard and /storage are bound through.

    Background survival: a foreground service holds the process out of Android's cached state while a language server or terminal is alive (always, with Zdroid → Keep Running in Background), children are reaped when you quit or swipe the task away, and a language server killed from outside is restarted up to three times in ten minutes before it stays stopped with a hint. Keep Awake in Settings → Android adds a wake lock so builds continue with the screen off. The device-wide phantom process cap (32 on Android 12+) cannot be lifted from an app; Android 14+ has a Developer Options toggle, and over adb settings put global settings_enable_monitor_phantom_procs false.

    Not in the engine: SysV IPC (PostgreSQL), 32-bit guests, mount or user namespaces. /proc/self/maps and mountinfo still show host paths.


     What works

    • Editor. Vulkan rendering, multi-pane workspace, vim mode, syntax highlighting, project panel, fuzzy file finder, command palette, buffer + project search.
    • Git. Git panel with staging, full git-graph commit history, diff view.
    • LSPs and debuggers. Whatever you install in the rootfs is on the editor's PATH: rust-analyzer via rustup, gopls, pyright, clangd, jdtls. Zed's own managed Node runs vtsls, eslint and friends. CodeLLDB debugs Rust with real breakpoints.
    • Extensions. Browse, install, manage. Themes, language configs, grammars, slash commands.
    • Remote SSH. Server-picker pill in the title bar, persisted server list, native askpass.
    • Agents. Zed's ACP agent UI, plus Zed's own agent with your API keys (below).
    • Multi-window. Android freeform and DeX, each extra window is a real Activity with OS chrome.
    • Edge-to-edge rendering with content under the display cutout.
    • App menu bar with nested submenus (Settings, Keymap, Themes, Extensions).
    • Theme follow for system light/dark.
    • ZedDocumentsProvider exposes the project root as a SAF volume, so other Android apps can browse Zed's worktrees.

     AI with your own API keys

    Besides ACP agents, Zed's own agent and inline assistant work with your API keys, no Zed account needed. Zdroid keeps the API providers Zed supports (Anthropic, OpenAI, Google, OpenRouter and the rest) and OpenAI-compatible endpoints such as a LiteLLM or vLLM gateway. It leaves out Zed-hosted models and web search, Zed sign-in, and the local model servers (Ollama, LM Studio, llama.cpp). ACP agents on an SSH remote keep their own authentication on the remote machine.

    To add an OpenAI-compatible endpoint, open Settings → AI → LLM Providers → Add Provider, choose OpenAI, and enter the URL, API key and model name. Agent tools need a model with tool-call support. Keys are stored in Android Keystore. The same endpoint in settings.json (enter the key in LLM Providers):

    {
      "language_models": {
        "openai_compatible": {
          "my-gateway": {
            "api_url": "https://gateway.example.com/v1",
            "available_models": [{ "name": "my-model", "max_tokens": 128000 }]
          }
        }
      },
      "agent": {
        "default_model": { "provider": "my-gateway", "model": "my-model" }
      }
    }
    

    Requests come from the tablet, even in an SSH project, so the endpoint must be reachable from it. See Zed's gateway documentation.


     Build from source

    You'll need:

    • Rust toolchain with aarch64-linux-android (rustup target add aarch64-linux-android)
    • cargo-ndk (cargo install cargo-ndk)
    • Android NDK r27 (sdkmanager "ndk;27.0.12077973")
    • Gradle 8+, adb on $PATH
    • A device with USB or wireless debugging on
    cd crates/gpui_android/examples/zed_android
    
    ANDROID_NDK_HOME=/path/to/ndk/27.0.12077973 \
      cargo ndk -t arm64-v8a -P 31 -o android/app/src/main/jniLibs build
    
    cd android
    gradle assembleDebug
    adb install -r app/build/outputs/apk/debug/app-debug.apk
    adb shell am start -n com.zdroid/.MainActivity
    
    adb logcat -d | grep -E "zed_android|RustPanic|FATAL"
    

    First build is around 10 minutes. Incremental Rust rebuilds are 20 seconds, Gradle re-pack a few seconds.


     Tested on

    Samsung Galaxy Tab S9 Ultra (Snapdragon 8 Gen 2 / Adreno 740, Android 16, One UI 8) is the daily driver, and release builds are compiled for its CPU. Other high-end devices from 2022 on should run them too (Snapdragon 8 Gen 1, Dimensity 9000, Exynos 2200, Tensor G3 and later), but older CPUs crash at launch, including the Tensor G2 in the Pixel 7 and Pixel Tablet. See docs/workarounds/reference-cpu-build.md. Android 12 or later and Vulkan 1.1 are required too, and only Adreno is exercised. Mali / Xclipse will run but may want shader tweaks.

    A hardware keyboard is the supported config. Tablet plus Bluetooth keyboard, foldable in tablet mode, or DeX/desktop-mode with monitor and peripherals all work. Phones technically run but are de-prioritized.


     License

    GPL-3.0-or-later, same as upstream Zed. The engine crates crates/zd_engine_core and crates/zd_loader are MIT. The APK bundles the unmodified Ubuntu 26.04 base image (ubuntu-base, from cdimage.ubuntu.com), whose packages carry their own licenses (GPL, LGPL, BSD, MIT and others); the source of every package is in the Ubuntu archive, and nothing in the image is modified.

    © Dylan Murzello, distributed under GPL-3.0-or-later. Zed itself is © Zed Industries.


     Acknowledgments


     So why this ?

    Zed Industries' position on a mobile/tablet port: not planned.

    This repo is what those threads were asking for, built independently. The Termux build attempt failed because the upstream wasmtime/cranelift deps don't compile inside Termux. We sidestep that by building the APK on a desktop with cargo-ndk and running a stock Ubuntu userland through our own ptrace-free chroot engine. The editor uses upstream Zed components with Android adaptations at the platform and runtime boundaries, documented in crates/gpui_android/docs/workarounds/.