動作の変更点: すべてのアプリ

Android 16 プラットフォームには、アプリに影響する可能性がある動作変更が含まれています。下記の動作変更は、targetSdkVersion に関係なく、Android 16 上で稼働するすべてのアプリに適用されます。該当する場合は、アプリをテストし、必要に応じて修正して、適切に対応する必要があります。

Android 16 をターゲットとするアプリにのみ影響する動作変更のリストも必ずご確認ください。

コア機能

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

JobScheduler の割り当ての最適化

Android 16 以降、Google は次の要素に基づいて、通常のジョブ実行とエクスプレス ジョブ実行のランタイム割り当てを調整しています。

  • アプリがどのアプリ スタンバイ バケットに属しているか: Android 16 では、アクティブなスタンバイ バケットに、十分なランタイム割り当てが適用されるようになります。
  • アプリがトップ状態のときにジョブの実行が開始された場合: Android 16 では、アプリがユーザーに表示されている間に開始され、アプリが非表示になった後に続行されるジョブは、ジョブのランタイム割り当てに準拠します。
  • フォアグラウンド サービスを実行中にジョブが実行されている場合: Android 16 では、フォアグラウンド サービスと同時に実行されているジョブは、ジョブのランタイム割り当てに準拠します。ユーザーが開始するデータ転送にジョブを使用している場合は、代わりにユーザーが開始するデータ転送ジョブの使用を検討してください。

この変更は、WorkManager、JobScheduler、DownloadManager を使用してスケジュール設定されたタスクに影響します。ジョブが停止した理由をデバッグするには、WorkInfo.getStopReason() を呼び出してジョブが停止した理由をロギングすることをおすすめします(JobScheduler ジョブの場合は JobParameters.getStopReason() を呼び出します)。

バッテリー最適化のベスト プラクティスについて詳しくは、タスク スケジューリング API のバッテリー使用量を最適化するに関するガイダンスをご覧ください。

また、Android 16 で導入された新しい JobScheduler#getPendingJobReasonsHistory API を利用して、ジョブが実行されなかった理由を把握することをおすすめします。

テスト

アプリの動作をテストするには、アプリが Android 16 デバイスで実行されている限り、特定のジョブ割り当て最適化のオーバーライドを有効にできます。

「トップ状態はジョブのランタイム割り当てに準拠する」の適用を無効にするには、次の adb コマンドを実行します。

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME

「フォアグラウンド サービスと同時に実行されているジョブはジョブのランタイム割り当てに準拠する」の適用を無効にするには、次の adb コマンドを実行します。

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME

特定のアプリ スタンバイ バケットの動作をテストするには、次の adb コマンドを使用してアプリのアプリ スタンバイ バケットを設定します。

adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted

アプリが属するアプリ スタンバイ バケットを確認するには、次の adb コマンドを使用してアプリのアプリ スタンバイ バケットを取得します。

adb shell am get-standby-bucket APP_PACKAGE_NAME

放棄された空のジョブの停止理由

如果与作业关联的 JobParameters 对象已被垃圾回收,但尚未调用 JobService#jobFinished(JobParameters, boolean) 来指示作业已完成,则会发生作业被废弃的情况。这表示作业可能会在应用不知情的情况下运行和重新调度。

依赖于 JobScheduler 的应用不会维护对 JobParameters 对象的强引用,并且超时现在将获得新的作业停止原因 STOP_REASON_TIMEOUT_ABANDONED,而不是 STOP_REASON_TIMEOUT

如果新的作业被废弃停止原因频繁出现,系统会采取缓解措施来降低作业频率。

应用应使用新的停止原因来检测和减少被废弃的作业。

如果您使用的是 WorkManager、AsyncTask 或 DownloadManager,则不会受到影响,因为这些 API 会代表您的应用管理作业生命周期。

JobInfo#setImportantWhileForeground のサポートを完全に終了

JobInfo.Builder#setImportantWhileForeground(boolean) メソッドは、スケジュール設定アプリがフォアグラウンドにある間、またはバックグラウンドの制限を一時的に免除されている間のジョブの重要度を示します。

このメソッドは、Android 12(API レベル 31)で非推奨になりました。Android 16 以降では、このメソッドは効果的に機能しなくなり、このメソッドの呼び出しは無視されます。

