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

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

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

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

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

メモリ上限ウィジェット

Android 17 以降では、Android 17(API レベル 37)以上をターゲットとするアプリの場合、RemoteViews パーセル内の Bitmap と Icon の両方のメモリ使用量の合計に対して、厳しいメモリ上限(1.5 * 画面の幅 * 画面の高さ * 4)が適用されます。これらの上限を超えると、致命的な IllegalArgumentException がスローされ、アプリのプロセスがクラッシュします。

詳細については、UpdateAppWidget をご覧ください。

コア機能

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 物理キーボード入力のユーザー補助サポート

この機能では、CJKV 言語入力のスクリーン リーダーの音声フィードバックを強化するために、新しい AccessibilityEvent API と TextAttribute API が導入されています。CJKV IME アプリは、テキスト作成中にテキスト変換候補が選択されたかどうかを通知できるようになりました。編集フィールドのあるアプリは、テキスト変更のユーザー補助イベントを送信する際にテキスト変更タイプを指定できます。たとえば、アプリは、テキストの作成中にテキストの変更が発生したことや、テキストの変更がコミットの結果であることを指定できます。これにより、スクリーン リーダーなどのユーザー補助機能サービスは、テキストの変更の性質に基づいて、より正確なフィードバックを提供できます。

導入アプリ数

  • IME アプリ: 編集フィールドでテキストの作成を設定する際、IME は TextAttribute.Builder.setTextSuggestionSelected() を使用して、特定の変換候補が選択されたかどうかを示すことができます。

  • フィールドを編集できるアプリ: カスタム InputConnection を保持するアプリは、TextAttribute.isTextSuggestionSelected() を呼び出すことで候補選択データを取得できます。これらのアプリは、TYPE_VIEW_TEXT_CHANGED イベントをディスパッチする際に AccessibilityEvent.setTextChangeTypes() を呼び出す必要があります。標準の TextView を使用する Android 17(API レベル 37)をターゲットとするアプリでは、この機能はデフォルトで有効になります。(つまり、TextView は、IME からのデータの取得と、ユーザー補助サービスにイベントを送信する際のテキスト変更タイプの設定を処理します)。

  • ユーザー補助サービス: TYPE_VIEW_TEXT_CHANGED イベントを処理するユーザー補助サービスは、AccessibilityEvent.getTextChangeTypes() を呼び出して変更の性質を特定し、それに応じてフィードバック戦略を調整できます。

プライバシー

Android 17 では、ユーザーのプライバシーを強化するために、次のような変更が行われています。

ECH(Encrypted Client Hello)が有効

Android 17 では、暗号化 Client Hello(ECH)のプラットフォーム サポートが導入されています。これは、TLS handshake で Server Name Indication(SNI)を暗号化することでユーザーのプライバシーを強化する TLS 拡張機能です。この暗号化により、ネットワーク監視者がアプリが接続している特定のドメインを簡単に特定することを防ぐことができます。

Android 17(API レベル 37)以上をターゲットとするアプリの場合、TLS 接続に ECH が使用されます。ECH は、アプリで使用されるネットワーキング ライブラリ(HttpEngine、WebView、OkHttp など)に ECH サポートが統合されており、リモート サーバーも ECH プロトコルをサポートしている場合にのみ有効になります。ECH をネゴシエートできない場合、クライアントはランダム化されたコンテンツを含む ECH 拡張機能を送信します(ECH GREASE と呼ばれるメカニズム)。ECH GREASE の仕組みについて詳しくは、RFC 9849 をご覧ください。

アプリでこの動作をカスタマイズできるようにするため、Android 17 では、ネットワーク セキュリティ構成ファイルに新しい <domainEncryption> 要素が追加されています。デベロッパーは、<base-config> タグまたは <domain-config> タグ内で <domainEncryption> を使用して、グローバルまたはドメイン単位で ECH モード("enabled""disabled" など)を選択できます。

詳細については、暗号化されたクライアント Hello のドキュメントをご覧ください。

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

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

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

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

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

If an app targets Android 17 (API level 37) or higher and the user is using a physical input device (for example, an external keyboard), the Android operating system applies the new show_passwords_physical setting to all characters in the password field. By default, that setting hides all password characters.

The Android system shows the last-typed password character to help the user see if they mistyped the password. However, this is much less necessary with larger external keyboards. In addition, devices with external keyboards often have larger displays, which increases the danger of someone seeing the typed password.

If the user is using the device's touchscreen, the system applies the new show_passwords_touch setting.

標準の 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 User Consent API を使用するように移行する必要があります。

セキュリティ

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

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

In Android 17, the platform continues its shift toward a "secure-by-default" architecture, introducing a suite of enhancements designed to mitigate high-severity exploits such as phishing, interaction hijacking, and confused deputy attacks. This update requires developers to explicitly opt in to new security standards to maintain app compatibility and user protection.

Key impacts for developers include:

  • BAL hardening & improved opt-in: We are refining Background Activity Launch (BAL) restrictions by extending protections to IntentSender. Developers must migrate away from the legacy MODE_BACKGROUND_ACTIVITY_START_ALLOWED constant. Instead, you should adopt granular controls like MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE, which restricts activity starts to scenarios where the calling app is visible, significantly reducing the attack surface.
  • Adoption tools: Developers should utilize strict mode and updated lint checks to identify legacy patterns and ensure readiness for future target SDK requirements.

デフォルトで CT を有効化

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

Safer Native DCL—C

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

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

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

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

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 では、システム インテリジェンスが次のように変更されています。

setContentCaptureEnabled の非推奨

一部のデバイスでは、デバイス上の AI 機能が画面コンテンツを分析してインテリジェントなエクスペリエンスを提供できるように、コンテンツ キャプチャがデフォルトで有効になっています。

Android 17 以降では、ContentCaptureManager.setContentCaptureEnabled(boolean) API メソッドは非推奨になりました。Android 17(API レベル 37)以上をターゲットとするアプリでは、setContentCaptureEnabled(false) を呼び出してもコンテンツ キャプチャが無効にならなくなりました。

アプリでコンテンツ キャプチャを無効にし続ける必要がある場合や、システムによる画面コンテンツのキャプチャを制限する必要がある場合は、FLAG_SECURE ウィンドウ レイアウト パラメータの使用に移行する必要があります。

コンテンツ キャプチャを無効にするには、次の例のように、ウィンドウに FLAG_SECURE フラグを設定します。

Kotlin

window.setFlags(
    WindowManager.LayoutParams.FLAG_SECURE,
    WindowManager.LayoutParams.FLAG_SECURE
)

Java

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_SECURE,
    WindowManager.LayoutParams.FLAG_SECURE
);

詳細については、WindowManager.LayoutParams.FLAG_SECURE リファレンス ドキュメントをご覧ください。

メディア

Android 17 では、メディアの動作が次のように変更されています。

バックグラウンド音声の強化

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

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

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

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

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

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

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

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

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

接続

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

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

For apps targeting Android 17 (API level 37), the read() method of the InputStream obtained from an RFCOMM-based BluetoothSocket now returns -1 when the socket is closed or the connection is dropped.

This change makes RFCOMM socket behavior consistent with LE CoC sockets and aligns with the standard InputStream.read() documentation, which states that -1 is returned when the end of the stream is reached.

Apps that rely solely on catching an IOException to break out of a read loop may be impacted by this change and should update the BluetoothSocket read loops to explicitly check for a return value of -1. This ensures the loop terminates correctly when the remote device disconnects or the socket is closed. For an example of the recommended implementation, see the code snippet in the Transfer Bluetooth data guide.