この記事は、 Google Developer Expert (GDE) @yanzm さんに寄稿いただいたゲスト記事です。この「エキスパートに学ぶシリーズ」では、まだ Jetpack Compose を使ったことがないデベロッパー向けに既存アプリで段階的に導入を進める方法や導入するメリットについて GDE の方々よりご紹介いただきます。前回は既存アプリに Jetpack Compose を導入する手順について紹介しました。今回は XML レイアウトの中に Jetpack Compose による UI を表示するための View を追加し、段階的に Jetpack Compose に置き換えていく方法を紹介します。
まず、カンファレンスのセッション情報を表示するためのレイアウトを例に、XML で定義されたレイアウトを Jetpack Compose へ置き換えて行きます。
レイアウトは次の様に ConstraintLayout を使って構成されています。その中には、セッションタイトル、スピーカーの画像、スピーカーの名前、スピーカーの肩書きを表示する 3 つの TextView と 1 つの ImageView が含まれます。
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/session_title" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:layout_marginEnd="16dp" android:textAppearance="@style/TextAppearance.AppCompat.Headline" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:text="Jetpack Compose で Material Design 3" /> <ImageView android:id="@+id/speaker_image" android:layout_width="72dp" android:layout_height="72dp" android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:layout_marginBottom="16dp" android:background="#cccccc" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/session_title" /> <TextView android:id="@+id/speaker_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:textAppearance="@style/TextAppearance.AppCompat.Body1" app:layout_constraintBottom_toTopOf="@id/speaker_title" app:layout_constraintStart_toEndOf="@id/speaker_image" app:layout_constraintTop_toTopOf="@id/speaker_image" app:layout_constraintVertical_chainStyle="packed" tools:text="Yuki Anzai" /> <TextView android:id="@+id/speaker_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:textAppearance="@style/TextAppearance.AppCompat.Caption" app:layout_constraintBottom_toBottomOf="@id/speaker_image" app:layout_constraintStart_toStartOf="@id/speaker_name" app:layout_constraintTop_toBottomOf="@id/speaker_name" tools:text="Android GDE" /></androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/session_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Jetpack Compose で Material Design 3" />
<ImageView
android:id="@+id/speaker_image"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginBottom="16dp"
android:background="#cccccc"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/session_title" />
android:id="@+id/speaker_name"
android:layout_width="wrap_content"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
app:layout_constraintBottom_toTopOf="@id/speaker_title"
app:layout_constraintStart_toEndOf="@id/speaker_image"
app:layout_constraintTop_toTopOf="@id/speaker_image"
app:layout_constraintVertical_chainStyle="packed"
tools:text="Yuki Anzai" />
android:id="@+id/speaker_title"
android:layout_marginTop="8dp"
android:textAppearance="@style/TextAppearance.AppCompat.Caption"
app:layout_constraintBottom_toBottomOf="@id/speaker_image"
app:layout_constraintStart_toStartOf="@id/speaker_name"
app:layout_constraintTop_toBottomOf="@id/speaker_name"
tools:text="Android GDE" />
</androidx.constraintlayout.widget.ConstraintLayout>
このレイアウトを持つアプリは MDC-Android (英語) の マテリアル デザイン 3 テーマをベースとするアプリのテーマを View システムで使っています。
そのため Jetpack Compose 用の マテリアル デザイン 3 コンポーネントライブラリに加えて、既存 View システムで使用しているテーマを Jetpack Compose で再利用するための MDC-Android Compose Theme Adapter (英語) のマテリアル デザイン 3 用ライブラリを追加します。
dependencies { … implementation "androidx.compose.material3:material3:1.0.0" implementation "com.google.android.material:compose-theme-adapter-3:1.0.21"}
dependencies {
…
implementation "androidx.compose.material3:material3:1.0.0"
implementation "com.google.android.material:compose-theme-adapter-3:1.0.21"
}
XML レイアウトの中に Jetpack Compose による UI を表示するには、 ComposeView という View を利用します。
XML レイアウトの中に ComposeView を追加して android:id を指定します。
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout …> <androidx.compose.ui.platform.ComposeView android:id="@+id/compose_view" android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/session_title" … /> …</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout …>
<androidx.compose.ui.platform.ComposeView
android:id="@+id/compose_view"
app:layout_constraintTop_toTopOf="parent" />
… />
ComposeView には setContent メソッドが用意されています。このメソッドのラムダブロック内に Jetpack Compose を利用したコードを記述して UI を実装していきます 。
class SessionDetailActivity : AppCompatActivity() { private val binding by lazy { ActivitySessionDetailBinding.inflate(layoutInflater) } private val viewModel: SessionDetailViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) … binding.composeView.setContent { // この中に Jetpack Compose のコードを書いていく Mdc3Theme { Text("Hello, Compose!") } } }}
class SessionDetailActivity : AppCompatActivity() {
private val binding by lazy {
ActivitySessionDetailBinding.inflate(layoutInflater)
private val viewModel: SessionDetailViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
binding.composeView.setContent {
// この中に Jetpack Compose のコードを書いていく
Mdc3Theme {
Text("Hello, Compose!")
XML レイアウトの置き換え先になるコンポーズ可能関数を SessionDetail という名前で用意します。以下、 SessionDetail Composable の様な記述は、 SessionDetail という名前のコンポーズ可能関数を意味します。 SessionDetail Composable に表示させるセッションの情報は、SessionData 型のオブジェクトを引数でとるようにします。
Jetpack Compose では Preview アノテーションを使って Composable のプレビューを表示することができるので、 SessionDetail Composable のプレビューも用意しておきます。
@Composableprivate fun SessionDetail(data: SessionData) {}@Preview@Composableprivate fun SessionDetailPreview() { Mdc3Theme { Surface { SessionDetail( data = SessionData( … ) ) } }}
@Composable
private fun SessionDetail(data: SessionData) {
@Preview
private fun SessionDetailPreview() {
Surface {
SessionDetail(
data = SessionData(
)
SessionData は SessionDetailViewModel が保持しており、Flow<SessionData> 型で公開されています。
class SessionDetailViewModel : ViewModel() { val sessionDataFlow: Flow<SessionData> = …}
class SessionDetailViewModel : ViewModel() {
val sessionDataFlow: Flow<SessionData> = …
Jetpack Compose には Flow を State に変換する collectAsState メソッドが用意されています。このメソッドを使って Flow<SessionData> を State<SessionData?> に変換します。State の値に value プロパティでアクセスし、 SessionDetail Composable に渡します。
SessionDetailViewModel ではなく SessionDetail を渡すようにすることで、 SessionDetail Composable を stateless(状態を持たない)な Composable にできます。stateless な Composable はテストがしやすくプレビューも簡単にできます。
class SessionDetailActivity : AppCompatActivity() { … private val viewModel: SessionDetailViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) … binding.composeView.setContent { // この中に Jetpack Compose のコードを書いていく Mdc3Theme { val state: State<SessionData?> = viewModel.sessionDataFlow .collectAsState(null) val data: SessionData? = state.value if (data != null) { SessionDetail(data = data) } } } }}
val state: State<SessionData?> = viewModel.sessionDataFlow
.collectAsState(null)
val data: SessionData? = state.value
if (data != null) {
SessionDetail(data = data)
セッションタイトルを表示する Text Composable を SessionDetail Composable に追加します。セッションタイトルを表示していた TextView は削除するのではなく android:visibility を invisible にします。
スピーカーの画像を表示する ImageView がこの TextView を参照しているため、削除すると ImageView のレイアウトでエラーがおこり、参照先を変更しなければなりません。また android:visibility が gone の場合だと TextView のエリア分だけ ImageView が上にずれてしまいます。
@Composableprivate fun SessionDetail(data: SessionData) { Column( modifier = Modifier .fillMaxWidth() .padding(16.dp), ) { Text( text = data.sessionTitle, style = MaterialTheme.typography.headlineSmall, ) }}
Column(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
) {
Text(
text = data.sessionTitle,
style = MaterialTheme.typography.headlineSmall,
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout …> <androidx.compose.ui.platform.ComposeView … /> <TextView android:id="@+id/session_title" … android:visibility="invisible" … /> …</androidx.constraintlayout.widget.ConstraintLayout>
android:visibility="invisible"
インターネット上にある画像を Compose で表示する例として、ここでは Coil ライブラリ (英語) を使います。
dependencies { … implementation "io.coil-kt:coil-compose:2.2.2"}
implementation "io.coil-kt:coil-compose:2.2.2"
Coil ライブラリ の AsyncImage Composable を使ってスピーカーの画像を表示します。
ConstraintLayout 内の ImageView は android:visibility を invisible にしておきます。
@Composableprivate fun SessionDetail(data: SessionData) { Column( modifier = Modifier .fillMaxWidth() .padding(16.dp), ) { Text( text = data.sessionTitle, style = MaterialTheme.typography.headlineSmall, ) Row( modifier = Modifier.padding(top = 16.dp), verticalAlignment = Alignment.CenterVertically, ) { AsyncImage( model = data.speakerImageUrl, contentDescription = "speaker image", modifier = Modifier.size(72.dp) ) } }}
Row(
modifier = Modifier.padding(top = 16.dp),
verticalAlignment = Alignment.CenterVertically,
AsyncImage(
model = data.speakerImageUrl,
contentDescription = "speaker image",
modifier = Modifier.size(72.dp)
スピーカーの名前と肩書きも同じように Text Composable で表示します。
@Composableprivate fun SessionDetail(data: SessionData) { Column( modifier = Modifier .fillMaxWidth() .padding(16.dp), ) { Text( text = data.sessionTitle, style = MaterialTheme.typography.headlineSmall, ) Row( modifier = Modifier.padding(top = 16.dp), verticalAlignment = Alignment.CenterVertically, ) { AsyncImage( model = data.speakerImageUrl, contentDescription = "speaker image", modifier = Modifier.size(72.dp) ) Column( modifier = Modifier.padding(start = 16.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) { Text( text = data.speakerName, style = MaterialTheme.typography.bodyMedium, ) Text( text = data.speakerTitle, style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant ) } } }}
modifier = Modifier.padding(start = 16.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
text = data.speakerName,
style = MaterialTheme.typography.bodyMedium,
text = data.speakerTitle,
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant
ConstraintLayout 内の全ての View を SessionDetail Composable に置き換えたので、 XML レイアウトおよび View Binding をやめて Activity の setContent を使うようにします。
class SessionDetailActivity : AppCompatActivity() { private val viewModel: SessionDetailViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { Mdc3Theme { val state: State<SessionData?> = viewModel.sessionDataFlow .collectAsState(null) val data: SessionData? = state.value if (data != null) { SessionDetail(data = data) } } } }}
setContent {
XML レイアウトを段階的に Jetpack Compose に置き換えていく方法を紹介しました。ComposeView を使うことで View 階層の中に Jetpack Compose による UI を簡単に組み込むことができます。
表示内容の変わらない View ならデータの更新について考える必要がないため、 Jetpack Compose への初めての置き換えに最適です。ぜひ挑戦してみてください。
この記事は Lauren Mytton による Android Developers Blog の記事 " Raising the bar on technical quality on Google Play " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
アプリの品質は、Google Play が行うあらゆる施策の基盤です。Android ユーザーは、ダウンロードするアプリやゲーム上での優れた体験を期待しています。そのため、Google Play ストアでは、品質の高いタイトルをより見つけやすくするとともに、品質の低いタイトルからユーザーの目を遠ざけています。ユーザーの期待に応えるため、私たちの品質基準を満たさない一部のアプリやゲームは、「おすすめ」などの目立つ発見手段から除外されたり、ストアの掲載情報に警告が表示されることがあります。
アプリの品質を高め、より多くのユーザーを惹きつけるための最も重要な方法の 1 つは、技術的な品質に注力することです。この記事では、Google Play が技術的な品質の定義をよりユーザーの体験に沿ったものに進化させることを説明し、デベロッパーの皆さんが、技術的な問題や機会を監視測定し、対処するために役立つ Android Vitals の新機能を紹介します。
Android Vitals は、現場から上がってくる安定性やパフォーマンスの指標など、Google Play での技術的品質をモニタリングするための 1 番の近道です。最も重要な指標は core vitals と呼ばれ、Google Play ストアでのアプリの可視性に影響します。
今後、既存の core vitals の指標を、よりユーザーに焦点を当てた新しい指標に置き換える予定です。私たちは、これらの指標が、ユーザー エクスペリエンスを反映していると信じており、アンインストールとの相関もより強いことが確認されています。
全体的な品質を向上するために、引き続き全体的な不正な動作のしきい値を適用します。全体的なしきい値は新しい指標を使用しますが、ユーザーが認識したクラッシュ率は 1.09%、ユーザーが認識した ANR 率は 0.47% のままで変更されません。Google Play でタイトルの可視性を最大化するには、これらのしきい値を下回るようにすることが重要です。
技術的な品質は、デバイス間によって異なることがあります。例えば、あるスマートフォンのデバイスではアプリが安定していてスムーズでも、別のデバイスではそうでないことがあります。これを考慮し、スマートフォンのモデル(例:Pixel 6)ごとに評価される新しい不正な動作のしきい値を導入します。ローンチ時には、このしきい値は、ユーザーが認識したクラッシュ率とユーザーが認識した ANR 率の両方について 8% に設定される予定です。
皆さんのタイトルが特定のスマートフォン モデルの core vitals でデバイスの不正な動作のしきい値を超えた場合、Google Play はそのスマートフォン モデルのユーザーに対するタイトルの可視性を低下する場合があります。たとえば、一部の 検出サーフェスからタイトルを除外したり、場合によっては、ストアの掲載情報に警告を表示して、アプリがお使いのスマートフォンで正常に動作しない可能性があることをユーザーに示すことがあります。Google Play ストアは、2022 年 11 月 30 日からストアの掲載情報の警告の適用を開始する予定です。
2022 年 11 月 30 日以降、ユーザーが所有するデバイスにおいて、ユーザーが認識したクラッシュ率またはユーザーが認識した ANR 率が 8% を超えるタイトルがある場合、ストアの掲載情報で警告が表示される場合があります。なお、警告文は変更される可能性があります。
この新しい品質ガイドラインに対応するため、Android Vitals では、問題の監視と対処を容易にするためのさまざまな新機能をリリースしました。
新しい指標は、Google Play Console の Android Vitals で利用できるほか、Play Developer Reporting API (英語) も利用できます。既存の指標は、引き続きコンテキストとして利用できます。
Android Vitals で、全体的な不正な動作のしきい値に対するタイトルの状態をモニタリングすることができます。さらに、Android Vitals は、デバイスごとのしきい値を超えている場合は警告を表示します。また、どのデバイスで、何人のユーザーに影響を及ぼしているかも表示されます。
ユーザーが認識したクラッシュ率や ANR 率に対する技術的な品質問題の原因を理解するには、これらの率の原因となるクラッシュや ANR のクラスターを調べましょう。これらは、Android Vitals の [クラッシュと ANR] ページで、全体または特定のスマートフォン モデルについて見ることができます。多くのユーザーに影響を及ぼしている問題から順番に対処することで、問題発生率をより迅速に低減することができます。
デバイスのハードウェアやソフトウェアの特定の側面が、問題発生率に影響することがあります。このような問題を発見し解決するために、Android Vitals に新しい機能が追加され、関連性が見つかった場合に通知されるようになりました。また、[リーチとデバイスの概要]ページで、ご自身で関連性を調べることも可能です。
Android Vitals は、デバイスのハードウェアまたはソフトウェアに関連する可能性のある問題を警告します。
デバイスごとに取り組むべき品質の問題の優先順位を決める際には、既存ユーザーと、新規ユーザーに対する機会損失や影響の両方を考慮する必要があります。これを支援するために、インストールベース、収益、評価、レビューなどの統合デバイス情報へのワンクリックでのアクセスを Google Play Console 上で開始しました。この情報はサイドパネルに表示されるため、今見ているページを離れる必要はありません。
Google Play Console の新しいサイドパネルでは、統合されたデバイス情報を
コンテキストで提供します。
Android Vitals に関連のある方々全員にアクセス権を付与してください。新しい品質指標は Android Vitals で公開されており、全体的またはスマートフォンごとの技術的な品質問題が表示されます。Google Play Console で Android Vitals を定期的に確認するか、Play Developer Reporting API (英語) と統合して、データを、ご自身のワークフローに直接取り込むことをお勧めします。詳細については、Android Developer のサイト を参照してください。
しきい値は 8% からスタートしますが、デベロッパーの皆さんには、スマートフォンごとの安定性指標が 2% 以下になることを目指していただきたいと思います。このことを念頭に置き、2023 年の前半には、スマートフォンごとのしきい値が低くなる可能性があることを想定してください。将来的には、ユーザー エクスペリエンスの他の重要な側面を反映する新しい指標を追加するために、品質基準を拡張する可能性もあります。その場合も、事前にお知らせします。
ユーザーは端末上での素晴らしい体験を期待し、その期待に応えることができるデベロッパーの皆さんは Google Play でのさらなる成功を収めるでしょう。これらのアップデートは、ユーザーとデベロッパー両方の方々が最悪の体験を回避できるように設計されていますが、私たちの長期的な焦点は、優れたユーザー エクスペリエンスを増やすことです。そのためには、クラッシュや ANR 以外の技術的な品質への投資と、品質に関する非技術的な側面への投資が必要です。今後数か月間にわたり、このトピックの続報をお知らせする予定ですので、ご注目ください。
Reviewed by Maru Maruyama - Developer Relations Engineer, Tamao Imura - Developer Marketing Manager, Platforms and Ecosystems
この記事は Android Developers Team による Android Developers Blog の記事 " Outdooractive boosts user experience on wearable devices with 30% less development time using Compose for Wear OS " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
Outdooractive (英語) はヨーロッパ最大のアウトドア プラットフォームで、1,200 万人 (英語) を超える自然愛好家のグローバル コミュニティにトレイルマップや情報を提供しています。アウトドア活動の計画やナビゲーションに特化したプラットフォームである Outdooractive は以前より、ユーザー数の拡大にはスマートウォッチなどのウェアラブル デバイスが欠かせないと考えていました。ウェアラブルは、ナビゲーション ツールやアクティビティ トラッカーとしてユーザーに大きな価値を提供します。そのため、Outdooractive のデベロッパーは、Google から Android の新しい UI ツールキット Wear OS 向け Compose (英語) に関する打診を受けたとき、この成長市場でアプリを改善する絶好の機会だと考えました。
アプリの再構築に着手すると、Wear OS 向け Compose のメリットはすぐに明らかになりました。Outdooractive のデベロッパーは、開発時間を 30% ほど短縮でき、効率的なユーザー インターフェースを短時間で作成できるようになりました。Outdooractive のシニア プロジェクト マネージャーである Liam Hargreaves 氏は、「数日かかりそうなものが、数時間でできるようになりました」と話します。
コードベースの最新化と開発スピードの向上によって、デベロッパーが UI のコードを直感的に読み書きできるようになりました。また、デザイン フェーズでのプロトタイピングが高速になり、柔軟なコラボレーションができるようになりました。そのため、デベロッパーは、ユーザーのためにさらに便利な機能を作れるようになっています。
Outdooractive のアプリが目指しているのは、正確な情報をユーザーのウェアラブル デバイスまでリアルタイムに届けることです。たとえば、曲がるべき場所を伝えるナビゲーション、トレイルの状態、最新の気象情報といった情報です。
「私たちのアプリには、かなり複雑なインタラクションがあります」と Hargreaves 氏は言います。「こういった情報を、アクセスしやすい形で、シンプルかつ高速にわかりやすく提示しなければなりません。しかも、お客様は山道にいたり、嵐に遭遇していたり、手袋や冬用のハイキング装備を身につけていたりするかもしれません」
Outdooractive のデベロッパーは、Wear OS 向け Compose の新機能を活用して、移動中のユーザーに高品質な体験を提供できるアプリを作成しました。Chip コンポーネントを使うことで、リスト作成のプロセスを大きく改善できました。あらかじめ用意されているデザイン要素を使えるので、デベロッパーは数日分の作業を省略できました。また、ScalingLazyColumn を使うことで、RecyclerView や ScrollView に頼ることなく、最適なスクロール画面を作成できました。
AnimatedVisibility コンポーネントが使いやすいうえに、これまでは開発する余裕がなかったアニメーション機能を作成できるようになったことも、デベロッパーを喜ばせました。Wear OS 向け Compose で特に重宝されたのは、「読み込み中」や「エラー」など、さまざまな UI の状態をとても簡単にユーザーに提示できるようになったことでした。
「Compose を使うと、UI コードを直感的に読み書きできるようになります。デザイン フェーズでのプロトタイピングが高速になり、コードでのコラボレーションもしやすくなりました」
Wear OS 向け Compose を導入したことで、Outdooractive のユーザーは、ハイキング コースのナビゲーションなど、通常であればスマートフォンで行っていたことをウェアラブル デバイスで行えるようになりました。これは、Wear OS 向け Compose のおかげで実現した主要な UI の目標でした。
「ウェアラブルは、私たちのプロダクト戦略や市場戦略において欠かせない部分の 1 つです。ユーザーからの反応も非常に好意的です」と Hargreaves 氏は語っています。
Outdooractive のデベロッパーは、心拍数のモニタリングなどのフィットネス トラッキング機能をアプリに組み込むことで、ウェアラブル デバイスならではの機能も提供しています。これは、Health Services という別の Wear OS 機能を使い、デバイスに搭載されたセンサーにアクセスして実現しています。Wear OS の Health Services は、健康やフィットネスに関連するセンサーの設定をすべて自動で行い、データを収集し、心拍数や移動距離、速度などの指標を計算します。そのため、デベロッパーは電池寿命をできる限り延ばしながら、高度なアプリの機能を簡単に実現できます。Outdooractive のデベロッパーは、Health Services と Wear OS 向け Compose を活用し、ボディセンサーを使ってアプリの機能をさらに強化したいと考えています。
Outdooractive の効率的なプロセスは、Wear OS 向け Compose によってアプリ開発が簡単になるという実例を示しています。これが実現できたのは、デベロッパーの柔軟性が向上し、開発の負担を増やさずにさまざまなレイアウトを試せるようになったからです。
Hargreaves 氏は、Wear OS 向け Compose を使うことを検討している他のデベロッパーに向けて、「全面的に導入することをお勧めします」と明確にアドバイスしています。
Wear OS 向け Compose を使うと、ウェアラブル デバイスでエンゲージメントの高いユーザー エクスペリエンスを構築できます。
概要を知りたい方は、Google I/O の Wear OS 関連トーク (動画/英語 - 日本語字幕は、YouTube の自動字幕機能から日本語を選択してください) をご覧ください。さっそく学習を始めたい方は、Wear OS 向け Compose の Codelab をお試しください。
この記事は Paul Feng による Android Developers Blog の記事 " Continuing our Commitment to User Choice Billing" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
ユーザーとデベロッパーの皆さんにより多くの柔軟性と選択肢を提供するために継続的に進化してきた Android の長い歴史に沿って、ユーザー選択型決済の試験運用プログラムを通じて、Google Play の課金オプションの拡大を検討し始めることを今年初めに発表しました。アプリ内課金用の代替的な課金システムを提供するには、ユーザーの手に委ねることが最良だという信念が、この試験運用プログラムの根底にあります。
試験運用プログラムに参加されている方々は、所定の国のユーザーに対して、Google Play の課金システムに加えて、その他の代替的な課金システムを提供できるようになります。私たちのゴールは、安全でポジティブなユーザーエクスペリエンスを維持しながら、世界中のデベロッパーとユーザーの皆さんが、ユーザー選択型決済をサポートする際に伴う複雑さを理解することです。この試験運用プログラムは、私たちが、さまざまな実装をテストして繰り返したり、デベロッパーやユーザーからプログラムの体験に関する洞察を集めることで、このプログラムをどのように進化できるかを決断できます。
ユーザー選択型決済の試験運用プログラムの詳細はこちら
この試験運用プログラムを発表した際に、最初のパートナーとして Spotify と協業することをお伝えしました。私たちは、Spotify と密接に連携をしており、今週からユーザー選択型決済の初期テスト導入が一部の国の Spotify ユーザーに対して開始されたことを嬉しく思っています。私たちは、Spotify での反復を通して、この体験がさらに進化していくと信じています。この取り組みの展開の詳細については、こちらの Spotify からの発表をご覧ください。
また、Bumble がユーザー選択型決済の試験運用プログラムに参加してくれたことも嬉しい限りです。今後数か月中に、一部の国でアプリ内での選択が可能になるものと思われます。
さらに、世界中のデベロッパーからの関心を受け、2022 年 9 月には、ゲーム以外のアプリを開発するすべてのデベロッパーの皆さんの試験運用プログラムへの参加が可能となりました。現時点での UX ガイドラインを含む参加条件や要件の詳細を説明し、ユーザー選択型決済をまずオーストラリア、インド、インドネシア、日本、欧州経済地域のユーザーに提供することを発表しました。
デベロッパーやユーザーの皆さんからの好意的な反応と初期のフィードバックに基づき、アメリカ、ブラジル、そして、南アフリカのユーザーにもこの試験運用を拡大することを 2022 年 11 月 11 日 (日本時間) に発表しました。
参加しているデベロッパーは、35 カ国以上でユーザー選択型決済の展開が可能
この試験運用プログラムはまだスタートしたばかりですが、私たちは、開始直後にいただいた反応に勇気づけられています。今後、パートナーの皆さんとの協力関係の構築を継続しながら、より多くのユーザーにユーザー選択型決済を展開し、さらに多くの情報を共有できることを楽しみにしています。試験運用プログラムの参加条件、要件、参加方法などの詳細については、ヘルプセンターをご覧ください。
Reviewed by Tamao Imura - Developer Marketing Manager, Platforms and Ecosystems
この記事は Matthew McCullough による Android Developers Blog の記事 " What’s new from Android, at Android Dev Summit ‘22 " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
アメリカのベイエリアで Android Dev Summit (英語) が始まりました。そこでは、皆さんが最新の Android 開発を活用して、ユーザー向けのすばらしい体験を構築するたくさんの方法を紹介しました。最新の Android 開発は、リストサイズからタブレットや折りたたみ式の大画面まで、Android が提供するさまざまな画面サイズのデバイスでアプリの拡張を支援しています。
ここでは、内容をまとめて紹介します。基調講演全編 (動画/英語) も忘れずにご覧ください!
Android Dev Summit ‘22 基調講演
* 日本語字幕は、YouTube の字幕機能から日本語を選択してください
最新の Android 開発、略して MAD (Modern Android Development) と呼んでいる一連のライブラリ、ツール、サービス、ガイドを導入したのは数年前のことでした。Android Studio、Kotlin、Jetpack ライブラリ、そして強力な Google & Play 開発者サービスで私たちが目指しているのは、あらゆる Android デバイスに対応した高品質なアプリを速く簡単に開発できるようにすることです。
何年か前には、美しく高度な UI を作れるように Jetpack Compose を導入しました。これは、新しい Android アプリの推奨 UI フレームワークになっています。
また、安定版の Compose ライブラリを指定した Gradle 部品構成表 (BOM) を導入しています。最初の BOM リリースとなる 22 年 10 月版 Compose (英語) には、マテリアル デザイン 3 コンポーネント、Lazy スタッガード グリッド、可変フォント、プルリフレッシュ、遅延リストのスナップ、キャンバスでのテキスト描画、テキストの URL アノテーション、ハイフネーション、LookAheadLayout が含まれています。Lyft のチームは、Compose を使うことで大きなメリットを実現し、「今では、すべての新機能のコードの 90% 以上を Compose で開発しています」 (英語) と話しています。
私たちは、Android のデバイス エコシステム全体を活用してもらうために Compose を役立てたいと考えています。Compose for Wear OS は、数週間前に 1.0 の安定版リリースに到達し、Wear OS での推奨の UI 開発方法になりました。2022 年 10 月 24 日は、さらにこの流れを拡大するため、Compose for Android TV の最初のアルファ版をリリースしました。フィーチャー カルーセルやイマーシブ リストなどのコンポーネントはすでに利用でき、近日中にさらに多くのコンポーネントが追加される予定です。Android を学習している方や新しいアプリを作ろうとしている方には、Jetpack Compose がお勧めです!
最新の Android 開発を実現しているのが、Android Studio (英語) です。公式 IDE である Android Studio には、あらゆる種類の Android デバイスに対応したアプリを開発するための強力なツールが搭載されています。22年 10 月版 Compose では、皆さんが試すことができるたくさんの新機能をリリースしています。デフォルトが Compose でマテリアル 3 を採用している更新版テンプレート、デフォルトでの Compose ライブ編集の有効化、コンポジションのトレース、Android SDK アップグレード アシスタント、App Quality Insights の改善などです。すべての機能は、Android Studio Flamingo の最新プレビュー版をダウンロード (英語) して試すことができます。ぜひ、フィードバックをお送りください。
今、ユーザーが注目しているのは、最も小さく身近なデバイス、つまりスマートウォッチです。昨年には、Samsung との合同プラットフォーム Wear OS を発表しました。そして今年は、Samsung Galaxy Watch 5 や Google Pixel Watch といったすばらしい新デバイスが登場したことで、デバイスのアクティベーション数が 3 倍になっています。Wear OS アプリの開発を速く簡単にする Compose for Wear OS は、この夏に 1.0 になり (英語)、Wear OS アプリで推奨の UI 開発方法になっています。20 を超えるウェアラブル専用 UI コンポーネントがデザインされており、マテリアル テーマやユーザー補助機能も組み込まれています。
2022 年 10 月 24 日に、Android Studio の Wear OS 向けテンプレートと、Wear OS の安定版 Android R エミュレータ システム イメージが更新されたことをお知らせします。
ウェアラブルからはパーソナライズされたデータが得られるので、データを公開せず、完全に安全な状態に保つことが重要です。そこで、それを簡単に実現するソリューションとして、ヘルスコネクトに取り組んできました。健康データを格納して共有する API は、Samsung と密接に連携して開発しました。ユーザーはこの 1 か所のみで、簡単にパーミッションを管理できます。
Wear OS に注力しているデベロッパーは、大きな成果を挙げています。Todoist は、アプリを Wear 3 向けに再構築して、インストールの増加率が 50% 上昇しました。また、Outdooractive は Compose for Wear OS を使って開発時間を 30% 短縮しました。他にはない魅力的な体験を Wear OS ユーザーに届けるなら、今が狙い目です!
* 日本語字幕は、YouTube の自動字幕機能から日本語を選択してください
以前もお知らせしたように、Google は全力を挙げてタブレット、折りたたみ式、ChromeOS に注力しています。Samsung Galaxy Z Fold4、Lenovo P12 Tab Pro、今後発売予定の Google の Pixel Tablet など、すばらしい新ハードウェアが登場する今こそ、アプリを見直して大画面に対応する絶好のチャンスです。私たちは、Android のアップデート、Google アプリの改善や Google Play ストアの変更といった作業に懸命に取り組んでおり、タブレットに最適なアプリを見つけやすくしています。
Android Studio Electric Eel では、サイズ変更可能なエミュレータとデスクトップ エミュレータ、どんなサイズの画面でもベスト プラクティスに従えるようにするためのビジュアル lint チェックなどを通して、これまでになく簡単にアプリを大画面でテストできるようにしています。
さらに、こういったデバイス向けのデザインやレイアウトのガイドを増やしてほしいという声も寄せられていることから、2022 年 10月 24日、developer.android.com を縦断した (英語) 新しいアプリ レイアウト ガイドと、正規レイアウト (英語) 向けのデベロッパー ガイドとサンプルを追加しました。
大画面機能に対応すると、アプリのエンゲージメントが向上します。たとえば Concepts (英語) の場合、描画機能や図形ガイドなどの優れたタッチペン操作を ChromeOS とタッチペン デバイスで実現したことで、タブレットでの使用がスマートフォンに比べて 70% 高くなりました。
Android Studio や Window Manager Jetpack などの改善に関する最新情報は、11 月 9 日にライブ中継されるフォーム ファクタ トラック (英語) をご覧ください。
成功につながるプラットフォームの中心となるのはオペレーティング システムです。そして、8 月にリリースされた Android 13 では、パーソナライズ、プライバシー、セキュリティ、接続性、メディアなど、プラットフォームの実にさまざまな面で機能強化が行われています。
たとえば、アプリ別の言語設定では、多言語ユーザーの操作が改善され、状況に応じてデバイスの言語を使い分けられるようになります。
パーミッションが不要な新しい写真選択ツールでは、ユーザーが写真や動画を閲覧して選択できますが、ユーザーが明示的にアプリと共有することを選んだものだけが対象になります。これは、Android がプライバシーを重視していることを示す好例です。
また、新しい API レベルをターゲットにしやすくするため、最新の Android Studio Flamingo のプレビュー版に Android SDK アップグレード アシスタント ツールを導入しています。特に重要な変更点について、手順が細かく記載されたドキュメントが提供されるので、アプリのターゲット SDK をアップデートする際に参考にできます。
ここで紹介したのは、ほんの一例に過ぎません。私たちは、Android が提供する最新機能 (英語) を活用できるようにしつつ、プラットフォームの変更にアプリを対応する作業をこれまで以上に簡単にしています。
プラットフォームについて知っておきたい 3 つのこと
Android Dev Summit の初日に基調講演を行い、最新の Android 開発に関する最初のトラック (英語) が始まりましたが、今後もまだまだ続きます。11 月 9 日には、次のトラック:フォーム ファクタ (英語) がライブストリームされるので、お楽しみに。最後のテクニカル トラックはプラットフォーム (英語) についてで、11 月 14 日にライブストリームされます。
どうしても聞いてみたい質問がある方は、#AskAndroid を使ってツイートしてください。毎回のトラックのライブストリームの最後には、ライブ Q&A でチームが皆さんの質問に回答しますので、ぜひご覧ください。
大変うれしいことに、今年は世界中のデベロッパーの皆さんと直接お会いできる機会があります。本日のベイエリアはその初回です。11 月 9 日には、Android Dev Summit をロンドンからお届けします。お楽しみは 12 月のアジアまで、各地で続きます。12 月 16 日には DevFest & Android Dev Summit Japan 2022 が東京で(詳細は後日)、12 月中旬にはバンガロールで行われます(参加希望はこちら (英語) から登録できます)。
Android をより良いプラットフォームにするためには、オンラインで参加する方も世界各地の会場に直接お越しになる方も含め、デベロッパーの皆さんのフィードバックが必要です。皆さんと一緒に優れたアプリを開発し、Android が提供するさまざまなデバイスでユーザーを喜ばせる機会をいただけたことに感謝します。どうぞ 2022 Android Dev Summit をお楽しみください!
この記事は Tom Grinsted による Android Developers Blog の記事 " Supporting and rewarding great Apps and Games on Google Play " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
Google Play の使命は、Android ユーザーとアプリやゲームのデベロッパーの皆さんとの関係を促進し、世界中の何万ものビジネスがモバイル エコシステムで成長し繁栄することを可能にすることです。私たちは毎日、何十億ものユーザーが端末上で魅力的で役立つ豊かな体験を発見できるよう支援しています。だからこそ、私たちは Google Play ストアで提供する体験の品質を、大切にしています。
そのために私たちは、ユーザー獲得からエンゲージメント、リテンション、再獲得に至るまで、ライフサイクル全体を通じて高品質のタイトルの促進と支援を行う新しい方法を常に開発しています。今後数か月の間に、Google Play と Google Play Console の機能強化を実施します。それにより、Google Play 上での体験全体にデベロッパーの皆さんの主要なイベント、コンテンツ、オファーが組み込まれるようになります。これらの変更は、より多くのユーザーにリーチし、より質の高いタイトルの発見を向上させ、デベロッパーの皆さんのプレゼンスを最適化することにより、最大の効果を得ることを目的としています。
これらのアップデートをナビゲートするために、私たちが特に重要だと思う考え方や方向性をいち早くお伝えし、ユーザーのライフサイクル全体でデベロッパーの皆さんのさらなる成長を後押しする新機能を発表します。ぜひご一読ください。
私たちはデベロッパーの皆さんのパートナーとして、皆さんのさらなる成功を後押しすることに重点を置いています。現在のアプリやゲームのエコシステムでは、ロイヤリティとリエンゲージメントがかつてないほど重要視されています。私たちは、デベロッパーの皆さんが私たちのサーフェスを活用して、新規ユーザーを見つけるだけでなく、ユーザーとエンゲージし、ユーザーを再獲得する機会をさらに増やすことに注力をしています。
一部のタイトルでは、LiveOps は Google Play でユーザーに直接、お得なオファー、ローンチ、イベントを提供するための重要なチャネルとなっています。LiveOps は、Rise of Kingdoms、Paramount+、MyFitnessPal などのタイトルが、ユーザーを発見し、リエンゲージメントを行い、マネタイズを促し、エキサイティングな新コンテンツを追加することに役立っています。LiveOps を使用しているデベロッパーは、使用していない類似タイトルと比較して、平均で収益が +3.6%、28DAU が +5.1% 増加しています。個々のイベントは、すでに Google Play 上で魅力的な成果を達成しています。
Google Play のデータ : LiveOps によってもたらされた実際に起きたさらなる成長
分析 : 直近で実施された 70 以上の LiveOps のうち 90% vs. 信頼区間 0.9 の対照群
このパフォーマンスを加速するため、今後数か月の間に、インパクトのある新しいプレースメントやフォーマットを作成し、Google Play でのコンテンツの利用方法を拡大します。コンテンツは、ホームページから、検索や発見、タイトルのリスト、ディープリンクを介したアプリへの直接アクセスなど、ユーザーの体験に深く組み込まれるようになります。
新しいコンテンツフォーマットにより、ユーザーが高品質なコンテンツを発見・再発見し、楽しむことができるようになります。最終的なデザインは異なる場合があります。
Google Play 上のコンテンツがもたらす機会を最大限に活用していただくために、Google Play Console 上で重要な変更を実施します。まず、LiveOps の名称を「プロモーション用コンテンツ」に変更します。これは、現在 Google Play に投稿できるコンテンツの幅と、今後追加される新しいコンテンツ タイプを反映したものです。また、フォーマットのガイドラインや優先順位のクォータも更新され、データの一括ダウンロードも可能になりました。すでにプロモーション用コンテンツを利用している何千ものタイトルの 1 つである場合、Google Play Console の受信トレイにメッセージが表示され、詳細を確認することができます。2023 年は、さらに多くのアプリとゲームへのアクセスを拡大する予定です。
これらの変更により、イベントを活用してアクティブな視聴者と収益を拡大する機会がさらに増えることになります。Google Play での可視性とプロモーションは、タイトルと個々のコンテンツの品質にも左右されます。そのため、更新されたコンテンツのガイドラインと推奨事項を必ずご確認ください。
モバイルアプリやゲームのライフサイクルのもう 1 つの重要な要素は、以前タイトルを試したことのあるユーザーを呼び戻すことです。モバイルのエコシステムが成熟し、デベロッパーの皆さんが長期的な投資を続ける中、この成長チャネルの重要性は増すばかりです。
そこで、離脱したユーザー向けのストアのカスタム掲載情報を導入します。これにより、アプリやゲームを試したことがあるがその後アンインストールした Google Play 上のユーザーに対して、異なるストーリーを伝えることができます。ストアの掲載情報は、YouTube でアプリの広告を表示するときのオーバーレイのような体験を提供するため、カスタマイズされたユーザーの再獲得のためのメッセージが、さまざまな Google サーフェスでユーザーの目に触れることが可能となります。
また、今後数ヶ月の間に、Google Play が高品質で素晴らしいタイトルのユーザーの再獲得をどのように支援できるかを検討していく予定です。離脱したユーザー向けのストアのカスタム掲載情報は、2022 年の年末に展開される予定です。このフォーム (英語) にご入力いただくことで、いち早く、この新機能を使用することへのご関心をお知らせいただくことができます。
私たちは、Google Play でユーザーのためにエキサイティングで新鮮なユーザー ジャーニーを作り上げることに注力しています。さまざまな要素がある中、品質評価は私たちのチームの判断とエディトリアル関連の決断において考慮される要因の 1 つとなっています。ユーザーは素晴らしい体験を期待しており、私たちはその期待に応えてくれるタイトルを支援することを目指しています。
まず、アプリ内品質を考慮します。私たちは、以下のようなさまざまな要素に着目しています。タイトルが洗練されたデザインで、ユーザーを長期的に惹きつけるコンテンツであるかどうか。オンボーディングエクスペリエンスが明確であるか、広告が適切に統合されているか。直感的に操作できるナビゲーション、コントロール、メニューアクセスがあるかどうか。サポートするすべてのフォームファクターにおいて、機能的な動作のガイドラインを満たしているかどうか。また、誰にとっても使いやすいアプリやゲームになっているかどうか、などの要素を見ています。
技術的な品質も重要な検討事項です。技術的な品質は、ユーザーやデバイスによって大きく異なる可能性があるため、よりユーザーに焦点を当てたクラッシュと ANR の新しい指標を Android vitals に導入します。これらの指標は、デベロッパーの皆さんが、Google Play ストア上で受ける対応に影響を与えるようになります。特定のデバイスで劣悪な体験を提供する可能性があるタイトルからユーザーを遠ざけ、ユーザーが、より適切なタイトルに誘導されるようになります。また、一部のアプリやゲームでは、ストアの掲載情報に警告が表示される場合があります。
ユーザーが利用しているモバイル端末においてユーザーが認識したクラッシュ レートまたは ユーザーが認識した ANR 率 が 8% を超えるタイトルがある場合、2022 年 11 月 30 日以降ストアの掲載情報上に警告が表示される場合があります。なお、最終的なデザインやテキストは変更される可能性があります。
このような警告が Google Play で表示される前に、アプリに該当リスクがある場合は Android vitals で警告しますので、改善策を講じることが可能です。詳しくは、アプリの品質に関するブログポストをご覧ください。
最後に品質に関する話題に関連して、トップ ランキングを改善するために、レーティングの最低基準を 3.0 に設定することになりました。私たちはまず、2023 年 2 月に世界中の、すべてのフォームファクターにおいて、無料のトップ ランキングへのレーティング変更を開始する予定です。2023 年後半には、この変更を有料と売上のトップ ランキングにも導入する予定です。
Google Play Console には、評価のトリアージ、ユーザーが書き込んでいる上位の問題の深堀り、レビューへの直接の返信するためのツールが用意されています。詳しくはこちらをご覧ください。
Google Play をデベロッパーの皆さんにとって、より価値のあるプラットフォームにしていくために、私たちのサーフェスがデベロッパーの皆さんの成長に与えるポジティブな影響を明確化できるようにしたいと考えています。そこで、Google Play ストアのパフォーマンス レポートを更新し、ユーザーが Google Play で皆さんのタイトルをどのように発見しているかという情報を、よりよく反映するようにしました。これには、より多くの Google Play 以外のエクスペリエンスからのデータ、Google Play でのユーザーのオーガニックな行動や、有料とダイレクトトラフィックの区別、主要なディスカバリー ジャーニー(たとえば、「パズルゲーム」などのカテゴリーを検索)の探索トラフィックへの組み込みが含まれます。このアップデートが公開される際には、Google Play Console からメッセージでお知らせします。
これらの変更と、現在開発中のその他のエキサイティングな機能は、すべて連動しています。ユーザー体験の質の向上、サービスの進化、心が躍るようなイベントや魅力的なコンテンツに投資しているデベロッパーの方々にとって、Google Play は、皆さんのさらなる成長と成功を強力に後押しするプラットフォームであり、パートナーであり続けます。
この記事は Diego Zavala, Christiaan Brand, Ali Naddaf, Ken Buchanan による Android Developers Blog/Android Developers - Medium の記事 " Bringing passkeys to Android & Chrome " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
2022 年 10 月 12日より、Google は Android と Chrome の両方でパスキーのサポートを開始しました。
パスキーはフィッシングによって侵害される可能性があるパスワードなどの認証要素に代わるもので、安全性が大幅に向上します。パスキーは再利用できず、サーバーの侵害によって漏洩することもないため、ユーザーはフィッシング攻撃から保護されます。また、業界標準 (英語) に基づいて作られており、オペレーティング システムやブラウザのエコシステムに依存せずに動作し、ウェブサイトでもアプリでも利用できます。
パスキーはパスワードの自動入力という既存の仕組みに基づいているので、おなじみの UX パターンに従います。エンドユーザーは、保存してあるパスワードを使うときと同じ操作でパスキーを利用できます。つまり、指紋などの既存のデバイスの画面ロック解除キーを提示するだけです。ユーザーのスマートフォンやコンピュータに保存されたパスキーは、クラウドを通してバックアップと同期されるので、デバイスを紛失してもロックアウトされることはありません。さらに、スマートフォンに保存されているパスキーを使って、そばにある別のデバイスからアプリやウェブサイトにログインすることもできます。
10 月 12 日のサポート開始により、パスキーに関する作業が大きな節目を迎え、次の 2 つの主な機能が実現できるようになったことをお知らせします。
さっそく試してみたいデベロッパーの皆さんは、Google Play 開発者サービスのベータ版 (英語) に登録し、Chrome Beta を使ってみてください。どちらの機能も、今年中に安定版チャンネルで一般公開版として利用できるようになる予定です。
2022 年の次のマイルストーンとして、ネイティブ Android アプリ向けの API を提供する予定です。ウェブ API を使って作成したパスキーは、同じドメインを使うアプリでシームレスに利用できます。その逆も同様です。ネイティブ API を使うと、パスキーと保存したパスワードのどちらかを選ぶ仕組みを統一的に扱うアプリを作ることができます。パスワードとパスキーの両方でおなじみのシームレスな UX を使えるので、ユーザーやデベロッパーは徐々にパスキーに移行しやすくなります。
エンドユーザーは、わずか 2 ステップでパスキーを作成できます。(1)パスキーのアカウント情報を確認し、(2)プロンプトに従って指紋や顔などの画面ロック解除キーを提示します。
ログイン操作も同じように簡単です。(1)ログインに使うアカウントを選択し、(2)プロンプトに従って指紋や顔などの画面ロック解除キーを提示します。
スマートフォンに保存したパスキーは、そばにあるデバイスからログインする際に使うこともできます。たとえば、Android ユーザーは Mac の Safari からパスキー対応のウェブサイトにログインできます。同じように、パスキーは Chrome でもサポートされているので、たとえば Windows の Chrome ユーザーが iOS デバイスに保存されているパスキーを使ってログインすることもできます。
パスキーは業界標準に基づいて作られているので、Windows、macOS、iOS、ChromeOS など、プラットフォームやブラウザが違っても、同じユーザー エクスペリエンスを提供できます。
私たちは、Apple や Microsoft などの同じ業界の企業、FIDO Alliance (英語) のメンバー、W3C (英語) と協力し、何年もかけて (英語) 安全な認証標準の検討を進めています。W3C WebAuthn (英語) や FIDO 標準は、制定時よりサポートしています。
今回重要な節目ではありますが、これでこの取り組みが終わるわけではありません。Google は、パスワードや新たに導入されたパスキーを保存する場所をユーザーが自由に選べる世界に向けて、これからも注力し続けます。来年には、Android に変更を加え、サードパーティのパスワードマネージャーがパスキーをサポートできるようにする予定なので、今後の最新情報にご注目ください。
この記事は Android Developers Team による Android Developers Blog の記事 " The new Google Pixel Watch is here - start building for Wear OS! " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
2022 年 10 月 6 日の Made by Google イベント (英語) を見た方は、Pixel ポートフォリオ (英語) の最新デバイスをご覧になったはずです。スマートフォンの Pixel 7 と Pixel 7 Pro に加えて、2 つの最新フォーム ファクタを紹介しました。それが、Google Pixel Tablet1 (Google のまったく新しいタブレット、2023 年発売予定)と、Wear OS by Google を搭載した最新デバイス Google Pixel Watch です。 このスマートウォッチ販売が始まった今こそ、これからのホリデーシーズン中に多くの消費者の手に渡ることになる新しいスマートウォッチにアプリが対応する絶好のタイミングです。ここでは、Wear OS の最新アップデート、皆さんのアプリの体験を向上する方法、美しく効率的な Wear OS アプリの開発に着手する方法についてお知らせします。
Google Pixel Watch には Wear OS が搭載されており、プラットフォームの最新アップデートである Wear OS 3.5 が含まれています。この最新バージョンの Wear OS を利用できる Wear OS デバイスは他にもあります。新しい Wear OS は、スムーズかつ簡単に操作できるように設計されており、タップやスワイプ、音声コマンドで必要な情報にアクセスできます。また、刷新された UI と高度な通知機能が搭載されているので、ユーザーが一目で確認できる情報が増えました。
こうした新機能をベースとして存分に活用しながら開発を進められるというメリットを実感していただくため、少ない開発時間とコード行数でアプリを実行できる最新の宣言型 UI ツールキット、Compose for Wear OS を2022 年にすでにリリースしています。すべて Kotlin で構築されており、API が安定版であり、開発に利用できることを示すバージョン 1.0 (英語) になっています。1.0 リリースの内容は次のとおりです。
Wear OS 向けのアップデートに含まれるもう 1 つのうれしい内容は、短時間でタイルを作成できる Tiles Material ライブラリ (英語) のリリースです。Tiles Material ライブラリには、Wear OS 向けの最新マテリアル デザインに対応した既製のマテリアル コンポーネントやレイアウトが含まれています。この使いやすいライブラリには、ボタン用コンポーネントや進捗状況を示すアークなどが含まれているため、ゼロからコンポーネントを作る必要がなくなります。さらに、既製のレイアウトが使えるので、タイル開発を大幅に加速でき、タイル向けのマテリアル デザイン ガイドラインに確実に従うことができます。
また、先日リリースされた Android Studio Dolphin にはさまざまな Wear OS 機能が追加されているので、アプリ、タイル、ウォッチフェイスがすべての Wear OS 3 デバイスに対応することができます。Wear OS エミュレータ ツールバーのアップデート、直感的なペア設定アシスタント、ウォッチフェイスやタイル、ウォッチフェイスの追加機能をすばやくテストできる新しいダイレクト サーフェス起動機能などが含まれ、WearOS 向けの高度なアプリをこれまでになく簡単かつ効率的に作れるようになっています。
皆さんのアプリをはじめとして、Google アプリや Spotify、Strava、Bitmoji、adidas Running、MyFitnessPal、Calm など、さまざまなアプリが Wear OS 向けにすばらしい体験を提供しています。2022 年は、Todoist (英語) 、PeriodTracker、Outdooractive (英語) がアプリを Compose で再構築し、アプリの開発をシンプルかつ効率的にできるツールや API のメリットを活用しています。Outdooractive は、Compose for Wear OS を使うことで、チームの開発時間を 30% 削減できました。
Google Pixel Watch の発表と合わせて、Google 製アプリによる新たな体験 も提供します。ここでは、すばらしいユーザー エクスペリエンスを実現するもう 1 つの方法として、新しいハードウェア機能が使われています。Google フォトでは、お気に入りの写真を Google Pixel Watch のウォッチフェイスに設定できるようになります。Google Pixel Watch にはカスタマイズ可能な 19 個のウォッチフェイスが搭載されており、各ウォッチフェイスで、たくさんのカスタマイズ オプションが提供されています。Google アシスタント (英語) も搭載されているので、Google Pixel Watch ユーザーは Wear OS アプリや内蔵の Google アシスタント機能を使ってお気に入りのアプリを操作できます。たとえば、Google Home の最新アップデートでは、Wear OS アプリを使うか、時計に「Hey Google」と話しかけることで、スマートホーム デバイスを簡単に制御できます。また、温度を調整したり、来客や配達があったときに Nest ドアベルから通知を受け取ったりすることなど、あらゆる操作が可能です。2
最新の Wear OS プラットフォームやハードウェアのアップデートを活用すれば、健康&フィットネス アプリにたくさんのチャンスが生まれます。Google Pixel Watch には、プロセッサ レベルに至るまで最適化されたオンデバイス機械学習による正確な心拍数トラッキングなど、Fitbit のすばらしい健康&フィットネス機能が含まれており、Google Pixel Watch で呼吸数、心拍数の変動、睡眠の質といった主要な指標を把握できます。このようにデータの質が向上しているので、健康&フィットネス アプリが有意義な情報や体験をユーザーに提供できる場面が増えています。
Wear OS と Google Pixel Watch のアップデートや機能強化により、目に見える形でアプリを差別化できるようになっています。さまざまなアプリが、こういった機能を使ってユーザーを喜ばせています。皆さんもぜひお試しください。
すばらしいデバイスがすでにそろっている Wear OS エコシステムに、最新デバイスの Google Pixel Watch が加わります。API やツールの改善から刺激的な新しいハードウェアまでがそろった今こそ、Wear OS アプリの開発に着手する絶好のチャンスです。Compose for Wear OS 向けの開発を始めるには、こちらの学習パスの順を追った説明をご覧ください。それからクイック スタートガイドなどのドキュメントを確認し、Wear OS 向けの Compose の Codelab でハンズオン形式での実習に挑戦しましょう。
さらに詳しい情報については、Google I/O の Wear OS セッション (動画/英語) をご覧ください。また、まもなく開催される Android Developer Summit (英語) の基調講演やテクニカル セッションで、Wear OS の最新の重要な情報をお聴きください。*日本語字幕は、YouTube の自動字幕機能から日本語を選択してください
Made by Google についてのお知らせをいち早く知りたい方は、こちらの公式ブログ (英語) をご覧ください。Pixel エコシステムに加わるもう 1 つのすばらしいフォーム ファクタである Google Pixel Tablet 向けに開発を始めたい方は、タブレット向けにアプリを最適化する方法 (英語) をご覧ください。
免責事項 :
1. Google Pixel Tablet は、米連邦通信委員会などの規制機関の規則によって義務づけられている認可を受けていません。このデバイスは、義務づけられている法的な認可が得られるまで、販売などの方法で流通されない可能性があります。
2. 対応するスマートホーム デバイス(別売)が必要です。
この記事は Allison Chang, Weifang Sun, Manuel Wang による Android Developers Blog の記事 " New features and tools to help you showcase your Play Store listing " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
アプリのユーザーになる可能性のある人々にアプリの機能や価値を理解してもらうには、 Google Play ストアの掲載情報を効果的に活用することが一番の方法です。皆さんが提供するアセットや情報(説明文、イメージ、動画)は、ユーザーが何をダウンロードすべきかを決めるうえで欠かせません。
タブレット、スマートウォッチ、テレビなど、スマートフォン以外のネットワーク デバイスが使われることが多くなっている今、それぞれのフォーム ファクタに合わせてアプリのアセットを提供することがこれまでになく重要になっています。実際に、モバイル以外のアクティブな Android デバイス数は、この 1 年間で 30% 近く増加しています。
2022 年 10 月 13 日、ストアの掲載情報のアセットをこれまで以上に Google Play の中心に据えるための新機能についてお知らせしました。さらに、アプリの掲載情報を最適化し、有効なインストール数を増やすために役立つベスト プラクティスも紹介します。
現在、タブレット、折りたたみ式、Chromebook などの大画面で、ユーザーがデバイスに最適なアプリを探せるようにするための機能強化を続けています。2022 年の I/O でお知らせした (動画/日本語字幕あり) ように、大画面向けの Google Play ストアを再設計し、アプリとゲームのホームに直接スクリーンショット、動画、説明文を表示するようにします。
Google Play ストアの大画面向けホームページ(2023 年)
コンテンツを前面に出すアプローチの目的は、ストアでアプリについて詳しく説明して、それをインストールするかどうかの判断に役立ててもらうことです。
また、大画面向けにアプリを表示するベスト プラクティスとして、コンテンツの品質に関するガイドラインを公開しました。2023 年の早いうちに、この基準に従ってアセットを提供したアプリは、見栄えの良いフォーマットで Google Play に表示されるようになります。これはアプリの宣伝性には影響しません。 Google Play ストアでのアプリの表示方法が変わるだけです。
現在、Chromebook で Google Play ストアを表示すると、ストアの掲載情報ページにはタブレット版かスマートフォン版のアプリのスクリーンショットが表示されます。これは必ずしも Chromebook のエクスペリエンスを正確に表しているとは限らないので、Play Console で Chromebook のスクリーンショットをアップロードできる機能をリリースしています。
Play Developer Console での Chromebook のスクリーンショット
スクリーンショットは 8 枚まで登録でき、主に Chromebook の Google Play ストアに表示されます。このスクリーンショットは、アプリの掲載情報ページと Google Play ホームページの両方に表示されます。
スクリーンショットは、16:9、横向き、解像度 1080-7690px のものを推奨します。
使ってみたい方は、Play Console の [メインのストアの掲載情報] セクションをご覧ください。
新たに ChromeOS のスクリーンショットがサポートされたため、タブレット向けの品質に関するガイドラインも更新し、大画面での整合性が確保されるようにしました。すでにアップロードされているタブレットのスクリーンショットは影響を受けませんが、アプリをアップデートする際に新しいスクリーンショットを簡単に生成できるようになります。
先月には、フォーム ファクタ固有のホームページを導入しました。これは、モバイル以外のデバイスも持っているユーザーがスマートフォンを開いたときに表示される専用の画面です。このホームページでは、スマートウォッチ、テレビ、自動車に最適なタイトルをスマートフォンから表示できるので、皆さんのアプリや詳しいストアの掲載情報の視認性が向上します。
その他のデバイス向けのホームページ
さらに、Google Play で新しいデバイス フィルタを使って検索結果を絞り込めるようになっています。このフィルタを有効にすると、選択したデバイスと互換性のあるタイトルのみが検索結果に表示されます。
以上の変更により、詳しいストアの掲載情報が Google Play ではるかに目立ちやすくなります。そこで、アプリのアセットの最適化に役立ついくつかの方法を紹介します。
アプリやゲームの中核となる画面をデバイス固有のスクリーンショットで示す
Play Console には、アプリやゲームがさまざまな種類のデバイスでどのように見えるかを示すスクリーンショットをアップロードできます。また、フォーム ファクタ独自の機能を紹介することもできます。スクリーンショットを選ぶときは、アプリの主要なユーザーフローを表す画像を使うようにしてください。そうすることで、あらゆるデバイスのユーザーが、実際のアプリやゲームがどのようなものであるかを把握できるようになります。
デバイスの画像は慎重に利用する
ストアの掲載情報に実機を掲載すると、スクリーンショットや動画がすぐに古くなったり、一部のユーザーが身近に感じられなかったりする可能性があります。時間をかけずにアセットを管理できるように、アプリやゲームのスクリーンショットや動画のみを使うようにしましょう。
高品質イメージを適切なアスペクト比と解像度で利用する
あらゆるサイズの画面で見栄えの良いスクリーンショットにするためには、高品質イメージを使うことが欠かせません。ピクセルが見えるようなスクリーンショット、引き延ばされたり圧縮されたりしているスクリーンショット、向きが正しくないスクリーンショットは使わないようにしましょう。
アセットにテキストがかぶらないようにする
スクリーンショットや動画が Google Play のホームページできれいに表示されるように、テキストを使いすぎないようにしてください。アセットは、画面サイズに収まるように拡大縮小される可能性があります。過度なテキストを避けることで、意図せずにテキストが切れることがなくなります。
テキストを使う必要がある場合は、有効期限がある頻繁に更新しなければならないテキストは避けるようにしましょう。
Google Play で皆さんのストアの掲載情報を際立たせるための方法は、現在もテストが続いていますが、アセットの品質の重要性が変わることはありません。あらゆる種類のデバイスに最高の形でアプリを見せることができるように、ここで紹介した機能やヒントを活用していただけることを願っています。着手するうえで、さらに詳しいヒントを確認したい方は、コンテンツの品質に関するガイドラインをご覧ください。
この記事は、 Google Developer Expert (GDE) @STAR_ZERO さんに寄稿いただいたゲスト記事です。この「エキスパートに学ぶシリーズ」では、まだ Jetpack Compose を使ったことがないデベロッパー向けに既存アプリで段階的に導入を進める方法や導入するメリットについて GDE の方々よりご紹介いただきます。
新規アプリにて Jetpack Compose を導入することは最適な方法ですが、 Jetpack Compose は View-base UI と統合することができ、既存アプリに対しても段階的に導入が可能になっています。
この記事では、まだ Jetpack Compose を使用したことがない方向けに、既存アプリに Jetpack Compose を導入する手順について紹介します。
Jetpack Compose を最大限に活かすために、最新の Android Studio 安定版をインストールします。また、それにあわせて build.gradle の Android Gradle Plugin のバージョンもアップデートします。今回は執筆時点での安定版である 7.3.0 を指定しています。
buildscript { // ... dependencies { classpath "com.android.tools.build:gradle:7.3.0" // ... }}
buildscript {
// ...
classpath "com.android.tools.build:gradle:7.3.0"
Jetpack Compose は Kotlin でのみ実装することが可能になっています。まだ Kotlin を使用していないプロジェクトについては Kotlin の導入を行う必要があります。 Kotlin は Java と同時に使用することができます。既存アプリに Kotlin を導入するにはこちらのページを確認してください。
Jetpack Compose を使用するには Gradle で構成を追加する必要があります。
サポートされてる minSdk のバージョンは 21 からです。21 以上にアップデートし、さらに Jetpack Compose を有効にする設定と、 Java と Kotlin のターゲットバージョンの設定を追加します。
最後に使用してる Kotlin バージョンによって適切な Jetpack Compose Compiler のバージョンが変わります。こちらのページの Kotlin と Compiler のバージョンの対応表があるので、適切なバージョンを指定します。
android { defaultConfig { // … // Jetpack Compose がサポートされているのは 21 から minSdk 21 } // … buildFeatures { // Jetpack Compose を有効にする compose true } // Java と Kotlin のターゲットを Java8 に設定 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } composeOptions { // Jetpack Compose の Compiler バージョンを指定 // Kotlin のバージョンから適切なバージョンを指定する kotlinCompilerExtensionVersion "1.3.1" }}
android {
defaultConfig {
// …
// Jetpack Compose がサポートされているのは 21 から
minSdk 21
buildFeatures {
// Jetpack Compose を有効にする
compose true
// Java と Kotlin のターゲットを Java8 に設定
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
kotlinOptions {
jvmTarget = '1.8'
composeOptions {
// Jetpack Compose の Compiler バージョンを指定
// Kotlin のバージョンから適切なバージョンを指定する
kotlinCompilerExtensionVersion "1.3.1"
以下のように build.gradle に必要なライブラリを追加します。
dependencies { // … // Activity と Jetpack Compose の統合 implementation 'androidx.activity:activity-compose:1.6.0' // Material Design implementation 'androidx.compose.material:material:1.2.1' // Jetpack Compos eのアニメーション implementation 'androidx.compose.animation:animation:1.2.1' // プレビュー等のツール implementation 'androidx.compose.ui:ui-tooling:1.2.1' // ViewModelとJetpack Composeの統合 implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1'}
// Activity と Jetpack Compose の統合
implementation 'androidx.activity:activity-compose:1.6.0'
// Material Design
implementation 'androidx.compose.material:material:1.2.1'
// Jetpack Compos eのアニメーション
implementation 'androidx.compose.animation:animation:1.2.1'
// プレビュー等のツール
implementation 'androidx.compose.ui:ui-tooling:1.2.1'
// ViewModelとJetpack Composeの統合
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1'
このとき、推移的依存関係により使用してるライブラリのバージョンも上がってしまう可能性があるので注意です。
Jetpack Compose で使用するテーマは新しく作成していくこともできますし、既存 View システムで使用しているテーマを再利用することもできます。
Material Component を使用している場合は MDC Compose Theme Adapter 、 AppCompat のテーマを使っている場合は AppCompat Compose Theme Adapter を使用することで再利用できます。
// MDC Compose Theme Adapterimplementation "com.google.android.material:compose-theme-adapter:1.1.19"// AppCompat Compose Theme Adapterimplementation "com.google.accompanist:accompanist-appcompat-theme:0.25.1"
// MDC Compose Theme Adapter
implementation "com.google.android.material:compose-theme-adapter:1.1.19"
// AppCompat Compose Theme Adapter
implementation "com.google.accompanist:accompanist-appcompat-theme:0.25.1"
MDC Compose Theme Adapter を使用する場合は MdcTheme を使用することで XML で定義されてるTheme を再利用することが出来ます。
MdcTheme { Box( modifier = Modifier.background( // XML の Theme の colorPrimary の色 color = MaterialTheme.colors.primary ) ) { Text( text = "Hello, Compose!", // XML の Theme の textAppearanceHeadline1 のスタイル style = MaterialTheme.typography.h1 ) }}
MdcTheme {
Box(
modifier = Modifier.background(
// XML の Theme の colorPrimary の色
color = MaterialTheme.colors.primary
text = "Hello, Compose!",
// XML の Theme の textAppearanceHeadline1 のスタイル
style = MaterialTheme.typography.h1
新規画面を Activity と Jetpack Compose で実装する例になります。 ComponentActivity を継承した Activity を作成し、 setContent のラムダブロック内に Jetpack Compose の実装をしていきます。
class MyActivity: ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { // この中に Jetpack Compose のコードを書いていく MdcTheme { Text(text = "Hello, Compose!") } } }}
class MyActivity: ComponentActivity() {
Text(text = "Hello, Compose!")
新規画面を Fragment と Jetpack Compose で実装する場合は次のようになります。 Fragment で実装する際は注意があり、 setViewCompositionStrategy を設定して Jetpack Compose の Composition を正しく破棄する必要があります。詳しくはこちらのページを確認してください。
class MyFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { return ComposeView(requireContext()).apply { // Fragment の View が破棄されるときに Composition も破棄する setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) setContent { // この中に Jetpack Compose のコードを書いていく MdcTheme { Text(text = "Hello, Compose!") } } } }}
class MyFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return ComposeView(requireContext()).apply {
// Fragment の View が破棄されるときに Composition も破棄する
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
紹介したとおり、既存アプリにも Jetpack Compose を導入することは意外と簡単に出来るようになっています。もしかしたら既存アプリに導入するのは難しいと思っている方もいらっしゃるかもしれませんが、段階的に導入することで可能なところから少しずつ Jetpack Compose を使っていくことができます。
Jetpack Compose を使うことで効率よく UI を実装することができますので、ぜひ挑戦してみてください。