Edited at
PORTDay 15

DockerでAndroidアプリのビルド環境を作る

「PORT」アドベントカレンダー 15日目

新卒エンジニアの@kichinagaです。

業務では、主にサーバーサイドや、アプリの開発を行っています。

最近、SlackからGithubのAndroidのプロジェクトをDeploygateにデプロイするための前準備として、DockerでAndroidアプリのビルド環境を作成したので、それについて書きます。


元イメージ

なるべく容量を抑える為にalpineイメージを使用しました。

またglibcの入っているイメージを使用しました。

glibcの入ったイメージを使用しているのは、普通のalpineイメージだとappt周りで失敗する為です。


Dockerfile

FROM frolvlad/alpine-glibc:alpine-3.8



パッケージのインストール

jdkなど、必要なものがいくつかあるので、それらのパッケージをインストールします。


Dockerfile

RUN apk update && \

apk upgrade && \
apk --no-cache --virtual .build add \
bash \
openjdk8 \
wget


環境変数, Pathの設定

次にjdkや、sdk toolsのパスや、ビルドするAndroidのバージョンの設定を行います


Dockerfile

## ENV settings

ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk
ENV SDK_TOOL_VERSION=sdk-tools-linux-4333796
ENV ANDROID_HOME=/usr/local/android-sdk-linux
ENV BUILD_TOOLS_VERSION=28.0.3
ENV PLATFORMS_VERSION=android-28
ENV PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin


SDK Toolのインストール

sdkmanagerコマンドを使えるように、sdk toolsをインストールします。

公式サイトからlinux用のsdk toolsをwgetでダウンロードし、unzipで指定の場所にsdk toolsを展開します。

展開した後はsdk toolsのzipは必要なくなるので、容量削減の為に削除しましょう。


Dockerfile

# install android sdk tools

RUN mkdir $ANDROID_HOME && \
wget "https://dl.google.com/android/repository/${SDK_TOOL_VERSION}.zip" && \
unzip -d $ANDROID_HOME $SDK_TOOL_VERSION.zip && \
rm -rf $SDK_TOOL_VERSION.zip


ライセンスの認証

sdk toolsは使用する為にライセンスに同意する必要があります。

sdkmanager --licensesコマンドで全てのライセンスに同意できます。

ライセンスは複数あり、同意時にはyを押す必要があるので、yesコマンドで同意します。

また、Warning: File ~/.android/repositories.cfg could not be loaded.という警告が出るので、あらかじめ~/.android/repositories.cfgを作成しておきます。


Dockerfile

# agree sdkmanager licenses

RUN mkdir ~/.android && \
touch ~/.android/repositories.cfg
RUN yes | sdkmanager --licenses


ビルドツールのインストール

最後に、Androidアプリのビルドツール群をsdkmanagerからインストールします。


Dockerfile

# install android tools and more

RUN sdkmanager "tools" "build-tools;${BUILD_TOOLS_VERSION}" "platforms;${PLATFORMS_VERSION}" "platform-tools" "extras;android;m2repository"

これで、Androidビルド用のDockerイメージが作成できました。


Dockerfile

今までのをまとめた物です


Dockerfile

FROM frolvlad/alpine-glibc:alpine-3.8

## install package
RUN apk update && \
apk upgrade && \
apk --no-cache --virtual .build add \
bash \
openjdk8 \
wget

## ENV settings
ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk
ENV SDK_TOOL_VERSION=sdk-tools-linux-4333796
ENV ANDROID_HOME=/usr/local/android-sdk-linux
ENV BUILD_TOOLS_VERSION=28.0.3
ENV PLATFORMS_VERSION=android-28
ENV PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin

# install android sdk tools
RUN mkdir $ANDROID_HOME && \
wget "https://dl.google.com/android/repository/${SDK_TOOL_VERSION}.zip" && \
unzip -d $ANDROID_HOME $SDK_TOOL_VERSION.zip && \
rm -rf $SDK_TOOL_VERSION.zip

# agree sdkmanager licenses
RUN mkdir ~/.android && \
touch ~/.android/repositories.cfg
RUN yes | sdkmanager --licenses

# install android tools and more
RUN sdkmanager "tools" "build-tools;${BUILD_TOOLS_VERSION}" "platforms;${PLATFORMS_VERSION}" "platform-tools" "extras;android;m2repository"



おまけ

上のdockerfileをイメージ化しておき、androidのプロジェクト直下に下のbuild.shを置いて次のコマンドを実行すると、Docker上でbuildを行い、deploygateにデプロイしてくれます。


build.sh

#!/bin/bash

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

curl \
-F "token=[deploygeteのtoken]" \
-F "file=@/project/app/build/outputs/apk/debug/app-debug.apk" \
-F "message=sample" \
https://deploygate.com/api/users/[ユーザー名]/apps


コマンド

$ docker run -v `pwd`:/project -w /project -t [コンテナ名] sh /project/build_debug.sh


参考

AlpineベースのAndroidビルド環境のDockerイメージを作成した


最後に

本当はSlackでdeployまでやりたかったんですが、時間的に厳しかったです...

CIにも流用できそうなので、Slack deployも含めて、時間を作って手を伸ばしたいと思います。




PORT 株式会社では、自社サービスを支えてくれる優秀な Ruby エンジニアを募集しています(Ruby エンジニア以外も)。

もくもく会も行なっていますので、ぜひ一緒にもくもくしましょう!

PORT Advent Calendar はまだまだ続きます。乞うご期待!