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

この機能では、CJKV 言語入力のスクリーン リーダーの音声フィードバックを強化するために、新しい AccessibilityEventTextAttribute 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 では、TLS handshake で Server Name Indication(SNI)を暗号化することでユーザーのプライバシーを強化する TLS 拡張機能である Encrypted Client Hello(ECH)のプラットフォーム サポートが導入されています。この暗号化により、ネットワーク監視者がアプリの接続先の特定のドメインを簡単に特定することを防ぐことができます。

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" など)を選択できます。

詳しくは、Encrypted Client Hello のドキュメントをご覧ください。

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

Android 17 引入了 ACCESS_LOCAL_NETWORK 运行时权限,以保护用户免遭未经授权的本地网络访问。由于此权限属于现有的 NEARBY_DEVICES 权限组,因此系统不会再次提示已授予其他 NEARBY_DEVICES 权限的用户。这项新要求可防止恶意应用利用不受限制的本地网络访问权限进行隐秘的用户跟踪和指纹识别。通过声明和请求此权限,您的应用可以发现并连接到局域网 (LAN) 中的设备,例如智能家居设备或投屏接收器。

以 Android 17(API 级别 37)或更高版本为目标平台的应用现在可以通过两种方式与 LAN 设备保持通信:采用系统介导的、可保护隐私的设备选择器来跳过权限提示,或者在运行时明确请求此新权限以保持本地网络通信。

如需了解详情,请参阅本地网络权限文档。

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

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 ユーザー同意 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 がデフォルトで有効になった

If an app targets Android 17 (API level 37) or higher, certificate transparency (CT) is enabled by default. (On Android 16, CT is available but apps had to opt in.)

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

If your app targets Android 17 (API level 37) or higher, the Safer Dynamic Code Loading (DCL) protection introduced in Android 14 for DEX and JAR files now extends to native libraries.

All native files loaded using System.load() must be marked as read-only. Otherwise, the system throws UnsatisfiedLinkError.

We recommend that apps avoid dynamically loading code whenever possible, as doing so greatly increases the risk that an app can be compromised by code injection or code tampering.

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

For apps targeting Android 17 (API level Android 17 (API level 37)) and higher, Contacts Provider 2 (CP2) restricts certain columns containing Personally Identifiable Information (PII) from the data view. When this change is enabled, these columns are removed from the data view to enhance user privacy. The restricted columns include:

Apps that are using these columns from ContactsContract.Data can extract them from ContactsContract.RawContacts instead, by joining with RAW_CONTACT_ID.

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

For apps targeting Android 17 (API level Android 17 (API level 37)) and higher, Contacts Provider 2 (CP2) enforces strict SQL query validation when the ContactsContract.Data table is accessed without READ_CONTACTS permission.

With this change, if an app doesn't have READ_CONTACTS permission, StrictColumns and StrictGrammar options are set when querying the ContactsContract.Data table. If a query uses a pattern that isn't compatible with these, it will be rejected and cause an exception to be thrown.

メディア

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

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

Beginning with Android 17, the audio framework enforces restrictions on background audio interactions including audio playback, audio focus requests, and volume change APIs to ensure that these changes are started intentionally by the user.

Some audio restrictions apply to all apps. However, the restrictions are more stringent if an app targets Android 17 (API level 37). If one of these apps interacts with audio while it is in the background, it must have a foreground service running. In addition, the app must meet one or both of these requirements:

  • The foreground service must have while-in-use (WIU) capabilities.
  • The app must have the exact alarm permission and be interacting with USAGE_ALARM audio streams.

For more information, including mitigation strategies, see Background audio hardening.

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

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

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

我们在 Android 16 中引入了平台 API 变更,以 忽略屏幕方向、 宽高比和尺寸调整能力限制(针对大型屏幕,sw >= 600dp),适用于面向 API 级别 36 或更高级别的应用。开发者可以选择使用 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.