この機能の削除は JobInfo#isImportantWhileForeground() にも適用されます。Android 16 以降では、メソッドが呼び出されると、メソッドは false を返します。

順序付きブロードキャストの優先度スコープがグローバルではなくなった

Android アプリでは、ブロードキャスト レシーバの優先度を定義して、レシーバがブロードキャストを受信して処理する順序を制御できます。マニフェストで宣言されたレシーバの場合、アプリは android:priority 属性を使用して優先度を定義できます。コンテキストで登録されたレシーバの場合、アプリは IntentFilter#setPriority() API を使用して優先度を定義できます。ブロードキャストが送信されると、システムは優先度の高い順にレシーバにブロードキャストを配信します。

Android 16 では、異なるプロセス間で android:priority 属性または IntentFilter#setPriority() を使用してブロードキャスト配信順序を指定しても、その順序が保証されることはありません。ブロードキャストの優先度は、すべてのプロセスではなく、同じアプリケーション プロセス内でのみ考慮されます。

また、ブロードキャストの優先度は、(SYSTEM_LOW_PRIORITY + 1、SYSTEM_HIGH_PRIORITY - 1)の範囲に自動的に制限されます。SYSTEM_LOW_PRIORITYSYSTEM_HIGH_PRIORITY をブロードキャスト優先度として設定できるのは、システム コンポーネントのみです。

アプリが次のいずれかを行うと、影響を受ける可能性があります。

  1. アプリで同じブロードキャスト インテントを持つ複数のプロセスが宣言されており、優先度に基づいて特定の順序でそれらのインテントを受信することが想定されています。
  2. アプリのプロセスが他のプロセスとやり取りし、特定の順序でブロードキャスト インテントを受信することを想定している。

プロセスが相互に調整する必要がある場合は、他の調整チャネルを使用して通信する必要があります。

ART 内部の変更

Android 16 包含 Android 运行时 (ART) 的最新更新,这些更新可提升 Android 运行时 (ART) 的性能,并支持更多 Java 功能。通过 Google Play 系统更新,搭载 Android 12(API 级别 31)及更高版本的 10 亿多部设备也将受益于这些改进。

发布这些变更后,依赖于 ART 内部结构的库和应用代码在搭载 Android 16 的设备以及通过 Google Play 系统更新来更新 ART 模块的较低 Android 版本上可能无法正常运行。

依赖于内部结构(例如非 SDK 接口)始终会导致兼容性问题,但避免依赖于利用内部 ART 结构的代码(或包含代码的库)尤为重要,因为 ART 更改与设备所运行的平台版本无关,并且会通过 Google Play 系统更新推送到超过 10 亿部设备。

所有开发者都应在 Android 16 上对其应用进行全面测试,以检查其应用是否受到影响。此外,请查看已知问题,了解您的应用是否依赖于我们发现的任何依赖于内部 ART 结构的库。如果您的应用代码或库依赖项受到影响,请尽可能寻找公共 API 替代方案,并在问题跟踪器中创建功能请求,为新用例请求公共 API。

16 KB ページサイズの互換モード

Android 15 introduced support for 16 KB memory pages to optimize performance of the platform. Android 16 adds a compatibility mode, allowing some apps built for 4 KB memory pages to run on a device configured for 16 KB memory pages.

If Android detects that your app has 4 KB aligned memory pages, it automatically uses compatibility mode and display a notification dialog to the user. Setting the android:pageSizeCompat property in the AndroidManifest.xml to enable the backwards compatibility mode will prevent the display of the dialog when your app launches. For best performance, reliability, and stability, your app should still be 16 KB aligned. Check out our recent blog post on updating your apps to support 16 KB memory pages for more details.

The compatibility mode dialog that displays when the system detects that a 4 KB-aligned app could run more optimally if 16 KB aligned.

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

Android 16 には、より一貫性があり直感的なユーザー エクスペリエンスを実現するための以下の変更が含まれています。

ユーザー補助の妨げになる通知の非推奨

Android 16 废弃了无障碍功能通告,其特征是使用 announceForAccessibility 或调度 TYPE_ANNOUNCEMENT 无障碍功能事件。这可能会给 TalkBack 和 Android 屏幕阅读器用户带来不一致的用户体验,而替代方案可以更好地满足各种 Android 辅助技术的用户需求。

替代方案示例:

已废弃的 announceForAccessibility API 的参考文档中包含有关建议替代方案的更多详细信息。

