動作の変更点: 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 言語入力のスクリーン リーダーの音声フィードバックを強化するために、新しい 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 では、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.

物理デバイスからパスワードが非表示になった

アプリが Android 17(API レベル 37)以上を対象としており、ユーザーが物理入力デバイス(外部キーボードなど)を使用している場合、Android オペレーティング システムは、パスワード フィールドのすべての文字に新しい show_passwords_physical 設定を適用します。デフォルトでは、この設定によりすべてのパスワード文字が非表示になります。

Android システムは、ユーザーがパスワードを誤って入力したかどうかを確認できるように、最後に入力したパスワード文字を表示します。ただし、大型の外付けキーボードでは、この必要性は大幅に低くなります。また、外付けキーボードを備えたデバイスはディスプレイが大きいことが多く、入力したパスワードを誰かに見られる危険性が高まります。

ユーザーがデバイスのタッチスクリーンを使用している場合、システムは新しい show_passwords_touch 設定を適用します。

セキュリティ

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.)

より安全なネイティブ 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 では、さまざまなデバイスサイズとフォーム ファクタでユーザー エクスペリエンスを向上させるために次のように変更されています。

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

Android 16 では、API レベル 36 以降を対象とするアプリの場合、大画面(画面幅 >= 600 dp)での画面の向き、 アスペクト比、サイズ変更の制限を無視できるようプラットフォーム API に変更を加えました。デベロッパーは SDK 36 でこれらの変更をオプトアウトできますが、Android 17(API レベル 37)以降を対象とするアプリでは、このオプトアウトは使用できなくなります。

詳細については、画面の向きとサイズ変更の制限が 無視されるをご覧ください。