DockerでAndroidアプリをビルドする


こんにちはsekitakaです。

Dockerコンテナ上でAndroidアプリのビルドやテストができれば、jenkinsやクラウドのCIサービスなどでビルドスクリプトを使いまわせて便利ですね。
jenkisスレーブのネイティブの環境を汚さなくて済むというのも魅力的です。

そこでこの記事ではDockerでAndroidアプリをビルドする方法を紹介します。
サンプルプロジェクトも公開しているので、自由に利用してください。

Dockerfile

以下のDockerfileでAndroidをビルドするための基本的な環境が整います。

FROM ubuntu:16.04

# JDKインストール
# 2回実行しているのは Connection timed out が起きがちだったため。
RUN apt-get -y update
RUN apt-get -y install openjdk-8-jdk || true
RUN apt-get -y install openjdk-8-jdk

# Android SDKインストール
RUN apt-get install -y wget unzip
RUN wget https://dl.google.com/android/repository/tools_r25.2.3-linux.zip
RUN mkdir -p /Android/sdk
RUN unzip tools_r25.2.3-linux.zip -d /Android/sdk

# 環境変数
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
ENV ANDROID_HOME /Android/sdk
ENV PATH $ANDROID_HOME/bin:$PATH

Dockerイメージのビルド

このDockerfileを利用してイメージを作成します。
以下のコマンドを実行するとandroidという名前のイメージが作成されます。

cd <プロジェクトディレクトリ>
docker build -t android docker/

Androidアプリのビルド

Dockerイメージが作成できたら、以下のコマンドでサンプルアプリのビルドが可能です。
build.shgradlewを実行しています。build.shはコンテナ上で実行されています。
build.sh の内容については後述します。

cd <プロジェクトディレクトリ>
docker run --rm \
-v `pwd`:/app \
-v `pwd`/docker/share_by_container/android-sdk:/Android/sdk \
-v `pwd`/docker/share_by_container/dot_gradle:/root/.gradle \
-w /app -t android sh build.sh

ちなみに --rm はコマンド終了後に自動的にコンテナを削除するオプションです。使用後のゴミコンテナを残さないようにしています。

-vでホスト側のディレクトリをコンテナから参照できるようにしています。
/appにはホストのAndroidプロジェクトのディレクトリ、/Android/sdk には共有用のディレクトリ、 /root/.gradleにも共有用のディレクトリをマウントしています。
共有用のディレクトリはビルドに必要なパッケージなどが保存される場所で、コンテナ起動毎にダウンロードすると時間がかかるためこのようにしています。

build.sh

Dockerとは直接関係ないですが、ビルド用のシェルスクリプトは以下のようにしています。
各種パッケージのライセンスへの同意情報をandroid-sdk-licenseに書き込んでいます。
Macのローカル開発環境のライセンスへの同意情報は ~/Library/Android/sdk/licenses/android-sdk-license にありました。
下の例では 8933bad161af4178b1185d1a37fbf41ea5269c55 がライセンスの同意情報で、ローカルの開発環境で同意した値をコピーすればdockerでも同意した状態になります。

build.sh
#!/bin/bash

rm -f local.properties
mkdir -p $ANDROID_HOME/licenses
echo "8933bad161af4178b1185d1a37fbf41ea5269c55" > $ANDROID_HOME/licenses/android-sdk-license

./gradlew clean && \
./gradlew dependencies && \
./gradlew assembleDebug

まとめ

いかがでしたでしょうか。AndroidアプリをDocker上でビルドする方法を紹介しました。
Dockerでビルドすることでビルド環境をコードとしてリポジトリ管理できるようになるのがうれしいですね。

今回の記事で使用したサンプルプロジェクトは公開していますので、自由に使用してください。