互換性フレームワークの変更(Android 14)

図 1. 開発者向けオプションの [アプリの互換性の変更] 画面に、切り替え可能な変更のリストが表示されています。

このページでは、Android 14 の互換性フレームワークに含まれている切り替え可能な変更について説明します。Android 14 をサポートし、ターゲットとするアプリのテストとデバッグを行う際は、このリストを開発者向けオプションおよび adb コマンドと組み合わせて使用してください。

以下に、互換性フレームワーク ツールでできることをいくつか示します。

  • アプリの targetSdkVersion を実際には変更せずに、ターゲット固有の変更をテストする。切り替えを使用して、特定のターゲット固有の動作変更を強制的に有効にし、既存のアプリに対する影響を評価できます。
  • 特定の変更にテストを集中させる。切り替えを使用することで、テスト対象以外のターゲット固有の変更をすべて無効にできます。これにより、一度にすべてのターゲット固有の変更に対処する必要がなくなります。
  • adb を介して切り替えを管理する。adb コマンドを使用すると、切り替え可能な変更を自動テスト環境で有効または無効にできます。
  • 標準の変更 ID を使用して迅速にデバッグする。切り替え可能な変更にはそれぞれ一意の ID と名前が付けられており、ログ出力から問題の根本原因を速やかにデバッグできます。

各ユースケースでのツールの使用方法について詳しくは、互換性フレームワーク ツールをご覧ください。

互換性フレームワークに含まれる動作変更

このセクションでは、Android 14 の互換性フレームワークに含まれる切り替え可能な変更について説明します。

変更リストはデフォルトの状態でフィルタできます。

Android 14 の互換性フレームワークの切り替え可能な変更

ACCESS_SHARED_IDENTITY

変更 ID: 259743961
デフォルトの状態: すべてのアプリで有効。

ActivityOptions.setShareIdentityEnabled(boolean)true で呼び出された ActivityOptions のインスタンスでこのアクティビティを起動することにより、アプリが ID の共有を有効にしている場合、または、起動されたアクティビティの uid が起動元アプリの uid と同じ場合、起動元アプリの ID へのアクセス権を付与します。この変更が有効で、これらのいずれかの要件が満たされている場合、アクティビティは、Activity.getLaunchedFromUid() および Activity.getLaunchedFromPackage() を使用して、起動元アプリの uid とパッケージ名にそれぞれアクセスできます。

ALWAYS_SANDBOX_DISPLAY_APIS

変更 ID: 185004937
デフォルトの状態: すべてのアプリで無効。

有効にすると、ウィンドウ処理モードに関係なく、Display API のサンドボックス化がパッケージに適用されます。Display API では常にアプリの境界が設定されます。

この変更について詳しくは、Android 12 の動作変更ページで、サポートが終了した表示メソッドに関するセクションをご覧ください。

AUTHORITY_ACCESS_CHECK_CHANGE_ID

変更 ID: 207133734
デフォルトの状態: Android 14 以上をターゲットとするアプリで有効。

Android 14 以上をターゲットとするアプリの場合、同期に関連するすべての API の呼び出し元 uid について、権限へのアクセスの確認が可能になります。

CAMERA_MIC_INDICATORS_NOT_PRESENT

変更 ID: 162547999
デフォルトの状態: すべてのアプリで無効。

このデバイスがカメラとマイクのインジケーターをサポートすることを示します。変更 ID が存在しない場合、CompatChanges#isChangeEnabled メソッドは true を返すので、存在する場合は false になります。

DETACH_THROWS_ISE_ONLY

変更 ID: 207133734
デフォルトの状態: Android 14 以上をターゲットとするアプリで有効。

#detachImage がスローする正しい例外をゲートで制御するフラグ。

#detachImage がエラー発生時に IllegalStateException をスローすると、文書化されます。これまでは、Image をデタッチする際にサーフェスが放棄されると、これに対応するネイティブ ヘルパー メソッドが RuntimeException をスローしていました。

以前は文書化されていなかったこの例外の動作は、Android 13(API レベル 33)まで継続しています。

Android 13(API レベル 33)より後では、ネイティブ ヘルパー メソッドはドキュメントに従って IllegalStateExceptions のみをスローします。

この変更が有効になっている場合、#detachImage は画像のデタッチ中にエラーが発生した際に IllegalStateException のみをスローします。Android 13(API レベル 33)以下をターゲットとするアプリでは、動作は変更されません。

