機能と API の概要

Android 13 では、デベロッパー向けに優れた新しい機能と API が導入されました。下記のセクションで、アプリ向けの機能について確認し、関連する API を使ってみることができます。

新しい API、変更された API、削除された API の一覧については、API 差分レポートをご覧ください。新しい API について詳しくは、Android API リファレンスをご覧ください。新しい API は、見つけやすいようにハイライト表示されています。また、プラットフォームの変更がアプリに影響する領域については、Android 13 の動作変更(Android 13 をターゲットとするアプリの場合とすべてのアプリの場合)をご確認ください。

デベロッパーの生産性とツール

テーマ別アプリアイコン

ユーザーがテーマ別アプリアイコンの使用を選択しているところ
Android 13 でテーマ別アプリアイコンの使用を選択しているところ

Android 13 以降では、テーマ別アプリアイコンの使用を選択できます。対応している Android ランチャーで、アプリアイコンの色合いに、ユーザーが選択した壁紙やその他のテーマの色が反映されるようになります。

この機能をサポートする場合は、アプリでアダプティブ アイコンとモノクロのアプリアイコンの両方を用意し、マニフェストの <adaptive-icon> 要素からモノクロのアプリアイコンを参照する必要があります。ユーザーがテーマ別アプリアイコンを有効にして(つまりシステム設定でテーマアイコンの切り替えを有効にして)、ランチャーがこの機能をサポートすると、ユーザーが選択した壁紙とテーマの色から色合いが決定され、それがモノクロのアプリアイコンに適用されます。

次のいずれかに当てはまる場合は、ホーム画面にテーマ別アプリアイコンが表示されず、アダプティブ アイコンまたは標準のアプリアイコンが表示されます。

  • ユーザーがテーマ別アプリアイコンを有効にしていない場合
  • アプリにモノクロのアプリアイコンが用意されていない場合
  • ランチャーがテーマ別アプリアイコンをサポートしていない場合

詳細と設定手順については、アダプティブ アイコンをご覧ください。

アプリ別の言語設定

システム設定でのアプリ別の言語

多言語ユーザーは、多くの場合、特定のアプリに対してシステムに設定した言語(英語など)とは別の言語(オランダ語、中国語、ヒンディー語など)を選択します。Android 13 では、このようなユーザーのエクスペリエンスを改善するために、複数の言語をサポートするアプリ向けに以下の機能を導入しています。

  • システム設定: ユーザーがアプリごとに使用する言語を一元的に選択できる場所。

    アプリはマニフェストで android:localeConfig 属性を宣言して、複数の言語に対応するようにシステムに指示する必要があります。詳しくは、リソース ファイルを作成してアプリのマニフェスト ファイルで宣言する手順をご覧ください。

  • その他の API: LocaleManagersetApplicationLocales() および getApplicationLocales() メソッドといった公開 API を使用すると、アプリは実行時にシステム言語とは異なる言語を設定できます。

    これらの API はシステム設定と自動的に同期されます。そのため、これらの API を使用してカスタムのアプリ内言語選択ツールを作成するアプリでは、言語設定の選択内容にかかわらず、一貫したユーザー エクスペリエンスを提供できます。公開 API を使用すると、ボイラープレート コードの量を減らし、分割 APK をサポートして、アプリの自動バックアップによってアプリレベルの言語設定を保存できるようになります。

    以前の Android バージョンとの下位互換性を維持するため、AndroidX でも等価の API を使用できます。Appcompat 1.6.0-beta01 以降に追加された API を使用することをおすすめします。

複数の言語に対応していないアプリは、これらの変更の影響を受けません。

テキストと言語のサポートを改善

Android 13 では、以下で説明するように、テキストと言語を改善するための機能がいくつか含まれており、より洗練されたエクスペリエンスの提供が可能になっています。

ハイフネーションの高速化

