Skip to content

Latest commit

 

History

History
77 lines (66 loc) · 4.15 KB

File metadata and controls

77 lines (66 loc) · 4.15 KB

opencode for Android

Android host for the existing opencode application. The APK ships the OpenCode server with the documented Android compatibility patches (built with bun build --compile --target=bun-linux-arm64-android) together with the production bundle of packages/app, starts it on loopback and hosts the existing web UI in a WebView. No frontend code is duplicated or changed.

Android Activity
  -> EmbeddedServer (libopencode.so serve --hostname=127.0.0.1)
  -> WebView loads http://127.0.0.1:<port>/ (port selected at startup; packages/app bundle served by the server)

Layout

app/src/main/java/ai/opencode/android/
  MainActivity.kt      WebView host + mobile stylesheet + usage panel injection
  EmbeddedServer.kt    starts the server, prepares HOME/XDG, tools and git
app/src/main/assets/
  usage-panel.js       host affordance for context usage (localized via the app)
  usage-i18n.json      generated: app's `context.*` translations (62 locales)
  git-runtime.zip      generated: Termux aarch64 git + dependencies
app/src/main/jniLibs/arm64-v8a/
  libopencode.so       generated: opencode server (Bun Android target)
  libbun.so            generated: bare Bun Android runtime exposed as bun/node
  librg.so             generated: ripgrep for aarch64-linux-android
  libgit.so            generated: Termux git ELF (executed from nativeLibraryDir)
  libgit-remote-http.so generated: git https remote helper

Generated binaries are not committed (see .gitignore). Build everything with:

./script/android/build-apk.sh

From the repository root, the build script writes packages/android/app/build/outputs/apk/debug/app-debug.apk. It can be installed with adb install -r.

Runtime decisions

  • Executable code ships in the APK. extractNativeLibs/legacy packaging extracts jniLibs into nativeLibraryDir, the only app-writable location where Android still allows execve on targetSdk 29+. Nothing executable is downloaded at runtime.
  • git comes from pinned Termux aarch64 packages, extracted into files/usr and executed from nativeLibraryDir symlinks with LD_LIBRARY_PATH including files/usr/lib. GIT_CONFIG_NOSYSTEM=1 because the Termux build references its own prefix.
  • ripgrep replaces the fff native search library (no Android build); OPENCODE_DISABLE_FFF=true.
  • bun/node are the bare Bun Android runtime, so the agent can execute JS/TS files inside the workspace.
  • HOME/XDG live under /sdcard/OpenCode/home when all-files access is granted; otherwise they use app-private files/home. The default workspace is HOME/workspace. Data in app-private storage is removed on uninstall. WebView project selection may need to be restored after reinstall.
  • Session history is grouped by directory. The host canonicalizes HOME and workspace paths (/data/data/...) and migrates older UI state that stored the /data/user/0/... alias, so the home list matches the server records.
  • UI adaptation happens only through the host: a narrow-screen stylesheet injected by the WebView (dialogs full-screen, settings tabs stacked, titlebar session tabs keep a fixed width and scroll instead of squeezing, home keeps Settings/Help pinned with a scrollable session canvas, prompt editor is taller and the toolbar truncates the model name, main tab row scrolls) plus usage-panel.js host affordances: a localized context-usage panel (matching the repository's context tab, including the context breakdown) opened from the header usage circle or the "Usage" tab, and a read-only "Files" tab for browsing the workspace. File attachments from the phone work through a WebView onShowFileChooser implementation that opens the system document picker. The app bundle itself is untouched (git diff -- packages/app stays empty).

Security posture

  • Server binds 127.0.0.1 only; cleartext traffic is limited to loopback.
  • No Termux app, root, or external OpenCode server is required; provider traffic originates from the device. Cloud providers still require a network connection and credentials.
  • docs/android/EXECUTION_POLICY.md documents the W^X constraints.