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

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

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

コア機能

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

JobScheduler の割り当ての最適化

Starting in Android 16, we're adjusting regular and expedited job execution runtime quota based on the following factors:

  • Which app standby bucket the application is in: in Android 16, active standby buckets will start being enforced by a generous runtime quota.
  • If the job starts execution while the app is in a top state: in Android 16, Jobs started while the app is visible to the user and continues after the app becomes invisible, will adhere to the job runtime quota.
  • If the job is executing while running a Foreground Service: in Android 16, jobs that are executing while concurrently with a foreground service will adhere to the job runtime quota. If you're leveraging jobs for user initiated data transfer, consider using user initiated data transfer jobs instead.

This change impacts tasks scheduled using WorkManager, JobScheduler, and DownloadManager. To debug why a job was stopped, we recommend logging why your job was stopped by calling WorkInfo.getStopReason() (for JobScheduler jobs, call JobParameters.getStopReason()).

For information about how your app's state affects the resources it can use, see Power management resource limits. For more information on battery-optimal best practices, refer to guidance on optimize battery use for task scheduling APIs.

We also recommend leveraging the new JobScheduler#getPendingJobReasonsHistory API introduced in Android 16 to understand why a job has not executed.

Testing

To test your app's behavior, you can enable override of certain job quota optimizations as long as the app is running on an Android 16 device.

To disable enforcement of "top state will adhere to job runtime quota", run the following adb command:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME

To disable enforcement of "jobs that are executing while concurrently with a foreground service will adhere to the job runtime quota", run the following adb command:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME

To test certain app standby bucket behavior, you can set the app standby bucket of your app using the following adb command:

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

To understand the app standby bucket your app is in, you can get the app standby bucket of your app using the following adb command:

adb shell am get-standby-bucket APP_PACKAGE_NAME

空のジョブが破棄された理由

放棄されたジョブは、ジョブに関連付けられた JobParameters オブジェクトがガベージ コレクションされたものの、JobService#jobFinished(JobParameters, boolean) が呼び出されず、ジョブの完了が通知されていない場合に発生します。これは、アプリが認識せずにジョブが実行され、スケジュールが変更されている可能性があることを示します。

JobScheduler に依存するアプリは、JobParameters オブジェクトへの強参照を維持しないため、タイムアウトには STOP_REASON_TIMEOUT ではなく、新しいジョブ停止理由 STOP_REASON_TIMEOUT_ABANDONED が付与されます。

新しい放棄された停止理由が頻繁に発生する場合、システムは緩和策を講じてジョブの頻度を減らします。

アプリは、新しい停止理由を使用して、放棄されたジョブを検出して削減する必要があります。

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 では、予測型「戻る」に適切に移行したアプリの 3 ボタン ナビゲーションに、予測型「戻る」のサポートが追加されています。戻るボタンを長押しすると、予測型「戻る」アニメーションが開始され、戻るスワイプで移動する先のプレビューが表示されます。

この動作は、システム アニメーション(ホームに戻る、タスク間、アクティビティ間)など、予測型「戻る」アニメーションをサポートするシステムのすべての領域に適用されます。

3 ボタン ナビゲーション モードでの予測型「戻る」アニメーション。

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

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

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

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

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

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

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

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

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

参照

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

セキュリティ

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

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

Android 16 provides default security against general Intent redirection attacks, with minimum compatibility and developer changes required.

We are introducing by-default security hardening solutions to Intent redirection exploits. In most cases, apps that use intents normally won't experience any compatibility issues; we've gathered metrics throughout our development process to monitor which apps might experience breakages.

Intent redirection in Android occurs when an attacker can partly or fully control the contents of an intent used to launch a new component in the context of a vulnerable app, while the victim app launches an untrusted sub-level intent in an extras field of an ("top-level") Intent. This can lead to the attacker app launching private components in the context of the victim app, triggering privileged actions, or gaining URI access to sensitive data, potentially leading to data theft and arbitrary code execution.

Opt out of Intent redirection handling

Android 16 introduces a new API that allows apps to opt out of launch security protections. This might be necessary in specific cases where the default security behavior interferes with legitimate app use cases.

For applications compiling against Android 16 (API level 36) SDK or higher

You can directly use the removeLaunchSecurityProtection() method on the Intent object.

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
For applications compiling against Android 15 (API level 35) or lower

While not recommended, you can use reflection to access the removeLaunchSecurityProtection() method.

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 秒から延長され、検索中にユーザーがいつでもデバイス検出を停止できるようになりました。検索開始から 20 秒以内に 1 台以上のデバイスが検出されると、CDM は追加のデバイスの検索を停止します。

接続

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

債券損失の処理を改善

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

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