ハイフネーションにより、折り返されたテキストが読みやすくなり、UI の適応性が向上します。Android 13 以降では、ハイフネーションのパフォーマンスが最大 200% 最適化されるため、TextView でレンダリング パフォーマンスにほとんど影響を与えることなくハイフネーションを有効にできるようになります。ハイフネーションを高速化するには、setHyphenationFrequency()fullFast 頻度または normalFast 頻度を使用してください。

テキスト変換 API

日本語や中国語などの言語では、発音を表す文字を入力して語句を検索する方法を使用するため、検索やオートコンプリートが低速になりがちです。Android 13 では、アプリから新しいテキスト変換 API を呼び出せるので、ユーザーは検索する語句をより迅速かつ容易に見つけられます。たとえば、これまで日本語ユーザーは検索の際に次の手順を踏む必要がありました。

  1. 検索する語句(場所やアプリ名)の発音を表すひらがなを入力する
  2. キーボードを使用してひらがなを漢字に変換する
  3. 漢字を使って再度検索する
  4. 最終的に検索結果を取得する

新しいテキスト変換 API を使用すると、日本語ユーザーはひらがなを入力した後、2 と 3 の手順をスキップして、すぐに漢字の検索結果を表示できます。

非ラテン文字の行の高さの改善

Android 13 では、非ラテン文字について言語(タミル語、ビルマ語、テルグ語、チベット語など)ごとに行の高さが調整され、表示が改善されました。新しい行の高さにより、クリッピングが回避され、文字の配置が改善されます。Android 13 をターゲットに設定するだけで、アプリはこの改善を利用できます。この変更は非ラテン文字の UI に影響する可能性があるため、新しい行間隔を使用する際は必ずアプリをテストしてください。

行の高さの調整により、Android 12 ではクリッピングされていた文字(上)が Android 13 では適切に配置され、クリッピングされなくなりました(下)。

日本語テキストの折り返しの改善

Android 13 以降では、日本語アプリをより洗練された読みやすいものにするため、TextView において、文字ではなく文節(自然に読める最小の単語の集まり)やフレーズ単位でテキストを折り返すことができます。この折り返しを利用するには、TextView で android:lineBreakWordStyle="phrase" を使用します。

フレーズ スタイルを有効にした場合(下)と無効にした場合(上)の日本語テキストの折り返し

Unicode ライブラリの更新

Android 13 では、Unicode ICU 70Unicode CLDR 40Unicode 14.0 の最新の改良、修正、変更が追加されています。

主な変更点は次のとおりです。

  • 使用できる翻訳リソースがない場合、英語(カナダ)en‑CA と英語(フィリピン)en‑PH では英語(英国)en‑GB の代わりに英語(米国)en の翻訳リソースを使用します。
  • many 複数形カテゴリが、スペイン語 es、イタリア語 it、ポルトガル語 pt、ポルトガル語(ポルトガル) pt‑PT に導入されました。これは、CLDR v38 で導入されたフランス語と同様に、大きな数に使用されます。

カラーベクター フォント

COLRv1 ベクター絵文字(左)とビットマップ絵文字(右)

Android 13 以降では、COLR バージョン 1(COLRv1)フォントのレンダリング サポートが含まれ、システム絵文字が COLRv1 形式に更新されます。COLRv1 は、どんなサイズでもすばやく鮮明にレンダリングできる非常にコンパクトなフォント形式です。

ほとんどのアプリでは、すべてはシステムによって処理され、COLRv1 は問題なく機能します。ただし、アプリが独自のテキスト レンダリングを実装しており、システムのフォントを使用している場合は、絵文字のレンダリングをテストすることをおすすめします。

COLRv1 について詳しくは、以下のリソースをご覧ください。

クイック設定の配置 API

通知シェードのクイック設定を使うと、アプリのコンテキストから離れることなく、設定の変更や簡単な操作を行えます。カスタムタイルを提供しているアプリの場合、ユーザーがタイルを見つけてクイック設定に追加するのが簡単になります。新しいタイル配置 API を使用すると、アクティブなクイック設定のタイルにカスタムタイルを直接追加するようユーザーに促すことができるようになりました。ユーザーは新しいシステム ダイアログでアプリを離れずにワンタップでタイルを追加できます。クイック設定に移動する必要はありません。

