- android studioが不要なandroidアプリのビルド環境を作りたい
- 今の環境を残したままSDKやNDKバージョンが違う環境を作りたい
- Android Studioを立ち上げると起動が遅いので嫌気がさしている
Dockerコンテナを使ってビルド環境を作ると、そういった課題を解決することができます。
ゴール
最終的にAndroidアプリがビルドできる以下の環境を構築します。
- ホストOS: Windows 10 64bit
- Docker for Windows:18.09.2
- ゲストOS:Ubuntu16 16.04
- Android SDK:24と28
- Android NDK:リビジョン16b
- CMake:3.6.411459
- gcc/g++:4.9
NDKに関して、2019/5月時点でのNDKの最新の安定版はリビジョン19cですが、今回はリビジョン16bを使います。というのも、リビジョン18からgccが非サポートとなり、代わってclangが正式サポートとなっています。今回はCMakeとgccを使いたいため、リビジョン16bを利用します。
Dockerfile
先に結論を書きます。最終的に作成したDockerfileは以下のようになります。
FROM ubuntu:16.04
# Install sudo
RUN apt-get update ¥
&& apt-get -y install sudo ¥
&& user add -m android && echo "android:android" | chpasswd && adducer android sudo
# Install 32bit lib
RUN sudo apt-get -y install lib32stdc++6 lib32zl
# Environment variables
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
# Install Java8
RUN apt-get install -y software-properties-common curl ¥
&& add-apt-repository -y ppa:openjdk-r/ppa ¥
&& apt-get update ¥
&& apt-get install -y openjdk-8-jdk
# Environment variables
ENV ANDROID_COMPILE_SDK="24" ¥
ANDROID_BUILD_TOOLS="28.0.3" ¥
ANDROID_SDK_TOOLS_REV="4333796" ¥
ANDROID_CMAKE_REV="3.6.411459" ¥
ANDROID_CMAKE_REV_3_10="3.10.2.49884404" ¥
ANDROID_HOME=/usr/local/android-sdk-linux ¥
ANDROID_NDK=/usr/local/android-sdk-linux/ndk-bundle
ENV PATH $ANDROID_HOME/platform-tools:$ANDROID_NDK:$ANDROID_HOME/tools/bin:$PATH
ARG SDK_TOOL_VERSION=sdk-tools-linux-${ANDROID_SDK_TOOLS_REV}
# install wget, unzip
RUN apt-get update ¥
&& apt-get install -y --no-install-recommends ¥
wget ¥
unzip
# install android sdk tools
RUN cd /usr/local ¥
&& 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 ¥
&& mkdir -p $HOME/.android ¥
&& touch ~/.android/repositories.cfg
# install tools
RUN yes | sdkmanager --licenses > /dev/null ¥
&& yes | sdkmanager --update ¥
&& yes | sdkmanager 'tools' ¥
&& yes | sdkmanager 'platform-tools' ¥
&& yes | sdkmanager 'build-tools;'$ANDROID_BUILD_TOOLS ¥
&& yes | sdkmanager 'platforms;android-'$ANDROID_COMPILE_SDK ¥
&& yes | sdkmanager 'platforms;android-28' ¥
&& yes | sdkmanager 'extras;android;m2repository' ¥
&& yes | sdkmanager 'extras;google;google_play_services' ¥
&& yes | sdkmanager 'extras;google;m2repository' ¥
# install cmake, ndk
ARG CMAKE_REV_3_6=cmake;$ANDROID_CMAKE_REV
RUN yes | sdkmanager $CMAKE_REV_3_6 ¥
&& yes | sdkmanager --channel=3 --channel=1 'cmake;'$ANDROID_CMAKE_REV_3_10 ¥
&& yes | sdkmanager 'ndk-bundle'
# update Android NDK version
RUN cd $ANDROID_HOME ¥
&& wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip ¥
&& unzip android-ndk-r16b-linux-x86_64.zip ¥
&& rm android-ndk-r16b-linux-x86_64.zip ¥
&& rm -r ndk-bundle ¥
&& mv android-ndk-r16b ndk-bundle
解説
Open JDKのインストール
JavaをビルドするためにOpen JDKをインストールします。
# Environment variables
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
# Install Java8
RUN apt-get install -y software-properties-common curl ¥
&& add-apt-repository -y ppa:openjdk-r/ppa ¥
&& apt-get update ¥
&& apt-get install -y openjdk-8-jdk
インストールするライブラリのバージョン指定
sdk-tools、cmake、ndkのバージョンを指定します。この数値を変更すれば別のバージョンのものをインストールできます。
# Environment variables
ENV ANDROID_COMPILE_SDK="24" ¥
ANDROID_BUILD_TOOLS="28.0.3" ¥
ANDROID_SDK_TOOLS_REV="4333796" ¥
ANDROID_CMAKE_REV="3.6.411459" ¥
ANDROID_CMAKE_REV_3_10="3.10.2.49884404" ¥
ANDROID_HOME=/usr/local/android-sdk-linux ¥
ANDROID_NDK=/usr/local/android-sdk-linux/ndk-bundle
Android SDKのインストール
zipをwgetでダウンロードして解凍します。最後の2行はsdk-toolsを使ってインストールする際に必要となるファイルです。このタイミングで作っておきます。
# install android sdk tools
RUN cd /usr/local ¥
&& 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 ¥
&& mkdir -p $HOME/.android ¥
&& touch ~/.android/repositories.cfg
ビルドツールのインストール
先ほどダウンロードしたsdk-toolsを使って各種ツールをダウンロードします。yes | sdkmanagerとすることでsdkmanagerを使うと求められる同意を承認しています。
build-toolsだけあればビルドできそうな気がしますが、adb等の各種ツールも一緒にダウンロードしています。
ターゲットとするAPIによって$ANDROID_COMPILE_SDKを指定する必要があります。
# install tools
RUN yes | sdkmanager --licenses > /dev/null ¥
&& yes | sdkmanager --update ¥
&& yes | sdkmanager 'tools' ¥
&& yes | sdkmanager 'platform-tools' ¥
&& yes | sdkmanager 'build-tools;'$ANDROID_BUILD_TOOLS ¥
&& yes | sdkmanager 'platforms;android-'$ANDROID_COMPILE_SDK ¥
&& yes | sdkmanager 'platforms;android-28' ¥
最後に
今回作成した環境を用いれば、Android Studioで作成したプロジェクトであればbuild.shを叩くとandroidアプリ(apk)が作成できると思います。またCMakeを用いることでc++向けのライブラリをビルドすることもできます。
今回はubuntuをベースに作成しましたが、少々容量が大きくなってしまいました。alpineを使うとより軽量なイメージが作れると思います。時間があれば挑戦してみたいと思います。