これまでのリリースと同様、Android 17 には、アプリに影響する可能性がある動作変更が含まれています。下記の動作変更は、Android 17 以上をターゲットとするアプリにのみ適用されます。アプリが Android 17 以上をターゲットとする場合は、必要に応じてアプリを変更し、下記の動作に適切に対応できるようにしてください。
アプリの targetSdkVersion に関係なく、Android 17 で実行されるすべてのアプリに影響する動作変更のリストも必ずご確認ください。
コア機能
Android 17 では、Android システムのさまざまなコア機能を変更または拡張する以下の変更が含まれています。
MessageQueue の新しいロックフリー実装
Beginning with Android 17, apps targeting Android 17 (API level 37)
or higher receive a new lock-free implementation of
android.os.MessageQueue. The new implementation improves performance and
reduces missed frames, but may break clients that reflect on MessageQueue
private fields and methods.
For more information, including mitigation strategies, see MessageQueue behavior change guidance.
static final フィールドが変更不可になりました
Android 17(API レベル 37)以上をターゲットとする Android 17 以上で実行されているアプリは、static final フィールドを変更できません。アプリがリフレクションを使用して static final フィールドを変更しようとすると、IllegalAccessException が発生します。JNI API(SetStaticLongField() など)を使用してこれらのフィールドのいずれかを変更しようとすると、アプリがクラッシュします。
ユーザー補助
Android 17 では、ユーザー補助機能を改善するために次の変更が行われています。
複雑な IME 物理キーボード入力のユーザー補助サポート
この機能では、CJKV 言語入力のスクリーン リーダーの音声フィードバックを強化するために、新しい AccessibilityEvent と 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 では、TLS handshake で Server Name Indication(SNI)を暗号化してユーザーのプライバシーを強化する TLS 拡張機能である Encrypted Client Hello(ECH)のプラットフォーム サポートが導入されています。この暗号化により、ネットワーク監視者がアプリが接続している特定のドメインを簡単に特定することを防ぐことができます。
Android 17(API レベル 37)以上をターゲットとするアプリの場合、TLS 接続に ECH が機会的に使用されます。ECH は、アプリで使用されるネットワーキング ライブラリ(HttpEngine、WebView、OkHttp など)が ECH サポートを統合しており、リモート サーバーも ECH プロトコルをサポートしている場合にのみ有効になります。ECH をネゴシエートできない場合、接続は自動的に SNI 暗号化なしの標準 TLS ハンドシェイクにフォールバックします。
アプリでこの動作をカスタマイズできるようにするため、Android 17 では、ネットワーク セキュリティ構成ファイルに新しい <domainEncryption> 要素が追加されています。デベロッパーは、<base-config> タグまたは <domain-config> タグ内で <domainEncryption> を使用して、グローバルまたはドメイン単位で ECH モード("opportunistic"、"enabled"、"disabled" など)を選択できます。
詳細については、暗号化されたクライアント Hello のドキュメントをご覧ください。
Android 17 をターゲットとするアプリでローカル ネットワークの権限が必要に
Android 17 introduces the ACCESS_LOCAL_NETWORK runtime permission
to protect users from unauthorized local network access. Because this falls
under the existing NEARBY_DEVICES permission group, users who have already
granted other NEARBY_DEVICES permissions aren't prompted again. This new
requirement prevents malicious apps from exploiting unrestricted local network
access for covert user tracking and fingerprinting. By declaring and requesting
this permission, your app can discover and connect to devices on the local area
network (LAN), such as smart home devices or casting receivers.
Apps targeting Android 17 (API level 37) or higher now have two paths to maintain communication with LAN devices: Adopt system-mediated, privacy-preserving device pickers to skip the permission prompt, or explicitly request this new permission at runtime to maintain local network communication.
For more information, see the Local network permission documentation.
物理デバイスからパスワードを非表示にする
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.
セキュリティ
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 legacyMODE_BACKGROUND_ACTIVITY_START_ALLOWEDconstant. Instead, you should adopt granular controls likeMODE_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.)
Safer Native DCL—C
アプリが Android 17(API レベル 37)以降をターゲットとしている場合、Android 14 で導入された DEX ファイルと JAR ファイルの動的コードのより安全な読み込み(DCL)保護がネイティブ ライブラリにも適用されるようになりました。
System.load() を使用して読み込まれるネイティブ ファイルはすべて読み取り専用としてマークする必要があります。そうしないと、システムは UnsatisfiedLinkError をスローします。
アプリでは可能な限り、コードを動的に読み込まないようにすることをおすすめします。コードを動的に読み込むと、コード インジェクションやコードの改ざんによってアプリが不正使用されるリスクが大幅に高まります。
CP2 データビューで PII フィールドを制限する
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 チェックを適用する
Android 17(API レベル 37)以上をターゲットとするアプリの場合、READ_CONTACTS 権限なしで ContactsContract.Data テーブルにアクセスすると、連絡先プロバイダ 2(CP2)は厳格な SQL クエリ検証を適用します。
この変更により、アプリに READ_CONTACTS 権限がない場合、ContactsContract.Data テーブルをクエリするときに StrictColumns オプションと StrictGrammar オプションが設定されます。クエリでこれらのパターンと互換性のないパターンが使用されている場合、クエリは拒否され、例外がスローされます。
メディア
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_ALARMaudio streams.
For more information, including mitigation strategies, see Background audio hardening.
デバイスのフォーム ファクタ
Android 17 では、さまざまなデバイスサイズやフォーム ファクタでユーザー エクスペリエンスを向上させるために、以下の変更が加えられています。
大画面(sw>=600dp)での画面の向き、サイズ変更、アスペクト比の制約を無視するためのプラットフォーム API の変更
We introduced Platform API changes in Android 16 to ignore orientation, aspect ratio, and resizability restrictions on large screens (sw >= 600dp) for apps targeting API level 36 or higher. Developers have the option to opt out of these changes with SDK 36, but this opt-out will no longer be available for apps that target Android 17 (API level 37) or higher.
For more information, see Restrictions on orientation and resizability are ignored.
接続
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.