動作の変更点: Android 16 以上をターゲットとするアプリ

これまでのリリースと同様、Android 16 には、アプリに影響する可能性がある動作変更が含まれています。下記の動作変更は、Android 16 以上をターゲットとするアプリにのみ適用されます。アプリが Android 16 以上をターゲットとする場合は、必要に応じてアプリを変更し、下記の動作に適切に対応できるようにしてください。

アプリの targetSdkVersion に関係なく、Android 16 で実行されるすべてのアプリに影響する動作変更のリストも必ずご確認ください。

ユーザー エクスペリエンスとシステム UI

Android 16(API レベル 36)では、より一貫性があり直感的なユーザー エクスペリエンスを実現するために、以下の変更が加えられています。

エッジ ツー エッジのオプトアウトの廃止

Android 15(API レベル 35)をターゲットとするアプリに対して、Android 15 ではエッジツーエッジが強制適用されますが、R.attr#windowOptOutEdgeToEdgeEnforcementtrue に設定することで、アプリでオプトアウトできます。Android 16(API レベル 36)をターゲットとするアプリの場合、R.attr#windowOptOutEdgeToEdgeEnforcement は非推奨で無効になっています。アプリでエッジツーエッジをオプトアウトすることはできません。

  • アプリが Android 16(API レベル 36)をターゲットとし、Android 15 デバイスで実行されている場合、R.attr#windowOptOutEdgeToEdgeEnforcement は引き続き機能します。
  • アプリが Android 16(API レベル 36)をターゲットとし、Android 16 デバイスで実行されている場合、R.attr#windowOptOutEdgeToEdgeEnforcement は無効になります。

Android 16 ベータ版 3 でテストするには、アプリがエッジ ツー エッジに対応していることを確認し、R.attr#windowOptOutEdgeToEdgeEnforcement の使用をすべて削除して、Android 15 デバイスでもアプリがエッジ ツー エッジに対応するようにします。エッジツーエッジをサポートするには、Composeビューのガイダンスをご覧ください。

予測型「戻る」に移行またはオプトアウトが必要

For apps targeting Android 16 (API level 36) or higher and running on an Android 16 or higher device, the predictive back system animations (back-to-home, cross-task, and cross-activity) are enabled by default. Additionally, onBackPressed is not called and KeyEvent.KEYCODE_BACK is not dispatched anymore.

If your app intercepts the back event and you haven't migrated to predictive back yet, update your app to use supported back navigation APIs. or temporarily opt out by setting the android:enableOnBackInvokedCallback attribute to false in the <application> or <activity> tag of your app's AndroidManifest.xml file.

The predictive back-to-home animation.
The predictive cross-activity animation.
The predictive cross-task animation.

Elegant フォント API の非推奨と無効化

Apps targeting Android 15 (API level 35) have the elegantTextHeight TextView attribute set to true by default, replacing the compact font with one that is much more readable. You could override this by setting the elegantTextHeight attribute to false.

Android 16 deprecates the elegantTextHeight attribute, and the attribute will be ignored once your app targets Android 16. The "UI fonts" controlled by these APIs are being discontinued, so you should adapt any layouts to ensure consistent and future proof text rendering in Arabic, Lao, Myanmar, Tamil, Gujarati, Kannada, Malayalam, Odia, Telugu or Thai.

elegantTextHeight behavior for apps targeting Android 14 (API level 34) and lower, or for apps targeting Android 15 (API level 35) that overrode the default by setting the elegantTextHeight attribute to false.
elegantTextHeight behavior for apps targeting Android 16, or for apps targeting Android 15 (API level 35) that didn't override the default by setting the elegantTextHeight attribute to false.

コア機能

Android 16(API レベル 36)には、Android システムのさまざまなコア機能を変更または拡張する次の変更が含まれています。

固定レートの勤務スケジュールの最適化

Prior to targeting Android 16, when scheduleAtFixedRate missed a task execution due to being outside a valid process lifecycle, all missed executions immediately execute when the app returns to a valid lifecycle.

