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

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

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

コア機能

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

MessageQueue の新しいロックフリー実装

Android 17 以降、Android 17(API レベル 37)以上をターゲットとするアプリは、android.os.MessageQueue の新しいロックフリー実装を受け取ります。新しい実装ではパフォーマンスが向上し、フレーム落ちが減少しますが、MessageQueue のプライベート フィールドとメソッドを反映するクライアントが破損する可能性があります。

軽減策など、詳しくは、MessageQueue の動作変更に関するガイダンスをご覧ください。

static final フィールドが変更不可になった

Android 17(API レベル 37)以上をターゲットとする Android 17 以上で実行されているアプリは、static final フィールドを変更できません。アプリがリフレクションを使用して static final フィールドを変更しようとすると、IllegalAccessException が発生します。JNI API(SetStaticLongField() など)を使用してこれらのフィールドのいずれかを変更しようとすると、アプリがクラッシュします。

ユーザー補助

Android 17 では、ユーザー補助を改善するために以下の変更が行われています。

複雑な IME 物理キーボード入力のユーザー補助サポート

此功能引入了新的 AccessibilityEventTextAttribute API,以增强屏幕阅读器针对 CJKV 语言输入的语音反馈。CJKV IME 应用现在可以指示在文本撰写期间是否已选择文本转换候选内容。具有编辑字段的应用可以在发送文本更改无障碍事件时指定文本更改类型。例如,应用可以指定在文本撰写期间发生了文本更改,或者文本更改是由提交导致的。这样做可让屏幕阅读器等无障碍服务根据文本修改的性质提供更精确的反馈。

应用采用量

  • IME 应用:在编辑字段中设置正在撰写的文本时,IME 可以使用 TextAttribute.Builder.setTextSuggestionSelected() 来指明是否选择了特定的转换候选对象。

  • 具有“编辑字段”权限的应用:维护自定义 InputConnection 的应用可以通过调用 TextAttribute.isTextSuggestionSelected() 来检索候选选择数据。然后,这些应用在调度 TYPE_VIEW_TEXT_CHANGED 事件时应调用 AccessibilityEvent.setTextChangeTypes()。如果应用以 Android 17(API 级别 37)为目标平台,并使用标准 TextView,则默认启用此功能。(也就是说,TextView 将负责从 IME 检索数据,并在向无障碍服务发送事件时设置文本更改类型)。

  • 无障碍服务:处理 TYPE_VIEW_TEXT_CHANGED 事件的无障碍服务可以调用 AccessibilityEvent.getTextChangeTypes() 来识别修改的性质,并相应地调整其反馈策略。

プライバシー

Android 17 には、ユーザーのプライバシーを強化するために以下の変更が含まれています。

ECH(Encrypted Client Hello)が有効になった

Android 17 引入了对加密客户端问候 (ECH) 的平台支持。ECH 是一种 TLS 扩展,可通过加密 TLS 握手中的服务器名称指示 (SNI) 来增强用户隐私保护。这种加密有助于防止网络观察者轻松识别您的应用所连接的特定网域。

对于以 Android 17(API 级别 37)或更高版本为目标平台的应用,ECH 用于 TLS 连接。只有当应用使用的网络库(例如 HttpEngine、WebView 或 OkHttp)已集成 ECH 支持,并且远程服务器也支持 ECH 协议时,ECH 才会处于活跃状态。如果无法协商 ECH,客户端会发送一个包含随机内容的 ECH 扩展(一种称为 ECH GREASE 的机制)。如需详细了解 ECH GREASE 的工作原理,请参阅 RFC 9849

为了让应用能够自定义此行为,Android 17 向网络安全配置文件添加了一个新的 <domainEncryption> 元素。 开发者可以在 <base-config><domain-config> 标记中使用 <domainEncryption>,以全局或按网域的方式选择 ECH 模式(例如 "enabled""disabled")。

如需了解详情,请参阅加密客户端问候文档。

Android 17 をターゲットとするアプリにはローカル ネットワーク権限が必要

Android 17 では、ユーザーを不正なローカル ネットワーク アクセスから保護するために、ACCESS_LOCAL_NETWORK ランタイム権限 が導入されました。これは既存の NEARBY_DEVICES 権限グループに該当するため、他の NEARBY_DEVICES 権限をすでに付与しているユーザーには、再度権限の付与を求めるプロンプトは表示されません。この新しい要件により、悪意のあるアプリが、無制限のローカル ネットワーク アクセスを利用してユーザー トラッキングやフィンガープリント採取を密かに行うことを防ぐことができます。この権限を宣言してリクエストすることで、アプリはスマートホーム デバイスやキャスト レシーバーなどのローカル エリア ネットワーク(LAN)上のデバイスを検出して接続できます。