クイック設定にタイルを追加するかどうかをユーザーに尋ねるダイアログ

クリップボードのプレビュー

Android 13 以降では、クリップボードにコンテンツが追加されると、そのことをユーザーが視覚的に確認できるよう、標準のポップアップが表示されます。この新しい通知機能により、次のことが可能になります。

  • コンテンツが正常にコピーされたことをユーザーに知らせる。
  • コピーされたコンテンツのプレビューを表示する。

この機能により、コピー後にアプリに表示されるさまざまな通知が標準化され、ユーザーがクリップボードを細かく制御できるようになります。詳しくは、コピー&ペースト機能のページをご覧ください。

コピー / 貼り付けウィジェット
コンテンツがクリップボードに入ると表示される新しい UI。

予測型「戻る」ジェスチャー

Android 13 では、スマートフォン、大画面デバイス、折りたたみ式デバイスなどの Android デバイス用に、予測型「戻る」ジェスチャーが導入されています。この機能をサポートするには、アプリを更新する必要があります。

詳細については、予測型「戻る」ジェスチャーをサポートするようにアプリを更新するをご覧ください。Codelab を試すこともできます。

Bluetooth LE Audio

Low Energy(LE)オーディオは、Bluetooth クラシックに代わって特定のユースケースへの対応と接続トポロジを実現するために構築されたワイヤレス オーディオです。ユーザーは、友だちや家族と音声を共有して配信したり、情報発信、エンターテイメント、ユーザー補助のための公開ブロードキャストにサブスクリプション登録したりできるようになります。また、バッテリー寿命を損なうことなくハイファイ音声を受信し、Bluetooth クラシックでは不可能だったさまざまなユースケースをシームレスに切り替えることができます。Android 13 以降では、システムに LE オーディオの組み込みサポートが含まれているため、デベロッパーは互換性のあるデバイスでこのような機能を追加料金なしで入手できます。

MIDI 2.0

Android 13 以降では、USB 経由で MIDI 2.0 ハードウェアを接続する機能など、MIDI 2.0 規格のサポートが含まれてます。この規格では、コントローラの解像度の向上、非西洋言語のイントネーションのサポートの改善、音符単位のコントローラを使用した表現力の高いパフォーマンスなど、さまざまな機能が提供されています。

スプラッシュ画面の効率性を改善

Android 13 では、スプラッシュ画面 API のアニメーション スプラッシュ画面の効率が向上しています。

  • アニメーションの持続時間は AnimatedVectorDrawable から直接推定されます。Android 13 より前では、windowSplashScreenAnimationDuration を直接設定する必要がありました。

  • 新しい windowSplashScreenBehavior 属性を使用すると、Android 13 以降では、スプラッシュ画面にアイコンを常に表示するかどうかをより細かく制御できるようになります。

詳細については、スプラッシュ画面をご覧ください。

ART の最適化

Android 13(API レベル 33)以降では、ART によりネイティブ コードとの切り替えが大幅に高速化され、JNI 呼び出しが最大 2.5 倍高速になりました。ランタイム参照処理も、ほとんどブロックしないように再設計され、ジャンクをさらに軽減しています。さらに、Reference.refersTo() 公開 API を使用して、到達不能なオブジェクトをより迅速に再利用できます。また、クラスとメソッドの検索が最適化されるため、インタープリタの速度が向上します。また、ART ではインストール時にバイトコードの検証をより多く実行するため、実行時の検証の費用を回避し、アプリの起動時間を短縮できます。

プライバシーとセキュリティ

コンテキスト登録されたレシーバのエクスポートの安全性の強化

Android 13 では、ランタイム レシーバの安全性を高めるために、登録済みブロードキャスト レシーバをエクスポートしてデバイス上の他のアプリから参照可能にするかどうかをアプリで指定できるようになりました。以前のバージョンの Android では、デバイス上のアプリから動的に登録されたレシーバに保護されていないブロードキャストを送信できるのは、そのレシーバが署名権限によって保護されていない場合に限られていました。