When targeting Android 16, at most one missed execution of scheduleAtFixedRate is immediately executed when the app returns to a valid lifecycle. This behavior change is expected to improve app performance. Test this behavior in your app to check if your app is impacted. You can also test by using the app compatibility framework and enabling the STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS compat flag.

デバイスのフォーム ファクタ

Android 16(API レベル 36)では、大画面デバイスに表示されるアプリについて、次のように変更されています。

アダプティブ レイアウト

With Android apps now running on a variety of devices (such as phones, tablets, foldables, desktops, cars, and TVs) and windowing modes on large screens (such as split screen and desktop windowing), developers should build Android apps that adapt to any screen and window size, regardless of device orientation. Paradigms like restricting orientation and resizability are too restrictive in today's multidevice world.

Ignore orientation, resizability, and aspect ratio restrictions

For apps targeting Android 16 (API level 36), Android 16 includes changes to how the system manages orientation, resizability, and aspect ratio restrictions. On displays with smallest width >= 600dp, the restrictions no longer apply. Apps also fill the entire display window, regardless of aspect ratio or a user's preferred orientation, and pillarboxing isn't used.

This change introduces a new standard platform behavior. Android is moving toward a model where apps are expected to adapt to various orientations, display sizes, and aspect ratios. Restrictions like fixed orientation or limited resizability hinder app adaptability, so we recommend making your app adaptive to deliver the best possible user experience.

You can also test this behavior by using the app compatibility framework and enabling the UNIVERSAL_RESIZABLE_BY_DEFAULT compat flag.

Common breaking changes

Ignoring orientation, resizability, and aspect ratio restrictions might impact your app's UI on some devices, especially elements that were designed for small layouts locked in portrait orientation: for example, issues like stretched layouts and off-screen animations and components. Any assumptions about aspect ratio or orientation can cause visual issues with your app. Learn more about how to avoid them and improve your app's adaptive behaviour.

Allowing device rotation results in more activity re-creation, which can result in losing user state if not properly preserved. Learn how to correctly save UI state in Save UI states.

Implementation details

The following manifest attributes and runtime APIs are ignored across large screen devices in full-screen and multi-window modes:

The following values for screenOrientation, setRequestedOrientation(), and getRequestedOrientation() are ignored:

  • portrait
  • reversePortrait
  • sensorPortrait
  • userPortrait
  • landscape
  • reverseLandscape
  • sensorLandscape
  • userLandscape

Regarding display resizability, android:resizeableActivity="false", android:minAspectRatio, and android:maxAspectRatio have no effect.

For apps targeting Android 16 (API level 36), app orientation, resizability, and aspect ratio constraints are ignored on large screens by default, but every app that isn't fully ready can temporarily override this behavior by opting out (which results in the previous behavior of being placed in compatibility mode).

Exceptions

The Android 16 orientation, resizability, and aspect ratio restrictions don't apply in the following situations:

  • Games (based on the android:appCategory flag)
  • Users explicitly opting in to the app's default behavior in aspect ratio settings of the device
  • Screens that are smaller than sw600dp

Opt out temporarily

To opt out a specific activity, declare the PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY manifest property:

<activity ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
  ...
</activity>

If too many parts of your app aren't ready for Android 16, you can opt out completely by applying the same property at the application level:

<application ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
</application>

健康&フィットネス

Android 16(API レベル 36)では、健康とフィットネスのデータに関連する次の変更が加えられました。

健康とフィットネスの権限

For apps targeting Android 16 (API level 36) or higher, BODY_SENSORS permissions are transitioning to the granular permissions under android.permissions.health also used by Health Connect. Any API previously requiring BODY_SENSORS or BODY_SENSORS_BACKGROUND now requires the corresponding android.permissions.health permission. This affects the following data types, APIs, and foreground service types:

If your app uses these APIs, it should now request the respective granular permissions:

These permissions are the same as those that guard access to reading data from Health Connect, the Android datastore for health, fitness, and wellness data.

Mobile apps

Mobile apps migrating to use the READ_HEART_RATE and other granular permissions must also declare an activity to display the app's privacy policy. This is the same requirement as Health Connect.

接続

Android 16(API レベル 36)では、Bluetooth スタックに次の変更が加えられて、周辺機器との接続が改善されています。

ボンドの損失と暗号化の変更を処理する新しいインテントの追加

As part of the Improved bond loss handling, Android 16 also introduces 2 new intents to provide apps with greater awareness of bond loss and encryption changes.

Apps targeting Android 16 can now:

  • Receive an ACTION_KEY_MISSING intent when remote bond loss is detected, allowing them to provide more informative user feedback and take appropriate actions.
  • Receive an ACTION_ENCRYPTION_CHANGE intent whenever encryption status of the link changes. This includes encryption status change, encryption algorithm change, and encryption key size change. Apps must consider the bond restored if the link is successfully encrypted upon receiving ACTION_ENCRYPTION_CHANGE intent later.

If your app currently uses custom mechanisms for bond loss handling, migrate to the new intent ACTION_KEY_MISSING to detect and manage bond loss events. We recommend your app guide the user to confirm the remote device is in range before initiating device forgetting and re-pairing.

Moreover, if a device disconnects after ACTION_KEY_MISSING intent is received, your app should be mindful about reconnecting to the device as that device may no longer be bonded with the system.

セキュリティ

Android 16(API レベル 36)では、セキュリティが次のように変更されています。

MediaStore バージョンのロックダウン

For apps targeting Android 16 or higher, MediaStore#getVersion() will now be unique to each app. This eliminates identifying properties from the version string to prevent abuse and usage for fingerprinting techniques. Apps shouldn't make any assumptions around the format of this version. Apps should already handle version changes when using this API and in most cases shouldn't need to change their current behavior, unless the developer has attempted to infer additional information that is beyond the intended scope of this API.

Safer Intents

Safer Intents 機能は、Android のインテント解決メカニズムのセキュリティを強化するために設計された、多段階のセキュリティ イニシアチブです。インテントの処理中にチェックを追加し、特定の条件を満たさないインテントをフィルタすることで、悪意のあるアクションからアプリを保護することを目的としています。

Android 15 では送信側のアプリに重点を置いた機能でしたが、Android 16 では受信側のアプリに制御が移行され、デベロッパーはアプリ マニフェストを使用して厳格なインテント解決をオプトインできるようになりました。

主な変更点は次の 2 つです。

  1. 明示的インテントはターゲット コンポーネントのインテント フィルタと一致する必要がある: インテントでコンポーネントを明示的にターゲットに設定する場合は、そのコンポーネントのインテント フィルタと一致する必要があります。

  2. アクションのないインテントはどのインテント フィルタにも一致しません。アクションが指定されていないインテントは、どのインテント フィルタにも解決されません。

これらの変更は、複数のアプリが関係する場合にのみ適用され、単一アプリ内のインテントの処理には影響しません。

影響

オプトインであるため、有効にするには、デベロッパーがアプリ マニフェストで明示的に有効にする必要があります。そのため、この機能の影響は、デベロッパーが以下の条件を満たしているアプリに限定されます。

  • Safer Intents 機能とそのメリットを理解している。
  • より厳格なインテント処理手法をアプリに積極的に組み込む。

このオプトイン アプローチにより、現在の安全性の低いインテントの解決動作に依存している既存のアプリが破損するリスクを最小限に抑えることができます。

Android 16 での最初の影響は限定的かもしれませんが、Safer Intents イニシアチブには、今後の Android リリースでより広範な影響を与えるためのロードマップがあります。最終的には、厳密なインテントの解決をデフォルトの動作にすることを計画しています。

Safer Intents 機能は、悪意のあるアプリがインテントの解決メカニズムの脆弱性を悪用しにくくすることで、Android エコシステムのセキュリティを大幅に強化する可能性があります。

ただし、オプトアウトと強制適用への移行は、既存のアプリとの互換性の問題に対処するために慎重に管理する必要があります。

実装

