Android17の変更機能で、既存アプリで必ず対応が必要なものをリストアップしました。
変更内容と影響があるアプリ、また対応すべき内容をまとめてあります。
こちらを参照いただき開発アプリへの影響有無を確認後、必要に応じてアプリの改修を行ってください。
なお、GoogleからはAndroid17時点では変更されないもののAndroid18で変更される予定のものについても、アプリへの影響が大きいものについては事前アナウンスされています。影響がある場合は早めの対応を推奨します。
アプリへの影響が大きそうなものについては個別に深堀り調査し、別記事でまとめる予定です。
すべてのアプリ
| No. | カテゴリ | 変更内容 | 変更の概要 | 変更の詳細 | 影響があるアプリ | 対応方法、確認内容 |
|---|---|---|---|---|---|---|
| 1 | Core functionality | App memory limits | Android 17 では、デバイスの総 RAM に基づいてアプリのメモリ上限が導入される | アプリ利用できる最大メモリがデバイスの総RAMにより決定されるようになる。Android17時点では控えめに設定されている。 フォアグラウンドでのOOMやバックグラウンド遷移後のLowMemoryKillerによるアプリ終了が発生しやすくなる可能性あり。 |
すべてのアプリ 特に廉価版デバイスで動作させた場合 |
・ApplicationExitInfoを利用し、この変更により影響でアプリ終了が発生したかを確認する ・メモリのベストプラクティスに沿ったアプリ設計/実装に見直す |
| 2 | Security | usesClearTraffic deprecation plan |
Android 18でusesCleartextTraffic属性が 廃止される予定 |
Android18で、usesCleartextTraffic 要素は非推奨になる予定。暗号化されていない(HTTP)接続を行う必要があるアプリは、ネットワーク セキュリティ構成ファイルを使用するように移行する必要がある。 | usesCleartextTraffic属性を使用しているアプリ 開発環境につなぐときだけHTTP通信しているアプリで注意が必要 |
networkSecurityConfig属性でネットワーク・セキュリティ構成ファイルを使ったやり方に置き換える ※API 24以降で利用可能 |
| 3 | Security | Restrict implicit URI grants |
Android 18で - Send - SendMultiple - ImageCapture をアクションに指定している場合、Uriに権限付与が必要になる ※Android 17までは自動でREAD/WRITE権限がシステムから付与される |
現在、アプリが Send、SendMultiple、または ImageCapture のアクションを含む URI でインテントを起動すると、システムはターゲット アプリに読み取りと書き込みの URI 権限を自動的に付与している。この動作は Android 18 で変更される予定。そのため、アプリはシステムに付与を任せるのではなく、関連する URI 権限を明示的に付与する必要がある | ファイルの共有機能などで - Send - SendMultiple - ImageCapture のアクションでIntentを投げているアプリ |
共有対象Uriに事前に権限付与を実施するようにする 参考: URI ごとにアクセスを許可する |
| 4 | Security | Per-app keystore limits | Android Keystoreに鍵を保存する際、個数の上限に達していると例外を投げるようになった | Android 17 以降では、アプリが所有できる鍵の数に上限が設けられている。 ・システムアプリ:APIレベルによらず200,000個 ・非システムアプリでAndroid 16以下をターゲットとするアプリ:200,000個 ・非システムアプリでAnroid17以上をターゲットとするアプリ:50,000 個 |
Android Keystoreに鍵を無制限に保存することが可能なアプリ | 鍵作成時の例外をキャッチし、ユーザーに「これ以上鍵を保存することはできません」といったメッセージを表示するようにする |
| 5 | User experience and system UI | Restoring default IME visibility after rotation | デバイスの構成変更時にIMEの可視性が復元されない | Android 17 以降では、デバイスの構成が変更されたとき(回転など)に、アプリ自体で処理されない場合、以前の IME の可視性は復元されなくなる | デバイスの構成変更時にIMEの可視性が復元されることを期待しているアプリ | 以下のような対応が必要 ・android:windowSoftInputMode=stateAlwaysVisibleにする ・onCreate()やonConfigrationChanged()でInputMethodManagerを利用して明示的にIMEを再表示する |
| 6 | Human input | Touchpads deliver relative events by default during pointer capture | ポインタキャプチャー&ユーザーがタッチパッドを使っているとき、デフォルトでマウスのように移動量が通知されるようになった | Android 17 以降では、アプリが View.requestPointerCapture() を使用してポインタ キャプチャをリクエストし、ユーザーがタッチパッドを使用している場合、システムはユーザーのタッチによるポインタの移動とスクロール ジェスチャーを認識し、キャプチャされたマウスのポインタとスクロール ホイールの移動と同じ方法でアプリに通知される。 | ユーザーがタッチパッド使用時に絶対座標を想定しているアプリ(例:お絵かきアプリ) | ポインタキャプチャー時に view.requestPointerCapture(View.POINTER_CAPTURE_MODE_ABSOLUTE) を呼ぶよう修正する |
| 7 | Media | Background audio hardening | Android 17ではバックグラウンドでの音声再生や音量変更が制限されるようになった | Android 17 以降では、以下ケース以外では音声の再生や操作ができなくなる ・フォアグラウンドで動作している ・SHORT_SERVICE 以外のフォアグラウンドサービスが実行されている さらにAndroid17をターゲットにしている場合、以下の条件が追加される ・ユーザ操作により開始されたフォアグラウンドサービスが実行されている ・正確なアラームの権限を取得していて、USAGE_ALARM属性の音声ストリームを操作する |
バックグラウンドで音声再生や音量変更を行おうとしているアプリ(例:BOOT_COMPLETEDでいきなり音声再生する) | フォアグラウンドサービスを利用して音声の再生・操作を行うよう変更する |
Android17をターゲットとするアプリ
| No. | カテゴリ | 変更内容 | 変更の概要 | 変更の詳細 | 影響があるアプリ | 対応方法、確認内容 |
|---|---|---|---|---|---|---|
| 1 | Core functionality | New lock-free implementation of MessageQueue | Android 17ではMessageQueueの実装が新しくなった | Android 17 以降をターゲットとするアプリでは、android.os.MessageQueue の新しいロックフリー実装(Deliqueue)が動作する。新しいMessageQueueではパフォーマンスが向上しフレーム落ちが減少するが、MessageQueue のプライベート フィールドとメソッドを利用できなくなり、一部のテストライブラリも動作しなくなる。 | 古いテストフレームワーク(Espresso / Robolectric)を使用しているアプリ MessageQueueのmMessageフィールドを監視しているアプリ |
・テストフレームワークを最新にする ・mMessageフィールドの監視を諦める(公式にも移行ガイド等無し) |
| 2 | Core functionality | Static final fields are now unmodifiable | Android 17ではJNI経由でのstatic finalフィールドの書き換えができなくなった | Android 17 以上をターゲットとするアプリは、static final フィールドを変更できない。 | JNI経由でstatic finalフィールドを書き換えているアプリ | クラッシュするので該当の処理を外す ※一般的にstatic finalフィールドの書き換えはやらないはず |
| 3 | Accessibility | Accessibility support of complex IME physical keyboard typing | Android 17でアクセシビリティ用のIMEに関するメソッドが追加された 入力内容が変換候補によるものかの判別ができるようになり、その旨をアクセシビリティサービスに通知できるようになった |
CJKV 言語入力のスクリーン リーダーの音声フィードバックを強化するために、新しい AccessibilityEvent API と TextAttribute API が導入されている | 独自でInputConnectionを実装しているアプリ | textAttribute.isTextSuggestionSelectedで変換候補が選択されたことがわかったら AccessibilityEvent.setTextChangeTypes()で適切な変更種別をアクセシビリティサービスに通知する |
| 4 | Privacy | Local network permission required for apps targeting Android 17 | Android 17ではローカルネットワークへの通信はINTERNETパーミッションに加え ACCESS_LOCAL_NETWORK の権限も必要になった |
Android 17 では、不正なローカル ネットワーク アクセスからユーザーを保護するために、ACCESS_LOCAL_NETWORK ランタイム権限が導入されている。 | ローカルネットワークに対する通信を行っているアプリ(SSDP, mDNPなど) | AndroidManifest.xmlにACCESS_LOCAL_NETWORKの権限を追加しユーザに許諾をとる ※NEARBY_DEVICESグループの権限を取得済みであれば取得不要 |
| 5 | Privacy | Localhost (127.0.0.1) permission required for apps targeting Android 17 | Android 17ではローカルネットワークへの通信はINTERNETパーミッションに加えUSE_LOOPBACK_INTERFACE の権限も必要になった | Android 17 では、localhost / loopback 通信(127.0.0.1 や ::1)を悪用したアプリ間通信を制限し、プライバシーとサンドボックス分離を強化するため、USE_LOOPBACK_INTERFACE 権限が導入されている。 | ローカルホスト経由でデータのやり取りをするアプリ | ローカルホスト通信を行うアプリは相互にAndroidManifest.xmlにUSE_LOOPBACK_INTERFACE の権限を追加する ※同一アプリ内のローカルホスト通信であれば不要 |
| 6 | Security | Activity Security | Android 17ではバックグラウンドアクティビティを起動する際の制御がより細かくなった | BAL の強化とオプトインの改善: IntentSender への保護を拡張することで、バックグラウンド アクティビティの起動(BAL)の制限を強化してる。デベロッパーは、以前の MODE_BACKGROUND_ACTIVITY_START_ALLOWED 定数から移行する必要がある。 既存の定数の代わりに、MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE などのきめ細かい制御を採用して、アクティビティの開始を呼び出し元のアプリが表示されているシナリオに制限し、攻撃対象領域を大幅に削減する必要がある。 |
バックグラウンドからのアクティビティ起動を行っているアプリ | アクティビティ起動を許可するオプション定数の差し替えが必要 |
| 7 | Security | Enable CT by default | Android 17では certificate transparency (CT)がデフォルトで有効になった | アプリが Android 17 以降をターゲットとしている場合、証明書の透明性(CT)はデフォルトで有効になっている。 | 公開CA証明書を使っているが CT ログ登録されていない証明書を配布しているアプリ/サーバ | サーバ証明書がCT対応している確認し、必要に応じで更新 |
| 8 | Security | Safer Native DCL—C | Android 17ではSystem.load()でネイティブライブラリ読み込み時、対象がread-onlyでないとクラッシュするようになった | System.load() を使用して読み込まれるすべてのネイティブ ファイルは、読み取り専用としてマークする必要がある。そうでない場合、システムは UnsatisfiedLinkError をスローする。 | System.load()を使ってライブラリを読み込んでいるアプリ | 読み込み前に属性をread-onlyにする |
| 9 | Device form factors | Platform API changes to ignore orientation, resizability and aspect ratio constraints on large screens (sw>=600dp) | Android 17ではタブレット時(sw600dp以上)、画面の向き固定や アスペクト比の制限ができなくなった ※Android 16ではオプトアウトできた機能 |
Android 16 では、API レベル 36 以上をターゲットとするアプリで大画面(sw >= 600dp)の画面の向き、アスペクト比、サイズ変更の制限を無視するためのプラットフォーム API の変更を導入した。 デベロッパーは SDK 36 でこれらの変更をオプトアウトできたが、Android 17 以上をターゲットとするアプリでは、このオプトアウトは利用できなくなる。 |
タブレットを対象としており、画面の向きを固定していたりするアプリ | タブレットで実行し、画面表示が崩れたり画面回転時にクラッシュしたりしないかを確認する |
| 10 | Performance | restricting the size of custom notification views | システムのメモリ使用量を削減するため、カスタム通知ビューのメモリサイズが制限された | カスタム通知ビューで大きいメモリを利用しようとすると、RemoteViewの描画でエラーになり通知ビューが空で表示される | カスタム通知ビューを利用しているアプリ | カスタム通知ビューに表示する内容を見直し、メモリ使用量を削減する |