AndroidでClaude Code / Codex / Gemini CLIを動かすために詰まったこと —— Shelly
はじめに
前回、ShellyというAndroid向けターミナルIDEを作った話を書きました。
今回はその続きとして、実際にAndroid上でAI coding CLIを動かそうとして詰まった部分を書きます。
なぜTermux/prootだけでは足りなかったか
- phantom process killing
- SELinux
- app切り替え時のプロセス維持
- WebView/WebSocketベースの限界
- CLIごとの認証・実行方式の差
Shellyの現在の構成
- Expo / React Native UI
- Kotlin / Android native module
- JNI forkpty
- managed runtime
- bundled CLI binaries
- TypeScript側のUI/agent orchestration
JNI forkptyにした理由
PTYをAndroidアプリ内で直接持つことで、ターミナル出力をUIとAIに渡しやすくした。
managed runtimeの考え方
Androidのapp data配下に置いたバイナリをそのままexecすると制約に当たる。
そこで、実行経路を制御するラッパーを用意した。
※ここは「完全なSELinux bypass」とは書かず、制約回避のための実装と書く。
Claude Codeで詰まったこと
- 旧バージョンは動く
- 2.1.113+ はmusl Bun SEA周りでブロック
-
__errno_location問題 - Bash tool実行で追加課題
- 現時点では完全解決ではない
Codexで詰まったこと
- codex-termux fork経由で動かしている
- ただし最新モデル利用にはCLI側のバージョン制約がある
-
gpt-5.5は現行同梱CLIでは弾かれるケースがある
Gemini CLIで詰まったこと
- 起動はする
- 自動更新が失敗する場合がある
- Shelly内で「最新版を常に使う」設計はまだ完全ではない
実機テストで分かったこと
- Galaxy Z Fold6で検証
- Claude Codeのペーストは通った
- CLIごとに正常系が違う
- READMEに書けることと、実機で保証できることを分ける必要がある
APKサイズ問題
v5.1.0時点でAPKは約866〜868MiB。
主因はAI CLI runtimeを同梱していること。
大きいもの:
- Claude runtime
- Codex TUI / exec
- cli-tools.tar
- Node
- GitHub CLI
stripではほぼ削れなかった。
次にやるなら、Core APK + optional runtime download方式。
まとめ
Android上でAI coding agentを動かすことはできる。
ただし「Linuxが動くからCLIもそのまま動く」わけではない。
Shellyは今、その境界を1つずつ潰している段階です。
