English version

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 エミュレータを起動することです。
1
2
3
| docker run -d -p 6080:6080 -p 5554:5554 -p 5555:5555 \
--name android-container \
budtmo/docker-android:emulator_11.0
|
起動後、ブラウザで http://localhost:6080 にアクセスすると、Android 画面が表示されます。
ポートの説明
| ポート | 用途 |
|---|
| 6080 | noVNC(Web インターフェース) |
| 5554 | ADB コンソールポート |
| 5555 | ADB デバッグポート |
| 4723 | Appium サーバー(Appium イメージ使用時) |
基本的な使い方
Web ブラウザからの操作
- ブラウザで
http://localhost:6080 にアクセス - 画面をクリック、ドラッグ、スワイプで Android を操作
- キーボード入力も可能
ADB 経由での操作
Docker ホストから ADB でコンテナ内の Android にアクセスできます。
1
2
3
4
5
6
7
8
9
10
11
| # ADB 接続
adb connect localhost:5555
# デバイス一覧確認
adb devices
# アプリのインストール
adb install my-app.apk
# シェルアクセス
adb shell
|
Docker Compose での構成
複数のエミュレータを起動する場合は、Docker Compose
を使用すると便利です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| version: '3'
services:
android-11:
image: budtmo/docker-android:emulator_11.0
ports:
- "6080:6080"
- "5554:5554"
- "5555:5555"
environment:
- DEVICE=Samsung Galaxy S10
- DATAPARTITION=4g
privileged: true
android-13:
image: budtmo/docker-android:emulator_13.0
ports:
- "6081:6080"
- "5556:5554"
- "5557:5555"
environment:
- DEVICE=Pixel 6
- DATAPARTITION=4g
privileged: true
|
起動コマンド:
これにより、Android 11 と Android 13 の 2 つのエミュレータが起動し、それぞれ異なるポートでアクセスできます。
Appium を使ったテスト自動化
docker-android には Appium
サーバーが組み込まれたイメージも用意されています。Appiumは、モバイルアプリケーションのテスト自動化を実現するオープンソースフレームワークです。
Appium イメージの起動
1
2
3
| docker run -d -p 6080:6080 -p 4723:4723 -p 5555:5555 \
--name appium-android \
budtmo/docker-android:emulator_11.0_appium
|
Python + Appium のテストコード例
以下は、Appium で Android アプリをテストする Python コードの例です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| from appium import webdriver
from appium.options.android import UiAutomator2Options
# Appium サーバーの設定
options = UiAutomator2Options()
options.platform_name = 'Android'
options.platform_version = '11'
options.device_name = 'emulator-5554'
options.app = '/path/to/your/app.apk'
# Appium サーバーに接続
driver = webdriver.Remote('http://localhost:4723', options=options)
# テスト実行例
try:
# 要素を取得してクリック
element = driver.find_element('id', 'com.example:id/button')
element.click()
# テキスト入力
input_field = driver.find_element('id', 'com.example:id/input')
input_field.send_keys('Hello, docker-android!')
print("テスト成功")
finally:
driver.quit()
|
CI/CD パイプラインでの使用例(GitHub Actions)
以下は、GitHub Actions
で docker-android を使用してテストを実行する例です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| name: Android UI Tests
on:
push:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Start Android emulator
run: |
docker run -d -p 4723:4723 -p 5555:5555 \
--name android-emulator \
budtmo/docker-android:emulator_11.0_appium
# エミュレータの起動を待機
sleep 30
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install appium-python-client pytest
- name: Run tests
run: |
pytest tests/test_android.py
- name: Stop emulator
if: always()
run: docker stop android-emulator
|
環境変数によるカスタマイズ
docker-android では、以下の環境変数でエミュレータの動作をカスタマイズできます。
| 環境変数 | 説明 | デフォルト値 |
|---|
DEVICE | デバイスモデル名 | Samsung Galaxy S10 |
DATAPARTITION | データパーティションサイズ | 2g |
EMULATOR_TIMEOUT | 起動タイムアウト(秒) | 300 |
RELAXED_SECURITY | Appium のセキュリティ緩和 | false |
使用例:
1
2
3
4
| docker run -d -p 6080:6080 -p 5555:5555 \
-e DEVICE="Pixel 6" \
-e DATAPARTITION="4g" \
budtmo/docker-android:emulator_13.0
|
クラウド環境での活用
AWS ECS での構成例
docker-android は AWS ECS
や GCP Cloud Run などのコンテナオーケストレーション環境でも動作します。
以下は、AWS ECS タスク定義の例です(一部抜粋)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| {
"family": "android-emulator-task",
"containerDefinitions": [
{
"name": "android-emulator",
"image": "budtmo/docker-android:emulator_11.0_appium",
"memory": 4096,
"cpu": 2048,
"essential": true,
"portMappings": [
{
"containerPort": 6080,
"protocol": "tcp"
},
{
"containerPort": 4723,
"protocol": "tcp"
}
],
"environment": [
{
"name": "DEVICE",
"value": "Samsung Galaxy S10"
},
{
"name": "DATAPARTITION",
"value": "4g"
}
]
}
],
"requiresCompatibilities": ["FARGATE"],
"networkMode": "awsvpc",
"cpu": "2048",
"memory": "4096"
}
|
Kubernetes での構成例
Kubernetes
での Deployment 例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
| apiVersion: apps/v1
kind: Deployment
metadata:
name: android-emulator
spec:
replicas: 3
selector:
matchLabels:
app: android-emulator
template:
metadata:
labels:
app: android-emulator
spec:
containers:
- name: android
image: budtmo/docker-android:emulator_11.0_appium
ports:
- containerPort: 6080
- containerPort: 4723
resources:
limits:
memory: "4Gi"
cpu: "2"
requests:
memory: "2Gi"
cpu: "1"
env:
- name: DEVICE
value: "Pixel 6"
- name: DATAPARTITION
value: "4g"
---
apiVersion: v1
kind: Service
metadata:
name: android-emulator-service
spec:
selector:
app: android-emulator
ports:
- name: novnc
port: 6080
targetPort: 6080
- name: appium
port: 4723
targetPort: 4723
type: LoadBalancer
|
パフォーマンスとリソース管理
リソース要件
1 つのエミュレータあたりの推奨リソース:
- CPU: 2 コア以上
- メモリ: 4GB 以上(Android 11 以降は 8GB 推奨)
- ディスク: 10GB 以上
並列実行時の注意点
複数のエミュレータを同時に起動する場合、以下の点に注意してください。
- ポート番号の重複を避ける
- ホストマシンのリソースを適切に配分する
- Docker の
--cpus と --memory オプションでリソース制限を設定
並列実行例:
1
2
3
4
5
6
7
8
9
10
11
| # エミュレータ 1
docker run -d -p 6080:6080 -p 5555:5555 \
--cpus="2" --memory="4g" \
--name android-1 \
budtmo/docker-android:emulator_11.0
# エミュレータ 2
docker run -d -p 6081:6080 -p 5556:5555 \
--cpus="2" --memory="4g" \
--name android-2 \
budtmo/docker-android:emulator_11.0
|
トラブルシューティング
エミュレータが起動しない場合
原因: ハードウェア仮想化が無効
解決方法: BIOS で Intel VT-x または AMD-V を有効化してください。Linux の場合は KVM が利用可能か確認します。
1
2
| # KVM が利用可能か確認
egrep -c '(vmx|svm)' /proc/cpuinfo
|
noVNC が接続できない場合
原因: ポートマッピングが正しくない
解決方法: -p オプションでポートが正しくマッピングされているか確認してください。
1
2
| # ポート使用状況の確認
docker port android-container
|
メモリ不足エラー
原因: コンテナに割り当てられたメモリが不足
解決方法: --memory オプションでメモリを増やすか、DATAPARTITION 環境変数を小さくします。
1
2
3
4
| docker run -d -p 6080:6080 -p 5555:5555 \
--memory="8g" \
-e DATAPARTITION="2g" \
budtmo/docker-android:emulator_11.0
|
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 テスト基盤を検討している方は、ぜひ試してみてください。
関連記事
参考リンク