ANTIGRAVITY LABEN
記事一覧/アプリ開発
アプリ開発/2026-06-25上級

お気に入りを一つ押すたびに、見えている壁紙が全部描き直されていた — Compose の再コンポーズを実測で止めた記録

壁紙アプリのグリッドで、お気に入りを一つ切り替えるたびに可視サムネイル全件が再コンポーズされていた問題を、Composition Tracing で実測してから直した記録です。不安定な引数の特定、データモデルの安定化、ラムダと派生状態の扱い、修正前後の再コンポーズ回数の比較までを個人開発の視点でまとめました。

Android18Jetpack Compose3再コンポーズパフォーマンス最適化3Composition Tracing

プレミアム記事

壁紙アプリのお気に入り一覧を作り直していたとき、サムネイルのハートを一つ押すたびに、画面に見えている十数枚のサムネイルがほんの一瞬ちらつくのに気づきました。タップした一枚だけが切り替わってほしいのに、可視範囲のセル全部が描き直されているような挙動です。

スクロール中だと、このちらつきがそのままカクつきになります。自分の Pixel では辛うじて滑らかでも、古い端末を貸してくれる知人の手元では明らかに引っかかる。個人開発で同じアプリを長く触っていると、自分の端末の速さに慣れてしまって、こういう劣化を見落とします。気づいたのは、低速端末でスクロールしながらお気に入りを連打したときでした。原因は Jetpack Compose の再コンポーズ範囲が広がりっぱなしになっていたことで、まず「何回描き直されているか」を数字にするところから手をつけました。

推測でチューニングを始めない — まず再コンポーズ回数を可視化する

Compose のパフォーマンス問題でいちばんやってはいけないのは、rememberkey を勘で足していくことです。どの Composable が何回再コンポーズされているか分からないまま手を入れると、効いたのか効いていないのか判断できず、別の場所を壊します。

最初にやったのは Composition Tracing の有効化でした。System Trace に「どの Composable 関数が何回コンポーズ/再コンポーズされたか」が名前付きで載るようになります。このセットアップ自体は定型作業なので、Antigravity のエージェントに「composition tracing を有効化して、デバッグビルドでだけ計測できるようにして」と頼み、出てきた差分を私が確認しました。

// app/build.gradle.kts
dependencies {
    // Composition Tracing 用(debug のみで十分)
    implementation("androidx.tracing:tracing-perfetto:1.0.0")
    implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
}
 
// Compose コンパイラに composition tracing マーカーを埋め込ませる
composeCompiler {
    // デバッグ計測時のみ true。リリースには含めない
    includeTraceMarkers = true
}

計測は Android Studio の System Trace プロファイラ、もしくは Macrobenchmark から androidx.tracing.perfetto を起動して取りました。起動後にお気に入りを一回トグルし、トレースを Perfetto で開いて、サムネイル Composable のスライス数を数えます。ここで「一回のトグルで可視セル数ぶんの再コンポーズが走っている」ことが、初めて疑いではなく事実になりました。

犯人は「不安定な引数」だった

再コンポーズが広がる典型は、Composable に渡している引数が Compose コンパイラから「不安定(unstable)」と判定されているケースです。不安定な引数を一つでも受け取る Composable は、スキップ(skippable)の対象から外れ、親が再コンポーズされるたびに無条件で再コンポーズされます。

私のグリッドのアイテムは、こんなデータクラスを受け取っていました。

// 一見ふつうのモデル。だが Compose からは unstable に見える
data class WallpaperItem(
    val id: String,
    val thumbnailUrl: String,
    val tags: List<String>,        // ← List はインターフェースなので unstable 扱い
    var isFavorite: Boolean,       // ← var は unstable の決定打
)

List<String> は実装が差し替わりうるインターフェース型なので、コンパイラは中身が変わらない保証がないと判断します。さらに var プロパティは、いつ書き換わるか分からないため不安定の決定打です。この一つのモデルが unstable なせいで、それを受け取るサムネイル Composable 全体が skippable でなくなり、お気に入りの Set が更新されて親が再コンポーズされるたびに、可視セルが全部巻き込まれていました。

安定性の判定は、Compose コンパイラのレポート出力で確認できます。

# build.gradle.kts に compiler reports を出す設定を入れた上で
./gradlew assembleRelease \
  -Pandroidx.compose.compiler.reports.destination=build/compose_reports
 
# 生成された *-classes.txt を見ると stable/unstable が一覧で出る
# 例: unstable class WallpaperItem

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
Composition Tracing を仕込み、どの Composable が一操作で何回再コンポーズされているかを推測ではなく数値として読めるようになります
LazyVerticalGrid が favorite トグルのたびに可視サムネイル全件を描き直していた原因を不安定な引数まで特定し、@Immutable・安定キー・derivedStateOf で再コンポーズを必要な一件に絞り込めるようになります
修正前後の再コンポーズ回数とスクロール時のフレーム時間を Before/After で比較し、個人開発でどこまでエージェントに計測を任せどの判断を自分で握るかの線引きを持てるようになります
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

アプリ開発2026-06-23
インストール直後だけ起動が一拍遅い — Baseline Profile で Android のコールドスタートを実測で詰めた手順
更新直後やインストール直後だけ Android アプリの起動が一拍もたつく原因を JIT と Cloud Profile の観点で切り分け、Baseline Profile でコールドスタートを実測で詰めた手順を、Macrobenchmark の構築から段階公開での監視まで個人開発の視点でまとめました。
アプリ開発2026-03-15
Antigravity × Android プロダクション設計 — Jetpack Compose + MVI で「出荷できるアプリ」を AI と作る
Antigravity を使って本番品質の Android アプリを設計・実装する上級ガイド。MVI アーキテクチャ、Jetpack Compose のパフォーマンス最適化、テスト戦略、CI/CD まで、AI と協働する実践手法を解説します。
アプリ開発2026-03-10
Android Studio × Antigravity Android 開発ガイド — Kotlin/Jetpack Compose を AI で加速する
Android Studio と Antigravity を組み合わせて Android アプリ開発を効率化する方法を、Kotlin と Jetpack Compose のコード生成からテスト、Google Play 公開まで解説します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →