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

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

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

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

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

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

Android 15 enforced edge-to-edge for apps targeting Android 15 (API level 35), but your app could opt-out by setting R.attr#windowOptOutEdgeToEdgeEnforcement to true. For apps targeting Android 16 (API level 36), R.attr#windowOptOutEdgeToEdgeEnforcement is deprecated and disabled, and your app can't opt-out of going edge-to-edge.

  • If your app targets Android 16 (API level 36) and is running on an Android 15 device, R.attr#windowOptOutEdgeToEdgeEnforcement continues to work.
  • If your app targets Android 16 (API level 36) and is running on an Android 16 device, R.attr#windowOptOutEdgeToEdgeEnforcement is disabled.

For testing in Android 16 Beta 3, ensure your app supports edge-to-edge and remove any use of R.attr#windowOptOutEdgeToEdgeEnforcement so that your app also supports edge-to-edge on an Android 15 device. To support edge-to-edge, see the Compose and Views guidance.

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

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)では、健康とフィットネスのデータに関連する次の変更が加えられました。

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

对于以 Android 16(API 级别 36)或更高版本为目标平台的应用,BODY_SENSORS 权限即将过渡到 android.permissions.health 下的精细权限,这些权限也会被 Health Connect 使用。凡是以前需要具有 BODY_SENSORSBODY_SENSORS_BACKGROUND 权限的 API,现在都需要获取相应的 android.permissions.health 权限。这会影响以下数据类型、API 和前台服务类型:

如果您的应用使用这些 API,则现在应请求相应的精细权限:

这些权限与用于保护对 Health Connect(用于存储健康、健身和身心健康数据的 Android 数据存储区)读取数据的权限相同。

移动应用

迁移到使用 READ_HEART_RATE 和其他精细权限的移动应用还必须声明 activity 以显示应用的隐私权政策。这与 Health Connect 的要求相同。

接続

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

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

作为改进了对键值对丢失的处理的一部分,Android 16 还引入了 2 个新 intent,以便应用更好地了解键值对丢失和加密更改。

以 Android 16 为目标平台的应用现在可以:

  • 在检测到远程键盘连接丢失时接收 ACTION_KEY_MISSING intent,以便提供更具信息量的用户反馈并采取适当的措施。
  • 每当链接的加密状态发生变化时,都会收到 ACTION_ENCRYPTION_CHANGE intent。这包括加密状态更改、加密算法更改和加密密钥大小更改。如果应用在稍后收到 ACTION_ENCRYPTION_CHANGE intent 时成功加密了链接,则必须将该绑定视为已恢复。

如果您的应用目前使用自定义机制来处理键盘键失效,请迁移到新的 intent ACTION_KEY_MISSING 以检测和管理键盘键失效事件。我们建议您的应用在发起设备忘记和重新配对之前,引导用户确认远程设备是否在有效范围内。

此外,如果设备在收到 ACTION_KEY_MISSING intent 后断开连接,您的应用应注意重新连接到设备,因为该设备可能已不再与系统绑定。

セキュリティ

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.

プライバシー

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)は、ローカル ネットワーク アドレスとして分類されます。