動作の変更点: Android 17 以上をターゲットとするアプリ

これまでのリリースと同様、Android 17 には、アプリに影響する可能性がある動作変更が含まれています。下記の動作変更は、Android 17 以上をターゲットとするアプリにのみ適用されます。アプリが Android 17 以上をターゲットとする場合は、必要に応じてアプリを変更し、下記の動作に適切に対応できるようにしてください。

アプリの targetSdkVersion に関係なく、Android 17 で実行されるすべてのアプリに影響する動作変更のリストも必ずご確認ください。

コア機能

Android 17 では、Android システムのさまざまなコア機能を変更または拡張する以下の変更が含まれています。

MessageQueue の新しいロックフリー実装

Android 17 以降では、Android 17 以降をターゲットとするアプリは、android.os.MessageQueue の新しいロックフリー実装を受け取ります。新しい実装ではパフォーマンスが向上し、フレーム落ちが減少しますが、MessageQueue のプライベート フィールドとメソッドを反映するクライアントが破損する可能性があります。

軽減策など、詳しくは、MessageQueue の動作変更に関するガイダンスをご覧ください。

static final フィールドが変更不可になりました

Android 17 以上をターゲットとする 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 をターゲットとするアプリでは、この機能がデフォルトで有効になります。(つまり、TextView は、IME からデータを取得し、ユーザー補助サービスにイベントを送信する際にテキスト変更タイプを設定します)。

  • ユーザー補助サービス: TYPE_VIEW_TEXT_CHANGED イベントを処理するユーザー補助サービスは、AccessibilityEvent.getTextChangeTypes() を呼び出して変更の性質を特定し、それに応じてフィードバック戦略を調整できます。

セキュリティ

Android 17 では、デバイスとアプリのセキュリティが次のように改善されています。

アクティビティのセキュリティ

Android 17 では、プラットフォームは「デフォルトで安全」なアーキテクチャへの移行を継続し、フィッシング、インタラクション ハイジャック、混乱した代理攻撃などの重大な脆弱性を軽減するように設計された一連の機能強化が導入されています。このアップデートでは、アプリの互換性とユーザーの保護を維持するために、デベロッパーが新しいセキュリティ標準を明示的にオプトインする必要があります。

デベロッパーにとっての主な影響は次のとおりです。

  • BAL の強化とオプトインの改善: IntentSender への保護を拡張することで、バックグラウンド アクティビティの起動(BAL)の制限を強化しています。デベロッパーは、以前の MODE_BACKGROUND_ACTIVITY_START_ALLOWED 定数から移行する必要があります。代わりに、MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE などのきめ細かい制御を採用して、アクティビティの開始を呼び出し元のアプリが表示されているシナリオに制限し、攻撃対象領域を大幅に削減する必要があります。
  • 導入ツール: デベロッパーは、厳格モードと更新された lint チェックを利用して、以前のパターンを特定し、将来のターゲット SDK の要件に対応できるようにする必要があります。

localhost の保護

プラットフォームのセキュリティとユーザーのプライバシーを強化するため、Android 17 では新しいインストール時の権限 USE_LOOPBACK_INTERFACE が導入されています。この変更により、ループバック インターフェース(127.0.0.1::1 など)を介したアプリ間およびプロファイル間の通信が制限されます。この通信は、以前は INTERNET 権限で暗黙的に許可されていました。Android 17 以降をターゲットとするアプリの場合、次のルールが適用されます。

  • 相互の同意が必要: アプリ間およびプロファイル間の通信は、デフォルトでブロックされるようになりました。接続を成功させるには、送信側アプリと受信側アプリの両方が、マニフェストで USE_LOOPBACK_INTERFACE 権限を明示的に宣言する必要があります。
  • アプリ内トラフィックの除外: 同じアプリ内のループバック通信(アプリ内通信)は影響を受けず、この新しい権限は必要ありません。
  • ターゲット SDK の動作:
    • Android 17 以降をターゲットとするアプリ: 権限を明示的にリクエストする必要があります。欠落している場合、ソケット オペレーション(TCP 接続や UDP 送信など)は失敗し、通常は EPERM(オペレーションが許可されていない)エラーを返します。
    • アプリが API レベル 36 以下をターゲットとしている場合: 権限は INTERNET の分割権限として扱われます。低い API レベルをターゲットとするアプリは、INTERNET を保持している場合、この権限が自動的に付与されます。
  • 互換性に関する警告: 受信側アプリがターゲットを Android 17 に更新したにもかかわらず、この権限をリクエストしなかった場合、送信側アプリがより低い API レベルをターゲットにしている場合でも、他のアプリからの受信接続は拒否されます。

デフォルトで CT を有効化

アプリが Android 17 以降をターゲットとしている場合、証明書の透明性(CT)はデフォルトで有効になっています。(Android 16 では CT は利用可能ですが、アプリはオプトインする必要があります)。

Safer Native DCL—C

アプリが Android 17 以降をターゲットとしている場合、Android 14 で導入された DEX ファイルと JAR ファイルの動的コードのより安全な読み込み(DCL)保護が、ネイティブ ライブラリにも拡張されます。

System.load() を使用して読み込まれるすべてのネイティブ ファイルは、読み取り専用としてマークする必要があります。そうでない場合、システムは UnsatisfiedLinkError をスローします。

アプリでは可能な限り、コードを動的に読み込まないようにすることをおすすめします。コードを動的に読み込むと、コード インジェクションやコードの改ざんによってアプリが不正使用されるリスクが大幅に高まります。

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

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

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

Android 16 では、API レベル 36 以上をターゲットとするアプリで大画面(sw >= 600dp)の画面の向き、アスペクト比、サイズ変更の制限を無視するためのプラットフォーム API の変更を導入しました。デベロッパーは SDK 36 でこれらの変更をオプトアウトできますが、Android 17 以上をターゲットとするアプリでは、このオプトアウトは利用できなくなります。

詳しくは、向きとサイズ変更の制限が無視されるをご覧ください。