Android 16 プラットフォームには、アプリに影響を与える可能性のある動作変更が含まれています。
下記の動作変更は、Android 16 上で稼働するすべてのアプリに適用されます。
targetSdkVersionに関係なく。該当する場合は、アプリをテストし、必要に応じて修正して、適切に対応する必要があります。
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 ではなく、新しいジョブ停止理由 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_PRIORITY、SYSTEM_HIGH_PRIORITY 设置为广播优先级。
如果您的应用执行以下任一操作,可能会受到影响:
- 您的应用声明了具有相同广播 intent 的多个进程,并且希望根据优先级以特定顺序接收这些 intent。
- 您的应用进程与其他进程交互,并期望以特定顺序接收广播 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 以降を搭載したデバイスでアプリが実行されているときに、アプリに 4 KB アライメントのメモリページがあることが検出されると、Android は自動的に互換モードを使用し、ユーザーに通知ダイアログを表示します。AndroidManifest.xml で android:pageSizeCompat プロパティを設定して後方互換モードを有効にすると、アプリの起動時にダイアログが表示されなくなります。android:pageSizeCompat プロパティを使用するには、Android 16 SDK を使用してアプリをコンパイルします。
パフォーマンス、信頼性、安定性を最大限に高めるには、アプリを 16 KB アライメントにする必要があります。詳しくは、16 KB メモリページをサポートするようにアプリを更新する方法に関する最新のブログ投稿をご覧ください。
ユーザー エクスペリエンスとシステム UI
Android 16(API レベル 36)には、より一貫性のある直感的なユーザー エクスペリエンスを実現するための次の変更が含まれています。
ユーザー補助の妨げとなるアナウンスのサポート終了
Android 16 废弃了无障碍功能通告,其特征是使用 announceForAccessibility 或调度 TYPE_ANNOUNCEMENT 无障碍功能事件。这可能会给 TalkBack 和 Android 屏幕阅读器用户带来不一致的用户体验,而替代方案可以更好地满足各种 Android 辅助技术的用户需求。
替代方案示例:
- 对于窗口更改等重大界面更改,请使用
Activity.setTitle(CharSequence)和setAccessibilityPaneTitle(java.lang.CharSequence)。在 Compose 中,使用Modifier.semantics { paneTitle = "paneTitle" } - 如需向用户告知关键界面的更改,请使用
setAccessibilityLiveRegion(int)。在 Compose 中,请使用Modifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}。应谨慎使用这些事件,因为它们可能会在每次更新视图时生成通知。 - 如需向用户发送错误通知,请发送类型为
AccessibilityEvent#CONTENT_CHANGE_TYPE_ERROR的AccessibilityEvent并设置AccessibilityNodeInfo#setError(CharSequence),或使用TextView#setError(CharSequence)。
已废弃的 announceForAccessibility API 的参考文档中包含有关建议替代方案的更多详细信息。
3 ボタン ナビゲーションのサポート
Android 16 では、予測型「戻る」に適切に移行したアプリの 3 ボタン ナビゲーションに、予測型「戻る」のサポートが追加されています。戻るボタンを長押しすると、予測型「戻る」アニメーションが開始され、戻るスワイプで移動する先のプレビューが表示されます。
この動作は、システム アニメーション(ホームに戻る、タスク間、アクティビティ間)など、予測型「戻る」アニメーションをサポートするシステムのすべての領域に適用されます。
テーマ別アプリアイコンの自動設定
从 Android 16 QPR 2 开始,Android 会自动将主题应用于应用图标,以打造一致的主屏幕体验。如果应用未提供自己的带主题的应用图标,就会发生这种情况。应用可以通过在自适应图标中添加单色图层来控制主题化应用图标的设计,并在 Android Studio 中预览应用图标的外观。
デバイス フォーム ファクタ
Android 16(API レベル 36)には、仮想デバイスの所有者がディスプレイに投影するアプリに対して次の変更が含まれています。
仮想デバイスの所有者によるオーバーライド
虚拟设备所有者是创建和管理虚拟设备的可信应用或特权应用。虚拟设备所有者在虚拟设备上运行应用,然后将应用投影到远程设备的显示屏上,例如个人电脑、虚拟现实设备或车载信息娱乐系统。虚拟设备所有者使用的是本地设备,例如手机。
按应用替换项
在搭载 Android 16(API 级别 36)的设备上,虚拟设备所有者可以替换其管理的特定虚拟设备上的应用设置。例如,为了改进应用布局,虚拟设备所有者在将应用投影到外部显示屏上时,可以忽略屏幕方向、宽高比和可调整大小性限制。
常见的重大更改
Android 16 的行为可能会影响应用在汽车显示屏或 Chromebook 等大屏幕设备规格上的界面,尤其是那些专为竖屏小显示屏设计的布局。如需了解如何让应用适应所有设备类型,请参阅关于自适应布局。
参考
セキュリティ
Android 16(API レベル 36)には、システム セキュリティを強化して、悪意のあるアプリからアプリとユーザーを保護するための変更が含まれています。
Intent リダイレクト攻撃に対するセキュリティの強化
Android 16 针对一般的 Intent 重定向攻击提供了默认安全性,并且只需要最低限度的兼容性和开发者更改。
我们引入了默认安全加固解决方案,以应对 Intent 重定向漏洞。在大多数情况下,正常使用 intent 的应用不会遇到任何兼容性问题;我们在整个开发过程中收集了指标,以监控哪些应用可能会出现中断。
Intent 重定向在 Android 中出现,当攻击者可以部分或完全 控制用于在存在漏洞的应用上下文中启动新组件的 intent 内容时,而受害应用会在 intent 的 extra 字段中启动不受信任的子级 intent。这可能会导致攻击者应用在受害应用的上下文中启动私有组件、触发特权操作或获取对敏感数据的 URI 访问权限,从而可能导致数据窃取和任意代码执行。
选择停用 intent 重定向处理
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 秒から延長され、検索中にユーザーがいつでもデバイス検出を停止できるようになりました。検索開始から 20 秒以内に 1 台以上のデバイスが検出されると、CDM は追加のデバイスの検索を停止します。
接続
Android 16(API レベル 36)には、周辺機器との接続を改善するために Bluetooth スタックに次の変更が含まれています。
ペア設定の解除処理の改善
Android 16 以降、Bluetooth スタックが更新され、リモート ボンディングの損失が検出されたときのセキュリティとユーザー エクスペリエンスが改善されました。以前は、システムが自動的にボンディングを削除し、新しいペア設定プロセスを開始していたため、意図しない再ペア設定が発生する可能性がありました。多くのアプリで、債券の損失イベントが一貫した方法で処理されていないことが確認されています。
エクスペリエンスを統一するため、Android 16 ではシステムへのボンディング損失の処理が改善されました。以前にペア設定した Bluetooth デバイスを再接続時に認証できなかった場合、システムはリンクを切断し、ローカルのペア設定情報を保持します。また、ペア設定が解除されたことをユーザーに通知し、ペア設定をやり直すよう求めるシステム ダイアログを表示します。