DOWNSCALED

変更 ID: 168419799
デフォルトの状態: すべてのアプリで無効。

この変更により、アプリごとのバッファのダウンスケーリング変更が管理されます。この変更を無効にすると、以下のスケーリング ファクタは機能しなくなります。

アプリのパッケージでこの変更が有効になっている場合、アプリは、有効になっている最大のスケーリング ファクタに強制的に変更されます。たとえば、80% と 70% の両方が有効になっている場合は 80% が使用されます。

DOWNSCALE_30

変更 ID: 189970040
デフォルトの状態: すべてのアプリで無効。

DOWNSCALED も有効になっている場合、パッケージに対してこの変更を有効にすると、アプリでは実際のディスプレイの垂直解像度と水平解像度が 30% のディスプレイで実行されていると認識されます。

DOWNSCALE_35

変更 ID: 189969749
デフォルトの状態: すべてのアプリで無効。

DOWNSCALED も有効になっている場合、パッケージに対してこの変更を有効にすると、アプリでは実際のディスプレイの垂直解像度と水平解像度が 35% のディスプレイで実行されていると認識されます。

DOWNSCALE_40

変更 ID: 189970038
デフォルトの状態: すべてのアプリで無効。

DOWNSCALED も有効になっている場合、パッケージに対してこの変更を有効にすると、アプリでは実際のディスプレイの垂直解像度と水平解像度が 40% のディスプレイで実行されていると認識されます。

DOWNSCALE_45

変更 ID: 189969782
デフォルトの状態: すべてのアプリで無効。

DOWNSCALED も有効になっている場合、パッケージに対してこの変更を有効にすると、アプリでは実際のディスプレイの垂直解像度と水平解像度が 45% のディスプレイで実行されていると認識されます。

DOWNSCALE_50

変更 ID: 176926741
デフォルトの状態: すべてのアプリで無効。

DOWNSCALED も有効になっている場合、パッケージでこの変更を有効にすると、アプリでは実際のディスプレイの垂直解像度と水平解像度が 50% のディスプレイで実行されていると認識されます。

DOWNSCALE_55

変更 ID: 189970036
デフォルトの状態: すべてのアプリで無効。

DOWNSCALED も有効になっている場合、パッケージに対してこの変更を有効にすると、アプリでは実際のディスプレイの垂直解像度と水平解像度が 55% のディスプレイで実行されていると認識されます。

DOWNSCALE_60

変更 ID: 176926771
デフォルトの状態: すべてのアプリで無効。

DOWNSCALED も有効になっている場合、パッケージでこの変更を有効にすると、アプリでは実際のディスプレイの垂直解像度と水平解像度が 60% のディスプレイで実行されていると認識されます。

DOWNSCALE_65

変更 ID: 189969744
デフォルトの状態: すべてのアプリで無効。

DOWNSCALED も有効になっている場合、パッケージに対してこの変更を有効にすると、アプリでは実際のディスプレイの垂直解像度と水平解像度が 65% のディスプレイで実行されていると認識されます。

DOWNSCALE_70

変更 ID: 176926829
デフォルトの状態: すべてのアプリで無効。

DOWNSCALED も有効になっている場合、パッケージでこの変更を有効にすると、アプリでは実際のディスプレイの垂直解像度と水平解像度が 70% のディスプレイで実行されていると認識されます。

DOWNSCALE_75

変更 ID: 189969779
デフォルトの状態: すべてのアプリで無効。

DOWNSCALED も有効になっている場合、パッケージに対してこの変更を有効にすると、アプリでは実際のディスプレイの垂直解像度と水平解像度が 75% のディスプレイで実行されていると認識されます。

DOWNSCALE_80

変更 ID: 176926753
デフォルトの状態: すべてのアプリで無効。

DOWNSCALED も有効になっている場合、パッケージでこの変更を有効にすると、アプリでは実際のディスプレイの垂直解像度と水平解像度が 80% のディスプレイで実行されていると認識されます。

DOWNSCALE_85

変更 ID: 189969734
デフォルトの状態: すべてのアプリで無効。

DOWNSCALED も有効になっている場合、パッケージに対してこの変更を有効にすると、アプリでは実際のディスプレイの垂直解像度と水平解像度が 85% のディスプレイで実行されていると認識されます。

DOWNSCALE_90

変更 ID: 182811243
デフォルトの状態: すべてのアプリで無効。

