これまでのリリースと同様、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 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 つの方法が用意されています。システムが仲介するプライバシー保護デバイス選択ツールを採用して権限プロンプトをスキップするか、実行時にこの新しい権限を明示的にリクエストしてローカル ネットワーク通信を維持します。
詳しくは、ローカル ネットワークの権限のドキュメントをご覧ください。
物理デバイスからパスワードを非表示にする
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 では、デバイスとアプリのセキュリティが次のように改善されています。
アクティビティのセキュリティ
Android 17 では、プラットフォームは「デフォルトで安全」なアーキテクチャへの移行を継続し、フィッシング、インタラクション ハイジャック、混乱した代理攻撃などの重大度の高いエクスプロイトを軽減するように設計された一連の機能強化が導入されています。このアップデートでは、アプリの互換性とユーザーの保護を維持するために、デベロッパーが新しいセキュリティ標準を明示的に有効にする必要があります。
デベロッパーへの主な影響は次のとおりです。
- BAL の強化とオプトインの改善: 保護を
IntentSenderに拡張することで、バックグラウンド アクティビティの起動(BAL)の制限を強化しています。デベロッパーは、以前のMODE_BACKGROUND_ACTIVITY_START_ALLOWED定数から移行する必要があります。代わりに、MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLEなどのきめ細かい制御を採用する必要があります。これにより、呼び出し元アプリが表示されているシナリオにアクティビティの開始が制限され、攻撃対象領域が大幅に縮小されます。 - 導入ツール: デベロッパーは、厳格モードと更新された lint チェックを利用して、以前のパターンを特定し、将来のターゲット SDK の要件に対応できるようにする必要があります。
デフォルトで 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() の動作の一貫性
Android 17(API レベル 37)をターゲットとするアプリでは、RFCOMM ベースの BluetoothSocket から取得した InputStream の read() メソッドにおいて、ソケットが閉じられたときや接続が切断されたときに -1 を返すようになりました。
この変更により、RFCOMM ソケットの動作が LE CoC ソケットと一貫性を持つようになり、ストリームの終わりに達したときに -1 が返されることを示す標準の InputStream.read() ドキュメントと整合性が取れるようになります。
IOException をキャッチして読み取りループから抜け出すことにのみ依存しているアプリは、この変更の影響を受ける可能性があります。BluetoothSocket の読み取りループを更新して、-1 の戻り値を明示的にチェックする必要があります。これにより、リモート デバイスが切断されたときやソケットが閉じられたときに、ループが正しく終了します。推奨される実装の例については、Bluetooth データを転送するガイドのコード スニペットをご覧ください。