デベロッパーは、アプリ マニフェストで intentMatchingFlags 属性を使用して、より厳格なインテント マッチングを明示的に有効にする必要があります。アプリ全体でオプトインされているが、レシーバで無効になっている/オプトアウトされている機能の例を次に示します。

<application android:intentMatchingFlags="enforceIntentFilter">
    <receiver android:name=".MyBroadcastReceiver" android:exported="true" android:intentMatchingFlags="none">
        <intent-filter>
            <action android:name="com.example.MY_CUSTOM_ACTION" />
        </intent-filter>
        <intent-filter>
            <action android:name="com.example.MY_ANOTHER_CUSTOM_ACTION" />
        </intent-filter>
    </receiver>
</application>

サポートされているフラグの詳細:

フラグ名 説明
enforceIntentFilter 受信インテントの厳密なマッチングを適用
なし 受信したインテントの特別な一致ルールをすべて無効にします。複数のフラグを指定する場合、競合する値は「none」フラグに優先されます。
allowNullAction 一致ルールを緩和して、アクションのないインテントを一致させます。このフラグは、「enforceIntentFilter」と組み合わせて使用し、特定の動作を実現します。

テストとデバッグ

適用が有効になっている場合、インテントの呼び出し元がインテントを適切に入力していれば、アプリは正しく機能する必要があります。ただし、ブロックされたインテントでは、"PackageManager." タグが付いた "Intent does not match component's intent filter:""Access blocked:" などの警告ログ メッセージがトリガーされます。これは、アプリに影響する可能性のある問題を示しており、注意が必要です。

Logcat フィルタ:

tag=:PackageManager & (message:"Intent does not match component's intent filter:" | message: "Access blocked:")

プライバシー

Android 16(API レベル 36)では、プライバシーに関する次の変更が行われています。

ローカル ネットワークへのアクセス権

LAN 上のデバイスには、INTERNET 権限を持つすべてのアプリからアクセスできます。これにより、アプリはローカル デバイスに簡単に接続できますが、ユーザーの指紋の形成や位置情報のプロキシとしての使用など、プライバシーに関連する問題もあります。

ローカル ネットワーク保護プロジェクトは、新しいランタイム権限の背後でローカル ネットワークへのアクセスを制限することで、ユーザーのプライバシーを保護することを目的としています。

リリース計画

この変更は、2025 年第 2 四半期と未定の 2 つのリリースの間にデプロイされます。これらの保護は今後の Android リリースで適用されるため、デベロッパーは 25Q2 のガイダンスに沿ってフィードバックを共有する必要があります。また、次のガイダンスを使用して、暗黙的なローカル ネットワーク アクセスに依存するシナリオを更新し、ユーザーによる拒否と新しい権限の取り消しに対応する必要があります。

影響

現段階では、LNP はオプトイン機能です。つまり、オプトインしたアプリのみが影響を受けます。オプトイン フェーズの目的は、アプリのデベロッパーが、アプリのどの部分が暗黙的なローカル ネットワーク アクセスに依存しているかを把握し、次のリリースで権限ガードする準備を整えることです。

アプリが以下を使用してユーザーのローカル ネットワークにアクセスしている場合、影響を受けます。

  • ローカル ネットワーク アドレスで未加工ソケットを直接使用またはライブラリで使用(mDNS や SSDP サービス ディスカバリ プロトコルなど)
  • ローカル ネットワークにアクセスするフレームワーク レベルのクラスの使用(NsdManager など)

ローカル ネットワーク アドレスとの間のトラフィックにローカル ネットワーク アクセス権が必要です。次の表に、一般的なケースを示します。

アプリの低レベル ネットワーク オペレーション ローカル ネットワークへのアクセス権が必要です
アウトバウンド TCP 接続の作成 はい
受信 TCP 接続の受け入れ はい
UDP ユニキャスト、マルチキャスト、ブロードキャストの送信 はい
受信 UDP ユニキャスト、マルチキャスト、ブロードキャスト はい

