この記事は Jolanda Verhoef による Android Developers Blog の記事 " Jetpack Compose 1.2 is now stable! " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
2022 年 7 月 27 日、Android の最新ネイティブ UI ツールキットである Jetpack Compose のバージョン 1.2 をリリースしました。そして、引き続きロードマップを構築しています。今回のリリースには、ダウンロード可能なフォント、遅延グリッドといった新機能に加え、フォーカス、マウス、入力ハンドリングの改善といった、タブレットや Chrome OS 向けの機能強化が含まれています。
スマートフォン、タブレット、折りたたみ式向けに新しい Android アプリを開発する場合、私たちは Compose を推奨しています。今回は Compose for Wear OS 1.0 (英語) もリリースしたので、Wear OS アプリ開発でも Compose が最適な手段になります。
Twitter エンジニアリング チームなどのデベロッパーは、Compose を使って開発のスピードを上げています。
「Compose によって生産性が劇的に向上しました。コンポーズ可能な関数を書くのは、カスタムビューを作成するよりもはるかに簡単で速く、デザイナーの要件もたやすく満たせます」
Compose 1.2 には、スマートフォン、タブレット、折りたたみ式向けのたくさんのアップデートが含まれています。試験運用版から安定版になった新しい API があり、新しいバージョンの Kotlin もサポートされています。サンプル、Codelab、Accompanist ライブラリ、MDC-Android Compose Theme Adapter はすでにアップデートされ、Compose 1.2 対応になっています。
注 : Compose Compiler ライブラリを 1.2 にアップデートするには、Kotlin 1.7.0 が必要です。今後、Compiler のリリースは他の Compose ライブラリのリリースから切り離されます。この点に関する詳しい説明は、Jetpack Compose ライブラリが独立したバージョニングに関するブログ記事をご覧ください。
複数の機能や API が安定版として追加されました。主なものを紹介します。
Compose に新機能を導入する作業も続いています。いくつかの主な機能を紹介します。
@OptIn (英語) を使って新しい API を試し、フィードバックをお寄せください!
コミュニティから報告されたたくさんの問題を修正しました。主なものを紹介します。
Issue Tracker にバグレポートや機能リクエストをお送りいただき、大変感謝しています。Compose の改善や、皆さんに必要な API を作るうえで役立っています。Compose をより良いものにするために、今後もフィードバックをお願いします!
次に登場するのは何でしょうか。現在検討中または作業中の機能は、更新版のロードマップで確認できます。たとえば、項目の遅延追加や遅延削除時のアニメーション、フロー レイアウト、テキスト編集の改善などです。
Jetpack Compose は、皆さんから寄せられた要望をもとに進化し続けます。すでに多くのアプリで Jetpack Compose が本番環境として使われているのを見て、とてもうれしく思っています。そして、Jetpack Compose でアプリ開発がどのように改善したかを、皆さんの多くが共有しています。皆さんの次のアプリのリリースを楽しみにしています!
Compose をお楽しみください!
この記事は Jolanda Verhoef による Android Developers Blog の記事 " Independent versioning of Jetpack Compose libraries " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
2022 年 6 月 29 日より、さまざまな Jetpack Compose ライブラリが独立したバージョニング スキームに移行します。これにより、androidx.compose.compiler や androidx.compose.animation などのサブグループが個別のリリース サイクルに従えるようになります。
androidx.compose.compiler や androidx.compose.animation
これらのライブラリに独立したバージョニングを導入することで、これまで暗黙的に結合されていた依存関係が切り離されます。そのため、アプリの段階的なアップグレードがしやすくなり、最新の Compose 機能を維持できるようになります。
バージョンが 1 つになっていた Compose から最初に切り離されるライブラリは、Compose Compiler です。2022 年 6 月 29 日より、Kotlin 1.7.0 をサポートする 1.2.0 安定版をリリースしました。このリリースには、Compose UI ライブラリおよび Compose Runtime ライブラリとの下位互換性と上位互換性の両方が備わっています。つまり、Compose Compiler を 1.2.0 安定版にアップグレードして Kotlin 1.7.0 を使いつつ、他の Compose ライブラリは 1.1.0 安定版などの現行バージョンのままにすることができます。
アプリで使っている Compose Compiler のバージョンをアップグレードするには、build.gradle ファイルで kotlinCompilerExtensionVersion を指定します。
build.gradle
kotlinCompilerExtensionVersion
android { composeOptions { kotlinCompilerExtensionVersion = "1.2.0" }}
android {
composeOptions {
kotlinCompilerExtensionVersion = "1.2.0"
}
Compose と Kotlin は密接に結びついており、Kotlin のバージョンをアップグレードするために Compose Compiler のアップデートが必要になるというフィードバックがありました。Compose と Kotlin の両方で最も優れた最新の機能(とバグの修正)を使っていただけるように、Compose Compiler の安定版は頻度を上げてリリースする計画です。つまり、Compose Compiler のバージョン番号は、他のほとんどの Compose ライブラリよりも上がるペースが早くなります。Compose Compiler では上位互換性と下位互換性の両方が確保されるので、新しいバージョンがリリースされたら、すぐにアップグレードできます。
Compose Compiler は Kotlin コンパイラ プラグインなので、お使いの Kotlin のバージョンと互換性のあるバージョンの Compose Compiler を使う必要があります。Compose-Kotlin 互換性マップを参考に、プロジェクトに合ったバージョンを選んでください。
Compiler ライブラリを異なるバージョニング スキームに移行することは、Compose ライブラリ グループ間のバージョン依存を解消するための第一歩です。今後、他の Compose ライブラリでも新しい安定版リリースが公開され、Compose Compiler とは別にそれぞれのリリース サイクルに従うことになります。
独立したバージョニングに対応し、さっそく最新バージョンの Compose Compiler と Kotlin (英語) を使ってみましょう。
皆さんが Compose で作るアプリを楽しみにしています。
この記事は Andrew Flynn & Jon Boekenoogen による Android Developers Blog の記事 " Play Time with Jetpack Compose " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
2020 年、Google Play ストアのエンジニアリング チームのリーダー陣は、ストアのショーウィンドウにあたる部分全体の技術スタックを再構築するという大きな決断を下しました。既存のコードは 10 年以上前のもので、無数の Android プラットフォーム リリースや機能アップデートを経て、大きな技術的負債を抱えていました。デベロッパーの生産性やストア自体のユーザー エクスペリエンスとパフォーマンスに悪影響を与えることなく、数百名のエンジニアが開発できるようにスケールアップできる新しいフレームワークが必要でした。
ネットワーク レイヤからピクセルのレンダリングに至るまで、ストアのあらゆるものを更新するため、複数年にわたるロードマップを作成しました。その一環として、インタラクティブ性とユーザーの快適さを目標とした最新の宣言型 UI フレームワークも採用したいと考えました。さまざまな選択肢を分析した結果、まだアルファ版にもなっていなかった Jetpack Compose を使うという、(当時としては)大胆な決断をすることになりました。
それ以来、Google の Google Play ストアチームと Jetpack Compose チームは、ストアの具体的なニーズを満たせるバージョンの Jetpack Compose を実現するため、非常に密接な連携のもと、リリースや改善を重ねてきました。この記事では、移行のアプローチやその過程で明らかになった課題や利点について説明し、多くのエンジニアが関わるアプリで Compose を採用するとはどういうことかについて共有したいと思います。
新しい UI レンダリング レイヤとして Jetpack Compose を検討するときの最優先事項は次の 2 つでした。
Google Play ストアはすでに 1 年以上 Jetpack Compose で UI のコードを記述しており、Jetpack Compose によって UI 開発がこれまで以上にシンプルになっていることを実感しています。
特にうれしいのは、UI の記述に必要なコードがかなり減ったことで、場合によってはコードが最大 50% 少なくなったことです。これが実現できたのは、Compose が宣言型 UI フレームワークであることに加え、簡潔な Kotlin を活用できるからです。カスタムの描画やレイアウトを作成する際も、ビューをサブクラス化してたくさんのメソッドをオーバーライドする必要はなく、シンプルな関数呼び出しで実現できます。
評価テーブルを例に説明しましょう。
ビューを使う場合、このテーブルは以下の要素で構成されます。
Compose を使う場合、このテーブルは以下の要素で構成されます。
@Composable
「そうは言っても、ライブラリの依存関係でビューが提供される場合どうすればいいのか」と疑問に思う方もいらっしゃるかもしれません。たしかに、すべてのライブラリ所有者が Compose ベースの API を実装しているとは限りません。私たちが最初に移行をしたときは特にそうでした。しかし、Compose では ComposeView と AndroidView API によって、ビューを簡単に利用できる相互運用性が実現されています。ExoPlayer (英語) や YouTube の Player などの人気ライブラリは、この方法によって問題なく統合できました。
Google Play ストアチームと Jetpack Compose チームは、Compose がビュー フレームワークと同じくらい速くジャンクなしで動作できるようにするため、密接に連携しました。Compose は Android フレームワークの一部というよりはアプリにバンドルされるものなので、これは難しい要件でした。画面上の個々の UI コンポーネントのレンダリングは高速でしたが、アプリが Compose フレームワーク全体をメモリに読み込むために必要な時間をすべて合わせれば、かなりの時間になりました。
Google Play ストアで Compose を採用するうえで、特に大きなパフォーマンス改善に貢献したのはベースライン プロファイルの開発でした。以前から利用できたクラウド プロファイルもアプリの起動時間の短縮に役立ちますが、これが利用できるのは API 28 以降に限られ、頻繁な周期で(毎週)リリースされるアプリにとっては効果的ではありません。この問題に対応するため、Google Play ストアチームと Android チームが連携して、ベースライン プロファイルの開発にあたりました。ベースライン プロファイルは、デベロッパーが定義し、アプリの所有者が指定してバンドルできるプロファイルです。アプリに同梱され、クラウド プロファイルとは完全な互換性があり、アプリレベルに限定して定義することも、ライブラリレベルで定義することもできます(Compose を採用すると、このプロファイルもついてきます!)。ベースライン プロファイルをロールアウトすることで、Google Play ストアの検索結果ページの最初のレンダリング時間は 40% 短縮されました。これは大きな成果です。
Compose は、特にスクロールの際に効率的なレンダリングをします。その中核をなす仕組みとなっているのが、UI コンポーネントの再利用です。Compose は、スキップできることがわかっている Composable の再コンポーズをできる限りスキップしようとします(不変である場合など)。しかし、すべてのパラメータが @Stable (英語) アノテーション要件を満たしている場合は、デベロッパーが強制的に Composable をスキップ可能にすることもできます。Compose のコンパイラでも、特定の関数をスキップできない理由を説明した便利なガイドが提供されています。Google Play ストアでは、スクロールが発生する状況で頻繁に再利用される UI コンポーネントを作りましたが、不要な再コンポーズが積み重なってフレーム時間が足りなくなり、ジャンクにつながるという状況が発生しました。そこで、デバッグ設定でもそのような再コンポーズを簡単に見つけることができるように、Modifier を作成しました。この手法を UI コンポーネントに適用することで、ジャンクを 10-15% 減らすことができました。
@Stable
Modifier
Modifier による再コンポーズの視覚化の例。青(再コンポーズなし)、緑(1 回の再コンポーズ)
Google Play ストア アプリの Compose を最適化するうえで、もう 1 つの重要な要素となったのが、アプリ全体の一連の移行戦略を詳細に作成したことです。最初に組み込みの実験をしたとき、「二重スタック問題」に直面しました。これは、1 つのユーザー セッション内で Compose とビューの両方のレンダリングを実行すると、特にローエンドのデバイスにおいて、メモリに大きな負荷がかかるという問題です。これはコードを同じページに展開した場合だけでなく、異なるスタックのそれぞれに 2 つのページ(Google Play ストアのホームページと検索結果ページなど)が存在する場合にも発生しました。これに起因する起動の遅さを解消するには、ページを Compose に移行する順番やスケジュールについて、具体的な計画を立てることが重要でした。さらに、アプリが完全に移行されるまでの穴埋めとして、よく使うクラスの短期的なプリウォーミングを追加することも有用であることがわかりました。
Compose は Android フレームワークにバンドルされていないので、Google Play ストアチームが Jetpack Compose に直接的に関与する手間も少なくすみました。その結果、短い時間でデベロッパーに役立つ改善をすることができました。Jetpack Compose チームとの共同作業で、LazyList のアイテムタイプのキャッシュのような機能追加をしたり、無駄なオブジェクトの割り当てなどに関する簡単な修正をすばやくしたりすることもできました。
Google Play ストアで Compose を採用したことで、チームのデベロッパー満足度は大幅に上昇し、コードの品質と健全性も大きく向上しました。Google Play ストアの新機能は、すべてこのフレームワーク上に構築されています。Compose はアプリの速度向上や利便性に貢献しています。Compose への移行戦略の性質上、APK サイズの変化やビルド速度は細かく測定できませんでしたが、可視化できたものについてはすべて順調に進んでいます。
Compose は Android UI 開発の未来です。Google Play ストアの事例から言うと、これ以上すばらしいものはありません!
この記事は Florina Muntenescu による Android Developers Blog の記事 " Jetpack Compose 1.1 is now stable! " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
私たちは、Android の最新ネイティブ UI ツールキット、Jetpack Compose のロードマップを実現する作業を続けており、2022 年 2 月 9 日にバージョン 1.1 をリリースしました。今回のリリースには、フォーカス処理の向上、タッチ ターゲットのサイズ調整、ImageVector のキャッシュ、Android 12 のストレッチ オーバースクロールのサポートなどの新機能が含まれています。さらに、Compose 1.1 では、これまで試験運用版だったたくさんの API が安定版になっているほか、より新しいバージョンの Kotlin もサポートされています。すでにサンプル、Codelab、Accompanist ライブラリもアップデートしており、Compose 1.1 と合わせて利用できるようになっています。
Compose 1.1 に ImageVector のキャッシュ機能を導入し、パフォーマンスを大幅に向上させています。painterResource API にキャッシュ機構を追加しており、解析した ImageVector のすべてのインスタンスを、与えられたリソース ID やテーマと合わせてキャッシュできるようになっています。このキャッシュは、構成が変わると無効になります。
Compose 1.0 と比較した場合、マテリアル コンポーネントのレイアウトでは、マテリアルのアクセシビリティ ガイドライン(英語)に記載されているタッチ ターゲット サイズ(英語)を満たすようにレイアウト領域が拡大されます。たとえば、RadioButton のタッチ ターゲットは、最小サイズの 48x48 dp に拡大されます。RadioButton のサイズをそれ以下に設定した場合も同様です。これにより、Compose のマテリアルとマテリアル デザイン コンポーネントの動作が一致し、ビューと Compose が共存しても、動作の一貫性が保たれます。また、この変更により、Compose のマテリアル コンポーネントを使って UI を作成すれば、タッチ ターゲットのアクセシビリティ最低要件が確実に満たされるようになります。
この変更によって既存のレイアウト ロジックが壊れる場合は、LocalMinimumTouchTargetEnforcement (英語) を false に設定することで、この動作を無効化できます。ただし、アプリのユーザビリティが低下する可能性があることを認識したうえで、慎重に利用するようにしてください。
RadioButton のタッチ ターゲットの更新
左 : Compose 1.0、右 : Compose 1.1
いくつかの API が試験運用版から安定版になっています。主なものを紹介します。 (以下、リンク先はすべて英語)
@OptIn (英語) を使うと、新しい API を試すことができます。ぜひフィードバックをお願いします!
注 : Compose 1.1 を使うには、Kotlin 1.6.10 が必要です。詳しくは、Compose と Kotlin の互換性マップをご覧ください。
次に登場するのは何でしょうか。現在検討中または作業中の機能は、更新版のロードマップで確認できます。たとえば、遅延項目アニメーション、ダウンロード可能フォント、移動可能コンテンツなどです。
Jetpack Compose は安定版で、本番環境で利用できます。また、要望が寄せられた機能を追加する作業も続いています。すでに多くのアプリで Jetpack Compose が本番環境として使われ始めているのを見て、とてもうれしく思っています。皆さんが開発したアプリを見るのが、待ち遠しくてたまりません。
アルファ版やベータ版を通して Issue Tracker (英語) にバグレポートや機能リクエストをお送りいただき、大変感謝しています。Compose の改善や、皆さんに必要な API を作るうえで役立っています。Compose をよりよいものにするために、今後もフィードバックをお願いします!
2021 年 10 月 18 日に開催された、『DroidKaigi 前夜祭』に Google 関係者がパネリストとして登壇しました。
このイベントでは、2021 年に発表した Android/Google Play 関連の製品のお話や、I/O 以降に発表された製品・技術関連の最新情報についての内容を中心に Google 関係者が解説をしました。
この記事では、イベント内で解説した内容をまとめます。
Jetpack Compose は、ネイティブ UI をビルドするための Android の最新ツールキットで、Kotlin API を使用して、少ないコードで Android の UI 開発を簡素化し、加速することができます。Google I/O では、株式会社メルカリ様のケーススタディもリリースされ、UI 開発の生産性が 56 % 向上したという実例もございます。今回のイベントでは、その Jetpack Compose の最新アップデートである、1.1.0 についてお話をさせていただきました。
このセッションでは、Android IDE Android Studio (英語) の Android Gradle Plugin API (AGP) (英語) や Test framework についてについてお話をさせていただきました。公式の強力な Android IDE Android Studio Arctic Fox (2020.3.1) ベータ版 を I/O で発表したあと、7 月に安定版をリリースしました。UI 設計期間の短縮、新しいデバイスへのアプリ拡張、デベロッパーの生産性向上を目的としており、Compose と合わせて使うことで、最新の UI をすばやくデザインすることができます。
このセッションでは、Google Play と Multi Form Factor についてお話をさせていただきました。
Wear OS や大画面対応から、セキュリティ ツールなどのトピックまで幅広くカバーしました。
ご参加いただきました皆さん、ありがとうございました!Android Developer Summit の動画も、ぜひご視聴ください。
この記事は Anna-Chiara Bellini, Nick Butcher による Android Developers Blog の記事 " Jetpack Compose is now 1.0: announcing Android’s modern toolkit for building native UI " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
2021 年 7 月 28 日(日本時間 7 月 29 日) Jetpack Compose のバージョン 1.0 をリリースしました。Android の最新ネイティブ UI ツールキットである Jetpack Compose を使うと、優れたアプリを短時間で構築できます。このリリースは安定版で、本番環境で利用できます。Compose は、この 2 年間、Android コミュニティのフィードバックや貢献を受けつつ、オープンに開発が行われてきました。1.0 に到達した現時点で、既に Google Play ストアの 2000 以上のアプリで Compose が使われています。実は、Play ストアアプリ自体にも Compose が使われています。それだけではありません。たくさんのトップ アプリ デベロッパーと協力し、フィードバックやサポートを受けることで、1.0 リリースはさらに強固なものになっています。たとえば、Square は Compose を使うことで「宣言型 UI フレームワークの構築に関するさまざまな問題を解決することではなく、Square 独自の部分や UI インフラストラクチャに集中できる」と教えてくれました。Monzo は、Compose を使うと「質の高い画面を短時間で構築できる」と述べています。また、Twitter は「とても気に入っています!❤️」と見事に一言で言い表しています。
Compose は、ネイティブ Android アプリを短時間で簡単に作成できるように設計されています。完全に宣言的なアプローチが採用されているので、UI を記述しさえすれば、あとは Compose が対応してくれます。アプリの状態が変わると、UI が自動的に更新されるので、UI の構築がはるかにシンプルかつ高速になります。直感的な Kotlin API を使うと、美しいアプリを はるかに 少ないコードで実現できます。また、すべての既存の Android コードにネイティブでアクセスできるので、自分のペースで導入することもできます。強力なレイアウト API とコード駆動型 UI により、タブレットや折りたたみ式デバイスなど、異なるフォーム ファクタのサポートも簡単です。Compose のサポートは、Wear OS や ホーム画面 ウィジェットなども追加される予定です。
今回の 1.0 リリースは本番環境で利用でき、以下の主要機能が提供されています。
完全な宣言型アプローチを採用している Jetpack Compose によって、UI の開発方法は大きく変わります。新しいワークフローと異なる考え方をサポートするため、Compose 向けに設計された新しいツールを提供します。また、いくつかの既存のツールに Compose のサポートを追加しています。
Android Studio Arctic Fox で利用できる新しい Compose プレビューでは、異なる状態、ライトテーマやダークテーマ、異なるフォント スケーリングのコンポーザブルをすべて同時に確認できます。アプリ全体をデバイスにデプロイする必要はないので、コンポーネントの開発が簡単になります。リテラルのライブ編集機能によって機能強化されているため、プロジェクトを再コンパイルせずにアップデートを確認できます。
作業中の画面まで移動せずにデバイスで UI のパーツをテストしたいと思っていた方なら、新しいデプロイ プレビューを気に入ってくれるはずです。Composable のプレビューを作成するだけで、デバイスにデプロイしてすばやく反復できます。
Layout Inspector に Composable サポートが追加されるため、Compose と既存のビューを確実に混在させることができます。
Android Studio Arctic Fox での Compose サポートの詳細については、こちらをご覧ください。
新しいフレームワークを採用するには、評価が必要です。新しい UI ツールキットのように広範囲にわたるものでは、特にそれが重要になります。皆さんにとって今が適切なタイミングかどうかを情報に基づいて判断できるように、パブリック ロードマップ (英語) を公開して今後の Jetpack Compose の開発計画をお知らせします。
Compose を活用していただくために、皆さんや皆さんのチームが利用できる幅広いリソースを準備しました。
学ぶべきことはたくさんあります。Jetpack Compose Pathway (英語) では、主要な コードラボ、動画、ドキュメントを順番に体験できます。
Jetpack Compose は大きな飛躍であり、すばらしい UI を短時間で簡単に作れるものだと確信しています。これを使って皆さんが作るものを見ることが楽しみでなりません。Compose が 1.0 の安定版になった今こそ、実際に使うべきときです。直接コードを触るのが最善の方法です。ぜひ Compose を使ってみてください!
この記事は Florina Muntenescu による Android Developers Blog の記事 "What's new in Jetpack" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
Android Jetpack は、デベロッパーがベストプラクティスに従って、ボイラープレート コードを削減し、Androidのバージョンやデバイス間で一貫して動作するコードを書くためのライブラリ、ツール、ガイダンスを統合したものです。現在、Google Play の トップ 1000 アプリのうち 84 % がJetpack を利用しています。この記事では、Jetpack の最新のアップデートをまとめてご紹介します。
CameraX ライブラリは、デバイス固有の互換性の修正や回避策を含む、OS のバージョンを超えてカメラ機能にアクセスするための統一された API サーフェスを提供します。最新の改良点は、露出補正のサポートや、カメラの状態や機能に関するより詳細な情報へのアクセスなど、多数寄せられた機能要望にお応えした内容となっています。さらに、FPS レンジなどのカメラ設定を、カメラを動作中に Camera2Interop 経由で変更できるようになりました。また、ハイダイナミックレンジのプレビュー、ズーム比の調整、Android の Do Not Disturb モードへの対応など、最新のデバイスや OS の機能にも対応しています。特に重要なのは、パフォーマンスへの取り組みで、特に古いデバイスにおいて、画像の取り込みや初期化が高速化されています。
Hilt は、Dagger 上に構築されている、Jetpack 推奨の依存関係注入ソリューションです。安定版への移行の一環として、Hilt の ViewModel サポートはコア Hilt Android API に移され、SavedStateHandle が ViewModelComponent で利用可能なデフォルトの依存関係として追加されています。また、Hilt は Navigation および Compose と統合されています。適用範囲を宛先またはナビゲーション グラフ自体とした注釈付き Hilt ViewModel を取得できます。複数のデベロッパーの皆さんが、すでにアプリで Hilt を使い始めています。そのケーススタディは、こちらのブログ記事 (英語) をご覧ください。
ViewModel
SavedStateHandle
ViewModelComponent
Paging ライブラリを使用すると、データの小さなチャンクをロードおよび表示してネットワークとシステムのリソース消費を改善できます。このリリースでは、全体を Kotlin で書き直すことによって コルーチンおよび Flow を完全にサポートし、RxJava および Guava プリミティブを使用した非同期ロード、リポジトリおよびプレゼンテーション層の全体的な改善を提供します。
3.0 リリースでは Paging 2 と比べて使い勝手が大幅に改善され、書き直しは部分的および段階的移行を念頭に計画されたため、デベロッパーの皆さんはご自身のスケジュールに合わせて移行できます。詳細および実践については、Paging 3.0 のドキュメントおよび Paging 3.0 のCodelab をご覧ください。
Jetpack のレイアウト設計を柔軟に行うためのシステム ConstraintLayout、モーションおよびウィジェット アニメーションの管理を目的とした MotionLayout は現在安定版です。MotionLayout では、折りたたみデバイス、イメージ フィルタ、モーション エフェクトがサポートされています。デザインツールの新機能について詳細は、こちらの Google I/O セッションをご覧ください。
ConstraintLayout
MotionLayout
Security Crypto ライブラリを使うと、ファイルや SharedPreferences を安全かつ簡単に暗号化できます。SharedPreferences を暗号化するには、EncryptedSharedPreferences オブジェクトを適切なキーとスキームで作成し、このオブジェクトを標準の SharedPreferences オブジェクトのように使用します。
SharedPreferences
EncryptedSharedPreferences
val prefs: SharedPreferences = EncryptedSharedPreferences.create( context, "prefs_file_name", mainKey, prefKeyEncryptionScheme = AES256_SIV, prefValueEncryptionScheme = AES256_GCM,)// Use the resulting SharedPreferences object as usual.prefs.edit() .putBoolean("show_completed", true) .apply()
context,
"prefs_file_name",
mainKey,
prefKeyEncryptionScheme = AES256_SIV,
prefValueEncryptionScheme = AES256_GCM,
)
// Use the resulting SharedPreferences object as usual.
prefs.edit()
.putBoolean("show_completed", true)
.apply()
この1年間、Fragment ライブラリは内部の実装を整理して明文化されていない動作を削減するための大規模な変更を行いました。これにより、デベロッパーの皆さんは、アプリやゲームのベスト プラクティスに倣って信頼できるテストを記述しやすくなりました。これは、Navigation で複数のバックスタックをサポートするなど、将来的なライブラリの改善のための基礎となるもので、厳密化された API に対応するためには、いくつかの作業が必要になるかもしれません。実際に、ライブラリを更新した後のテストには細心の注意を払う必要があります。特に注意が必要なケースについては、Fragmentのリリースノートをご確認ください。
最新リリースでは、ActivityResult の統合も行われ、フラグメントから Activity の結果を登録することが可能になりました。 Fragment には、柔軟性があまり高くない onAttachFragment メソッドの代わりに、新しい FragmentOnAttachListener インターフェースも追加されています。Fragment または FragmentActivity でこのメソッドを上書きする既存のコードは引き続き機能しますが、新しいコードが柔軟性の高くない手法を誤って採用するのを防ぐため、onAttachFragment を非推奨にしました。
onAttachFragment
FragmentOnAttachListener
Fragment
FragmentActivity
// Obtain the fragment manager.May be a childFragmentManager,// if in a fragment, to observe child attachment.val fm = supportFragmentManagerval listener = FragmentOnAttachListener { fragmentManager, fragment -> // Respond to the fragment being attached.}fm.addFragmentOnAttachListener(listener)
// if in a fragment, to observe child attachment.
val fm = supportFragmentManager
val listener = FragmentOnAttachListener {
fragmentManager, fragment ->
// Respond to the fragment being attached.
fm.addFragmentOnAttachListener(listener)
ライブラリの機能が完成すると、安定化のためにベータ版に移行します。現時点では、重要な問題やコミュニティからのフィードバックに対してのみ、API を変更しています。
DataStore は、シンプルで非常に有用な API サーフェスを維持しながら、SharedPreferences の欠点を解決する堅牢なデータ ストレージ ソリューションを提供します。DataStore は、Flow と RxJava による Kotlin のコルーチンのようなベストプラクティスをサポートします。DataStore では、Preference DataStore 経由でキーと値のペアを格納したり、Proto DataStore 経由でプロトコル バッファがバックアップする型付きオブジェクトを格納できます。さらに、Kotlin Serialization のような独自のシリアル化ソリューションをプラグインすることもできます。
アルファ版ライブラリは、現在開発中のライブラリです。API の追加、変更、削除が行われる可能性がありますが、ライブラリのコンテンツはテストされていますので、高い機能性を備えています。
AppSearch は高性能で機能豊富なフルテキスト検索機能を提供する新しいデバイス内検索ライブラリです。SQLite と比較すると、AppSearch は複数の言語をサポートし、クエリ結果のランク付けがシンプルで、大きなデータセットのインデックス作成や検索の遅延がより少なくなります。
AppSearch 1.0.0-alpha01 は LocalStorage をサポートしています。これによって、アプリケーションは「ドキュメント」と呼ばれる構造化されたデータを管理し、それに対してクエリを実行することができます。アプリケーションは、「スキーマタイプ」を使って、構造がどのようなものかを定義します。例えば、メッセージは、件名、本文、送信者などのデータを持つスキーマタイプとしてモデル化することができます。
ビルダーを使用してスキーマ タイプのドキュメントを作成し、ストレージに追加します。"body:fruit" とクエリを実行すると、メッセージの本文に用語「fruit」があるすべてのドキュメント検索できます。
Android S では、AppSearch はアプリケーションのデータを他のアプリケーションと安全に共有し、追加のネイティブ ライブラリへのリンクを不要にすることで、アプリケーションのバイナリサイズを削減できる PlatformStorage も提供します。ライブラリがまだ Android S SDK を対象としていないため、現時点では Jetpack で PlatformStorage は使用できません。
デバイス全体の検索に統合するための Android S の中央ストレージ
Room は推奨されているデータ永続化レイヤであり、プラットフォーム上での使い勝手と安全性が向上します。
Room 2.4.0-alpha は自動移行をサポートしています。データベース スキーマが変更された時に、@AutoMigration を宣言して、どのバージョンからどのバージョンに移行したいかを示すと、Room が移行を生成してくれるようになりました。より複雑な移行を行う場合は、引き続き Migration クラスを使用できます。
@AutoMigration
Migration
@Database(- version = 1,+ version = 2, entities = { Doggos.class },+ autoMigrations = {+ @AutoMigration (from = 1, to = 2)+ } )public abstract class DoggosDatabase extends RoomDatabase { }
- version = 1,
+ version = 2,
entities = { Doggos.class },
+ autoMigrations = {
+ @AutoMigration (from = 1, to = 2)
+ }
public abstract class DoggosDatabase extends RoomDatabase { }
Room 2.3.0 安定版では、 Kotlin Symbol Processing が試験的にサポートされ、Kotlinコードのベンチマークでは、KAPTに比べて2倍の速度向上が見られました。また、enumとRxJava3のサポートも組み込まれています。
またRoom は、の実行時にコールバックを提供する QueryCallback クラスが導入され、ロギングなどのタスクがシンプルになりました。また、新しい@ProvidedTypeConverter アノテーションが導入され、型コンバータの作成がより柔軟になりました。
QueryCallback
@ProvidedTypeConverter
WorkManager ライブラリは、アプリが終了またはデバイスが再起動しても実行される延期可能な非同期タスクをスケジュールする方法として Android で推奨されています。すべてのタスクが確実に実行されるようにタスク照合の信頼性が向上し、さらに特定の Android OS バージョン向けのさまざまな回避策も提供されています。
WorkManager の機能の最新バージョンでは、マルチプロセス アプリのサポートが強化されています。作業リクエストのスケジュールを 1 つのプロセスに統合することで、多数のリクエストをスケジュールする際のデータベースの増大を抑制してパフォーマンスを向上するメリットがあります。
Android S SDKを対象としたバージョン 2.7(現在アルファ版)では、Android OS の新しいフォアグラウンド制限への追加サポートに対応しています。詳しくは、Effective Background Tasks on Android セッションをご覧ください。
Android Studio Arctic Fox で利用可能な Background Tasks Inspector は、最新のライブラリを使うと WorkManager のジョブを簡単に表示してデバッグできます。
Background Tasks Inspector
アプリ内の目的地間を移動するための Jetpack のフレームワークである Navigation ライブラリは、複数のバックスタックをサポートし、ボトムナビゲーションバーのように目的地が同じ深さにある場合にも簡単に対応できるようになりました。
Macrobenchmark ライブラリは、アプリの起動やスクロール パフォーマンスなどの統合された動作まで、Jetpack のベンチマーク範囲を拡張します。このライブラリは、継続的な統合テストでメトリクスを追跡するためにリモートで使用することも、プロファイリングの結果をAndroid Studioから表示するためにローカルで使用することもできます。詳細については、Google I/O のセッションをご覧ください。
Google アシスタントともっと密接した統合を希望しているデベロッパーのために、Google Shortcuts ライブラリは、既存の ShortcutInfo クラスを通じて、Google アシスタントやその他の Google サービスにアクションを公開する方法を提供します。
ShortcutInfo
ShortcutManager を介して一度に最大 15 個のショートカットを送信し、他のサービスの中から Google アシスタントに表示させ、音声やその他のインタラクションで利用できるようにします。
ShortcutManager
これを実装するには、ショートカットに Intentと機能バインディングを定義します。このバインディングは、Google サービスがユーザーに提供する最善の方法を見出すのに役立つ重要な情報を提供します。
// expose a "Cappuccino" action to Google Assistant and other servicesShortcutInfoCompat siCompat = ShortcutInfoCompat.Builder(ctx, "id_cappuccino") .setShortLabel("Cappuccino") .setIntent(Intent(ctx, OrderCappuccino::class.java)) .addCapabilityBinding( "actions.intent.ORDER_MENU_ITEM", "menuItem.name", asList("cappuccino") ) .build()ShortcutManagerCompat.pushDynamicShortcut(ctx, siCompat)
ShortcutInfoCompat siCompat =
ShortcutInfoCompat.Builder(ctx, "id_cappuccino")
.setShortLabel("Cappuccino")
.setIntent(Intent(ctx, OrderCappuccino::class.java))
.addCapabilityBinding(
"actions.intent.ORDER_MENU_ITEM",
"menuItem.name",
asList("cappuccino")
.build()
ShortcutManagerCompat.pushDynamicShortcut(ctx, siCompat)
アプリ内でユーザーが作成したすべてのコンテンツには 🎉 が含まれ、最新の絵文字をサポートすることは、あなたのアプリまたはゲームを ✨ にするために重要な要素です。API 19以降で最新の絵文字をサポートする EmojiCompat ライブラリは、従来の :emoji:emoji アーティファクトに代わる新しいアーティファクト emoji2:emoji2 に移行しました。新しい emoji2 ライブラリでは AppStartup ライブラリを使用た 🪄 自動設定が追加されています( 🐻❄️を表示するためのコード 👩🏿💻 は必要ありません)。
emoji2:emoji2
emoji2
AppCompat では、AppCompat 1.4 以降から emoji2 が追加されています。あなたのアプリまたはゲームがAppCompat を使用している場合、ユーザーは追加設定なしで最新の絵文字 ⭐ を見ることができます。AppCompat を使用していないアプリまたはゲームは emoji2:emoji2-views を追加できます。カスタム TextViews の場合は、emoji2:emoji2-views-helpers のヘルパーを使用するか、AppCompat のビューをサブクラス化することで、最新の絵文字をサポートすることができます。
emoji2:emoji2-views
TextViews
emoji2:emoji2-views-helpers
Jetpack Compose は、Android のネイティブ UI 開発用の最新ツールキットです。Android での UI 開発をシンプルにし、高速化します。Jetpack Compose は現在ベータ版で、7 月に安定版に移行する予定です。ここに掲載されているライブラリや皆さんがすでに使用している可能性のあるライブラリの多くは、Jetpack Compose との統合を目的とした機能を導入しています。Activity から ViewModel、Navigation、Hilt まで、これらすべてのライブラリを使うと、アプリに Compose をスムーズに導入できます。これらの使い方に関する詳細については、この Google I/O セッションをご覧ください。
Jetpack は、折りたたみ式デバイス、大画面デバイス、Wear デバイスなど、さまざまな形状での作業をしやすくします。大画面デバイスに対応するアプリ開発のための新しいガイドラインを導入し、、WindowManager や、SlidingPaneLayout などの Jetpack ライブラリを改善しています。詳しくは、こちらのブログ記事をご覧ください。
WindowManager
SlidingPaneLayout
以上、Jetpack の新機能を(比較的)簡単にご紹介しました。各ライブラリのアップデートの詳細については AndroidX リリースノートをご覧ください。また、Google I/O セッションでは、一部のライブラリについての詳細についてご説明しています。
Reviewed by Yuichi Araki - Developer Relations Team and Tamao Imura - Developer Marketing Manager, Google Play
この記事は Anna-Chiara Bellini、Nick Butcher による Android Developers Blog の記事 "Announcing Jetpack Compose Beta!" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
2021 年 2 月 24 日(日本時間 2 月 25 日)、Jetpack Compose のベータ版をリリースしました。新しい UI ツールキットである Jetpack Compose は、すべての Android プラットフォームでネイティブ アプリを高速かつ簡単に開発できるようにすることを目指して設計されています。Compose が提供するのは、最先端の宣言型 Kotlin API です。これにより、少ないコードで美しくレスポンシブなアプリを作ることができます。Compose は既存の Android アプリや Jetpack ライブラリに組み込めるので、Android のビューと Compose を組み合わせながら、自分のペースで採用できます。
今回のベータ版リリースで Compose の API は確定版になりました。これで本番向けのアプリを構築する際に必要な機能がすべてそろったことになります。ベータ版には、API が安定したという意味合いもあります。つまり、API が変更されたり、削除されたりすることはありません。Compose を学び始め、今後のプロジェクトや機能にどう活用するかについて計画を立てるには、今が絶好の機会です。Compose は今年中に 1.0 に到達する予定です。
Compose チームは、コミュニティの皆さんからのフィードバックも取り入れて、オープンに開発を進めています。2019 年に開発をオープンソース化して以来、30 回のパブリック リリースを行い、外部から寄せられた 700 個以上のバグに対応し、200 件以上の外部からのコントリビューションを受け入れました。皆さんに Compose を使ってアプリを開発していただくことはとても嬉しいことで、いただいたフィードバックや機能リクエストは API の微調整や作業の優先順位を付けることに役立っています。アルファ版リリース以降も、たくさんの機能を追加または改善しています。
ベータ版リリースでは、API の完全性を確保することに重点を置いています。つまり、1.0 やその先に向けて、土台となる API を提供することです。今後は、1.0 リリースに向けてこれらの API の機能を安定させる作業を進める予定です。アプリのパフォーマンスとユーザー補助機能には、特に重点を置いています。
最新の Android Studio Arctic Fox Canary 版は Compose ベータ版をサポートしており、たくさんの新しいツールも搭載しています。
🆕 ライブ リテラル: デバイスやエミュレータで、プレビューのリテラルをリアルタイムにアップデート🆕 アニメーション プレビュー: アニメーションの調査と再生🆕 Layout Inspector の Compose サポート🆕 インタラクティブ プレビュー: Composable を切り離して調査や操作が可能🆕 デプロイ プレビュー: アプリ全体をデプロイすることなく、デバイスに Composable をデプロイ
🆕 ライブ リテラル: デバイスやエミュレータで、プレビューのリテラルをリアルタイムにアップデート
🆕 アニメーション プレビュー: アニメーションの調査と再生
🆕 Layout Inspector の Compose サポート
🆕 インタラクティブ プレビュー: Composable を切り離して調査や操作が可能
🆕 デプロイ プレビュー: アプリ全体をデプロイすることなく、デバイスに Composable をデプロイ
Jetpack Compose は、Android ビューと共存してシームレスに動作するように設計されているので、自分のペースで採用できます。具体的には、Android ビューに Compose UI を埋め込んだり、Compose の中でビューを使ったりすることもできます。相互運用性に関するドキュメントに、たくさんの採用戦略をまとめました。
既存アプリに Compose を追加する際に役立つように、ビューとの相互運用性に加えて、よく使われるライブラリとの統合も行っています。そのため、アプリを書き直したり、アーキテクチャを変更したりする必要はありません。以下の統合が利用可能です。
MDC-Android Compose Theme Adapter ライブラリや Accompanist ライブラリを使えば Material および AppCompat のXML テーマとの統合機能を利用できるので、テーマを重複して定義する必要はありません。Accompanist は、よく使われるイメージ読み込みライブラリのラッパーも提供します。
Jetpack Compose は、 宣言型 UI ツールキットであり、現在のビューシステムからのパラダイム シフトです。つまり、記述するのは、アプリが特定の状態のときに UI がどのように見えるべきか であって、 どのように UI を生成するかではありません。アプリの状態が変わったときは、Compose によって UI がアップデートされるため、UI を操作して目的の状態に変更するという面倒でエラーが起こりやすい作業は必要なくなります。
また、Compose はすべて Kotlin で書かれているので、優れた言語機能を活用して、簡潔で強力かつ直感的な API を提供できます。たとえば、コルーチンを使うと、ジェスチャー、アニメーション、スクロールなど、はるかにシンプルな非同期 API を書くことができます。そのため、ジェスチャーに続いてアニメーションするなど、非同期イベントを組み合わせたコードを簡単に書けるようになります。キャンセルやクリーンアップはすべて構造化され、並列に行われます。
皆さんや皆さんのチームが Jetpack Compose に関するあらゆることを学習できるように、Jetpack Compose Pathway をアップデートしました。これは、動画やハンズオン Codelabs、重要なドキュメントを厳選した一覧であり、Compose を始める際に役立ちます。本日は、新しく作成またはアップデートしたガイド ドキュメントも公開します。たくさんのスクリーンキャストや新しい Animation Codelab を通じて、Compose で開発を始める方法を詳しく学ぶことができます。アーキテクチャ、ユーザー補助機能、テストに関するガイドから、アニメーション、リスト、Compose の思想に関する詳しい説明まで、作業をより早くするために役立つガイドも準備しました。
さらに、実際に動作する Compose をすぐに見てみたい方のために、8 つの公式サンプルアプリも提供しています。シンプルなものから複雑なものまで、すべて異なる API やユースケースを扱っています。詳しくは README をご覧ください。
Compose を始める準備ができ、賞品も獲得したい方は、#AndroidDevChallenge に挑戦してください。Jetpack Compose で優れたアプリをすばやく作成する技術を身につけられるよう、4 週間にわたって日本時間の木曜日朝、週単位のチャレンジを出題します。各チャレンジでは、「インサイトを開放する」をテーマに、アニメーションやマテリアル テーマ、Composable やリストなど、毎回 Compose の新しい領域を扱います。毎回のチャレンジの勝者に新しい賞品があり、Pixel 5 を含む 1000 個以上の賞品を準備しています*。2 月 25 日から始まっている第 1 週のチャレンジの詳細は、こちらをご覧ください。
Jetpack Compose はベータ版に到達し、1.0 に向けた確定版の API や機能が完成しています。アプリで Compose を採用した方は、ぜひフィードバックをお寄せください。Kotlin Slack の #compose チャンネルで行われているディスカッションへの参加もお待ちしています。
*毎週のチャレンジに新しい賞品が設定されています。Google Pixel 5 が賞品になる週で、Google Pixel 5 が利用できない国にお住まいの方には、同程度の価値がある電子ギフトカードをお送りします。詳しくは公式ルールをご覧ください。
Reviewed by Yuichi Araki - Developer Relations Team and Hidenori Fujii - Google Play Developer Marketing APAC