この記事は Chet Haase による Android Developers - Medium の記事 "Now in Android #37"を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
Android 開発の最新ニュースやトピックをご紹介する Now in Android。今回は Android 12、MAD Skills WorkManager、AndroidX、最新のポッドキャスト エピソードなどをご紹介します。
今回の Now in Android は、動画とポッドキャストでもお届けします。内容は同じですが、読む量は少なくて済みます。この記事版には、取り上げているすべてのコンテンツへのリンクが掲載されていますので、ぜひご覧ください。
下のリンクをクリックするか、お気に入りのクライアント アプリでポッドキャストをサブスクライブしてください。
Android 12 の 2 回目のデベロッパー プレビュー が公開されています。また、4 月 7 日(日本時間 4 月 8 日)にはパッチ リリース の DP 2.2 を公開しました。
デベロッパー プレビュー 2 でリリースした新機能の概要は、ブログ記事でご紹介しています。ピクチャー イン ピクチャーの改善、ぼかしや色フィルタなどの強力なグラフィック効果を簡単に実現できる新しい RenderEffect API などが含まれています。
また、デベロッパー ドキュメントにもいくつか改善を加えました。
Android 12 プレビュー の Web サイトには、動作の変更点、新機能と新しい API などの情報を掲載しています。新しくリリースしたバージョンでぜひ皆さんのアプリのテストをお願いします。何か問題があればフィードバックをお送りください。デベロッパー プレビューをリリースすることで、皆さんからのフィードバックをより多く集め、最終プロダクトの公開までに完成度を上げていきます。
最終リリースに向けて作業が進むにつれて、機能や修正が増えていきます。今後のリリースにもご期待ください。
最先端の Android 開発に関する技術コンテンツを扱う MAD Skills シリーズが続いています。ミニシリーズとして取り上げてきた WorkManager から今回も最新情報をお知らせします。
Firebase JobDispatcher や GCMNetworkManager API をまだ使っている場合は、どちらも非推奨となってますので、今こそ移行のタイミングです。このエピソードでは、WorkManager を使うようにコードを移行する方法について、Caren Chang が解説しています。動画に加えて、Firebase JobDispatcher と GCMNetworkManager から移行する方法についてのガイドも忘れずにご覧ください。
Hugo Visser さんが、健康管理アプリで WorkManager を使ってスケジュールを設定し、定期的にデータをダウンロードして処理する方法について解説しています。さらに、いくつかのデバイスで問題を発見し、その問題を送信したところ、最新リリースの WorkManager でバグが修正されたことにも触れています。
WorkManager シリーズの最後のエピソードでも、WorkManager のエキスパートを招いてリアルタイム Q&A を行いました。私のほかに、Ben Weiss とこのシリーズの進行役である Caren Chang、そして Sumir Kataria と WorkManager の担当エンジニア Rahul Ravikumar が参加しました。この API について、できる限り多くの質問にお答えしています。
連載中のコンテンツは、YouTube の MAD Skills プレイリスト、Medium の記事、またはすべてのリンクが掲載されているランディング ページからご覧いただけます。
Fragment 1.3.2、Activity 1.2.2、Lifecycle 2.3.1 など、いくつかの AndroidX のバグ修正版を安定版としてリリースしました。最初のアルファ版リリースになったばかりですが、いくつかの新ライブラリも登場しました。
Oboe は、さまざまな Android リリースやデバイスで高パフォーマンス、低レイテンシ(遅延)のオーディオを実現するネイティブ ライブラリです。昨年 4 月には、ADB ポッドキャストで Oboe のエンジニアから話を聞きました。そして現在、Oboe は Games SDK に統合されています。Daniel Galpin が Android Developers ブログに新しい記事(英語)を投稿しました。プロジェクトに Oboe を追加してコードから利用する方法について詳しく説明しています。
Manuel Vivo が、Lifecycle 2.4.0-alpha01 の新しい API を紹介するブログ記事(英語)を公開しました。この API を使うと、UI レイヤーから安全に Kotlin Flow を使用できます。
Nicole Borrelli が、PendingIntent を正しく使う方法と、これを使うべきタイミングについてのブログ記事(英語)を投稿しました。これはタイムリーな話題です。次のリリースで行われるセキュリティ関係の変更により、Android 12 をターゲットとしたアプリで PendingIntent の可変性についての宣言が必須になるからです。
ユニット 4 が始まります。他のコースもご覧ください!
Android 開発の基本と Kotlin プログラミングを学びたい方向けのコース、Android Basics in Kotlin で、ユニット 4: インターネットへの接続が公開されました。この新しいコンテンツでは、Kotlin コルーチンのコードを書きつつ、ネットワーク データを扱う Retrofit や Coil などの重要なライブラリの使い方を学習します。
今まで Blogger で公開していた ADB が終了しました。そして、Android Developers Backstage の新しい Web サイトを公開し、新しいフィード、そして素敵な新しいロゴを作成しました。この変更は現在の ADB サブスクライバには影響しません。フィードはリダイレクトされるので、再度サブスクライブする必要はありません。しかし、今後のエピソードのメモを参照したい場合は、adbackstage.libsyn.com をご確認ください。
新しいサイトとフィードに投稿された最初のエピソードは、長年にわたり独立系の Android アプリ デベロッパーとして活躍している Chris Lacy さんへのインタビューです。Chris さんがアプリをどのように実装したのか、またその過程で Android のプログラミングや API についてどのようなことを学んだのか、Romain と私が話を聞きました。
次回も Android デベロッパーの世界の最新アップデートをお届けします。お楽しみに。
この記事は Eric Bahna による Android Developers Blog の記事 "Start Your Engines: Launch New Android Auto Apps to Production!" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
本年 3 月、Jetpack の一部として Android for Cars App Library を公開しました。ほとんどのデベロッパーは、既に実装をこのライブラリに移行しています。パートナー デベロッパーの素晴らしいアプリが登場し、ドライバーの満足度も高く、クオリティの高いアプリとなっています。
この度、2021 年 4 月 5 日(日本時間 4 月 6 日)より、Android Auto のナビゲーション、駐車場、充電スポットのアプリを製品版として公開できるようになったことをお知らせします。このマイルストーンに到達するために、Android Auto ライブラリの開発と公開プロセスを安定させる作業を続けてきました。
製品版として公開すると、ドライバーはベータ版プログラムに登録しなくても、Android Auto 対応自動車のスクリーンで Android Auto アプリを利用できるようになります。製品版として公開する方法は以下のとおりです。
Android for Cars App Library 1.0 に関する、デベロッパーの皆さんからのご協力とフィードバックに感謝しております。
Android Auto ユーザーから特に多く寄せられたリクエストは、アプリのカテゴリを増やしてほしいというものでした。このライブラリの目的は、アプリの品質ガイドラインを満たしつつ、アプリを 500 モデル以上の Android Auto 対応自動車へ、簡単に配信できるようにすることです。ライブラリが複雑な画面のフォーム ファクタや入力モードを抽象化してくれるので、デベロッパーのみなさんはアプリの魅力を高める作業に集中して取り組むことが可能になりました。
ナビゲーション、駐車場、充電スポットのアプリを製品版として公開できるようになったことは、大きな一歩であるとともに、さらに長い道のりの始まりでもあります。より多くのデベロッパーのみなさんが開発した自動車用アプリが作成されることをとても期待しています。また、皆さんと協力してすばらしい車内体験を提供することを楽しみにしています。
2018 年より開催している Google Play 主催の Indie Games Festival は、インディー ゲームとそのデベロッパーの革新性や独自性を称えるイベントです。
2021 年に 4 年目を迎える インディー ゲーム フェスティバルの開催が今年も決定しました!募集開始時期や詳細なスケジュールおよびルールは、今後順次お知らせします。
今年は、新しく「学生部門賞」も加わります!(13 歳以上の学生の方が対象です)
ゲーム開発者を目指す学生の皆さんの沢山のご応募をお待ちしています。
どうぞご期待ください。
Tamao Imura - Developer Marketing Manager, Google Play
この記事は Meghan Mehta による Android Developers - Medium の記事 "Working with Package Visibility" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
Android では、ユーザーのプライバシーとプラットフォームのセキュリティを高め、ユーザーに安全な体験を提供するための変更を行っています。Android 11(API レベル 30)以降をターゲットとしたアプリは、ユーザーがデバイスにインストールしているアプリのうち、フィルタによって絞り込まれた一部のアプリのみしか参照できないようになっています。それ以外のアプリにアクセスしたい場合は、Android マニフェストで<queries> 要素を使い、直接連携するアプリを宣言しなければなりません。このブログ投稿では、この機能に対応する際のベスト プラクティスについて解説します。
アプリに対するクエリや連携を行うには、いくつかの方法があります。
<!-- Copyright 2019 Google LLC. SPDX-License-Identifier: Apache-2.0 --><manifest package="com.example.game"> <queries> <package android:name="com.example.store" /> <package android:name="com.example.services" /> </queries> …</manifest>
SPDX-License-Identifier: Apache-2.0 -->
<manifest package="com.example.game">
<queries>
<package android:name="com.example.store" />
<package android:name="com.example.services" />
</queries>
…
</manifest>
!-- Copyright 2019 Google LLC. SPDX-License-Identifier: Apache-2.0 --><manifest package="com.example.game"> <queries> <intent> <action android:name="android.intent.action.SEND" /> <data android:mimeType="image/jpeg" /> </intent> </queries> ...</manifest>
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="image/jpeg" />
</intent>
...
<!-- Copyright 2019 Google LLC. SPDX-License-Identifier: Apache-2.0 --><manifest package="com.example.suite.enterprise"> <queries> <provider android:authorities="com.example.settings.files" /> </queries> …</manifest>
<manifest package="com.example.suite.enterprise">
<provider android:authorities="com.example.settings.files" />
連携する場合、必要なパッケージのみに対してクエリを実行し、データを最小限にとどめることを推奨します。 QUERY_ALL_PACKAGES や、同じく広範な <intent> 要素は、そのレベルの情報が必要になるアプリでのみ利用してください。また、新しい Package Visibility ポリシーでは、デバイスにインストールされているアプリの一覧が参照できる QUERY_ALL_PACKAGES パーミッションを新たに使用する場合、承認プロセスを通していただく必要があります。詳しくは、こちらをご覧ください。
ほとんどの一般的なユースケースでは、広範囲にわたってインストールされているアプリの情報を得る必要はありません。多くのシナリオでは、startActivity() で十分目的は果たせます。インテントを実行できるアプリがない場合は、例外をキャッチします。
<!-- Copyright 2019 Google LLC. SPDX-License-Identifier: Apache-2.0 -->try { val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply { addCategory(CATEGORY_BROWSABLE) } startActivity(intent)} catch (e: ActivityNotFoundException) { Snackbar.make(it,"Activity Not Found",Snackbar.LENGTH_LONG).show()}
try {
val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply {
addCategory(CATEGORY_BROWSABLE)
}
startActivity(intent)
} catch (e: ActivityNotFoundException) {
Snackbar.make(it,"Activity Not Found",Snackbar.LENGTH_LONG).show()
ターゲットが見えなかったとしても、アクティビティを開始できます。ただし、これは暗黙的インテントなので、アクティビティが利用できるかどうかを開始前に問い合わせたり、起動する具体的なアプリを確認したりすることはできません。インテントを実行できなかった場合は、起動時に通知されます。この問題には、フラグを使って対処することができます。
このフラグを使うと、インテントがブラウザ以外の結果として解決できる場合のみ、インテントが起動されます。そのような結果が存在しない場合は、ActivityNotFoundException が投げられ、アプリはカスタムタブで URL を開きます。
<!-- Copyright 2019 Google LLC. SPDX-License-Identifier: Apache-2.0 -->val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply { // The URL should either launch directly in a non-browser app (if it's // the default), or in the disambiguation dialog. addCategory(CATEGORY_BROWSABLE) flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER}
// The URL should either launch directly in a non-browser app (if it's
// the default), or in the disambiguation dialog.
flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER
インテントにこのフラグが含まれていると、startActivity() の呼び出しでブラウザアプリが直接起動される、または確認ダイアログ(オプションはブラウザアプリのみ)がユーザーに表示される場合、ActivityNotFoundException が投げられます。フラグの詳細については、ユースケースに基づいてパッケージの公開設定を設定するをご覧ください。
フラグがよく使われる例として、カスタムタブがあげられます。カスタムタブを使うと、ブラウザの見た目をカスタマイズできます。ブラウザ以外のアプリでも、リンクはカスタムタブで正しく開きます。しかし、どのブラウザのカスタムタブを使うかをデベロッパーが選びたいような高度な事例では、フラグが役立ちます。
カスタムの共有シートではなく、システムの共有シートを使うことをお勧めします。システムの共有シートは、アプリが見えなくてもカスタマイズできます。詳しくはこちらのドキュメントをご覧ください。
マニフェストを調べれば、含まれているすべてのクエリを簡単に確認できます。これを行うには、マニフェスト ファイルに移動して [Merged Manifest] を選択します。
パッケージ フィルタリングのログ メッセージを有効にして、デフォルトの Package Visibility がアプリに与える影響を確認することもできます。
<!-- Copyright 2019 Google LLC. SPDX-License-Identifier: Apache-2.0 -->$ adb shell pm log-visibility - enable YOUR_PACKAGE_NAME
$ adb shell pm log-visibility - enable YOUR_PACKAGE_NAME
パッケージの可視性の詳細については、以下の情報をご覧ください。
それでは、コーディングをお楽しみください。
Google Play にとって、ユーザーとデベロッパーの皆さんのプライバシーと安全が、最も重要です。
そのため、大きなポリシーの改定に伴いデベロッパーの皆さんに対応いただくことが必要となる場合に、その情報を広くお伝えするためのウェビナーを開催しています。
次回は、4 月 16 日に 2021 年 3 月末に適用となったポリシー変更の内容を中心にお伝えする「 Google Play デベロッパー ポリシー ウェビナー 2021 年 4 月」の開催を予定しています。本ウェビナーは、Google Play ストアに向けたアプリの開発やパブリッシングを担う企業や個人の皆さまを対象にした、オンライン ウェビナーです。同じ会社・組織から何人でもご参加可能です。皆さまお誘い合わせの上、ご参加ください。
なお、質問はこちらの Google フォームで事前に受け付けております。こちらの動画をウェビナーに参加される前にご視聴いただき、ウェビナーの前に内容に関する質問をフォームから記入ください。ご協力をお願いします。
【開催概要】
イベント名:Google Play デベロッパー ポリシー ウェビナー 2021 年 4 月開催日時:2021 年 4 月 16 日 16 時 00 分 - 16 時 50 分開催形式:オンライン ウェビナー対象:Google Play ストアに向けたアプリの開発やパブリッシングを担う開発者*開始10 分前から入場可能です
【参加方法】
こちらのイベントページよりご登録・ご視聴ください。当日でも参加登録は可能ですが、事前に登録を完了いただくと、スムーズです。なるべく登録をお済ませの上お待ち下さい。
多数のご参加をお待ちしています。
Posted by Konosuke Ogura - Trust & Safety - Play & Android, Global Policy & Operations Lead and Tamao Imura - Developer Marketing Manager, Platforms and Ecosystems
この記事は Manuel Vivo による Android Developers - Medium の記事 "Now in Android #36" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
Android 開発の最新ニュースやトピックをご紹介する Now in Android。今回は MAD Skills のミニシリーズ WorkManager、AndroidX、オーディオ、UX、Wear OS タイル、Jetpack Compose、コルーチン、#AndroidDevChallenge、最新のポッドキャスト エピソードなどをご紹介します。
今回の Now in Android は、動画とポッドキャストでもお届けします。内容は同じですが、読む量は少なくて済みます。この記事版(そのままお読みください!)には、取り上げているすべてのコンテンツへのリンクが掲載されていますので、ぜひご覧ください。
最先端の Android 開発に関する技術コンテンツを扱う MAD Skills シリーズが続いています。
WorkManager についてのミニシリーズには、2 つのエピソードが追加されました。
バックグラウンド処理: Android アプリでやってはいけないことがあるとすれば、それは UI スレッドのブロックです。このエピソードでは、Ben Weiss が WorkManager を使ってバックグラウンド処理を行う方法について、さまざまなアプローチを取り上げています。
WorkManager では、Executor、コルーチン、RxJava のどれを使うかによって、利用する API が違います。このエピソードでは、作業が完了したときに結果を返す方法についても説明しています。さらに Ben は、これまでの MAD 動画の中で最高級の “Let’s go” を披露しています。
高度な設定とテスト: さらに Ben は、WorkManager の初期化をカスタマイズする方法、複数のプロセスにまたがるアプリをサポートする方法、Worker をテストする方法について解説し、便利なデバッグ テクニックもご紹介しています。
今回の、 AndroidX リリースは、ほとんどがバグの修正です。
ご存知の通り、私は Hilt を担当しています。今回は広く、Hilt のベータ版をリリースしたことをお伝えしたいと思います!ViewModel、WorkManager、Navigation をサポートする Hilt の API と AndroidX 固有の API は、すべて安定版です。Hilt は Android で依存関係の注入を行う際の Jetpack の推奨ソリューションです。今回は、クイック リファレンスを公開しました。Hilt と Dagger のさまざまなアノテーションが行う処理の内容と、それを使う方法をすばやく調べることができます。
また、Jetpack Compose や Navigation コンポーネントを使い始めた方のために、hilt-navigation-compose ライブラリを新しくリリースしています。これを使うと、Navigation Compose で作成したナビゲーション グラフの遷移先がスコープになった ViewModel が Hilt から提供され、それを取得できます。詳しくは、こちらのドキュメントをご覧ください。
Don Turner が、Android のオーディオ レイテンシの改善と、それがリアルタイム オーディオ アプリに与える影響について解説しています。このブログ記事では、エコシステムでの変更内容と今後の計画、そして Oboe ライブラリを使って低レイテンシ オーディオ アプリを構築する方法を取り上げています。
Jetpack Compose は、常にユーザーを念頭に置いて開発されています。一番のユーザーは、デベロッパーの皆さんです。Android Studio の Compose プレビュー機能がどのように設計され、さまざまな UX の研究がそのデザインや機能にどのような影響を与えたのか、Preethi Srinivas と Paris Hsu がこちらのブログ記事(英語)で解説しています。
Wear OS Tiles が刷新されました。まだアルファ版ですが、カスタムタイルを作成できる新しい Jetpack Tiles ライブラリをリリースしました。Wear OS でタイルを使うと、アプリを開かずに情報やアクションにすばやくアクセスできます。なお、対応する Wear OS プラットフォームのアップデートが今春にロールアウトされた後、ユーザーはカスタムタイルを利用できるようになります。
Jetpack Compose チームが API ガイドラインを公開しました。Jetpack Compose API を使いこなすためのパターンやベスト プラクティス、スタイルのガイドラインがまとまっています。このガイドは Compose らしいコードを書くために参考になりますので、ぜひご確認ください。Compose API 全体の背景にある考え方を詳しく知りたい方もご一読ください。
Caren Chang と私が、Android でコルーチンを使う方法についてリアルタイム セッションで解説しました。コルーチンのドキュメントや基本の Codelab をご紹介しつつ、チャットで寄せられる質問に回答しました。
コルーチンについての学習をスタートする方は、Android Studio にアクセスし、この動画を見ながらコーディングしてみましょう。
数週間前に Jetpack Compose がベータ版になり、デベロッパー チャレンジが始まりました。その結果、1 週目には子犬の里親探しアプリが、2 週目にはカウントダウン タイマーがインターネットにあふれました。続いて 3 週目はスピード勝負、最終週の第 4 週はお天気アプリの課題にチャレンジしていただきました。
参加する時間がなかった方も、このチャレンジを活用して、ご自分のペースで Compose を試してみてください。
前回の Now in Android 以降、Android Developers Backstage に新しいエピソードが投稿されています 。以下のリンクまたはお気に入りのポッドキャスト クライアントでご確認ください。
ADB 158: Jetpack Compose… C’est bêta !
Chet Haase、Romain Guy、Tor Norbye が、Jetpack Compose チームから 4 名のゲスト Nick Butcher、Clara Bayarri、Leland Richardson、Adam Powell と「Compose がベータ版になったこと」の意味、コルーチン、マテリアル デザインの実装、ConstraintLayout などの Jetpack が提供する機能について話を聞きました。
今回は以上です。次回も Android デベロッパーの世界の最新アップデートをお届けします。お楽しみに。
この記事は Jolanda Verhoef による Android Developers Blog の記事 "Creating custom Tiles on Wear OS by Google with the Jetpack Tiles library" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
Wear OS by Google スマートウォッチのタイルは、2019 年に導入されてから、特に便利で有用な機能になっています。タイルは高速にアクセスでき、使い勝手が良く、手首から必要な情報や作業にスワイプでアクセスできるように設計されています。さらに、ユーザーは確認したい情報やアクションを自由に操作できます。
2021 年 3 月 12 日(日本時間 3 月 13 日)に、Jetpack Tiles ライブラリがアルファ版になったことをお知らせします。このライブラリを使うと、デベロッパーは Wear OS スマートウォッチでカスタムタイルを作成できます。なお、対応する Wear OS プラットフォームのアップデートが今春にロールアウトされた後、ユーザーはカスタムタイルを利用できるようになります。
タイルは、日々の活動の進捗状況をトラッキングする、すばやくワークアウトを始める、最近聴いた曲を再生する、お気に入りの連絡先にメッセージを送信するなど、たくさんのユースケースに利用できます。アプリが没入的な体験を提供できる一方、タイルは高速に読み込めるので、ユーザーはすぐに行いたいことに集中できます。ユーザーがさらに情報を必要としているなら、タイルをタップしてスマートウォッチやスマートフォンで関連するアプリを開き、細かい処理を行うことができます。
タイルは Wear OS アプリの一部として、Android Studio で作成できます。最初に Wear OS Tiles への依存関係を追加します。
dependencies { implementation "androidx.wear:wear-tiles:1.0.0-alpha01" debugImplementation "androidx.wear:wear-tiles-renderer:1.0.0-alpha01" }
1 つ目の依存関係には、タイルの作成に必要なライブラリが含まれています。2 つ目の依存関係は、アクティビティでタイルをプレビューするためのものです。
次に、TileProviderService を使ってタイルの表示に必要な情報を提供します。
TileProviderService
class MyTileService : TileProviderService() { override fun onTileRequest(requestParams: RequestReaders.TileRequest) = Futures.immediateFuture(Tile.builder() .setResourcesVersion("1") .setTimeline(Timeline.builder().addTimelineEntry( // For more information about timelines, see the docs TimelineEntry.builder().setLayout( Layout.builder().setRoot( Text.builder().setText("Hello world!") ) ) ) ).build()) override fun onResourcesRequest(requestParams: ResourcesRequest) = Futures.immediateFuture(Resources.builder() .setVersion("1") .build() ) }
このコードには、重要な部分が 2 つあります。
onTileRequest()
TimelineEntry
onResourcesRequest()
タイルをプレビューするには、簡単なアクティビティを作成します。このアクティビティは、デバッグおよびプレビューのみに利用するので、src/main ではなく、src/debug に追加します。
src/main
src/debug
class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val rootLayout = findViewById<FrameLayout>(R.id.tile_container) TileManager( context = this, component = ComponentName(this, MyTileService::class.java), parentView = rootLayout ).create() } }
以上でタイルを公開する準備が整います。さらに詳しい手順を知りたい方や、タイルについてのさらに詳しい情報を確認するには、新しいガイドと、サンプルタイルの実例をご覧ください。
Jetpack Tiles ライブラリはアルファ版なので、API を改善するためのフィードバックをお待ちしています。それでは、コーディングをお楽しみください。
Reviewed by Yuichi Araki - Developer Relations Team and Tamao Imura - Developer Marketing Manager, Platforms and Ecosystems
この記事は Ashnil Dixit による Android Developers Medium の記事 "Collaborating with local payment partners to drive awareness and conversion" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
昨年、1 ドル未満の価格や現地価格に対する効率的なアプローチを探す上で役立つヒントについてのブログ記事(英語) を公開しました。今年は、インドと東南アジアでユーザーのコンバージョンを推進するベスト プラクティスについて、記事とケーススタディから成る 4 部構成のシリーズを連載します。今回はその 1 回目です。
Google Play を使うと、ユーザーは Play Billing が提供するさまざまな決済方法(クレジットカード、携帯通信会社の課金、Google Play ギフトカードなど)を選択できるようになります。その中には、インドの UPI、タイの TrueMoney、インドネシアの GoPay など、現地特有の決済方法も多く含まれています。
しかし、最近の調査(Google Consumer Survey、Ipsos 2020)によると、大半のユーザーは現地特有の決済方法が使用できるということに気づいていません。この点は、ユーザーを課金ユーザーにコンバージョンする上で障壁になる可能性があります。
現地のエコシステム パートナーは、巨大な取引ユーザーを保持しています。そのため、ゲームのリリースや主要な LiveOps(ゲーム内イベント) のタイミングにおいて、非常に魅力的な共同マーケティング パートナーになります。こういった現地エコシステム パートナーと連携することで、ゲームの認知度を上げて高品質なユーザーを獲得できる可能性があります。
通常、決済パートナーは、さまざまなチャンネル(アプリ内およびオンライン メディア)を通してゲームの特典や LiveOps(ゲーム内イベント)、リリースをプロモーションするため、デベロッパーが新しいユーザーを獲得する上で役立ちます。
現地の決済パートナーと共同でマーケティングやキャンペーンを行うことで、デベロッパーの初回購入者数、合計消費額、インストール数などが増加します。
インドや東南アジアで支払者へのコンバージョンを推進する上で、デベロッパーができることはたくさんあります。現地の決済パートナーとのコラボレーションもその戦略の 1 つです。決済パートナーは大規模な取引ユーザーのベースを保持しているので、ここぞというタイミングでプロモーション効果を増幅させ、認知度を高めて、支払者へのコンバージョンを推進する上で役立ちます。これらの地域でビジネスの拡大を検討している方は、コラボレーションの機会を探してみるのもいいかもしれません。
さらに詳しい情報は、アプリ開発を成功させるためのアカデミーのゲームビジネス基礎コースで提供しています。価格の差別化やモバイルゲーム製品に関するレッスンをご覧ください。
この記事のインフォグラフィック版は、簡単に共有できます。こちらからご覧ください。
Reviewed by Hidenori Fujii - Google Play Developer Marketing APAC
先月は、Android の次期バージョンの初期プレビューとして、Android 12 デベロッパー プレビューを公開しました。今月、2021 年 3 月 17 日(日本時間 3 月 18 日)に Android 12 デベロッパー プレビュー 2 をリリースしました。このビルドでは、アプリでテストできる新機能や変更点がさらに追加されています。
初期 プレビュー プログラムは、オープン性とコミュニティの皆さんとのコラボレーションで改善を行う、私たちの中核的な理念に基づいて進められています。皆さんから寄せられた情報を元に、Android をデベロッパーやユーザーにとって、よりよいプラットフォームにするために引き続き開発していきます。ぜひ今後もフィードバックをお寄せください。
Android 12 では、プライバシーとセキュリティを中核に据え、OS をよりスマートにし、使いやすさとパフォーマンスを向上させることを目指しています。また、ユーザーがスマートフォン、ノートパソコン、タブレット、TV、自動車のどれを使っていてもすばらしい体験を提供できるように、新しいツールの開発も進めています。デベロッパー プレビュー 2 で注目すべき機能は、新しい角丸画面 API、ピクチャー イン ピクチャー API の改善、コンパニオン デバイス管理の改善、ぼかしや色フィルタなどのエフェクトの使い勝手の向上、アプリ オーバーレイ コントロールなどです。
デベロッパー プレビュー 2 には、注目すべき機能がたくさん含まれています。ここでは、そのいくつかをご紹介します。詳しい情報を確認したい方や Pixel にダウンロードしたい方は、Android 12 デベロッパー ウェブサイトをご覧ください。既にデベロッパー プレビュー 1 または 1.1 を実行している方は、無線(OTA)アップデートで最新のリリース データを受信することもできます。
私たちは、デバイスやデータを安全に保ちつつ、ユーザーにとっての透明性と制御を向上させることに注力し続けています。このリリースでは、実際に確認してアプリでテストできる新機能をいくつか追加しました。
上記の詳細やその他のプライバシーやセキュリティの変更点については、こちらをご覧ください。
view.setRenderEffect(RenderEffect.createBlurEffect(radiusX, radiusY, SHADER_TILE_MODE))
新しいバージョンのプラットフォームをロールアウトするにあたって、アプリの互換性を優先し、迅速かつスムーズにアップデートできるように作業を行っています。皆さんが Android 12 に対応する時間を長くとれるように、Android 12 ではアプリに関連する変更のほとんどがオプトイン方式になっています。また、短時間で対応できるように、ツールやプロセスをアップデートしています。
リリースに一歩近づいたデベロッパー プレビュー 2 では、全般的な安定性を改善する作業を続けています。今が新機能や変更点をテストする良いタイミングです。特に、API に関するご意見や、プラットフォームの変更点がアプリに与える影響に関する詳しいフィードバックをお待ちしています。フィードバック ページから、問題の報告をお願いします。
また、今は互換性テストを行って必要な作業を洗い出し始めるべきタイミングでもあります。Android 12 Beta 1 までに互換性のあるアップデートをリリースできるように、早めにこの作業を開始することを推奨しています。現時点では、アプリの targetSdkVersion を変更する必要はありませんが、動作の変更点の切り替えを使うと作業がスムーズに行なえます。Android 12 の変更点をオプトインすることで、アプリがどのような影響を受ける可能性があるかについての予備知識を得ることができます。
2021 年 8 月に Platform Stability に到達すると、アプリに関連するすべてのシステム動作、SDK/NDK API、非 SDK リストが確定します。このタイミングで最終的な互換性テストを終え、完全に互換性があるバージョンのアプリ、SDK、ライブラリをリリースできます。デベロッパー向けのタイムラインの詳細は、こちらをご覧ください。
このデベロッパー プレビューには、Android 12 の機能を確認し、アプリをテストしてフィードバックを私達にお送りいただくために必要なすべてのものが含まれています。Pixel 3 / 3 XL、Pixel 3a / 3a XL、Pixel 4 / 4 XL、Pixel 4a / 4a 5G、Pixel 5 のシステム イメージへダウンロードすると、すぐに利用を開始できます。Pixel デバイスをお持ちでない方は、Android Studio で 64 ビット システム イメージと Android Emulator を使うことができます。
今回のリリースでは、Android TV でアプリをテストしたり、まったく新しい Google TV エクスペリエンスを試したりすることもできます。詳細はこちらをご覧ください。開発を始めるには、ADT-3 デベロッパー キットを利用します。
開発に必要な詳細情報一式は、Android 12 デベロッパー ウェブサイトでご覧いただけます。
この記事は Chet Haase による Android Developers - Medium の記事 "Now in Android #35" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
Android 開発の最新ニュースやトピックをご紹介する Now in Android。今回は Jetpack Compose ベータ版、#AndroidDevChallenge、Android 12、WorkManager、Android for Cars ライブラリ、RecyclerView、コルーチン、最新のポッドキャスト エピソードなどをご紹介します。
公開です!ついに公開です!Jetpack Compose が 2 月 24 日(日本時間 2 月 24 日)にベータ版としてリリースされました!このリリースを祝して、#TheAndroidShow を開催しました。Jetpack Compose の機能概要とライブ Q&A、そしてデモを通して、この新しいツールのリリースがなぜ待ち望まれていたのか理由をご紹介します。
日本語字幕に対応しています。ぜひ日本語に切り替えてご覧ください。
Jetpack Compose は未来の Android 向け UI ツールキットで、ネイティブ Android アプリを短時間で簡単に作成できるように設計されています。このライブラリの作業は、2019 年の Google I/O で Compose を発表して以来、オープンソースで進めてきました。昨年 8 月にアルファ版のマイルストーンに到達したばかりですが、2 月 24 日にベータ版になりました。
ベータ版は大きな成果で、プロダクトの安定化を継続するために必要な API が安定版であることを示しています。 Compose に関する多数の情報が既に公開されています。使い方を学び、今年中に 1.0 が完成したときにアプリで利用できる準備を整えるためにご活用ください。
まずは、こちらのブログ記事をご確認ください。Jetpack Compose に関するあらゆる情報や、詳しく学習する際に役立つ関連情報へのリンクが掲載されています。
また、Jetpack Compose のさまざまな機能の使い方を説明した動画とスクリーンキャストもまとめてあります。
もちろん、実際にコードを触ってみることもできます。サンプルや新しい学習 Pathway の Codelab も更新されているので、忘れずにご覧ください。
さらに、デベロッパー サイトにアクセスすると、アップデートされた最新のドキュメントを確認できます。Jetpack Compose を使い始める方法など、あらゆる情報へのリンクが掲載されています。
Android の歴史は、1.0 リリース 1 年前 の 2007 年に開催した、デベロッパー チャレンジによって始まりました。ですので、 Android 開発の世界にクールな新機能が登場するとき、その様なチャレンジが企画されることは別に不思議なことではないでしょう。
そして、Jetpack Compose がベータ版になった今こそ、もう一度チャレンジを開催すべきだと考えました。今回は、4 週間にわたって毎週 1 回ずつチャレンジを実施し、Pixel 5 を含む 1000 個以上の賞品をご用意しました。詳しくは、初回のブログ記事や 第 2 週のチャレンジ以降のブログ記事、そして#AndroidDevChallenge の ウェブサイトをご覧ください。そして、ぜひこれからも Compose でコードを書いてみてください!
またこの季節がやってきました。桜の花が咲き始め、少しずつ暖かくなり、カリフォルニアは 11 月まで雨が降らなくなります。そして、次期バージョン Android 最初のデベロッパー プレビュー をリリースしました!
今回のリリースの概要はブログ記事(日本語)に掲載されています。プライバシーやセキュリティの向上、メディアのトランスコードや AVIF イメージのサポートといったグラフィック機能など、さまざまな内容が含まれています。
さらに、Android 12 プレビュー サイトでは、動作の変更点、新機能と新しい API などを詳しく説明しています。最も重要なことは、新しいリリースで皆さんのアプリを試し、何か問題があればフィードバックを送っていただくことです。早い段階でプレビューをリリースする意味のすべてはそこにあり、最終プロダクトの公開までに完成度を上げることが目的です。
もちろん今回のリリースは、最終リリースに向けてこの先も多くの段階が待ち受ける中、第 1 歩を踏み出したに過ぎません。今後もリリースを重ねて、機能や修正の数を増やしていきますので、ご期待ください。
Android 12 は最終リリースに向かって進行中、今後のリリースに注目
今週より、MAD Skills で次のミニシリーズが始まり、Ben Weiss がその概要についてお話ししています。
WorkManager の基本: 最初の技術コンテンツとなるこのエピソードでは、Caren Chang が WorkManager の基本について解説しています。ここでは、WorkManager を使って画像をぼかす例を紹介します。コードは、WorkManager Codelab から確認できます。
新しい API Android for Cars App Library が登場します。現在はベータ版で、クローズド ソースの com.google.android.libraries.car.app の機能が元になっていますが、現在はオープンソースとして AndroidX で利用できます。
この API を使うと、Android Auto で動作するナビゲーション、駐車場、充電スポットのアプリを開発できます。ドライバー ディストラクション基準を満たし、画面フォーム ファクタや入力の違いなどの細かい点に対応してくれるテンプレートが提供されるので、開発が簡単になります。
ブログ記事(英語)と、ガイドを確認し、ライブラリを使って新しいアプリ体験を実現しましょう。
RecyclerView を扱う連載シリーズの最終回として、Meghan Mehta が ConcatAdapter を使って RecyclerView のヘッダーを実装する方法を解説します。
マルチスレッド プログラミングは厄介かもしれませんが、正しく行うことが重要です。Kotlin デベロッパーには、同時実行コードを簡単に書く方法として、コルーチンの使用をお勧めします。ただし、コルーチンを初めて使う方や、コルーチンを正しく効果的に使う方法についてアドバイスがほしい方は、こちらの新しいドキュメントをご覧ください。
新しいガイドに Kotlin のコルーチンで開発するためのベスト プラクティスをまとめました。
前回の Now in Android 以降、Android Developers Backstage にいくつかのエピソードが投稿されています。以下のリンクまたはお気に入りのポッドキャスト クライアントでご確認ください。
私は歴史にまつわる ADB エピソードが大好きです。なぜそのような仕組みになっているのかという深い謎に包まれた秘密に迫ることができるからです。今回は、Tor と Romain と私が、1.0 が登場するかなり前という初期の Android チームに関わっていたエンジニアの 1 人、Dan Bornstein に話を聞きました。Dan は、現在の Android Runtime(ART)の前身となる Dalvik ランタイムの作成に携わったメンバーです。Dalvik におけるいくつかの設計上の決断のほか、ランタイム、ガベージ コレクタ、パフォーマンスなど、ありとあらゆるテクノロジーに関するトークが登場します。
皆さんのお声をお待ちしています。今回は、Tor Norbye と Romain Guy と私が、Android Developers Backstage を改善するためにできること、またはしないことについて話します。
アンケートフォームから皆さんのご意見、ご感想をお知らせください。
Reviewed by Yuichi Araki - Developer Relations Team and Hidenori Fujii - Google Play Developer Marketing APAC
この記事は Manuel Vivo による Android Developers - Medium の記事 "Now in Android #34" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
Android 開発の最新ニュースやトピックをご紹介する Now in Android。今回は MAD Skills のミニシリーズ MotionLayout、マテリアル コンポーネント、KSP、AndroidX、コルーチンとインテントに関する最新のブログ記事・動画・関連ドキュメントなどをご紹介します。
今回の Now in Android は、動画とポッドキャストでもお届けします。内容は同じですが、読む量は少なくて済みます。このブログ記事版には、取り上げているすべてのコンテンツへのリンクが掲載されていますので、ぜひご覧ください。
MotionLayout についてのミニシリーズが終わりを迎えつつあります。4 回目のエピソードでは、Sean McQuillan が Motion Layout を使って折りたたみ可能なツールバーを作る方法について説明します。このようなツールバーは、この API が大活躍してくれる場所の 1 つです。MotionLayout を使ってカスタム属性をアニメーションさせる方法も習得できます。
最後のエピソードでは、デベロッパー リレーションズ チームとエンジニアリング チームからモーション レイアウトのエキスパートが参加し、リアルタイム Q&A を開催しました。
これまでのエピソードを見逃してしまった方は、MAD Skills ミニシリーズ MotionLayout のプレイリストをチェックしておきましょう。
material-components-android ライブラリの安定版として、バージョン 1.3.0 がリリースされました。MaterialTimePicker や ProgressIndicator などの新しいマテリアル コンポーネントが含まれています。その他、ダイアログなどのコンポーネント内の文字列の国際化とローカライズ、BadgeUtils クラスのパブリックへの公開も行われています。
すべての変更点は、リリースノートでご覧ください。
Kotlin で軽量コンパイラ プラグインを作成するツール、Kotlin Symbol Processing(KSP)がアルファ版になりました。アノテーション プロセッサに詳しい方向けに説明すると、KSP は KAPT に似たような機能を提供します。しかし、最大 2 倍高速で、Kotlin マルチプラットフォームを念頭において開発されています。
アノテーション処理を使っているライブラリ作成者の方は、ライブラリを KSP 互換にする方法に関するブログ記事をご覧ください。
さまざまな AndroidX ライブラリでたくさんの最新増分リリースが公開されています。また、以下の安定版リリースが含まれています。
安定版リリース以外では、Paging 3 が最初のベータ版リリースに到達しています。これは注目に値します。Paging 3 は、土台からコルーチンに対応している Kotlin を使って、大きく書き換えられています。この API は、beta01 で API 安定版に到達しました。
私は、コルーチンが Android ランタイムで実際にどのように実行されているのかを解説するブログ記事(英語)を投稿しました。Android のコルーチンは Java プログラミング言語で定義されているスレッドモデルを使うので、コードの同時実行の問題に注意する必要があります。
プライバシーは Android の最優先事項であり続けています。ユーザーの個人データの保護や、アプリがそのデータを使う際の透明性は、ますます重要になっているからです。Fred Chung の動画では、ユーザーの目に見える変更点もいくつか取り上げていますが、主にデベロッパーを対象に、新しい API、動作の変更、テストについて解説しています。1 回だけのアクセス許可オプションなどのアクセス許可の変更、ストレージ、パッケージの公開設定、個人データへのアクセスを特定する際に役立つツールなどをご紹介しています。
Nicole Borrelli が、アプリ内コールバックを実装する際に Intent ではなく PendingIntent を使うべき理由について説明しているブログ記事(英語)を投稿しました。PendingIntent を使わないと、アプリに脆弱性が残る可能性があります。
アプリの品質は、すべての人にとって重要です。Android Developers の ウェブサイトにアプリの品質セクションを新たに設けて、アプリの品質についての重要な最新情報や、高品質を実現して維持する際に役立つ情報を提供しています。アプリの中核品質チェックリストは、視覚的な体験、機能、パフォーマンスと安定性、プライバシーとセキュリティ、Google Play という観点でアプリを評価する参考になります。ユーザーから期待される水準を満たすため、このリストをデザインチームや QA チームと共有することもおすすめします。
今後は、このリストを定期的に更新して最新の状態を保つとともに、タブレットや WearOS などの他のフォーム ファクタにも拡大していく予定です。
アプリの品質については、こちらのブログ記事も併せてご覧ください。
私たちは、Android 開発をさらに多くの人に広めたいと考えています。そこで、Android 開発の教育者向けに、Kotlin による Android 開発の新しいカリキュラムを公開しました。講義のスライドから、ハンズオンの Codelab まで、必要なものをすべて含むたくさんの素材がそろっています。
グループで学びたい方のために、すべてのデベロッパーに Android Study Jams プログラムを公開しました。このコンテンツを使うと、グループのメンバーがオンライン カリキュラムを通して、好きなペースで一緒に Android を学ぶことができます。
この記事は Jolanda Verhoef による Android Developers Blog の記事 "Android Dev Challenge Finale: Weather app" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
#AndroidDevChallenge の最終週は、皆さんの創造性を輝かせましょう!先週はスピードの勝負でしたが、最終週となる今回で全力を出し切ってください。
UI はすべて Compose で構築する必要があります。気象データはダミーのもので構いません。提出するアプリは、最低でも英語をサポートする必要があります。
皆さんの作品は、以下の 4 つのカテゴリに基づいて審査します。
レイアウト、テーマ、グラフィックに関する Compose ドキュメントを確認し、美しいデザインの実装の参考にしてみましょう。アニメーションやジェスチャーの斬新な使用法も考えてみてください。コードの質は、アーキテクチャとテストによって改善できます。また、動作全般については、ユーザー補助機能を忘れずに確認するようにしましょう。
回答は、パブリック GitHub リポジトリで実装する必要があります。Github リポジトリ テンプレートのコピーを作成し、README の手順に従ってください。テンプレートには、Compose による基本的な Hello World! と継続的インテグレーション設定が含まれています。
Hello World!
※1 応募に関する詳細は必ず公式ルールをご確認ください。
今週も究極の 5G Google スマートフォン、Google Pixel 5 を獲得するチャンスです!4 つのカテゴリそれぞれの勝者と、最も優秀な作品に、Google Pixel 5 を進呈します。
Jetpack Compose の中核はデベロッパー コミュニティです。プロダクトをさらに使いやすく改善するために、皆さんのフィードバックをお寄せください。
この記事は Neethi Thomas、Dafna Gal、Ashnil Dixit による Android Developers Blog の記事 "Sub-dollar pricing expansion in 20 markets" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
Google Play では、Android デベロッパーがアプリやゲームをできる限り広いマーケットに提供できるようにするために継続して対応を行ってきました。既に 165 以上のマーケットで無料と有料のアプリをサポートし、インドやブラジルなどの 20 のマーケットで、デベロッパーが設定できるプロダクトの最低価格を引き下げてきました。
このたび、2021 年 3 月 4 日(日本時間 3 月 5 日)に、新たにラテンアメリカ、ヨーロッパ、中東、アフリカ、アジア太平洋地域の 20 のマーケットでプロダクトの最低価格制限を引き下げたことをお知らせします。
この新しい下限額により、ほとんどの対象マーケットで 10-30 米セント相当の価格を設定できるようになります。この超低価格帯、すなわち「1 ドル未満」の価格設定を利用し、現地の購買力や需要を踏まえて価格を調整することで、新たな潜在購買層へのアプローチが可能になります。また、グローバルな価格戦略を柔軟に設定できるようになり、アプリやゲームで多くのユーザーを収益につなげるチャンスにもなります。
以下の新しいマーケットで、有料アプリ、アプリ内アイテム、定期購入の最低価格制限が引き下げられています。
バングラデシュ、ブルガリア、ボリビア、コスタリカ、チェコ共和国、デンマーク、クロアチア、ハンガリー、ヨルダン、カザフスタン、レバノン、スリランカ、ミャンマー、パキスタン、パラグアイ、ルーマニア、セルビア、タイ、タンザニア、ベトナム
これに加えて、以下のマーケットではすでに 1 ドル未満の価格設定が利用できます。
ブラジル、チリ、コロンビア、エジプト、インド、インドネシア、マレーシア、メキシコ、ナイジェリア、ペルー、フィリピン、ポーランド、ロシア、サウジアラビア、南アフリカ、トルコ、ウクライナ
Google Play Console で価格を調整する方法については、ヘルプセンターの記事をご覧ください。すべての価格帯が記載されたリストは、こちらからご覧ください。
2015 年にこの機能が導入されてから、Android デベロッパーは 1 ドル未満の価格設定を活用して、有料ユーザー数を拡大してきました。ここでは、1 ドル未満の価格設定を利用してビジネスを成長させる方法をいくつか紹介します。
期間限定の宣伝を行う:1 ドル未満の価格設定は、マーケティング活動によって新しいユーザーを獲得したり、低価格商品で熱心なユーザーに特典を提供するために活用できるツールです。たとえば、人気ゲーム Lords Mobile のデベロッパー IGG は、有料ユーザーのコンバージョンを増やすため、期間限定で 2-3 倍の価値があるスペシャル バンドルをわずか 3000 インドネシア ルピア(0.20 米ドル)で提供することがあります。これはスペシャル オファーなので、通常の売上を減らすことなく、支払者のベースを拡大できます。
シーズンごとの特典を提供する:1 ドル未満の価格設定は、シーズンごとの有償特典を提供するにも効果的です。ユーザーはこのようなアイテムを購入できる期間が限られていることを知っていなすので、さらに魅力を感じます。これを低価格設定と組み合わせることで、初回購入者にとっての魅力を高めることができます。Moonton は、Mobile Legends でそのシーズンで初めて購入を行ったユーザーに、レアなスキンを提供し、これは 1 ドル未満の購入の場合にも適用されます。
お試し価格を提供する:1 ドル未満の価格設定は、お試し価格で新しい有料ユーザーを惹きつけるために使うこともできます。たとえば、貴重なアイテムを購入したことがないユーザーに、1 ドル未満の価格を提示できます。先にも触れたデベロッパーの Moonton は Mobile Legends: Bang Bang で最初の購入を行ったユーザーが、お試し価格で人気のヒーローにアクセスできるようにしています。この戦略は、ゲーム全体の経済に大きな影響を与えることなく、新しい有料ユーザーにアプローチすることを可能にしています。
熱心なユーザーに特典を提供する:1 ドル未満の価格設定と、購入イベントの繰り返しを組み合わせて活用することもできます。たとえば、7 日間毎日購入したユーザーに特別なボーナスを提供し、ユーザーが納得できる購入額を超えないようにすることができます。
ガチャを提供する:1 ドル未満の価格設定は、チャンスベースのアイテム、たとえば「ガチャ」とも相性がよく、新規ユーザーへ効果的にアピールできます。価値のあるゲーム内アイテムを 5 ドルだと購入しないユーザーでも、0.15 ドルなら、中のアイテムが欲しくて宝箱を開けてくれるかもしれません。1 ドル未満の価格でガチャを提供すれば、多くのユーザーが運試しのために支払いをしてくれる可能性があります。
アプリやゲームの提供地域に合わせた 1 ドル未満の価格設定を活用する方法はたくさんあります。これらのベスト プラクティスは、あくまで一例です。皆さんのビジネスの拡大にこの機能をご活用ください。