APK Cloud Runner — アーキテクチャ図

「ブラウザでAPKを動かすサービス」設計書 v0.9 の補足図版 / 2026-10-03

案C:redroid in per-session microVM ★ 公開サービスの推奨構成

redroid の密度・起動速度と、KVM仮想マシンによる隔離強度を両取りする構成。敵対的APKからホストを守る境界は Layer 2(VM)。

① ブラウザ (クライアント) Next.js + TypeScript ・WebCodecs VideoDecoder → WebGL ・Pointer/Keyboard/IME キャプチャ ・APK ドラッグ&ドロップ UI ② エッジ Cloudflare ・WAF / DDoS / Bot ・Turnstile ・レート制限 ③ 管理プレーン(東京リージョン / 実行プレーンとは別VPC) API Next.js / Go 認証・課金・監査 APK 解析 Worker aapt2 / apksigner ClamAV / YARA Orchestrator Go / スケジューラ ABI・version・負荷 PostgreSQL セッション/監査 Redis キュー/状態 R2 / S3 APK 保管 Stream GW Go / WSS 中継 Observability: Prometheus / Grafana / Loki / OTel  Security: 異常検知・自動kill・支出ガードレール ④ 実行プレーン(ベアメタル / KVM有効ホスト)— 管理プレーンから到達不可、outbound は egress proxy のみ Host Agent Go 単一バイナリ VM ライフサイクル adb install 実行 ★ Layer 2:KVM microVM(セッション毎に新規作成 → 終了後 完全破棄) Layer 3:最小ゲスト Linux(binder_linux / ashmem or memfd のみ) Layer 4:redroid コンテナ(--privileged は VM 内に閉じる) Android 8.1〜16 / overlayfs: /data-base 共通 + /data-diff 専用 libndk_translation 同梱(x86_64ホスト時 → arm/arm64 APK 対応) Layer 5:ユーザの APK scrcpy-server.jar adb :5555 は VM 内部のみ。公網へ絶対に露出しない VM #N ... (同構造) ウォームプール (ready) Egress Proxy (squid) ・既定 DENY / allowlist ・内部DNS のみ、sinkhole ・port 80/443 のみ ・帯域制限 5Mbps/VM ・全フローログ 90日 完全遮断 ✕ 169.254.169.254 (metadata) ✕ RFC1918 / link-local ✕ SMTP / SSH / IRC / RDP gRPC: VM 起動 / adb install / scrcpy 注入 isolated bridge → egress proxy のみ(外部IFへ直接 routing しない) H.264 + 制御 → Stream GW → WSS WSS: H.264 バイナリフレーム ⇄ touch/key/IME/clipboard
映像・制御ストリーム(H.264 / scrcpy プロトコル) ユーザトラフィック(HTTPS / WSS) 内部制御(gRPC / adb) egress(既定DENY・全監視)
なぜこの構成か: redroid は --privileged が必須で、コンテナ隔離が実質無効になります。VMを1枚挟むことで --privileged は「ゲストカーネルに対する特権」に留まり、ホストは守られます。redroid の起動速度・密度はそのまま享受できます。
必須要件: KVM が使えるホスト(ベアメタル or 入れ子仮想化対応クラウド)。通常の管理系VPSやアプライアンスOS(TrueNAS等)では動きません。

案B:redroid 直接(Docker on VPS) PoC / MVP 向け 公開サービスには不可

KVM不要・普通のVPSで動く・最も早く形になる。ただし --privileged + ホストカーネル共有のため、信頼できないAPKには耐えられない。

ブラウザ WebCodecs + WSS Next.js API + Orchestrator セッション管理 APK 解析・スキャン 単一ホスト(KVM不要の普通VPS)— ホストカーネルを全コンテナが共有 ⚠ redroid #1 (--privileged) Android 13 全ケーパビリティ / 全 /dev seccomp・AppArmor 無効 → ホストの FS をマウント可能 → 脱出が「機能」 binder はホストカーネルの モジュール = 攻撃面に直接触れる redroid #2 ... #N 同じホストカーネルを共有 密度 20〜40 セッション 起動 10〜20秒 Stream Gateway scrcpy-server 注入 H.264 → WSS 制御イベント中継 Egress Proxy(案Cと共通) 既定DENY / allowlist / 内部DNS / 帯域制限 metadata IP (169.254.169.254) 完全遮断 全フローログ保存・異常検知・自動kill ※ ホストが侵害された場合、  この proxy も bypass されうる → 別ホストに置くのが望ましい WSS (H.264 ⇄ 入力)
使い方: Phase 0〜2 と、信頼できる開発者だけがAPKを上げるクローズドβまで。不特定多数に開放する前に案Cへ移行することをロードマップの Gate として固定してください。
redroid 公式 README の免責(原文): "Should NOT expose adb port on public network, otherwise, redroid container (even host OS) may get compromised."

案D:AOSP Emulator / Cuttlefish + 公式 WebRTC 配信を自作したくない場合の最速解

Google が公式に「エミュレータをブラウザに映す」実装を提供している。映像配信を自前で書く必要がない代わりに、密度とコストが悪い。