DOWNSCALED も有効になっている場合、パッケージに対してこの変更を有効にすると、アプリでは実際のディスプレイの垂直解像度と水平解像度が 90% のディスプレイで実行されていると認識されます。

DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED

変更 ID: 161145287
デフォルトの状態: すべてのアプリで無効。

有効にすると、保護されていないブロードキャストのレシーバをコードで登録する際に Context.RECEIVER_EXPORTED または Context.RECEIVER_NOT_EXPORTED をアプリで明示的に設定する必要があります。

詳しくは、コンテキスト登録されたレシーバのエクスポートの安全性の強化をご覧ください。

ENFORCE_PACKAGE_VISIBILITY_FILTERING

変更 ID: 154726397
デフォルトの状態: Android 14 以上をターゲットとするアプリで有効。

Android 14 以降をターゲットとするアプリの場合、AccountManager API にアクセスするには、アプリのマニフェストでパッケージの公開設定の必要性を宣言する必要があります。

ENFORCE_READ_ONLY_JAVA_DCL

変更 ID: 218865702
デフォルトの状態: Android 14 以上をターゲットとするアプリで有効。

Android 14 以降をターゲットとするアプリの場合、動的に読み込まれるすべてのファイルを読み取り専用としてマークする必要があります。これにより、動的に読み込まれるファイルが悪意のある攻撃者によって予期せず上書きされるのを防ぐことができます。

ENFORCE_STRICT_QUERY_BUILDER

変更 ID: 143231523
デフォルトの状態: すべてのアプリで無効。

有効にすると、SQLiteQueryBuilder はすべての CalendarProvider2 クエリの選択に対し、悪意のある引数がないか検証します。

FGS_TYPE_NONE_DEPRECATION_CHANGE_ID

変更 ID: 254662522
デフォルトの状態: すべてのアプリで無効。

有効にすると、Android 14 以降をターゲットとするアプリで、そのフォアグラウンド サービスのタイプに関連付けられた必要な権限のないフォアグラウンド サービスを開始する場合、SecurityException が発生します。

FORCE_DISABLE_HEVC_SUPPORT

変更 ID: 174227820
デフォルトの状態: すべてのアプリで無効。

アプリの HEVC メディア機能のサポートを強制的に無効にします。アプリは、サポートされているメディア機能をマニフェストで宣言することとされていますが、このフラグを使用すると、アプリの HEVC サポートを強制的に無効にできます。その結果、HEVC でエンコードされたメディアにアクセスする際は、コード変換が強制されます。このフラグを設定すると、アプリの OS レベルのデフォルトがオーバーライドされます。このフラグはデフォルトでは無効です。つまり、OS のデフォルトが優先されます。このフラグと FORCE_ENABLE_HEVC_SUPPORT を設定した状態は定義されていません。その場合、OS は両方のフラグを無視します。

FORCE_ENABLE_HEVC_SUPPORT

変更 ID: 174228127
デフォルトの状態: すべてのアプリで無効。

アプリの HEVC メディア機能のサポートを強制的に有効にします。アプリは、サポートされているメディア機能をマニフェストで宣言することとされていますが、このフラグを使用すると、アプリの HEVC サポートを強制的に有効にできます。その結果、HEVC でエンコードされたメディアにアクセスする際は、コード変換が回避されます。このフラグを設定すると、アプリの OS レベルのデフォルトがオーバーライドされます。このフラグはデフォルトでは無効です。つまり、OS のデフォルトが優先されます。このフラグと FORCE_DISABLE_HEVC_SUPPORT を設定した状態は定義されていません。その場合、OS は両方のフラグを無視します。

FORCE_NON_RESIZE_APP

変更 ID: 181146395
デフォルトの状態: すべてのアプリで無効。

適用されるパッケージを強制的にサイズ変更不可にします。

FORCE_RESIZE_APP

変更 ID: 174042936
デフォルトの状態: すべてのアプリで無効。

適用されるパッケージを強制的にサイズ変更可能にします。これにより全画面表示ウィンドウ モードでのサイズ変更が可能になりますが、アプリを強制的にサイズ変更可能なマルチウィンドウ モードにするものではありません。

GWP_ASAN

変更 ID: 145634846
デフォルトの状態: すべてのアプリで無効。

サンプリングされるネイティブ メモリのバグ検出をアプリで有効にします。

GWP-ASan の使用方法について詳しくは、GWP-ASan ガイドをご覧ください。

