はじめまして、こんにちは。 Androidエンジニアのn-sekiです。STORES 決済 アプリ / SDK の開発を担当しています。
決済 AndroidチームではCIツールとしてBitriseを利用していまして、すこし前にビルドの速度改善をしたところ(大幅に!)ビルド時間が短縮できました。
特殊なことはまったくやっておらず基本に忠実な対応でしたが、かんたんに振り返ってみます。
最初に結論
もったいぶる必要もないので先にやったことをリストします。
- Bitriseのキャッシュを有効化
- Gradleビルドキャッシュを有効化
- Bitriseでビルドに利用されるマシンを強化する
キャッシュを有効化!......その前に
何かを「改善」するときに大切なのが計測、そして仮説です。 今回のビルドでいうと、
- 今現在どれくらいの時間がかかっているのか?
- ビルドのどのステップに時間がかかっているのか?
- どのような手段でステップ実行時間が短縮できると考えられるか?
このようなことを事前に確認しておいて、対応後のビルド時間と比較し、仮説の通り各ステップの実行時間が短縮できたのか(それともできなかったのか)をチェックしなければなりません。必要であればこの工程を繰り返します。
改善前のビルド時間
GitHubのPull Requestでトリガーされるビルドではだいたい20分前後かかることが分かっていました。 改めて過去複数回のビルド時間の平均をとったり、各ステップの実行時間を確認すると次のことがわかりました。
- ビルドは平均20分かかっていた
- Pull Requestを作成してからビルド終了まで20分
- 次のステップの実行時間が大きかった
- ビルドに必要なツールのインストール
- UnitTestの実行と結果レポート作成(現在Pull Requestビルドでは
androidTest
は実行していません) - Lint実行
- ビルド
これらのステップはそれぞれがビルド時間の10%以上を占めており、今回の改善対象と言えそうでした。
キャッシュを有効化
事前の調査から、Gradleビルドキャッシュを利用するとこれらの実行時間が短縮できそうだ、ということが分かっていたので実際に試してみます。
段階的に進めたかったため、まずはBitriseのキャッシュを有効化しました。
Bitriseでは Workflow
にステップを追加するだけでキャッシュを有効にできます。
(Workflow
やステップはBitrise独自の言葉なので、詳しくは公式ドキュメントなどをご覧ください)
この時点ではビルド時間に変動はありません。
ついで、Gradleビルドキャッシュを有効にします。
設定値についてはこちらの記事を大いに参考にさせていただきました(ありがとうございます!)。
またこちらの書籍もとても参考になりました(ありがとうございます!!)。
その他やったこと
- (ビルド時間改善の対応前に)Android Gradle Pluginのバージョンを7.1.0にアップデートしていた
- キャッシュを有効にしたことでLintの速度改善も期待できる
- https://developer.android.com/studio/releases/gradle-plugin#lint-cacheable
- 非推移的なRクラスの使用
- https://developer.android.com/studio/build/optimize-your-build?hl=ja#use-non-transitive-r-classes
- 現時点では恩恵は得られなかったのですが、今後を見据えて導入しました
結果!
キャッシュを有効にしただけで、
約10分のビルド時間短縮が実現できました!
時間がかかっていたステップも期待通り実行時間が大きく短縮され、狙い通りの結果となりました。
この対応によって、今までPull Requestを作ってから20分待つ必要があったものが10分で終わるようになり、開発体験も少し快適になったのではないかと思います。
さらに......
マネージャーから「Bitriseのマシン、スペックが良いものにしてもいいよ」と素敵な言葉をいただいたので、すかさずスペックを変更しました。
Linux-standard
からLinux-elite
にスペックアップさせてあげました。
その結果なんとさらに2分もビルド時間が短縮し、
結果として20分 -> 8分という大幅なビルド時間短縮が実現できました!
まとめ
計測自体にはある程度の時間はかかるものの、ビルドキャッシュの有効化自体はgradle.properties
の修正のみで対応できます。
比較的かんたんな修正でビルド時間がかなり短縮でき、費用対効果がとても高い改善になったのではないかと思います。
ビルド時間に限らず、開発環境はどんどん改善していきたいですね。
モバイルエンジニア募集中です〜。ご興味があればお気軽にご連絡ください。