これらの制限はネットワーク スタックの深部に実装されているため、すべてのネットワーク API に適用されます。これには、ネイティブ コードまたはマネージド コードで作成されたソケット、Cronet や OkHttp などのネットワーク ライブラリ、それらの上に実装された API が含まれます。ローカル ネットワーク上のサービス(末尾が .local のサービス)を解決しようとすると、ローカル ネットワークの権限が必要になります。

上記のルールの例外:

  • デバイスの DNS サーバーがローカル ネットワーク上にある場合、そのサーバーとの間(ポート 53)のトラフィックにローカル ネットワーク アクセス権は必要ありません。
  • 出力切り替えツールをアプリ内選択ツールとして使用するアプリは、ローカル ネットワーク権限を必要としません(詳細なガイダンスは 2025 年第 4 四半期に提供予定です)。

デベロッパー ガイダンス(オプトイン)

ローカル ネットワークの制限を有効にするには、次の操作を行います。

  1. 25Q2 ベータ版 3 以降のビルドにデバイスを書き込みます。
  2. テストするアプリをインストールします。
  3. adb で Appcompat フラグを切り替えます。

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. デバイスを再起動する

これで、アプリのローカル ネットワークへのアクセスが制限され、ローカル ネットワークにアクセスしようとするとソケット エラーが発生します。アプリのプロセス外でローカル ネットワーク オペレーションを実行する API(NsdManager など)を使用している場合、オプトイン フェーズ中に影響を受けません。

アクセス権を復元するには、アプリに NEARBY_WIFI_DEVICES へのアクセス権を付与する必要があります。

  1. アプリがマニフェストで NEARBY_WIFI_DEVICES 権限を宣言していることを確認します。
  2. [設定] > [アプリ] > [アプリ名] > [権限] > [付近のデバイス] > [許可] に移動します。

これで、アプリのローカル ネットワークへのアクセスが復元され、アプリを有効にする前と同じようにすべてのシナリオが動作するようになります。

ローカル ネットワーク保護の適用が開始されると、アプリのネットワーク トラフィックに次のような影響が及ぶことになります。

権限 送信 LAN リクエスト アウトバウンド/インバウンド インターネット リクエスト インバウンド LAN リクエスト
許可 Works Works Works
未許可 ハプニング集 Works ハプニング集

次のコマンドを使用して、App-Compat フラグをオフにします。

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

エラー

これらの制限に起因するエラーは、ローカル ネットワーク アドレスへの send または send のバリエーションを呼び出すたびに、呼び出し元のソケットに返されます。

エラーの例:

sendto failed: EPERM (Operation not permitted)

sendto failed: ECONNABORTED (Operation not permitted)

ローカル ネットワークの定義

このプロジェクトのローカル ネットワークとは、Wi-Fi やイーサネットなどのブロードキャスト対応ネットワーク インターフェースを使用する IP ネットワークを指します。ただし、モバイル(WWAN)接続や VPN 接続は除きます。

ローカル ネットワークと見なされるのは次のとおりです。

IPv4:

  • 169.254.0.0/16 // リンクローカル
  • 100.64.0.0/10 // CGNAT
  • 10.0.0.0/8 // RFC1918
  • 172.16.0.0/12 // RFC1918
  • 192.168.0.0/16 // RFC1918

IPv6:

  • リンクローカル
  • 直接接続されたルート
  • Thread などのスタブ ネットワーク
  • 複数のサブネット(未定)

また、マルチキャスト アドレス(224.0.0.0/4、ff00::/8)と IPv4 ブロードキャスト アドレス(255.255.255.255)は、ローカル ネットワーク アドレスとして分類されます。

アプリ所有の写真

Android 16 以降を搭載したデバイスで、SDK 36 以降をターゲットとするアプリから写真と動画の権限を求めるメッセージが表示された場合、選択したメディアへのアクセスを制限することを選択したユーザーには、アプリが所有する写真が写真選択ツールで事前選択された状態で表示されます。ユーザーは、これらの事前選択された項目の選択を解除できます。これにより、それらの写真と動画へのアプリのアクセス権が取り消されます。