ブラウザ WebRTC (映像) gRPC-web (操作) ※ Cuttlefish は Chrome/Chromium 必須 API + Orchestrator セッション管理 / APK解析 スケジューラ TURN サーバ NAT 越えに必須 帯域課金が発生 ベアメタル / 入れ子仮想化ホスト(KVM 必須) Cuttlefish(AOSP 公式 VM 型仮想デバイス) crosvm / QEMU + KVM → 元々VMなので隔離が強い --start_webrtc が既定 → :8443 にブラウザUIが出る RAM 16GB 程度推奨 → 密度 3〜8 / ホスト GMS 入りイメージが公式提供(ライセンス範囲内での利用) google/android-emulator-container-scripts(代替) "end-to-end WebRTC streaming architecture to view and control the emulator in a web browser" WebRTC(映像) + gRPC(マウス/キーボード) x86_64 イメージは Android 11+ で ARM翻訳を内蔵
利点: 映像配信・入力中継を Google 公式実装に任せられる。GMS 入りイメージを正規ルートで使える(redroid + Open GApps のような法的グレーが無い)。元々VMなので隔離も強い。
欠点: 密度が低い(Cuttlefish は数GB〜16GB/インスタンス)ため、同時100セッションではコストが案Cの2〜3倍。TURN サーバの運用と帯域課金も発生。Cuttlefish の Web UI は Chrome/Chromium 限定。
ハイブリッド案: MVP は案D で「配信部分を自作せずに」立ち上げ、ユーザが付いてから案C(redroid + microVM + 自前 WebCodecs 配信)へ移行してコストを下げる、という経路も合理的です。

案A:完全クライアントサイド(v86 / container2wasm) 不採用

サーバ不要で隔離も完璧。しかし性能が3桁足りず、現代のAPKは起動しない。

ブラウザ内のみ(サーバ:静的ホスティングだけ) APK ドロップ ローカルで完結 v86 (x86 → WASM JIT) 0.9 〜 2.7 mIPS 実機は数1,000 mIPS → 3桁不足 Android-x86 1.6-r2 2009年世代が限界 イメージDL 数百MB〜1GB 現代 APK:起動せず minSdk 21+ が要求する ART / binder / GLES / 64bit 参考:copy.sh/v86/?profile=android (公式デモ、"Speed: 0.9 mIPS / Avg: 2.7 mIPS" 表示) container2wasm(Bochs/QEMU→WASM)、CheerpX/WebVM も同オーダーで、Android Framework 非対応
不採用の理由: 要件「任意のAPKが動く」を満たせません。将来 WebGPU + WASM SIMD + スレッド化 + JIT が進んだ際の再評価対象として記録に留めます。
それでも価値がある場面: 「ブラウザの中で Android が動く」という技術デモ・話題作り・OSS としての発信。サーバコストがゼロなので、サイドプロジェクトとしては成立します。

構成比較

評価軸 案A
client (v86)
案B
redroid 直接
案C ★
redroid + microVM
案D
Emulator/Cuttlefish
案E
SaaS (Anbox等)
現代APKが動く✕○○○○
敵対的APK(マルウェア)に耐える○✕ 致命的○ VM境界○ VM境界○
KVM 不要(普通VPSで動く)○○✕✕○
密度(セッション / 64GBホスト)n/a20〜4010〜203〜8〜100(公称)
コールドスタート数分〜10〜20秒20〜40秒60〜120秒数秒
映像配信の自前実装不要必要必要不要(公式)不要
TURN サーバ不要不要不要必要提供側
32bit ARM (armeabi-v7a)✕○ x86_64+翻訳○ x86_64+翻訳○ x86_64+翻訳プラン次第
GMS(Play / ログイン / FCM)✕✕(法的に不可)✕(法的に不可)△ 公式イメージ△ 契約次第
月額目安(同時10・東京)¥0¥25,000¥210,000〜¥350,000〜¥150,000〜(従量)
MVP までの工数1〜2週6〜8週12〜16週6〜8週2〜4週
法務リスク低高中低〜中低(ベンダ負担)
公開サービス適性✕✕◎○◎
推奨する経路: 案B で Phase 0〜2(PoC/MVP)→ 案C で Phase 4(公開)。並行して案E(Anbox Cloud / Corellium / Appetize)の法人見積を取得し、自前構築の総コスト(人件費 約¥10M + 6ヶ月)と比較して最終判断する。
もう一つの合理的な経路: 映像配信の自前実装を避けるため、MVPは案D(Google公式WebRTC流用)で立ち上げ、トラフィックが増えた段階で案Cに移してコストを下げる。

隔離レイヤ(案C)

Layer実体敵対的APKからの距離
5ユーザの APK—
4redroid(Android ユーザ空間)同一プロセス空間
3最小ゲスト Linux(binder / ashmem のみ)ゲストカーネル(使い捨て)
2QEMU/KVM microVM★ VM境界=公開サービスの最低ライン
1ホスト OS(最小構成)保護対象
0物理 / ハイパーバイザ保護対象
案B が公開に不適な理由: --privileged は全ケーパビリティ付与・全 /dev アクセス・seccomp/AppArmor 無効化・ホストFSマウント可能を意味します。コンテナ脱出が「脆弱性」ではなく「機能」です。加えて binder はホストカーネルのモジュールなので、敵対的コードがホストカーネルの攻撃面に直接触れます。
設計書 v0.9 補足図版 — 数値は推定値を含みます。Phase 0(ホスト検証)で実測して確定してください。