概要
Podroid は、 Android端末 で Linuxコンテナ を動作させるアプリ。 root不要 で、 Alpine Linux VM 上の Podman を利用可能。 QEMU仮想化 と シリアルターミナル を内蔵。 永続性、 ネットワーク、 ポートフォワーディング に対応。 Android 8.0+(arm64)端末 で利用可能。
Podroidの特徴
- root権限不要 でLinuxコンテナ実行を実現
- QEMU による軽量な Alpine Linux VM を起動
- Podman によるOCIコンテナランタイム提供
- シリアルターミナル 内蔵(xterm完全エミュレーション)
- 永続化 機能:パッケージ、設定、コンテナイメージ保存
- ネットワーク :インターネット接続とポートフォワーディング対応
- 自己完結型 :root不要、Termux不要、ホストバイナリ不要
- 対応要件 :arm64 Android 8.0+、150MB以上の空き容量
クイックスタート手順
- APK をReleasesからインストール
- Podroidを開き、「 Start Podman」をタップ
- 約 20秒 でVMが起動(画面・通知で進捗表示)
- 「 Open Terminal」をタップしターミナル起動
- コンテナ実行例
podman run --rm alpine echo hellopodman run --rm -it alpine shpodman run -d -p 8080:80 nginx
ターミナル機能詳細
- TermuxのTerminalView を利用した VT100/xtermエミュレーション
- 追加キー バー(ESC、TAB、CTRL、ALT、F1–F12等)
- CTRL/ALT は トグル操作 対応
- SYNC ボタンで端末サイズ手動同期
- キーボード開閉時 に自動で端末サイズ同期
- ベル文字 でバイブレーション通知
- TUIアプリ (vim、btop、htop等)も正しく表示
ポートフォワーディング機能
- VMからAndroid端末への ポート転送 設定
- 設定画面でルール追加(例:TCP 8080→80)
- 端末のlocalhost:8080でサービスへアクセス
- ルールは 再起動後も保持、VM稼働中でも追加・削除可能
仕組み・アーキテクチャ
- Androidアプリ
- Foreground Service でVMを常駐
- PodroidQemu (libqemu-system-aarch64.so使用、KVMなし)
- シリアル標準入出力←→ターミナルエミュレータ
- QMPソケット(ポート転送・VM制御)
- Alpine Linux VM
- 読み取り専用initramfs+永続ext4ディスク(overlayfs構成)
- ttyAMA0上でgettyによるジョブ制御
- Podman+crun+netavark+slirp4netns搭載
起動シーケンス
- QEMUがvmlinuz-virt+initrd.imgをロード
- 2段階init(init-podroid)が永続ext4ディスクをoverlayfs上にマウント
- インストールパッケージやコンテナイメージはoverlayに保存され再起動後も維持
ターミナル連携
- Androidアプリはホストプロセスのfork不可
- TerminalSessionはQEMUのシリアルI/Oにリフレクションで直結
- キーボード入力→QEMU stdin、QEMU stdout→ターミナル
- sttyで端末サイズ同期、TUIアプリも正しく表示
ネットワーク
- QEMUのユーザーモードネットワーク(SLIRP)によりVMは10.0.2.15を取得
- ポートフォワードはQEMUのhostfwd機能をCLI引数・QMP経由で管理
ソースからのビルド方法
- initramfsのビルド(multi-arch対応Docker必要)
./docker-build-initramfs.sh
- APKのビルド
./gradlew assembleDebugadb install -r app/build/outputs/apk/debug/app-debug.apk
プロジェクト構成
- Dockerfile:initramfsビルダー(Alpine aarch64)
- docker-build-initramfs.sh:ワンコマンドビルドスクリプト
- init-podroid:VM用カスタムinit
- app/src/main/
- java/com/excp/podroid/
- engine/:QEMUライフサイクル・QMPクライアント・VM状態管理
- service/:フォアグラウンドサービス・起動通知
- data/repository/:設定・ポート転送永続化
- ui/screens/:ホーム・ターミナル・設定(Jetpack Compose)
- jniLibs/arm64-v8a/:プリビルドQEMU+libslirp
- assets/:カーネル+initramfs(自動生成)
- java/com/excp/podroid/
クレジット
- QEMU :マシンエミュレーション
- Alpine Linux :VMベース
- Podman :コンテナランタイム
- Termux :ターミナルエミュレータライブラリ
- Limbo PC Emulator :Android上QEMUの先駆者
ライセンス
- GNU General Public License v2.0