Android 17(API レベル 37)以降を対象とするアプリは、LAN デバイスとの通信を維持するためのパスが 2 つになりました。システムが仲介するプライバシー保護デバイス選択ツールを採用して権限の付与を求めるプロンプトをスキップするか、この新しい権限をランタイム時に明示的にリクエストしてローカル ネットワーク通信を維持します。

詳細については、ローカル ネットワーク権限のドキュメントをご覧ください。

物理デバイスからパスワードを非表示にする

アプリが Android 17(API レベル 37)以降を対象としていて、ユーザーが物理入力デバイス(外付けキーボードなど)を使用している場合、Android オペレーティング システムは、パスワード フィールドのすべての文字に新しい show_passwords_physical 設定を適用します。デフォルトでは、この設定によりすべてのパスワード文字が非表示になります。

Android システムは、ユーザーがパスワードを誤って入力したかどうかを確認できるように、最後に入力したパスワード文字を表示します。ただし、大型の外付けキーボードでは、この機能の必要性ははるかに低くなります。また、外付けキーボードを搭載したデバイスはディスプレイが大きいことが多く、入力したパスワードを誰かに見られる危険性が高まります。

ユーザーがデバイスのタッチスクリーンを使用している場合、システムは新しい show_passwords_touch 設定を適用します。

標準 SMS メッセージの OTP 保護

Android 17 以降、Android は SMS OTP 保護を拡張し、標準の SMS メッセージ(WebOTP または SMS Retriever 形式を使用しない OTP を含む SMS メッセージ)に適用します。Android 17(API レベル 37)以上をターゲットとするほとんどのアプリでは、これらの SMS メッセージは受信後 3 時間経過するまで利用できません。この遅延は、OTP のハイジャックを防ぐことを目的としています。3 時間の遅延の間、 SMS_RECEIVED_ACTION ブロードキャストは保留され、 SMS プロバイダ データベース クエリはフィルタリングされます。遅延後、これらのアプリで SMS メッセージを利用できるようになります。

デフォルトの SMS アシスタント アプリやコネクテッド デバイス コンパニオン アプリなど、一部のアプリは、この遅延の対象外です。OTP 抽出のために SMS メッセージの読み取りに依存するすべてのアプリは、引き続き機能するように、SMS Retriever API または SMS ユーザー同意 API を使用するように移行する必要があります。

セキュリティ

Android 17 では、デバイスとアプリのセキュリティが次のように改善されています。

アクティビティのセキュリティ

Android 17 では、プラットフォームは「デフォルトで安全」なアーキテクチャへの移行を継続し、フィッシング、インタラクション ハイジャック、混乱した代理攻撃などの重大なエクスプロイトを軽減するように設計された一連の機能強化が導入されています。このアップデートでは、アプリの互換性とユーザー保護を維持するために、デベロッパーが新しいセキュリティ標準を明示的にオプトインする必要があります。

デベロッパーへの主な影響は次のとおりです。

  • BAL の強化とオプトインの改善: バックグラウンド アクティビティ の起動(BAL)の制限を改良し、保護を IntentSender にまで拡大しています。 デベロッパーは、従来の MODE_BACKGROUND_ACTIVITY_START_ALLOWED 定数から移行する必要があります。代わりに、 アクティビティの開始が呼び出し元のアプリが表示されている場合に制限され、攻撃対象領域が大幅に縮小される MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLEなどのきめ細かい制御を採用する必要があります。
  • 採用ツール: デベロッパーは、厳格モードと更新された lint チェックを使用して、従来のパターンを特定し、今後のターゲット SDK の要件に対応できるようにする必要があります。

CT をデフォルトで有効にする

アプリが Android 17(API レベル 37)以上をターゲットとしている場合、証明書の透明性(CT)はデフォルトで有効になっています。(Android 16 では CT は利用可能ですが、アプリはオプトインする必要があります)。

より安全なネイティブ DCL - C

アプリが Android 17(API レベル 37)以降をターゲットとしている場合、Android 14 で導入された DEX ファイルと JAR ファイルの動的コードのより安全な読み込み(DCL)保護がネイティブ ライブラリにも適用されるようになりました。

