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

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

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

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

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

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

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

このセクションでは、Android 12 の最新のデベロッパー プレビュー ビルドの互換性フレームワークに含まれる動作変更のリストを示し、それぞれについて説明します。

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

Android 12 の互換性フレームワークに追加された動作変更

ALLOW_TEST_API_ACCESS

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

@TestApi API へのアクセスをアプリに許可します。

注: この変更はデフォルトでは無効です。プラットフォームのテストコードでのみ使用してください。

ALWAYS_SANDBOX_DISPLAY_APIS

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

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

この変更について詳しくは、Display#getRealSize と getRealMetrics: 非推奨とサンドボックス化をご覧ください。

BLOCK_FLAG_SLIPPERY

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

Android 12 で動作するアプリの場合、アプリ内のウィンドウで FLAG_SLIPPERY が使用されているかどうかを確認します。このフラグは、サポートされていないフィールドであるため、システム コンポーネントによってのみ使用されることを想定しています。その場合は、制限されます。

BLOCK_GPS_STATUS_USAGE

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

Android 12 以上をターゲットとするアプリの場合、GpsStatus API の使用をすべて GnssStatus API に置き換える必要があります。

BLOCK_IMMUTABLE_PENDING_INTENTS

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

Android 12 以上をターゲットとするアプリの場合、位置情報 API に渡される不変の PendingIntent オブジェクトによって IllegalArgumentException. が生成されます。

BLOCK_PENDING_INTENT_SYSTEM_API_USAGE

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

Android 12 以上をターゲットとするアプリの場合、LocationRequest システム API を PendingIntent 位置情報リクエストと一緒に使用することはできません。

BLOCK_UNTRUSTED_TOUCHES

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

システム セキュリティと優れたユーザー エクスペリエンスを維持するため、Android 12 は、オーバーレイが安全でない方法でアプリを覆い隠している場合にタッチイベントをアプリが使用することを許しません。

この変更について詳しくは、信頼できないタッチイベントはブロックされるをご覧ください。

CAMERA_MIC_INDICATORS_NOT_PRESENT

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

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

CHANGE_ID_AUTH_STATE_DENIED

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

Android 12 以上をターゲットとするクライアント アプリの場合、承認が拒否された状態で nanoapp にメッセージを送信しようとすると、SecurityException がスローされます。

CHANGE_ID_SAMPLING_RATE_SENSORS_PERMISSION

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

Android 12 以降をターゲットとするアプリの場合、HIGH_SAMPLING_RATE_SENSORS 権限がなく、デバッグモードで実行し、200 Hz を超えるサンプリング レートをリクエストすると SecurityException がスローされます。

DELIVER_HISTORICAL_LOCATIONS

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

Android 12 以上をターゲットとするアプリの場合、位置情報クライアントは、状況によっては過去の位置情報を受け取ることがあります。

DOWNSCALED

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

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

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

DOWNSCALE_50

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

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

DOWNSCALE_60

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

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

DOWNSCALE_70

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

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

DOWNSCALE_80

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

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

DOWNSCALE_90

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

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

DROP_CLOSE_SYSTEM_DIALOGS

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

アプリとシステムを操作しているときのユーザー制御を改善するため、Android 12 では ACTION_CLOSE_SYSTEM_DIALOGS インテント アクションのサポートが終了しました。

この変更について詳しくは、アプリからシステム ダイアログを閉じるアクションが不可にをご覧ください。

ENABLE_CHECKS_FOR_PRIVATE_FILES

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

Android 12 以上をターゲットとするアプリの場合、メディア プロバイダを使用してプライベート ファイルを挿入または更新することはできません。

ENABLE_DEFERRED_SCAN

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

このオプションを有効にすると、MediaProvider#update() の一部としてトリガーされるスキャンが延期されます。

ENABLE_INCLUDE_ALL_VOLUMES

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

このオプションを有効にすると、最近マウント解除されたボリュームのファイルのデータベース行が MediaProvider#query に追加されます。

ENABLE_RAW_MANAGE_EXTERNAL_STORAGE_ACCESS

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