このエクスポート構成は、次のいずれかを行うアプリで使用できます。

写真選択ツール

Android 13(API レベル 33)以降では、写真選択ツールが利用できます。アプリで写真選択ツールを起動すると、メディア ライブラリ全体を表示する権限をアプリに付与するのではなく、ユーザーがアプリと共有する特定の画像や動画(プロフィール写真など)を選択します。これは、ユーザーの写真や動画にアクセスする際に推奨される方法です。

アプリで実行時の権限を宣言する必要がないため、写真選択ツールでのユーザーのプライバシーが強化されます。また、写真選択ツールにより標準化された組み込みの UI が提供されるため、一貫性のあるユーザー エクスペリエンスが得られます。

付近の Wi-Fi デバイスに対する新しい実行時の権限

Android 13(API レベル 33)では、デバイスから付近のアクセス ポイントへの Wi-Fi 接続を管理するアプリ向けに、NEARBY_DEVICES 権限グループに新しい実行時の権限を導入しています。そのようなアプリでは、複数の Wi-Fi API の呼び出しで、新しい権限 NEARBY_WIFI_DEVICES を宣言する必要があります。また、Android 13 以上をターゲットとしている場合は、アプリが Wi-Fi API から物理的な位置情報を取得しない限り、ACCESS_FINE_LOCATION 権限を宣言する必要はありません。

詳しくは、付近の Wi-Fi デバイスに対する権限をご覧ください。

正確なアラームを使用するための新しい権限

Android 13 以降をターゲットとするアプリの場合、アプリに自動的に付与される USE_EXACT_ALARM 権限を使用できます。ただしアプリがこの権限を使用するには、次の条件の少なくとも 1 つを満たす必要があります。

  • 目覚まし時計アプリまたはタイマーアプリである。
  • イベントが近づくと通知を表示するカレンダー アプリである。

正確なアラームを設定する機能がアプリにあるものの、上記のどのケースも満たさない場合は、引き続き SCHEDULE_EXACT_ALARM 権限を宣言し、ユーザーがアプリのアクセスを拒否した場合も想定しておく必要があります。

デベロッパーがダウングレードできる権限

Android 13 以降では、アプリは使用しない実行時の権限へのアクセスを取り消すことができます。この API を使用すると、プライバシー保護を強化する次のようなタスクをアプリで実行できます。

  • 使用しない権限を削除する。
  • 権限に関するベスト プラクティスを遵守し、ユーザーの信頼を高める。アプリ側で予防的に取り消した権限を、ダイアログを使用してユーザーに表示することもできます。

APK 署名スキーム v3.1

Android 13 では、APK 署名スキーム v3.1 のサポートが追加されました。これは、既存の APK 署名スキーム v3 の改良版です。このスキームでは、APK 署名スキーム v3 のローテーションに関する既知の問題の一部が解決されています。特に、v3.1 署名スキームは SDK バージョンのターゲット設定をサポートしているため、プラットフォームの今後のリリースをローテーションの対象にできます。

v3.1 署名スキームでは、12L 以下では認識されないブロック ID が使用されます。したがって、プラットフォームは次のような署名者の動作を適用します。

  • Android 13 以降を搭載したデバイスは、v3.1 ブロック内のローテーションされた署名者を使用する。
  • それより前のバージョンの Android を搭載したデバイスは、ローテーションされた署名者を無視し、代わりに v3.0 ブロック内の元の署名者を使用する。

署名鍵をまだローテーションしていないアプリの場合、追加のアクションは不要です。アプリがローテーションの実行を選択するたびに、システムはデフォルトで v3.1 署名スキームを適用します。

すでにローテーションを実行したアプリで v3.0 署名ブロック内のローテーションされた署名鍵を引き続き使用するには、apksigner の呼び出しを次のように更新する必要があります。

apksigner sign --ks keystore.jks |
  --key key.pk8 --cert cert.x509.pem
  --rotation-min-sdk-version API_LEVEL
  [signer_options] app-name.apk

ここで、API_LEVEL には 32 以下を指定します。