System.load() を使用して読み込まれるネイティブ ファイルはすべて読み取り専用としてマークする必要があります。そうしないと、システムは UnsatisfiedLinkError をスローします。

アプリでは可能な限り、コードを動的に読み込まないようにすることをおすすめします。コードを動的に読み込むと、コード インジェクションやコードの改ざんによってアプリが不正使用されるリスクが大幅に高まります。

CP2 データビューで機密データのフィールドを制限する

对于以 Android 17(API 级别 Android 17(API 级别 37))及更高版本为目标平台的应用,联系人提供程序 2 (CP2) 会限制数据视图中包含某些个人身份信息 (PII) 的列。启用此变更后,这些列将从数据视图中移除,以增强用户隐私保护。 受限列包括:

如果应用正在使用 ContactsContract.Data 中的这些列,则可以通过与 RAW_CONTACT_ID 联接,改为从 ContactsContract.RawContacts 中提取这些列。

CP2 で厳格な SQL チェックを適用する

Android 17(API レベル 37)以上をターゲットとするアプリの場合、READ_CONTACTS 権限なしで ContactsContract.Data テーブルにアクセスすると、連絡先プロバイダ 2(CP2)は厳格な SQL クエリ検証を適用します。

この変更により、アプリに READ_CONTACTS 権限がない場合、ContactsContract.Data テーブルをクエリするときに StrictColumns オプションと StrictGrammar オプションが設定されます。クエリでこれらのパターンと互換性のないパターンが使用されている場合、クエリは拒否され、例外がスローされます。

メディア

Android 17 には、メディアの動作に関する以下の変更が含まれています。

バックグラウンド オーディオの強化

Android 17 以降では、オーディオ フレームワークは、オーディオ再生、音声フォーカス リクエスト、音量変更 API などのバックグラウンド オーディオ インタラクションに対する制限を適用し、これらの変更がユーザーによって意図的に開始されるようにします。

一部の音声制限はすべてのアプリに適用されます。ただし、アプリが Android 17(API レベル 37)をターゲットとしている場合、制限はより厳しくなります。これらのアプリのいずれかがバックグラウンドでオーディオを操作する場合は、フォアグラウンド サービスが実行されている必要があります。また、アプリは次の要件のいずれかまたは両方を満たす必要があります。

  • フォアグラウンド サービスには「使用中のみ許可」の機能が必要です。
  • アプリに正確なアラームの権限が付与されており、USAGE_ALARM 音声ストリームとやり取りしている必要があります。

軽減策など、詳しくは、バックグラウンド音声の強化をご覧ください。

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

Android 17 には、さまざまなデバイスサイズとフォーム ファクタでユーザー エクスペリエンスを向上させるための以下の変更が含まれています。

大画面(画面幅 600 dp 以上)での画面の向き、サイズ変更、アスペクト比の制約を無視するためのプラットフォーム API の変更

Android 16 では、API レベル 36 以上をターゲットとするアプリで大画面(sw >= 600dp)の画面の向き、アスペクト比、サイズ変更の制限を無視するためのプラットフォーム API の変更を導入しました。デベロッパーは SDK 36 でこれらの変更をオプトアウトできますが、Android 17(API レベル 37)以上をターゲットとするアプリでは、このオプトアウトは利用できなくなります。

詳しくは、向きとサイズ変更の制限が無視されるをご覧ください。

接続

Android 17 では、一貫性を高め、Bluetooth RFCOMM ソケットの標準 Java InputStream 動作に合わせるために、以下の変更が導入されています。

RFCOMM の BluetoothSocket read() 動作の一貫性

Android 17(API レベル 37)をターゲットとするアプリでは、RFCOMM ベースの BluetoothSocket から取得した InputStreamread() メソッドは、ソケットが閉じられたり接続が切断されたりすると、-1 を返すようになりました。

この変更により、RFCOMM ソケットの動作が LE CoC ソケットと一貫性を持つようになり、ストリームの終わりに達すると -1 が返されることを示す標準の InputStream.read() ドキュメントと整合性が取れるようになります。

IOException のキャッチのみに依存して読み取りループから抜け出すアプリは、この変更の影響を受ける可能性があります。BluetoothSocket の読み取りループを更新して、-1 の戻り値を明示的にチェックする必要があります。これにより、リモート デバイスが切断されたときやソケットが閉じられたときに、ループが正しく終了します。推奨される実装の例については、Bluetooth データを転送するガイドのコード スニペットをご覧ください。