IMPLICIT_INTENTS_ONLY_MATCH_EXPORTED_COMPONENTS

変更 ID: 229362273
デフォルトの状態: Android 14 以上をターゲットとするアプリで有効。

Android 14 以降をターゲットとするアプリの場合、暗黙的インテントでコンポーネントを呼び出すには、コンポーネントをエクスポートする必要があります。コンポーネントがエクスポートされず、呼び出されない場合、そのコンポーネントはレシーバのリストから削除されます。これは、特にアクティビティとブロードキャストに適用されます。

KEYSTORE_OPERATION_CREATION_MAY_FAIL

変更 ID: 169897160
デフォルトの状態: すべてのアプリで無効。

有効にすると、キーストア オペレーションの作成が新しいプルーニング戦略に沿って失敗することがあります。以前、キーストアは暗号オペレーションの作成が常に成功するという前提で動作していました。しかし、KeyMint バックエンドのオペレーション スロット数には限りがあります。

オペレーション スロットが「無限」にあるという外観を維持するため、使用可能なオペレーション スロットがない場合、キーストア デーモンは最後に使用されてから最も時間の経ったオペレーションをプルーニングしていました。その結果、良好なオペレーションが途中で終了することがありました。これにより、AndroidKeystore はサービス拒否(DoS)と意図しないライブロックが発生するリスクにさらされました。たとえば、電源管理の最適化により複数のアプリが同時に起動して暗号オペレーションを実行しようとした場合、それらは互いのオペレーションを終了する処理を開始し、進行しなくなります。

ライブロックの解消や DoS の阻止を実現するため、プルーニング戦略が変更され、少数のオペレーション スロットを短時間のみ使用するクライアントが優先されるようになりました。その結果、非アクティブ状態が 5 秒を超えない単一のオペレーションは、ほとんど常にプルーニング戦略によって妨げられることなく完了するようになります。ファイル システムの暗号化に関連するオペレーションの中には、そのようなオペレーションすらプルーニングするものがありますが、そうしたケースは非常にまれです。この新しいプルーニング戦略オペレーションの副作用として、クライアントのプルーニング能力が既存のすべてのオペレーションよりも低い場合、作成が失敗する可能性があります。

プルーニング戦略: 適切な候補を見つけるため、呼び出し元と個々の既存のオペレーションのマルスを計算します。マルスとは、プルーニング能力(呼び出し元)またはプルーニング抵抗力(既存のオペレーション)の逆数です。呼び出し元がオペレーションをプルーニングできるためには、自分よりも高いマルスを持つオペレーションを見つける必要があります。プルーニング戦略について詳しくは、operation.rs の実装をご覧ください。Android 11(API レビュー 30)以下では、KeyStore2 はキーストア デーモンをポーリングして空いているオペレーション スロットを探します。Android 11(API レビュー 30)以下をターゲットとするアプリの場合、暗号と署名のオブジェクトの初期化は常に成功するように見えますが、オペレーションを取得する時間が長くなる可能性があります。すべての Android バージョンで、より公平なオペレーション スロットのスケジューリングが実現され、オペレーションを正常に完了できる可能性が高くなります。

NATIVE_HEAP_ZERO_INIT

変更 ID: 178038272
デフォルトの状態: すべてのアプリで無効。

ネイティブ ヒープのメモリ割り当ての自動ゼロ初期化を有効にします。

NATIVE_MEMTAG_ASYNC

変更 ID: 145772972
デフォルトの状態: すべてのアプリで無効。

このプロセスで非同期(ASYNC)メモリタグのチェックを有効にします。このフラグは、ARM メモリタグ付け拡張機能(MTE)をサポートするハードウェアにのみ影響します。

NATIVE_MEMTAG_SYNC

変更 ID: 177438394
デフォルトの状態: すべてのアプリで無効。

このプロセスで同期(SYNC)メモリタグのチェックを有効にします。このフラグは、ARM メモリタグ付け拡張機能(MTE)をサポートするハードウェアにのみ影響します。NATIVE_MEMTAG_ASYNC とこのオプションの両方を有効にした場合は、このオプションが優先されます。また、MTE が SYNC モードで有効化されます。

NEVER_SANDBOX_DISPLAY_APIS

変更 ID: 184838306
デフォルトの状態: すべてのアプリで無効。

有効にすると、Display API のサンドボックス化がレターボックスまたは SCM アクティビティに適用されなくなります。Display API は、今後も引き続き DisplayArea 境界を提供します。

