雰囲気で乗り切っているひとのためのAndroidビルド高速化ノウハウ
一言で表すと
Gradleビルドシステムの設定を見直して、ビルド高速化しよう。
概要
Gradleビルドキャッシュを使おう
code:gradle.properties
org.gradle.caching=true
org.gradle.configureondemand=true
org.gradle.parallel=true
org.gradle.jvmargs=-Xmx2048m -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelGC
caching: Gradleビルドキャッシュを利用する
configureondemand: 実験的機能。タスクの依存関係にあるプロジェクトのみを実行するのでマルチプロジェクトで効果的
parallel: 並列数をorg.gradle.workers.max(デフォルトはCPU数)に指定
jvmargs: ビルドJVMの起動パラメータ(Xmxはローカル/CIに合わせて)
Go.icon parallel=trueで並列に実行されるのはわかっていたけど、並列数をMAXに指定しているのは知らなかった
ビルドキャッシュを有効にした場合、初回ビルドより2回目のビルドの方がかなり短い。
どれくらいキャッシュを使ったはビルドの出力を見るとわかる
code:txt
BUILD SUCCESSFUL in 9s
367 actionable tasks: 109 executed, 207 from cache, 51 up-to-date
Android Lintも早くなる
推奨環境は「Gradle 7.1.x以上 / Android Studio Bamblebee Canary 13」
Android Lintは重い処理だけど、Bumblebeeではキャッシュができるので、ビルドが早くなるはず。
キャッシュが悪さするケースに遭遇したら
意図せずキャッシュが使われる場合はキャッシュをクリアしたり、キャッシュを使わないでビルドする。
code:txt
Gradleビルドキャッシュを消す場合
rm -rf ~/.gradle/caches/build-cache-1
code:txt
キャッシュを使わないで、とりあえずビルドする場合 --no-build-cache を使う
./gradlew clean assembleDebug --no-build-cache
Go.icon Gradleビルドキャッシュによるものなのかわからないけど、業務でもこんな問題が起きてた。同じようにキャッシュをクリアしたり、キャッシュなしでビルドしたりしてた。
(ちなみにその問題は、CIでリリースビルドしているのに、なぜかリソースだけデバッグのものになるというもの)
Mori Atsushi.icon 怖いね
さらに解説を読みたい方は..
アンドロイド・アンサンブル【C99新刊】を買おう。
---------------
(ドキュメント)ビルド構成を最適化する
開発用のビルド バリアントを作成する
リリースビルドだけで必要なものをデバッグビルドから省くなど。
GO.icon 業務ではリリースビルドだけで必要になるプラグインをデバッグビルドから削除して、ビルドを7分くらい短縮するなどした。
不要なリソースのコンパイルを回避する
code:kotlin
android {
...
productFlavors {
create("dev") {
...
// The following configuration limits the "dev" flavor to using
// English stringresources and xxhdpi screen-density resources.
resConfigs("en", "xxhdpi")
}
...
}
}
Go.icon いいかも
Mori Atsushi.icon これ、デバッグめんどくさくなるのでちょっと悩んでる…
デバッグビルドに対して Crashlytics を無効にする
Mori Atsushi.icon これすごく早くなった
気になるポイント
ドキュメントに色々ビルド時間の短縮のヒントがある
コメント
Mori Atsushi.icon Github Actionsだと gradle/gradle-build-action を使うとキャッシュをかなり持ってくれるので爆速になった