kelai141/dsh-mobile-apk
Android shell for DeepSeek Harness: WebView UI over an embedded Termux runtime snapshot (extract-and-run, no Termux app needed), SAF directory bridge, keep-alive foreground service, engine watchdog, and online runtime updates. One APK to install: it boots a full dsh web agent that can really execute bash. App name DeepCode (icon text
catalog 简介 / catalog descriptioncatalog description:dsh 安卓壳 APK——WebView UI + 内嵌 Termux 运行时快照(解压即跑),为dsh本地运行设计的高性能方案
项目介绍Project Overview
dsh-mobile-apk 是 DeepSeek Harness 的 Android 插件,提供 WebView 界面与内嵌的 Termux 运行时快照(约 70MB,首次启动解压后从 APK 内启动 bash 引擎),无需单独安装 Termux。内置 SAF 目录桥接、前台保活服务、看门狗进程及在线运行时热更新,通过 window.androidBridge 协议与页面交互。适用场景:在 Android 设备上直接运行完整的 dsh Web 代理与 bash 终端,进行移动端开发、远程执行或离线调试。注意事项:APK 按 ABI 单独打包,x86_64 快照已端到端验证,arm64 需按文档组装,16KB 页版本必须在 16KB 设备上构建。
dsh-mobile-apk is a DeepSeek Harness Android plugin that packages a WebView UI over an embedded Termux runtime snapshot (~70MB, extracted on first launch), so the dsh web agent and bash engine run directly from the APK without a separate Termux install. It exposes a foreground keep-alive service, engine watchdog, SAF directory bridge, and manifest-driven online runtime updates via the window.androidBridge protocol. Use it to run a full dsh agent on Android phones for mobile dev, diagnostics, or offline scripting. Caveat: APKs are per-ABI; only the x86_64 snapshot is end-to-end verified, and 16KB-page builds must be produced on a 16KB device.
请帮我了解并安装插件:【dsh-mobile-apk】【https://github.com/kelai141/dsh-mobile-apk】
把上面这条消息直接发给当前会话里的 DSH,让它帮你了解并安装。安装命令不一定准确,发给 DSH 更稳。Send this message to DSH in your current session. CLI install commands may not be accurate across systems — DSH will figure it out for you.
或使用命令行安装(适合开发者)Or use CLI install (for developers)
命令行安装CLI Install
dsh plugin --profile web add github:kelai141/dsh-mobile-apk
把 kelai141/dsh-mobile-apk 加入你的 DSH 配置(web profile)即可启用。
READMEREADME
dsh-mobile-apk — DeepSeek Harness Android Shell APK
dsh-mobile 生态 · dsh-shell-termux(shell)· dsh-client-ui-responsive(移动 UI)· dsh-host-web-compat(浏览器兼容)
⚠️ 0.13.0-preview — preview release: unstable, intended for community validation — do not rely on it in production.
- ADB is not complete: pairing / port auto-scan / execution are preview UI screens — the real ADB channel is under development and completes in the 0.13.0 official release.
- Plugin-marketplace caveat: the built-in marketplace covers many third-party plugins, and most of them are likely unavailable or buggy on phones (mobile vs desktop differ in WebView engine / filesystem / permission model / runtime). Mobile adaptation is long-term work — treat this beta as usability validation & feedback, not a production dependency. Report plugin issues to the issue tracker with device model / version / reproduction steps.
Android shell for DeepSeek Harness: WebView UI
over an embedded Termux runtime snapshot (extract-and-run, no Termux app needed), SAF directory
bridge, keep-alive foreground service, engine watchdog, and online runtime updates. One APK to
install: it boots a full dsh web agent that can really execute bash. App name DeepCode (icon text
DeepSearch), package com.dsharnessmobile.shell, version 0.13.0-preview (versionCode 24).
Features
- Embedded runtime — xz snapshot (arm64 151.6 MB / x86_64 158.9 MB) bundling node + git + bash +
coreutils + dsh + plugins + pnpm + python/perl/ruby; first launch extracts in 2–4 min
(
refreshSnapshot), engine listens on127.0.0.1:3080; fully offline. - File-to-session (F5) — "Open with / Share" auto-jumps into this app and forces a fresh temp workspace session for the file; temp workspaces get a 7-day TTL auto-cleanup and appear in the workspace panel (issue #60).
- Search (grep/glob) — mobile ripgrep platform package (android-arm64, pcre2/NEON full-featured).
- Notifications — automatic task-completion notifications (engine event bridge + watchdog consumer); system notification chain incl. authorization requests.
- Mobile UI — responsive plugin (drawer/sheet on phones); adjustable font size, immersive status bar, dark theme.
- Built-in console — standalone bash terminal (
assets/console.html+ embedded Termux), usable for diagnostics even when the engine is down. - Keep-alive — foreground service + 5s watchdog (auto-restarts a hung engine) + 3s UI monitor poll + crash auto-rollback gate (UndoGate).
- Online runtime updates — manifest-driven snapshot swap (download → sha256 → atomic switch → auto-restart); the running runtime can update itself without an APK update.
- SAF bridge —
pickDirectorymaps the picked tree to a real path (/storage/emulated/0/…). - Device access — All Files Access; Shizuku probe example.
- ADB authorization UI (preview) — three-gate authorization state machine + pairing-port auto-scan; the real ADB channel lands in the 0.13.0 official release.
Download / Install
Release v0.13.0-preview ships two ABI variants:
| APK | Target |
|---|---|
dsh-mobile-apk-v0.13.0-preview-arm64.apk |
arm64 devices (real phones) |
dsh-mobile-apk-v0.13.0-preview-x86_64.apk |
x86_64 emulators / devices |
adb install -r -t <apk> # same-signature overwrite install
ABI must match the device. A mismatched snapshot crashes the engine at startup — node ELF
EM_X86_64 vs EM_AARCH64. Pick arm64 for real phones, x86_64 for emulators.
Build
Snapshot build & packaging live in the coordination repo (dsh-mobile); this repo is the shell. Requirements: JDK 17+, Android SDK (compileSdk 36); Gradle 8.11.1 via wrapper.
# Snapshot build (Termux sources + dependency closure + pnpm + cordis overrides + slimming):
node scripts\build-snapshot-013.mjs <arm64|x86_64>
# One-shot packaging (snapshot → injection → gates → gradle):
pwsh scripts\build-apk-013.ps1 -Suffix "-preview"
# output: out\v0.13.0\dsh-mobile-apk-v<ver>-<abi>.apk
Gates (inside build-apk-013.ps1): third-party compliance (check-third-party.mjs, GPL
obligations) / secrets / ELF / cordis mount-set ⊇ injected set / LICENSES self-check (Python
streaming) — any failure rejects the build.
Bridge protocol v1 (window.androidBridge)
App name DeepCode (icon text DeepSearch), package com.dsharnessmobile.shell.
androidBridge.version returns the app version (currently 0.13.0-preview, versionCode 24);
pages feature-detect on it. The ADB methods below are the preview authorization surface — the real
channel completes in the 0.13.0 official release.
Synchronous
| method | signature | description |
|---|---|---|
version |
() → string | app version (0.13.0-preview) for feature detection |
getSystemDark |
() → boolean | system dark mode (bypasses vendor WebViews whose matchMedia is stuck on light; used by the first-frame theme bridge) |
checkEngine |
() → string | probes 127.0.0.1:3080; JSON {running, latencyMs, error?} |
hasAllFilesAccess |
() → boolean | whether All Files Access is granted (external workspace requirement) |
getPickToken |
() → string | one-shot token for the directory-picker bridge (validated by the engine-side pick endpoint) |
copyText |
(text) → boolean | native clipboard write (WebView clipboard.writeText is always rejected; page falls back to this) |
getDevLogEnabled |
() → boolean | dev debug-log toggle state |
getAdbState |
() → string | ADB authorization state view (gate state machine): JSON {fullAccess, allowSwitch, paired, wirelessDebugOn, message} (preview) |
discoverAdbPorts |
() → string | wireless-debug port auto-scan (native TCP sweep): pairing-port candidates as JSONArray; [] while wireless debugging is off (preview) |
setAdbPair |
(code, pairPort, connectPort) → boolean | gate-3 pairing: real adb pair handshake; the code goes to argv only — never into the audit log (preview) |
adbShell |
(cmd) → string | ADB shell primitive: JSON {ok, stdout?, stderr?, guidance?}; fail-closed when not authorized (preview) |
Commands
| method | signature | description |
|---|---|---|
keepScreenOn |
(enable) | screen-on wake lock |
showNotification |
(title, text) | test notification channel (POST_NOTIFICATIONS) |
pickDirectory |
(callbackId) | SAF tree picker; result async via window.__dshBridge.onDirectoryPicked(callbackId, path) |
pickImage |
(callbackId) | SAF image picker; result async via the same callback |
setTextZoom |
(percent) | WebView font scale (50–200; Settings → General slider) |
setImmersiveMode |
(enable) | immersive status bar toggle (true = status bar normally hidden) |
downloadDebugLogs |
() | exports engine logs + environment info (zipped, system download/share dialog) |
requestAllFilesAccess |
() | opens the system All Files Access grant page (special permission) |
restartEngine |
() | restarts the engine process (EngineService watchdog brings it back) |
shutdownToGuide |
() | stops the engine and falls back to the test screen (no auto-restart) |
reloadWebUI |
() | reloads the Web UI |
openConsole |
() | opens the built-in console |
setDevLogEnabled |
(enabled) | sets the dev debug-log toggle (logs go under dshdata/log/ when on) |
setAdbAllow |
(enable) | gate-2 "allow access" switch (default off; off ⇒ channel fail-closed) (preview) |
revokeAdbPair |
() | revoke pairing (disconnect + delete adbkey + clear state; audited) (preview) |
The bridge decouples the APK from the dsh version: pages feature-detect on androidBridge.version.
Online update protocol
- App fetches
manifest.json:{url, sha256, size}(defaulthttp://10.0.2.2:8899/manifest.jsonfor emulator testing; production points at a release server); - Downloads the snapshot, verifies SHA-256, extracts to a staging dir (never touching the live tree),
atomically swaps
usr→usr-old→ newusr, then kills the old engine — the watchdog restarts it from the new runtime.
Test trigger: adb shell am start -n com.dsharnessmobile.shell/.MainActivity -a com.dsharnessmobile.shell.action.UPDATE;
status is written to files/update-status.txt. Test server: serve manifest.json + the snapshot from any
local HTTP server (default endpoint http://10.0.2.2:8899/manifest.json maps the host from the emulator).
Permissions
| permission | purpose |
|---|---|
INTERNET |
WebView + engine probe |
POST_NOTIFICATIONS |
notification channel (runtime request on API 33+) |
FOREGROUND_SERVICE + FOREGROUND_SERVICE_DATA_SYNC |
keep-alive foreground service |
MANAGE_EXTERNAL_STORAGE |
All Files Access (external workspace requirement; special permission, user-granted) |
SAF picking needs no permission.
ABI & pagesize
arm64 and x86_64 are both verified end-to-end; APKs are distributed per-ABI (the embedded snapshot is arch-specific). A 16KB-page build must be produced on a 16KB device (see docs/design.md §ABI).
License
MIT. Contains third-party components under their own licenses (see dependency declarations).
GPL compliance: copyleft license texts ship in all three forms — snapshot usr/share/LICENSES/,
repo LICENSES/, and APK assets/licenses/. Design rationale: docs/design.md.
Acknowledgments & invitation
Thanks to the community for feedback and contributions — especially cdwlll (environment issues), haitunlang (MIUI 12 compatibility), TACONailoong (legacy-WebView compat), X-SCI-TECH (PRs), Yangerwei (file race feedback), gr12-cmd (armv7l demand).
Contributors welcome: Android compatibility testing (Huawei / Honor / Xiaomi custom WebViews),
armv7l and more device support, completing the ADB channel, and growing the plugin ecosystem.
Development & contribution guidelines live in each repo's AGENTS.md.
nexu-io/open-design
ruvnet/ruflo
amruthpillai/reactive-resume
esengine/DeepSeek-Reasonix
volcengine/OpenViking
Molunerfinn/PicGo
titanwings/distilly
titanwings/colleague-skill