Keystore と KeyMint のエラーレポートの改善

鍵を生成するアプリのために、Keystore と KeyMint により詳細で正確なエラー インジケーターが表示されるようになりました。java.security.ProviderException に例外クラス階層を追加しました。これには、Keystore / KeyMint エラーコード、およびエラーが再試行可能かどうかなど、Android 固有の例外が含まれます。鍵の生成方法を変更し、(署名, 暗号化) を使用して新しい例外をスローすることもできます。改善されたエラーレポートでは、鍵の生成自体に関するレポートだけでなく、鍵生成を再試行するために必要なものも提供されます。

タブレットと大画面のサポート

Android 13 は、Android 12 と 12L の Feature Drop で導入されたタブレット最適化をベースにしています。これには、システム UI の最適化、マルチタスクと互換モードの改善も含まれています。テストの一環として、アプリがタブレットや他の大画面デバイスで最適に表示されることを確認してください。

新機能とテストするべき点について詳しくは、タブレットと大画面のサポートをご覧ください。

グラフィック

プログラム可能なシェーダー

AGSL アニメーション シェーダー(こちらの GLSL シェーダーに修正を加えたもの)

Android 13 以降では、プログラム可能な RuntimeShader オブジェクトのサポートが含まれています。この動作は Android グラフィック シェーディング言語(Android Graphics Shading Language: AGSL)で定義されます。AGSL の構文の多くは GLSL と同じですが、Android レンダリング エンジン内で動作して、Android のキャンバス内の描画と、View コンテンツのフィルタリングをカスタマイズできます。Android 内部では、これらのシェーダーを使用して、波紋効果ぼかしストレッチ オーバースクロールを実装しています。Android 13 以降では、アプリで同様の高度な効果を作成できます。

Choreographer の改善

Android 13 では、ChoreographerASurfaceControl に公開 API メソッドが導入されています。想定されるフレーム タイムラインに関する詳細情報がアプリに提供され、フレームのライフサイクルに関するより多くのコンテキストが SurfaceFlinger に追加されています。前と同様に、アプリは Choreographerコールバックを投稿して、フレーム タイムライン情報を受け取ることができます。Android 13(API レベル 33)では、Choreographer によって想定される複数の表示時間とそれに対応するフレーム期限が返されます。アプリで表示時間を選択し、その後、選択した SurfaceFlinger に通知することができます。そうすると、SurfaceFlinger は予想される表示時間より前にトランザクションの適用や、バッファのラッチを試行することはありません。

アプリが新しい Choreographer メソッドと SurfaceControl メソッドを使用している場合は、Perfetto トレースでアプリのフレーム ライフサイクルを確認できます。

カメラ

HDR 動画キャプチャ

Android 13 以降では、Camera2 API はハイ ダイナミック レンジ(HDR)動画キャプチャをサポートしており、カメラを使用して HDR 動画コンテンツをプレビュー、録画できます。標準ダイナミック レンジ(SDR)と比較して、HDR はより幅広い色に対応し、輝度コンポーネントのダイナミック レンジを拡大します(現在の 100 cd/m2 から 1,000 cd/m2 まで)。これにより、動画の品質が現実の世界に近づき、色彩が豊かになり、明るい部分はより明るく、暗い部分はより暗くなります。

HDR 動画キャプチャについて詳しくは、HDR 動画キャプチャのドキュメントをご覧ください。

メディア

空間オーディオ

空間オーディオとは、メディア コンテンツのサウンドをよりリアルにし、その場にいるかのような没入感のあるオーディオ体験を楽しめる機能です。この機能と統合する方法について詳しくは、空間オーディオのドキュメントをご覧ください。

予測オーディオ ルーティング

メディアアプリがオーディオのルーティング方法を特定できるように、Android 13 では、AudioManager クラスにオーディオ ルート API が導入されています。getAudioDevicesForAttributes() API は、指定したオーディオの再生に使用できるデバイスのリストの取得に、また getDirectProfilesForAttributes() API は、オーディオ ストリームを直接再生できるかどうかの確認に利用できます。これらの API を使用して、オーディオ トラックに最適な AudioFormat を決定します。