この変更について詳しくは、Android 12 の動作変更ページで、サポートが終了した表示メソッドに関するセクションをご覧ください。

OVERRIDE_CAMERA_RESIZABLE_AND_SDK_CHECK

変更 ID: 191514214
デフォルトの状態: すべてのアプリで無効。

この変更 ID が有効になっている場合、適用されるパッケージで android:resizeableActivity の現在の値と M 以下のターゲット SDK が無視され、アクティビティはサイズ変更不可と見なされます。この場合、カメラの回転と切り抜きの値は、現在のディスプレイの回転を考慮した必要な補正にのみ依存します。

OVERRIDE_CAMERA_ROTATE_AND_CROP_DEFAULTS

変更 ID: 189229956
デフォルトの状態: すべてのアプリで無効。

この変更 ID が有効になっている場合、適用されるパッケージでデフォルトのカメラの回転と切り抜きの動作がオーバーライドされ、常に CaptureRequest.SCALER_ROTATE_AND_CROP_NONE が返されるようになります。デフォルトの動作と、すべてのオーバーライドの組み合わせを以下の表で説明します。

OVERRIDE_MIN_ASPECT_RATIO

変更 ID: 174042980
デフォルトの状態: すべてのアプリで無効。

この変更により、所定の最小アスペクト比を強制的に適用するすべての変更が管理されます。この変更を有効にすると、以下の最小アスペクト比を適用できます。

アプリのパッケージでこの変更が有効になっている場合、アプリのマニフェストで指定されている最小のアスペクト比が、最大の有効なアスペクト比よりも優先されます(アプリのマニフェスト値の方が大きい場合を除く)。

OVERRIDE_MIN_ASPECT_RATIO_LARGE

変更 ID: 180326787
デフォルトの状態: すべてのアプリで無効。

OVERRIDE_MIN_ASPECT_RATIO も有効になっている場合、パッケージでこの変更を有効にすると、アクティビティの最小のアスペクト比が OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE で定義された高値に設定されます。

OVERRIDE_MIN_ASPECT_RATIO_MEDIUM

変更 ID: 180326845
デフォルトの状態: すべてのアプリで無効。

OVERRIDE_MIN_ASPECT_RATIO も有効になっている場合、パッケージでこの変更を有効にすると、アクティビティの最小アスペクト比が OVERRIDE_MIN_ASPECT_RATIO_MEDIUM_VALUE で定義された中央値に設定されます。

OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY

変更 ID: 203647190
デフォルトの状態: すべてのアプリで有効。

OVERRIDE_MIN_ASPECT_RATIO も有効になっている場合、パッケージでこの変更を有効にすると、画面の向きが縦向きのアクティビティに対する、アクティビティの最小アスペクト比を強制的に特定の値(OVERRIDE_MIN_ASPECT_RATIO_LARGEOVERRIDE_MIN_ASPECT_RATIO_MEDIUM など)にする他の変更が制限されます。

RATE_LIMIT_TOASTS

変更 ID: 174840628
デフォルトの状態: この変更は切り替えができません。互換性フレームワークによってログに記録されるだけです。

Toast.show() 呼び出し数のレート制限を有効にして、限られた時間内の過剰なトーストでユーザーに過度の負荷をかけないようにします。特定の時間枠で許可された数よりも多いトーストを表示しようとすると、トーストは破棄されます。

REQUIRE_NETWORK_CONSTRAINT_FOR_NETWORK_JOB_WORK_ITEMS

変更 ID: 241104082
デフォルトの状態: Android 14 以上をターゲットとするアプリで有効。

Android 14 以降をターゲットとするアプリの場合、付属の JobWorkItem がネットワーク使用状況を示している場合は、ホスティング ジョブでネットワーク制約を指定する必要があります。

THROW_ON_INVALID_DATA_TRANSFER_IMPLEMENTATION

変更 ID: 255371817
デフォルトの状態: Android 14 以上をターゲットとするアプリで有効。

Android 14 以降をターゲットとするアプリの場合、必要な Data Transfer API がすべて適切に実装されていない場合、例外がスローされます。

USE_EXPERIMENTAL_COMPONENT_ALIAS

変更 ID: 196254758
デフォルトの状態: すべてのアプリで無効。

有効にすると、「android」パッケージでコンポーネント エイリアスを使用できるようになります。