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

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

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

コア機能

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

JobScheduler の割り当ての最適化

从 Android 16 开始,我们将根据以下因素调整常规作业和加急作业的执行运行时配额:

  • 应用所处的应用待机存储分区:在 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. 您的应用声明了具有相同广播 intent 的多个进程,并且希望根据优先级以特定顺序接收这些 intent。
  2. 您的应用进程与其他进程交互,并期望以特定顺序接收广播 intent。

如果进程需要相互协调,则应使用其他协调渠道进行通信。

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 をリクエストしてください。リクエストは、Issue Tracker で機能リクエストを作成して行います。

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

Android 15 引入了对 16 KB 内存页面的支持,以优化平台性能。Android 16 添加了兼容模式,让一些针对 4 KB 内存页面构建的应用可以在配置为 16 KB 内存页面的设备上运行。

当您的应用在搭载 Android 16 或更高版本的设备上运行时,如果 Android 检测到您的应用具有 4 KB 对齐的内存页面,则会自动使用兼容模式并向用户显示通知对话框。在 AndroidManifest.xml 中设置 android:pageSizeCompat 属性以启用向后兼容模式,将会阻止应用启动时显示对话框。如需使用 android:pageSizeCompat 属性,请使用 Android 16 SDK 编译您的应用。

为了实现最佳性能、可靠性和稳定性,应用仍应以 16 KB 对齐。如需了解详情,请参阅我们近期发布的博文,了解如何更新应用以支持 16 KB 的内存页面。

兼容模式对话框:当系统检测到 4 KB 对齐的应用在 16 KB 对齐的情况下可以更高效地运行时,系统会显示此对话框。

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

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

妨げになるユーザー補助の読み上げの非推奨化

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

替代方案示例:

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

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

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

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

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

テーマ別アプリアイコンの自動生成

Android 16 QPR 2 以降では、Android がアプリ アイコンにテーマを自動的に適用し、一貫性のあるホーム画面を実現します。これは、アプリに独自のテーマ別アプリアイコンが用意されていない場合に発生します。アプリは、アダプティブ アイコン内にモノクローム レイヤを含め、Android Studio でアプリアイコンがどのように表示されるかをプレビューすることで、テーマ設定されたアプリアイコンのデザインを制御できます。

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

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

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

仮想デバイス オーナーは、仮想デバイスを作成して管理する信頼できる特権アプリです。仮想デバイスの所有者は、仮想デバイスでアプリを実行し、パソコン、仮想現実デバイス、自動車のインフォテインメント システムなどのリモート デバイスのディスプレイにアプリを投影します。仮想デバイスの所有者が、スマートフォンなどのローカル デバイスにいる。

スマートフォンの仮想デバイス オーナーが、アプリをリモート ディスプレイに投影する仮想デバイスを作成します。

アプリごとのオーバーライド

Android 16(API レベル 36)を搭載したデバイスでは、仮想デバイスの所有者は、仮想デバイスの所有者が管理する一部の仮想デバイスでアプリの設定をオーバーライドできます。たとえば、アプリのレイアウトを改善するために、仮想デバイスの所有者は、アプリを外部ディスプレイに投影する際に、向き、アスペクト比、サイズ変更の制限を無視できます。

一般的な互換性を破る変更

Android 16 の動作は、車載ディスプレイや Chromebook などの大画面フォーム ファクタのアプリの UI に影響する可能性があります。特に、縦向きの小さなディスプレイ向けに設計されたレイアウトに影響する可能性があります。すべてのデバイスのフォーム ファクタに対応するようにアプリをアダプティブにする方法については、アダプティブ レイアウトについてをご覧ください。

参照

コンパニオン アプリのストリーミング

セキュリティ

Android 16(API レベル 36)には、システム セキュリティを強化し、アプリとユーザーを悪意のあるアプリから保護するための変更が含まれています。

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

Android 16 では、一般的な Intent リダイレクト攻撃に対するデフォルトのセキュリティが提供され、互換性とデベロッパーの変更が最小限で済みます。

Intent リダイレクト エクスプロイトに対するデフォルトのセキュリティ強化ソリューションを導入します。ほとんどの場合、インテントを使用するアプリで互換性の問題が発生することはありません。Google は開発プロセス全体で指標を収集し、どのアプリで破損が発生する可能性があるかをモニタリングしています。

Android のインテント リダイレクトは、脆弱なアプリに関連して新しいコンポーネントの起動に使用されるインテントの内容を攻撃者が部分的または完全に制御できる場合に発生します。一方、被害者のアプリは(「トップレベル」の)インテントの Extras フィールドで信頼できないサブレベルのインテントを起動します。これにより、攻撃者のアプリが被害者のアプリのコンテキストで非公開コンポーネントを起動し、特権アクションをトリガーしたり、機密データへの URI アクセス権を取得したりする可能性があります。これにより、データ窃盗や任意のコード実行につながるおそれがあります。

インテント リダイレクト処理をオプトアウトする

Android 16 では、アプリが起動時のセキュリティ保護をオプトアウトできる新しい API が導入されています。これは、デフォルトのセキュリティ動作が正当なアプリのユースケースを妨げる特定のケースで必要になることがあります。

Android 16(API レベル 36)以降の 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 在配套设备配对流程期间引入了一种新行为,以防恶意应用侵犯用户的位置信息隐私。在 Android 16 上运行的所有配套应用都不再直接通过 RESULT_DISCOVERY_TIMEOUT 收到发现超时通知。而是通过可视对话框通知用户超时事件。当用户关闭对话框时,系统会通过 RESULT_USER_REJECTED 提醒应用关联失败。

搜索时长也从原来的 20 秒延长到了 30 秒,并且用户可以在搜索期间的任何时间停止设备发现。如果在开始搜索的前 20 秒内发现了至少 1 部设备,CDM 会停止搜索其他设备。

接続

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

債券損失の処理を改善

从 Android 16 开始,蓝牙堆栈已更新,以便在检测到远程配对丢失时提高安全性和用户体验。以前,系统会自动解除配对并启动新的配对流程,这可能会导致意外重新配对。在许多情况下,我们发现应用未以一致的方式处理债券损失事件。

为了统一体验,Android 16 改进了系统的绑定丢失处理。如果之前配对的蓝牙设备在重新连接时无法进行身份验证,系统会断开关联,保留本地配对信息,并显示系统对话框,告知用户配对已断开并指示他们重新配对。