ユーザー補助

音声による説明

Android 13(API レベル 33)では、システム規模の新しいユーザー補助設定が導入され、ユーザーがすべてのアプリで音声による説明を有効にできるようになりました。音声による説明は、プレゼンテーション全体が 1 人のナレーターの音声によって進められる付加的なナレーション トラックです。ナレーターは自然な休止を入れながら、画面上の状況を説明します。アプリでは次のコード スニペットのように isAudioDescriptionRequested() を使用してクエリすることで、音声による説明トラックに関するユーザー設定に従うことができます。

Kotlin

private lateinit var accessibilityManager: AccessibilityManager

// In onCreate():
accessibilityManager = getSystemService(AccessibilityManager::class.java)

// Where your media player is initialized
if (accessibilityManager.isAudioDescriptionRequested) {
    // User has requested to enable audio descriptions
}

Java

private AccessibilityManager accessibilityManager;

// In onCreate():
accessibilityManager = getSystemService(AccessibilityManager.class);

// Where your media player is initialized
if(accessibilityManager.isAudioDescriptionRequested()) {
    // User has requested to enable audio descriptions
}

AccessbilityManager にリスナーを追加することで、ユーザーの設定変更をアプリがモニタリングできます。

Kotlin

private val listener =
    AccessibilityManager.AudioDescriptionRequestedChangeListener { enabled ->
        // Preference changed; reflect its state in your media player
    }

override fun onStart() {
    super.onStart()

    accessibilityManager.addAudioDescriptionRequestedChangeListener(mainExecutor, listener)
}

override fun onStop() {
    super.onStop()

    accessibilityManager.removeAudioDescriptionRequestedChangeListener(listener)
}

Java

private AccessibilityManager.AudioDescriptionRequestedChangeListener listener = enabled -> {
    // Preference changed; reflect its state in your media player
};

@Override
protected void onStart() {
    super.onStart();

    accessibilityManager.addAudioDescriptionRequestedChangeListener(getMainExecutor(), listener);
}

@Override
protected void onStop() {
    super.onStop();

    accessibilityManager.removeAudioDescriptionRequestedChangeListener(listener);
}

コア機能

OpenJDK 11 の更新

Android 13 では、OpenJDK 11 LTS リリースに合わせて Android のコアライブラリを更新する取り組みが開始されています。アプリケーション デベロッパーとプラットフォーム デベロッパー向けのライブラリの更新と Java 11 の言語サポートが含まれます。Android 13 で導入されたコアライブラリの変更は、ART Mainline モジュールへの Google Play システム アップデートを通じて Android 12 デバイス向けにも提供されます。

Android 13 でのコアライブラリの変更には、次のものがあります。

  • ローカル変数、またはパラメータ ラムダとしての var キーワードのサポート。
  • String クラスに追加される以下のメソッド。

    • isBlank()
    • lines()
    • repeat()
    • strip()
    • stripLeading()
    • stripTrailing()
  • コレクションから配列への変換を簡単にする Collection.toArray(IntFunction) のサポート。

  • java.util の各クラス OptionalOptionalDoubleOptionalIntOptionalLong での ifPresentOrElse()isEmpty()orElseThrow()stream() のサポート。

  • ソケットの再利用を含む SocketOptions の拡張サポート。

  • NullReaderNullWriterInputStreamOutputStream、および読み取った文字を Writer に送る transferTo() Reader 機能。

  • Charsets を使った URL エンコードとデコードの機能の追加。

  • FileReaderFileWriterPrintStreamPrintWriterCharset 機能。

  • ByteArrayInput または OutputStreamInput または OutputStream の新しい関数 transferTo()readNBytes()readAllBytes()writeBytes()

  • ランタイムとコンパイラでの java.lang.invoke.VarHandle のサポート。

  • VarHandle を内部で使用した、java.util.concurrent の OpenJDK 11 API への更新。

Java および OpenJDK は、Oracle およびその関連会社の商標または登録商標です。