
docker-android は、Android エミュレータをDocker コンテナ内で動作させ、Web ブラウザから遠隔操作できるようにするオープンソースプロジェクトです。Android Studioをインストールすることなく、CI/CD パイプラインでのテスト 自動化やクラウド環境でのスケーラブルな Android テスト基盤を構築できます。
本記事では、docker-android の概要、セットアップ方法、基本的な使い方、そして実践的な活用例を紹介します。
docker-android とは?
docker-android は、budtmo 氏によって開発されている Docker ベースの Android エミュレータ環境です。主な特徴は以下の通りです。
主な特徴
- Web ブラウザからのアクセス: noVNC を使用して、ブラウザから Android 画面を直接操作
- 複数バージョン対応: Android 5.0 から最新バージョンまでサポート
- CI/CD 統合: Jenkins、GitLab CI、GitHub Actions などと簡単に統合可能
- Appium 対応: テスト自動化フレームワークと連携可能
- スケーラビリティ: Kubernetes や Docker Swarm でのスケールアウトに対応
アーキテクチャ
docker-android は以下のコンポーネントで構成されています。
graph TB
Browser[Webブラウザ]
noVNC[noVNC Server
Port: 6080]
VNC[VNC Server]
Emulator[Android Emulator
AVD]
Appium[Appium Server
Port: 4723
オプション]
ADB[ADB Server
Port: 5554/5555]
Browser -->|HTTP| noVNC
noVNC -->|VNC Protocol| VNC
VNC --> Emulator
Appium --> ADB
ADB --> Emulator
style Browser fill:#e1f5ff
style Emulator fill:#a5d6a7
style noVNC fill:#fff59d
style Appium fill:#ffcc80
主要コンポーネント:
- Android エミュレータ: Android SDK の AVD(Android Virtual Device)
- noVNC: VNC をブラウザから利用できるようにする Web インターフェース
- Appium サーバー: テスト自動化用の WebDriver サーバー(オプション)
- ADB(Android Debug Bridge): デバッグとコマンド実行用
セットアップ
前提条件
- Docker : 20.10 以上
- ハードウェア仮想化: Intel VT-x または AMD-V が有効化されていること
- メモリ: 最低 4GB(推奨 8GB 以上)
基本的な起動方法
最もシンプルな使い方は、以下のコマンドで Android 11 エミュレータを起動することです。
| |
起動後、ブラウザで http://localhost:6080 にアクセスすると、Android 画面が表示されます。
ポートの説明
| ポート | 用途 |
|---|---|
| 6080 | noVNC(Web インターフェース) |
| 5554 | ADB コンソールポート |
| 5555 | ADB デバッグポート |
| 4723 | Appium サーバー(Appium イメージ使用時) |
基本的な使い方
Web ブラウザからの操作
- ブラウザで
http://localhost:6080にアクセス - 画面をクリック、ドラッグ、スワイプで Android を操作
- キーボード入力も可能
ADB 経由での操作
Docker ホストから ADB でコンテナ内の Android にアクセスできます。
| |
Docker Compose での構成
複数のエミュレータを起動する場合は、Docker Compose を使用すると便利です。
| |
起動コマンド:
| |
これにより、Android 11 と Android 13 の 2 つのエミュレータが起動し、それぞれ異なるポートでアクセスできます。
Appium を使ったテスト自動化
docker-android には Appium サーバーが組み込まれたイメージも用意されています。Appiumは、モバイルアプリケーションのテスト自動化を実現するオープンソースフレームワークです。
Appium イメージの起動
| |
Python + Appium のテストコード例
以下は、Appium で Android アプリをテストする Python コードの例です。
| |
CI/CD パイプラインでの使用例(GitHub Actions)
以下は、GitHub Actions で docker-android を使用してテストを実行する例です。
| |
環境変数によるカスタマイズ
docker-android では、以下の環境変数でエミュレータの動作をカスタマイズできます。
| 環境変数 | 説明 | デフォルト値 |
|---|---|---|
DEVICE | デバイスモデル名 | Samsung Galaxy S10 |
DATAPARTITION | データパーティションサイズ | 2g |
EMULATOR_TIMEOUT | 起動タイムアウト(秒) | 300 |
RELAXED_SECURITY | Appium のセキュリティ緩和 | false |
使用例:
| |
クラウド環境での活用
AWS ECS での構成例
docker-android は AWS ECS や GCP Cloud Run などのコンテナオーケストレーション環境でも動作します。
以下は、AWS ECS タスク定義の例です(一部抜粋)。
| |
Kubernetes での構成例
Kubernetes での Deployment 例:
| |
パフォーマンスとリソース管理
リソース要件
1 つのエミュレータあたりの推奨リソース:
- CPU: 2 コア以上
- メモリ: 4GB 以上(Android 11 以降は 8GB 推奨)
- ディスク: 10GB 以上
並列実行時の注意点
複数のエミュレータを同時に起動する場合、以下の点に注意してください。
- ポート番号の重複を避ける
- ホストマシンのリソースを適切に配分する
- Docker の
--cpusと--memoryオプションでリソース制限を設定
並列実行例:
| |
トラブルシューティング
エミュレータが起動しない場合
原因: ハードウェア仮想化が無効
解決方法: BIOS で Intel VT-x または AMD-V を有効化してください。Linux の場合は KVM が利用可能か確認します。
| |
noVNC が接続できない場合
原因: ポートマッピングが正しくない
解決方法: -p オプションでポートが正しくマッピングされているか確認してください。
| |
メモリ不足エラー
原因: コンテナに割り当てられたメモリが不足
解決方法: --memory オプションでメモリを増やすか、DATAPARTITION 環境変数を小さくします。
| |
Android Studio Emulator との比較
| 項目 | docker-android | Android Studio Emulator |
|---|---|---|
| セットアップの簡単さ | ◎(Docker のみ) | △(Android Studio 必須) |
| CI/CD 統合 | ◎(簡単) | △(設定が複雑) |
| リモートアクセス | ◎(ブラウザ経由) | ×(VNC 等が必要) |
| パフォーマンス | ○(若干遅い) | ◎(ネイティブ並み) |
| スケーラビリティ | ◎(コンテナ化) | △(手動管理) |
| GPU サポート | △(制限あり※) | ◎(完全サポート) |
※ コンテナ環境でのGPU passthrough設定が必要
docker-android は CI/CD やクラウド環境での自動テストに適している一方、ローカル開発では Android Studio Emulator の方がパフォーマンスに優れています。
まとめ
docker-android を使用することで、Android エミュレータの環境構築が大幅に簡素化され、CI/CD パイプラインでのテスト自動化やクラウド環境でのスケーラブルなテスト基盤の構築が容易になります。
主なメリットは以下の通りです。
- Android Studio 不要で、ブラウザから Android を操作可能
- Docker コンテナとして管理できるため、環境の再現性が高い
- Appium と組み合わせることで、強力なテスト自動化が実現可能
- Kubernetes や ECS でスケールアウト可能
CI/CD でのテスト自動化やクラウド環境での Android テスト基盤を検討している方は、ぜひ試してみてください。
関連記事
- GitHub Actions を cron ジョブとして使う - CI/CDでの定期実行の設定方法
- Bucketeer: サイバーエージェント製フィーチャーフラグプラットフォーム - Docker Composeを使った開発環境構築の例
- 技術者の年末大掃除(Part 2) - Dockerの不要リソース削除について