メモ2ブログ

メモtoウェブログ。旧ブログはこちら。 http://sakebook.blogspot.jp/

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

なるべく小さく、sdkmanagerにも対応させた、CI用のDockerイメージを作成しました。 Emulatorなどを利用したAndroid Testにはまだ未対応ですが、Unit Testは実行できます。

PublicなDockerHubに上げたかったのですが、ライセンス違反という話があるのでPrivateにしてあります。

github.com

↑なぜか画像がアイコンになってくれない。。

詰まったところ

sdkmanagerの実行で失敗

bashも入ってないため、sdkmanagerの実行で失敗します。

sdkmanager: line 159: syntax error: unexpected "(" (expecting "}")
apk add bash

が必要でした。

glibcがない

純粋なAlpineのイメージだと、glibcが入ってないためapptでコケました。

Wikiにインストール方法が載っていたのですが、うまく入れられませんでした。

調べたら、こちら が既にAndroidを動かせる状態であったのですが、glibcだけを入れたイメージがあった ので、そちらをベースに作成することにしました。

内部的にはどちらもこのリポジトリに依存してるみたいです。

sdkmanagerを利用すると怒られる

sdkmanagerを利用するとWarningが表示されました。

Warning: File ~/.android/repositories.cfg could not be loaded.

ファイルを作成することでWarningが消えました。

改善したいところ

SDKも含めると結局大きい

Dockerイメージ自体を置いておけたり、キャッシュを効かせられないと、時間がかかります。 しかし、今まで利用してたイメージのサイズが2GB程度だったのに比べて、今回作成したイメージは1GBを切った(DockerHubのtagの数字)ので、そういう意味では小さくできました。

ライセンス周りの承認をいい感じにしたい

現状は承認ファイルのようなものを固定で入れてます。

しかし、 SDK Toolsの25.3.0から sdkmanager で承認ファイルを管理できます。

$ sdkmanager --licenses
5 of 5 SDK package licenses not accepted.
Review licenses that have not been accepted (y/N)?

あとは y を数回押すだけで、 $ANDROID_HOME/licenses/ に、承認ファイルが作成されます。

次のようにすれば自動で全部Acceptできるはずです。

$ (while sleep 1; do echo "y"; done) | sdkmanager --licenses

DLできるSDK Toolsが更新されたときに合わせてDockerfileも更新しようと思っています。

作成してみて

なんとなく触ってたDockerも、なるべくレイヤーを少なくすることだったり、registryにpushすることなどができて理解が深まりました。

ただ、ベストプラクティスのようなものがわかっていないので今後利用していきながら修正してければなと思います。

参考

Alpine Linux入門 -内部構造とapkでパッケージインストール編- / tehepero note(・ω<)

お前のDockerイメージはまだ重い💢💢💢 / Speaker Deck

公開用DockerイメージにAndroid SDKを含めるのはライセンス違反という話 / Islands in the byte stream

Alpine Linux / Alpine Linux

Glibc / OSS 用語集

Running glibc programs / Alpine Linux Wiki

alvr/alpine-android / GitHub

frol/docker-alpine-glibc / GitHub

sgerrand/alpine-pkg-glibc / GitHub

Installing Android Studio in Ubuntu 14.04 64-Bit .android/repositories.cfg could not be loaded / Stack Overflow

SDK Tools Release Notes / Android Studio

android - Automatically accept all SDK licences / Stack Overflow