gradle-build-performance
Androidアプリや Gradle ビルドのパフォーマンスをデバッグ・最適化します。ビルドが遅い場合、CI/CD のパフォーマンス調査、ビルドスキャンの分析、コンパイルのボトルネック特定などの際に活用してください。
description の原文を見る
Debug and optimize Android/Gradle build performance. Use when builds are slow, investigating CI/CD performance, analyzing build scans, or identifying compilation bottlenecks.
SKILL.md 本文
Gradleビルドパフォーマンス
使用する場合
- ビルド時間が遅い(クリーンビルドまたはインクリメンタルビルド)
- ビルドパフォーマンスの低下を調査する
- Gradleビルドスキャンを分析する
- 設定フェーズと実行フェーズのボトルネックを特定する
- CI/CDのビルド時間を最適化する
- Gradle Configuration Cacheを有効にする
- 不要な再コンパイルを削減する
- kapt/KSPアノテーション処理をデバッグする
例となるプロンプト
- 「ビルドが遅いです。どのように高速化できますか?」
- 「Gradleビルドスキャンを分析するにはどうしたらよいですか?」
- 「設定に時間がかかっているのはなぜですか?」
- 「プロジェクトが常にすべてを再コンパイルするのはなぜですか?」
- 「Configuration Cacheを有効にするにはどうしたらよいですか?」
- 「kaptが遅いのはなぜですか?」
ワークフロー
- ベースラインを測定 — クリーンビルド + インクリメンタルビルドの時間
- ビルドスキャンを生成 —
./gradlew assembleDebug --scan - フェーズを特定 — 設定?実行?依存関係解決?
- 1つの最適化を適用 — 複数の変更をまとめない
- 改善を測定 — ベースラインと比較
- ビルドスキャンで確認 — 視覚的に確認
クイック診断
ビルドスキャンを生成
./gradlew assembleDebug --scan
ローカルでビルドをプロファイリング
./gradlew assembleDebug --profile
# build/reports/profile/ でレポートを開きます
ビルドタイミングサマリー
./gradlew assembleDebug --info | grep -E "^\:.*"
# または Android Studio で表示: Build > Analyze APK Build
ビルドフェーズ
| フェーズ | 処理内容 | 一般的な問題 |
|---|---|---|
| 初期化 | settings.gradle.kts が評価される | 多すぎる include() ステートメント |
| 設定 | すべての build.gradle.kts ファイルが評価される | 高コストなプラグイン、不適切なタスク作成 |
| 実行 | 入出力に基づいてタスクが実行される | キャッシュミス、非インクリメンタルなタスク |
ボトルネックを特定
Build scan → Performance → Build timeline
- 長い設定フェーズ: プラグインと buildscript の最適化に焦点を当てる
- 長い実行フェーズ: タスクキャッシングと並列化に焦点を当てる
- 依存関係解決が遅い: リポジトリ設定に焦点を当てる
12の最適化パターン
1. Configuration Cacheを有効にする
ビルド間で設定フェーズをキャッシュします(AGP 8.0+):
# gradle.properties
org.gradle.configuration-cache=true
org.gradle.configuration-cache.problems=warn
2. ビルドキャッシュを有効にする
ビルドおよびマシン間でタスク出力を再利用します:
# gradle.properties
org.gradle.caching=true
3. 並列実行を有効にする
独立したモジュールを同時にビルドします:
# gradle.properties
org.gradle.parallel=true
4. JVMヒープを増やす
大規模プロジェクト用により多くのメモリを割り当てます:
# gradle.properties
org.gradle.jvmargs=-Xmx4g -XX:+UseParallelGC
5. 非推移的なRクラスを使用する
Rクラスのサイズとコンパイルを削減します(AGP 8.0+デフォルト):
# gradle.properties
android.nonTransitiveRClass=true
6. kaptからKSPに移行する
KSPはKotlinの場合kaptより2倍高速です:
// 前(遅い)
kapt("com.google.dagger:hilt-compiler:2.51.1")
// 後(高速)
ksp("com.google.dagger:hilt-compiler:2.51.1")
7. 動的な依存関係を避ける
依存関係のバージョンをピンします:
// 悪い例: ビルドのたびに解決を強制
implementation("com.example:lib:+")
implementation("com.example:lib:1.0.+")
// 良い例: 固定バージョン
implementation("com.example:lib:1.2.3")
8. リポジトリの順序を最適化する
最も使用されるリポジトリを最初に配置します:
// settings.gradle.kts
dependencyResolutionManagement {
repositories {
google() // 最初: Android依存関係
mavenCentral() // 次: ほとんどのライブラリ
// サードパーティリポジトリは最後
}
}
9. ローカルモジュールに includeBuild を使用する
複合ビルドは大規模なモノレポの project() より高速です:
// settings.gradle.kts
includeBuild("shared-library") {
dependencySubstitution {
substitute(module("com.example:shared")).using(project(":"))
}
}
10. インクリメンタルアノテーション処理を有効にする
# gradle.properties
kapt.incremental.apt=true
kapt.use.worker.api=true
11. 設定時のI/Oを避ける
設定中にファイルを読み取るか、ネットワーク呼び出しをしないでください:
// 悪い例: 設定中に実行
val version = file("version.txt").readText()
// 良い例: 実行フェーズに遅延
val version = providers.fileContents(file("version.txt")).asText
12. 遅延タスク設定を使用する
create() を避けて、register() を使用します:
// 悪い例: 積極的に設定
tasks.create("myTask") { ... }
// 良い例: 遅延設定
tasks.register("myTask") { ... }
一般的なボトルネック分析
遅い設定フェーズ
症状: ビルドスキャンに長い「Configuring build」時間が表示される
原因と対策:
| 原因 | 対策 |
|---|---|
| 不適切なタスク作成 | tasks.create() の代わりに tasks.register() を使用する |
| buildSrcに多くの依存関係 | includeBuild を使用した Convention Plugins に移行 |
| ビルドスクリプト内のファイルI/O | providers.fileContents() を使用する |
| プラグイン内のネットワーク呼び出し | 結果をキャッシュするかオフラインモードを使用 |
遅いコンパイル
症状: :app:compileDebugKotlin に時間がかかる
原因と対策:
| 原因 | 対策 |
|---|---|
| 非インクリメンタルな変更 | キャッシュを無効化する build.gradle.kts 変更を避ける |
| 大きなモジュール | より小さいフィーチャーモジュールに分割 |
| 過度なkapt使用 | KSPに移行 |
| Kotlinコンパイラメモリ | kotlin.daemon.jvmargs を増やす |
キャッシュミス
症状: 変更がないのにタスクが常に再実行される
原因と対策:
| 原因 | 対策 |
|---|---|
| 不安定なタスク入力 | @PathSensitive, @NormalizeLineEndings を使用 |
| 出力のロパス | 相対パスを使用 |
@CacheableTask がない | カスタムタスクにアノテーションを追加 |
| 異なるJDKバージョン | 環境全体でJDKを標準化 |
CI/CD最適化
リモートビルドキャッシュ
// settings.gradle.kts
buildCache {
local { isEnabled = true }
remote<HttpBuildCache> {
url = uri("https://cache.example.com/")
isPush = System.getenv("CI") == "true"
credentials {
username = System.getenv("CACHE_USER")
password = System.getenv("CACHE_PASS")
}
}
}
Gradle Enterprise / Develocity
高度なビルド分析の場合:
// settings.gradle.kts
plugins {
id("com.gradle.develocity") version "3.17"
}
develocity {
buildScan {
termsOfUseUrl.set("https://gradle.com/help/legal-terms-of-use")
termsOfUseAgree.set("yes")
publishing.onlyIf { System.getenv("CI") != null }
}
}
CI内の不要なタスクをスキップ
# UI専用の変更の場合テストをスキップ
./gradlew assembleDebug -x test -x lint
# 影響を受けたモジュールのテストのみ実行
./gradlew :feature:login:test
Android Studio設定
File → Settings → Build → Gradle
- Gradle JDK: プロジェクトのJDKと同じ
- Build and run using: Gradle(IntelliJではない)
- Run tests using: Gradle
File → Settings → Build → Compiler
- Compile independent modules in parallel: ✅ 有効
- Configure on demand: ❌ 無効(非推奨)
検証チェックリスト
最適化後、以下を確認してください:
- Configuration Cacheが有効で機能している
- ビルドキャッシュヒット率 > 80%(ビルドスキャンで確認)
- 動的な依存関係バージョンがない
- 可能な限りkaptの代わりにKSPを使用
- 並列実行が有効
- JVMメモリが適切にチューニングされている
- CIリモートキャッシュが設定されている
- 設定時のI/Oがない
リファレンス
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- new-silvermoon
- ライセンス
- Apache-2.0
- 最終更新
- 不明
Source: https://github.com/new-silvermoon/awesome-android-agent-skills / ライセンス: Apache-2.0
関連スキル
superpowers-streamer-cli
SuperPowers デスクトップストリーマーの npm パッケージをインストール、ログイン、実行、トラブルシューティングできます。ユーザーが npm から `superpowers-ai` をセットアップしたい場合、メールまたは電話でサインインもしくはアカウント作成を行いたい場合、ストリーマーを起動したい場合、表示されたコントロールリンクを開きたい場合、後で停止したい場合、またはソースコードへのアクセスなしに npm やランタイムの一般的な問題から復旧したい場合に使用します。
catc-client-ops
Catalyst Centerのクライアント操作・監視機能 - 有線・無線クライアントのリスト表示・フィルタリング、MACアドレスによる詳細なクライアント検索、クライアント数分析、時間軸での分析、SSIDおよび周波数帯によるフィルタリング、無線トラブルシューティング機能を提供します。MACアドレスやIPアドレスでのクライアント検索、サイト別やSSID別のクライアント数集計、無線周波数帯の分布分析、Wi-Fi信号の問題調査が必要な場合に活用できます。
ci-cd-and-automation
CI/CDパイプラインの設定を自動化します。ビルドおよびデプロイメントパイプラインの構築または変更時に使用できます。品質ゲートの自動化、CI内のテストランナー設定、またはデプロイメント戦略の確立が必要な場合に活用します。
shipping-and-launch
本番環境へのリリース準備を行います。本番環境へのデプロイ準備が必要な場合、リリース前チェックリストが必要な場合、監視機能の設定を行う場合、段階的なロールアウトを計画する場合、またはロールバック戦略が必要な場合に使用します。
linear-release-setup
Linear Releaseに向けたCI/CD設定を生成します。リリース追跡の設定、LinearのCIパイプライン構築、またはLinearリリースとのデプロイメント連携を実施する際に利用できます。GitHub Actions、GitLab CI、CircleCIなど複数のプラットフォームに対応しています。
tracking-application-response-times
API エンドポイント、データベースクエリ、サービスコール全体にわたるアプリケーションのレスポンスタイムを追跡・最適化できます。パフォーマンス監視やボトルネック特定の際に活用してください。「レスポンスタイムを追跡する」「API パフォーマンスを監視する」「遅延を分析する」といった表現で呼び出せます。