本日、Jetpack Compose 2025 年 12 月リリースが安定版になりました。これには、コア Compose モジュールのバージョン 1.10 とマテリアル 3 のバージョン 1.4 が含まれており(BOM マッピングの完全版を参照)、新機能と大幅なパフォーマンスの改善が追加されています。
本日のリリースを使用するには、Compose BOM バージョンを 2025.12.00 にアップグレードします。
implementation(platform("androidx.compose:compose-bom:2025.12.00"))
パフォーマンスの向上
アプリの実行時のパフォーマンスは、デベロッパーとユーザーにとって非常に重要です。そのため、Compose チームはパフォーマンスを最優先事項として取り組んでいます。今回のリリースでは、さまざまな改善が行われています。最新バージョンにアップグレードするだけで、これらの改善をすべて利用できます。社内のスクロール ベンチマークによると、Compose のパフォーマンスは、Views を使用した場合のパフォーマンスと同程度になっています。
さまざまなバージョンの Compose で View と Jetpack Compose を比較したスクロール パフォーマンスのベンチマーク
遅延プリフェッチで一時停止可能なコンポジション
遅延プリフェッチでの一時停止可能なコンポジションがデフォルトで有効になりました。これは、Compose ランタイムの動作を根本的に変更するもので、UI ワークロードの負荷が高いときに発生するジャンクを大幅に削減するように設計されています。
以前は、コンポジションが開始されると、完了まで実行する必要がありました。コンポジションが複雑な場合、メインスレッドが 1 フレームよりも長くブロックされ、UI がフリーズすることがあります。一時停止可能なコンポジションを使用すると、実行時間が不足した場合にランタイムが作業を一時停止し、次のフレームで作業を再開できるようになります。これは、遅延レイアウトのプリフェッチと組み合わせて使用し、フレームを事前に準備する場合に特に効果的です。Compose 1.9 で導入された Lazy レイアウトの CacheWindow API は、より多くのコンテンツをプリフェッチし、一時停止可能なコンポジションを活用して、よりスムーズな UI パフォーマンスを実現する優れた方法です。
一時停止可能なコンポジションと遅延プリフェッチを組み合わせることで、ジャンクを減らす
また、Modifier.onPlaced、Modifier.onVisibilityChanged、その他の修飾子の実装を改善し、パフォーマンスを最適化しました。Google は、Compose のパフォーマンスの改善に引き続き取り組んでまいります。
新機能
保持
Compose には、さまざまなライフサイクルで状態を保持して管理するための API が多数用意されています。たとえば、remember はコンポーズ間で状態を保持し、rememberSavable/rememberSerializable はアクティビティやプロセスの再作成間で状態を保持します。retain は、これらの API の間に位置する新しい API で、シリアル化せずに構成の変更をまたいで値を保持できますが、プロセスの終了をまたいで保持することはできません。retain は状態をシリアル化しないため、ラムダ式、フロー、ビットマップなどの大きなオブジェクトなど、簡単にシリアル化できないオブジェクトを永続化できます。たとえば、retain を使用してメディア プレーヤー(ExoPlayer など)を管理し、構成の変更によってメディアの再生が中断されないようにすることができます。
@Composable
fun MediaPlayer() {
val applicationContext = LocalContext.current.applicationContext
val exoPlayer = retain { ExoPlayer.Builder(applicationContext).apply { ... }.build() }
...
}
この機能の設計に影響を与え、貢献してくれた AndroidDev コミュニティ(特に Circuit チーム)に感謝いたします。
Material 1.4
material3 ライブラリのバージョン 1.4.0 では、新しいコンポーネントと機能強化が多数追加されています。
TextFieldは、テキストの状態を管理するためのより堅牢なメソッドを提供する、試験運用版のTextFieldStateベースのバージョンを提供するようになりました。また、新しいSecureTextFieldバリアントとOutlinedSecureTextFieldバリアントが提供されるようになりました。マテリアルTextコンポーザブルで autoSize 動作がサポートされるようになりました。- カルーセル コンポーネントに新しい
HorizontalCenteredHeroCarouselバリエーションが追加されました。 TimePickerで、選択ツールと入力モードの切り替えがサポートされるようになりました。- 垂直ドラッグ ハンドルを使用すると、ユーザーはアダプティブ ペインのサイズや位置を変更できます。
水平中央揃えのヒーロー カルーセル
Material 3 Expressive API は、引き続き material3 ライブラリのアルファ版で開発されています。詳細については、最近の講演をご覧ください。
新しいアニメーション機能
共有要素アニメーションのカスタマイズに関する更新など、アニメーション API の拡張を続けています。
動的共有要素
デフォルトでは、sharedElement() アニメーションと sharedBounds() アニメーションは
レイアウトは、ターゲット状態に一致するキーが見つかるたびに変更されます。ただし、ナビゲーションの方向や現在の UI の状態などの特定の条件に基づいて、このアニメーションを動的に無効にしたい場合があります。
共有要素の遷移が発生するかどうかを制御するために、rememberSharedContentState() に渡される SharedContentConfig をカスタマイズできるようになりました。isEnabled プロパティは、共有要素がアクティブかどうかを決定します。
SharedTransitionLayout {
val transition = updateTransition(currentState)
transition.AnimatedContent { targetState ->
// Create the configuration that depends on state changing.
fun animationConfig() : SharedTransitionScope.SharedContentConfig {
return object : SharedTransitionScope.SharedContentConfig {
override val SharedTransitionScope.SharedContentState.isEnabled: Boolean
get() =
// determine whether to perform a shared element transition
}
}
}
詳しくは、ドキュメントをご覧ください。
Modifier.skipToLookaheadPosition()
このリリースでは、共有要素のアニメーションを実行するときにコンポーザブルの最終位置を保持する新しい修飾子 Modifier.skipToLookaheadPosition() が追加されました。これにより、Androidify サンプルでカメラが徐々に表示されるように、「表示」タイプのトランジション アニメーションを実行できます。詳しくは、こちらの動画のヒントをご覧ください。
共有要素の遷移における初期速度
このリリースでは、新しい共有要素遷移 API prepareTransitionWithInitialVelocity が追加されました。これにより、共有要素遷移に初期速度(ジェスチャーなど)を渡すことができます。
Modifier.fillMaxSize()
.draggable2D(
rememberDraggable2DState { offset += it },
onDragStopped = { velocity ->
// Set up the initial velocity for the upcoming shared element
// transition.
sharedContentStateForDraggableCat
?.prepareTransitionWithInitialVelocity(velocity)
showDetails = false
},
)
ジェスチャーの初期速度から始まる共有要素のトランジション
ベール トランジション
EnterTransition と ExitTransition は、AnimatedVisibility/AnimatedContent コンポーザブルの表示と非表示の方法を定義します。新しい試験運用中のベール オプションを使用すると、コンテンツをベールまたはスクリムで覆う色を指定できます。たとえば、コンテンツの上に半透明の黒いレイヤをフェードイン/フェードアウトできます。
ベールで覆われたアニメーション コンテンツ - アニメーション中にグリッド コンテンツの上に半透明のベール(またはスクリム)が被せられていることに注意してください
AnimatedContent(
targetState = page,
modifier = Modifier.fillMaxSize().weight(1f),
transitionSpec = {
if (targetState > initialState) {
(slideInHorizontally { it } togetherWith
slideOutHorizontally { -it / 2 } + veilOut(targetColor = veilColor))
} else {
slideInHorizontally { -it / 2 } +
unveilIn(initialColor = veilColor) togetherWith slideOutHorizontally { it }
}
},
) { targetPage ->
...
}
今後予定されている変更
Modifier.onFirstVisible の非推奨
Compose 1.9 では、Modifier.onVisibilityChanged と Modifier.onFirstVisible が導入されました。フィードバックを審査した結果、Modifier.onFirstVisible の契約を確定的に履行することは不可能であることが明らかになりました。具体的には、アイテムが最初に表示される場合です。たとえば、Lazy レイアウトでは、ビューポートからスクロール アウトしたアイテムを破棄し、スクロール バックしてビューポートに戻ってきたら、再度コンポーズします。この場合、onFirstVisible コールバックは、新しく構成されたアイテムであるため、再度実行されます。同様の動作は、onFirstVisible を含む以前にアクセスした画面に戻る場合にも発生します。そのため、次の Compose リリース(1.11)でこの修飾子を非推奨とし、onVisibilityChanged への移行をおすすめすることにしました。詳細については、ドキュメントをご覧ください。
テストでのコルーチンのディスパッチ
テストの不安定さを改善し、より多くの問題を検出するために、テストでのコルーチンのディスパッチを変更する予定です。現在、テストでは UnconfinedTestDispatcher が使用されています。これは本番環境の動作とは異なります。たとえば、効果はキューに入れられるのではなく、すぐに実行されることがあります。今後のリリースでは、本番環境の動作に合わせてデフォルトで StandardTestDispatcher を使用する新しい API を導入する予定です。1.10 では、今すぐ新しい動作を試すことができます。
@get:Rule // also createAndroidComposeRule, createEmptyComposeRule val rule = createComposeRule(effectContext = StandardTestDispatcher())
StandardTestDispatcher を使用するとタスクがキューに登録されるため、composeTestRule.waitForIdle() や composeTestRule.runOnIdle() などの同期メカニズムを使用する必要があります。テストで runTest を使用する場合は、同期のために runTest と Compose ルールが同じ StandardTestDispatcher インスタンスを共有していることを確認する必要があります。
// 1. Create a SINGLE dispatcher instance
val testDispatcher = StandardTestDispatcher()
// 2. Pass it to your Compose rule
@get:Rule
val composeRule = createComposeRule(effectContext = testDispatcher)
@Test
// 3. Pass the *SAME INSTANCE* to runTest
fun myTest() = runTest(testDispatcher) {
composeRule.setContent { /* ... */ }
}
ツール
優れた API には優れたツールがふさわしいものです。Android Studio には、Compose デベロッパー向けの最新機能が多数追加されています。
- 変換 UI:
@Previewを右クリックして [変換 UI] を選択し、自然言語で変更を記述することで、デザインを繰り返し作成できます。 - 生成
@Preview: コンポーザブルを右クリックして、[Gemini] > [[コンポーザブル名] のプレビューを生成] を選択します。 - Vector Asset ウィザードでアイコンのバリエーションを新たにサポートし、マテリアル シンボルをカスタマイズできるようになりました。
- スクリーンショットからコードを生成したり、Gemini に既存の UI をターゲット画像に一致させるよう相談したりできます。これは、リモート MCP サポートと組み合わせて、Figma ファイルに接続してデザインから Compose UI を生成するなどの用途に使用できます。
- UI の品質に関する問題を修正するでは、ユーザー補助の問題などの一般的な問題について UI を監査し、修正案を提示します。
これらのツールが実際に動作している様子については、最近のデモをご覧ください。
Compose をお楽しみください
Google は、美しくリッチな UI を作成するために必要な API とツールを提供できるよう、Jetpack Compose への投資を継続しています。皆様からの貴重なご意見を大切にしております。今回の変更や今後のご希望について、Issue Tracker からフィードバックをお寄せください。
続きを読む
-
プロダクト ニュース
本日、The Android Show で発表されたように、Android はオペレーティング システムからインテリジェンス システムへと移行し、アプリのエンゲージメントを高める機会を増やしています。
Matthew McCullough • 所要時間: 4 分
-
プロダクト ニュース
モバイル エコシステムは常に進化しており、新たな機会と新たな脅威の両方をもたらしています。これらの変更を通じて、Android と Google Play は、数十億のユーザーが安心してアプリを利用し続け、デベロッパーのイノベーションが発展し続けられるよう、引き続き取り組んでまいります。
Vijaya Kaza • 所要時間: 3 分
-
プロダクト ニュース
Jetpack Compose の 2026 年 4 月のリリースは安定版です。このリリースには、コア Compose モジュール バージョン 1.11(BOM マッピングの全体を参照)、共有要素のデバッグツール、トラックパッド イベントなどが含まれています。
Meghan Mehta • 所要時間: 5 分
最新情報の入手
Android 開発に関する最新の分析情報を毎週メールでお届けします。