このオプションを有効にすると、Manifest.permission.MANAGE_EXTERNAL_STORAGE 権限を持つアプリが外部の RAW ストレージへのアクセスをリクエストできるようになります。

変更 ID: 183372781
デフォルトの状態: Android 11(API レベル 30)以上をターゲットとするアプリで有効。

このオプションを有効にすると、android.app.role#SYSTEM_GALLERY ロールを持つアプリが外部の RAW ストレージへのアクセスをリクエストできるようになります。

ENFORCE_NATIVE_SHARED_LIBRARY_DEPENDENCIES

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

Android 12 以上をターゲットとするアプリの場合、AndroidManifest.xmluses-native-library タグを使用してデバイス メーカーが定義した公開ネイティブ共有ライブラリへの依存関係を宣言する必要があります。いずれかの依存関係が満たされない場合(依存関係の 1 つが存在しない場合など)、パッケージ マネージャーはアプリをインストールしません。依存関係は、タグ内の android:required 属性で任意として指定できます。任意として指定した場合、依存関係が満たされなくてもインストールは中止されません。

インストール後、アプリ マニフェストで指定されたネイティブ共有ライブラリのみがアプリに提供されます。アプリ マニフェストにないネイティブ共有ライブラリで dlopen を呼び出した場合、ライブラリが実際にデバイスに存在していても、呼び出しは失敗します。

ENFORCE_STRICT_QUERY_BUILDER

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

Android 12 以上をターゲットとするアプリの場合、SQLiteQueryBuilderCalendarProvider2 クエリのすべての選択で悪意のある引数を確認するようになりました。

FGS_BG_START_USE_EXEMPTION_LIST_CHANGE_ID

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

パッケージで false に設定すると、そのパッケージが ActiveServices.sFgsBgStartExemptedPackages に含まれていても、FGS-BG-start から除外されません

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: 181136395
デフォルトの状態: すべてのアプリで無効。

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

FORCE_RESIZE_APP

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

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

HIDE_PROP_ICUBINARY_DATA_PATH

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

Android 12 以上をターゲットとするアプリの場合、android.icu.impl.ICUBinary.dataPath プロパティへのアクセス権を削除します。

IS_BACKUP_SERVICE_ACTIVE_ENFORCE_PERMISSION_IN_SERVICE

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

Android 12 以上をターゲットとするアプリの場合、isBackupServiceActive() に必要な BACKUP 権限は、クライアント側の BackupManager ではなくサービス側に適用されます。

KEYSTORE_OPERATION_CREATION_MAY_FAIL

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

Android 12 以上をターゲットとするアプリの場合、キーストア オペレーションの作成が失敗することがあります。以前、キーストアは暗号オペレーションの作成が常に成功するという前提で動作していました。しかし、KeyMint バックエンドのオペレーション スロット数には限りがあります。

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

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

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

LOW_POWER_EXCEPTIONS

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

Android 12 以上をターゲットとするアプリでは、呼び出し元が LOCATION_HARDWARE 権限を持っていない場合、低電力としてマークされたすべての LocationRequest オブジェクトは、メッセージを表示せずにリクエストの低電力部分をドロップする代わりに、例外をスローします。

MISSING_EXPORTED_FLAG

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

Android 12 以上をターゲットとするアプリでは、インテント フィルタが定義されている場合、android:exported 属性の値を明示的に指定する必要があります。

この変更について詳しくは、コンポーネントのより安全なエクスポートをご覧ください。

NATIVE_HEAP_ZERO_INIT

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

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

NATIVE_MEMTAG_ASYNC

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

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

NATIVE_MEMTAG_SYNC

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

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

NEVER_SANDBOX_DISPLAY_APIS

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

適用されるパッケージを、レターボックスまたは SCM アクティビティに対して Display API サンドボックス化しないようにします。Display API では、引き続き DisplayArea の境界が提供されます。

この変更について詳しくは、Display#getRealSize と getRealMetrics: 非推奨とサンドボックス化をご覧ください。

NOTIFICATION_CANCELLATION_REASONS

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

通知リスナーが、より具体的な新しいキャンセル理由を理解できるようにします。

