これまでのリリースと同様、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 物理キーボード入力のユーザー補助サポート
This feature introduces new AccessibilityEvent and TextAttribute
APIs to enhance screen reader spoken feedback for CJKV language input. CJKV IME
apps can now signal whether a text conversion candidate has been selected during
text composition. Apps with edit fields can specify text change types when
sending text changed accessibility events.
For example, apps can specify that a text change occurred during text
composition, or that a text change resulted from a commit.
Doing this enables accessibility
services such as screen readers to deliver more precise feedback based on the
nature of the text modification.
App adoption
IME Apps: When setting composing text in edit fields, IMEs can use
TextAttribute.Builder.setTextSuggestionSelected()to indicate whether a specific conversion candidate was selected.Apps with Edit Fields: Apps that maintain a custom
InputConnectioncan retrieve candidate selection data by callingTextAttribute.isTextSuggestionSelected(). These apps should then callAccessibilityEvent.setTextChangeTypes()when dispatchingTYPE_VIEW_TEXT_CHANGEDevents. Apps targeting Android 17 (API level 37) that use the standardTextViewwill have this feature enabled by default. (That is,TextViewwill handle retrieving data from the IME and setting text change types when sending events to accessibility services).Accessibility Services: Accessibility services that process
TYPE_VIEW_TEXT_CHANGEDevents can callAccessibilityEvent.getTextChangeTypes()to identify the nature of the modification and adjust their feedback strategies accordingly.
プライバシー
Android 17 では、ユーザーのプライバシーを強化するために、次のような変更が行われています。
ECH(Encrypted Client Hello)が有効
Android 17 introduces platform support for Encrypted Client Hello (ECH), a TLS extension that enhances user privacy by encrypting the Server Name Indication (SNI) in the TLS handshake. This encryption helps prevent network observers from easily identifying the specific domain your app is connecting to.
For apps targeting Android 17 (API level 37) or higher, ECH is used for TLS connections. ECH is active only if the networking library used by the app (for example, HttpEngine, WebView, or OkHttp) has integrated ECH support and the remote server also supports the ECH protocol. If ECH cannot be negotiated, the client sends an ECH extension with randomized contents (a mechanism called ECH GREASE). See RFC 9849 for more details on how ECH GREASE works.
To allow apps to customize this behavior, Android 17 adds a new
<domainEncryption> element to the Network Security Configuration file.
Developers can use <domainEncryption> within <base-config> or
<domain-config> tags to select an ECH mode (for example,
"enabled" or "disabled") on a global or per-domain basis.
For more information, see the Encrypted Client Hello documentation.
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 保護
Beginning with Android 17, Android is extending its SMS OTP protection
to apply to standard SMS messages (SMS messages containing an OTP that do not
use the WebOTP or SMS Retriever formats). For most apps targeting
Android 17 (API level 37) or higher, these SMS messages do not become
available until three hours after receipt. This delay is intended to help
prevent OTP hijacking. During this three hour delay, the
SMS_RECEIVED_ACTION broadcast is withheld and
SMS provider database queries are filtered. The SMS message is
available to these apps after the delay.
Certain apps such as the default SMS assistant app, connected device companion apps, etc., are exempted from this delay. All apps that rely on reading SMS messages for OTP extraction should transition to using SMS Retriever or SMS User Consent APIs to ensure continued functionality.
セキュリティ
Android 17 では、デバイスとアプリのセキュリティが次のように改善されています。
アクティビティのセキュリティ
Android 17 では、プラットフォームは「デフォルトで安全」なアーキテクチャへの移行を継続し、フィッシング、インタラクション ハイジャック、混乱した代理攻撃などの重大度の高いエクスプロイトを軽減するように設計された一連の機能強化が導入されています。このアップデートでは、アプリの互換性とユーザーの保護を維持するために、デベロッパーが新しいセキュリティ標準を明示的に有効にする必要があります。
デベロッパーへの主な影響は次のとおりです。
- BAL の強化とオプトインの改善: 保護を
IntentSenderに拡張することで、バックグラウンド アクティビティの起動(BAL)の制限を強化しています。デベロッパーは、以前のMODE_BACKGROUND_ACTIVITY_START_ALLOWED定数から移行する必要があります。代わりに、MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLEなどのきめ細かい制御を採用する必要があります。これにより、呼び出し元アプリが表示されているシナリオにアクティビティの開始が制限され、攻撃対象領域が大幅に縮小されます。 - 導入ツール: デベロッパーは、厳格モードと更新された lint チェックを利用して、以前のパターンを特定し、将来のターゲット SDK の要件に対応できるようにする必要があります。
デフォルトで 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 フィールドを制限する
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 では、メディアの動作が次のように変更されています。
バックグラウンド音声の強化
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 の変更
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.