3 ボタン ナビゲーションのサポート

Android 16 为已正确迁移到预测性返回的应用的三按钮导航栏引入了预测性返回支持。长按返回按钮会启动预测性返回动画,让您预览返回滑动手势会打开的界面。

此行为适用于系统中支持预测性返回动画的所有区域,包括系统动画(返回主屏幕、跨任务和跨 activity)。

“三按钮”导航模式下的预测性返回动画。

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

Android 16 では、仮想デバイス所有者がディスプレイに投影するアプリに対して、次の変更が加えられました。

仮想デバイス所有者のオーバーライド

虚拟设备所有者是创建和管理虚拟设备的可信或特权应用。虚拟设备所有者可以在虚拟设备上运行应用,然后将应用投影到远程设备(例如个人计算机、虚拟现实设备或汽车信息娱乐系统)的显示屏上。虚拟设备所有者位于本地设备(例如手机)上。

手机上的虚拟设备所有者创建虚拟设备,将应用投影到远程显示屏。

按应用替换项

在搭载 Android 16 的设备上,虚拟设备所有者可以在虚拟设备所有者管理的部分虚拟设备上替换应用设置。例如,为了改进应用布局,虚拟设备所有者可以在将应用投影到外部显示屏时忽略屏幕方向、宽高比和可调整大小限制。

常见的破坏性更改

Android 16 中的此行为可能会影响应用在汽车显示屏或 Chromebook 等大屏幕外形规格上的界面,尤其是针对纵向小屏幕设计的布局。如需了解如何让应用适应所有设备类型,请参阅自适应布局简介

参考编号

配套应用串流

セキュリティ

Android 16 では、システムのセキュリティを強化し、悪意のあるアプリからアプリとユーザーを保護するための変更が加えられています。

インテントのリダイレクト攻撃に対するセキュリティを強化

Android 16 提供了针对常规 Intent 重定向攻击的默认安全防护,并且所需的兼容性和开发者更改最少。

我们将默认针对 Intent 重定向漏洞引入安全增强解决方案。在大多数情况下,使用 intent 的应用通常不会遇到任何兼容性问题;我们在整个开发过程中收集了指标,以监控哪些应用可能会出现故障。

当攻击者部分或完全控制用于在存在漏洞的应用上下文中启动新组件的 intent 内容时,就会出现 Android 中的intent 重定向,而受害应用会在 intent(“顶级”intent)的 extras 字段中启动不可信的子级 intent。这可能会导致攻击者应用在受害应用上下文中启动私有组件、触发特权操作或获得对敏感数据的 URI 访问权限,从而可能导致数据被盗和任意代码执行。

停用 intent 重定向处理

Android 16 引入了一个新 API,允许应用选择停用启动安全保护。在默认安全行为干扰合法应用用例的特定情况下,这可能很有必要。

对于针对 Android 16 SDK 或更高版本进行编译的应用

您可以直接对 intent 对象使用 removeLaunchSecurityProtection() 方法。

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
对于针对 Android 15(API 级别 35)或更低版本进行编译的应用

虽然不建议这样做,但您可以使用反射来访问 removeLaunchSecurityProtection() 方法。

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent", Intent::class.java)
try {
    val removeLaunchSecurityProtection = Intent::class.java.getDeclaredMethod("removeLaunchSecurityProtection")
    removeLaunchSecurityProtection.invoke(iSublevel)
} catch (e: Exception) {
    // Handle the exception, e.g., log it
} // Opt-out from the security hardening using reflection
iSublevel?.let { startActivity(it) }

接続

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

債券の損失の処理を改善

Android 16 以降、Bluetooth スタックが更新され、リモート ボンディングの損失が検出されたときのセキュリティとユーザー エクスペリエンスが改善されました。以前は、システムが自動的にボンディングを削除し、新しいペア設定プロセスを開始していたため、意図しない再ペア設定が発生する可能性がありました。多くのアプリで、債券の損失イベントが一貫した方法で処理されていないことが確認されています。

エクスペリエンスを統一するため、Android 16 ではシステムへのボンディング損失の処理が改善されました。以前にペア設定した Bluetooth デバイスを再接続時に認証できなかった場合、システムはリンクを切断し、ローカルのペア設定情報を保持します。また、ペア設定が解除されたことをユーザーに通知し、ペア設定をやり直すよう求めるシステム ダイアログを表示します。