NOTIFICATION_TRAMPOLINE_BLOCK

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

アプリのパフォーマンスと UX を改善するため、Android 12 をターゲットとするアプリでは、サービスまたはブロードキャスト レシーバを通知トランポリンとして使用できなくなりました。

この変更について詳しくは、サービスまたはブロードキャスト レシーバからの通知トランポリン作成が不可にをご覧ください。

NULL_TELEPHONY_THROW_NO_CB

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

現在のプロセスのターゲットとする SDK のバージョンが Android 12 以降かどうかを確認するために使用されます。

以下のメソッドに適用されます。

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 で定義された中央値に設定されます。

PENDING_INTENT_EXPLICIT_MUTABILITY_REQUIRED

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

Android 12 以上をターゲットとするアプリの場合、アプリが作成する個々の PendingIntent オブジェクトの可変性を指定する必要があります。この追加要件により、アプリのセキュリティが強化されます。

この変更について詳しくは、ペンディング インテントで可変性の宣言が必須にをご覧ください。

RATE_LIMIT_TOASTS

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

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

REQUIRE_EXACT_ALARM_PERMISSION

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

Android 12 以上をターゲットとするアプリの場合、setExactAndAllowWhileIdle(int, long, PendingIntent)setAlarmClock(AlarmClockInfo, PendingIntent) を使用するには、新しい Manifest.permission.SCHEDULE_EXACT_ALARM 権限が必要です。

SECURITY_EXCEPTION_ON_INVALID_ATTRIBUTION_TAG_CHANGE

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

Android 12 以上をターゲットとするアプリの場合、noteOp(String, int, String)noteProxyOp(String, String)startOp(String, int, String) に送信されるすべての attributionTags につき、メソッドのパラメータとして指定されたパッケージのマニフェストでの定義を必須にします。

この変更を有効にするには、noteOp(String, int, String) を呼び出すパッケージと、メソッドのパラメータとして指定されたパッケージの両方で、この変更が有効になっている必要があります。

SELINUX_LATEST_CHANGES

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

Android 12 以上をターゲットとするアプリの場合、最新の SELinux の変更にオプトインします。Android 12 以上をターゲットとするアプリでこの変更をオフにした場合、効果は no-op です。共有ユーザー ID を使用するアプリには影響しません。

SELINUX_R_CHANGES

変更 ID: 168782947
デフォルトの状態: Android 11(API レベル 30)以上をターゲットとするアプリで有効。

この変更により、アプリの untrusted_app_R-targetSDk SELinux ドメインへのアクセスが制御されます。これは、互換性フレームワークの基本的な変更の 1 つで、アプリが targetSdkVersion を条件とするその他の変更を、アプリの targetSDKVersion を変更せずに切り替えられるようになります。そのため、Android 11 をターゲットとするアプリではこの変更を無効にしないでください。アプリが機能しなくなります。

この変更は、共有ユーザー ID を使用するアプリには影響しません。

SETTINGS_API_V2

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

AndroidManifest.xml インテント フィルタで android:autoVerify="true" とマークされたドメインを検証するための新しいユーザー設定 API は、現在のプラットフォーム プレビューではまだ実装されていません。現時点では、adb shell pm set-app-links-user-selection や同様のコマンドを使用してこの変更を有効にすると、新しいユーザー設定の変更をプレビューできます。

THROW_EXCEPTION_ON_REQUIRE_INSTALL_PACKAGES_TO_ADD_INSTALLER_PACKAGE

変更 ID: 150857253
デフォルトの状態: Android 11(API レベル 30)以上をターゲットとするアプリで有効。

Android 11(API レビュー 30)以上をターゲットとするアプリの場合、インストーラ パッケージ名が設定されていないパッケージにインストーラ パッケージ名を追加するには、INSTALL_PACKAGES 権限が必要になりました。呼び出し元が Android 11(API レビュー 30)をターゲットとする場合は、SecurityException がスローされます。それ以外の場合、リクエストはメッセージを表示せずに失敗します。いずれの場合も、この変更が有効になっているかどうかに関係なく、インストーラ パッケージは変更されません。