動作の変更点: API レベル 28 以降をターゲットとするアプリ

Android 9(API レベル 28)では、Android システムにいくつかの変更が加えられています。以下の動作変更は、API レベル 28 以降をターゲットとするアプリにのみ適用されます。targetSdkVersion を API レベル 28 以降に設定するアプリは、必要に応じてアプリを変更して、上記の動作を適切にサポートする必要があります。

Android 9 で実行されるすべてのアプリに影響する変更については、対象となる API レベルに関係なく、動作の変更点: すべてのアプリをご覧ください。

フォアグラウンド サービス

Android 9 以降をターゲットとし、フォアグラウンド サービスを使用するアプリは、FOREGROUND_SERVICE 権限をリクエストする必要があります。これは標準の権限であるため、リクエスト元のアプリに自動的に付与されます。

Android 9 以降をターゲットとするアプリが FOREGROUND_SERVICE をリクエストせずにフォアグラウンド サービスを作成しようとすると、システムは SecurityException をスローします。

プライバシーの変更点

Android 9 をターゲットとするアプリの場合は、次の動作変更に留意してください。デバイスのシリアル番号と DNS 情報を更新することで、ユーザーのプライバシーが強化されます。

ビルドシリアル番号のサポートの終了

Android 9 では、ユーザーのプライバシーを保護するため、Build.SERIAL は常に "UNKNOWN" に設定されます。

アプリでデバイスのハードウェア シリアル番号にアクセスする必要がある場合は、代わりに READ_PHONE_STATE 権限をリクエストしてから getSerial() を呼び出す必要があります。

DNS プライバシー

Android 9 をターゲットとするアプリでは、プライベート DNS API を尊重する必要があります。特に、システム リゾルバが DNS-over-TLS を実行している場合、組み込み DNS クライアントは、システムと同じホスト名への暗号化された DNS を使用するか、システム リゾルバを優先して無効にする必要があります。

フレームワーク セキュリティの変更

Android 9 には、アプリのセキュリティを向上させる動作の変更がいくつか含まれていますが、この変更が有効になるのは、アプリが API レベル 28 以降をターゲットとしている場合のみです。

デフォルトで有効になっているネットワーク TLS

Android 9 以降をターゲットとするアプリの場合、isCleartextTrafficPermitted() メソッドはデフォルトで false を返します。アプリで特定のドメインに対してクリアテキストを有効にする必要がある場合は、アプリのネットワーク セキュリティ構成で、そのドメインの cleartextTrafficPermitted を明示的に true に設定する必要があります。

プロセスで分けられたウェブベース データ ディレクトリ

Android 9 ではアプリの安定性とデータの整合性を高めるため、アプリが複数のプロセス間で単一の WebView データ ディレクトリを共有することはできません。通常、このようなデータ ディレクトリには、ウェブ ブラウジングに関連する Cookie、HTTP キャッシュ、その他の永続および一時ストレージが格納されます。

ほとんどの場合、アプリは android.webkit パッケージのクラス(WebViewCookieManager など)を 1 つのプロセスでのみ使用する必要があります。たとえば、WebView を使用するすべての Activity オブジェクトを同じプロセスに移動する必要があります。アプリの他のプロセスで disableWebView() を呼び出すと、「1 つのプロセスのみ」ルールをより厳密に適用できます。この呼び出しにより、依存ライブラリから呼び出された場合でも、他のプロセスで WebView が誤って初期化されることを防止できます。

アプリが複数のプロセスで WebView のインスタンスを使用する必要がある場合は、WebView.setDataDirectorySuffix() メソッドを使用して、そのプロセスで WebView の特定のインスタンスを使用する前に、プロセスごとに一意のデータ ディレクトリのサフィックスを割り当てる必要があります。この方法では、各プロセスのウェブデータをアプリのデータ ディレクトリ内の専用のディレクトリに配置します。

アプリ別の SELinux ドメイン

Android 9 以降をターゲットとするアプリは、ワールドアクセス可能な Unix 権限を使用して他のアプリとデータを共有できません。この変更により、Android アプリ サンドボックスの整合性が向上し、特に、アプリの個人データにはそのアプリのみがアクセスできるという要件が改善されます。

他のアプリとファイルを共有するには、コンテンツ プロバイダを使用します。

接続の変更

接続データのカウントとマルチパス

Android 9 以降をターゲットとするアプリでは、現在デフォルトではないネットワークのネットワーク トラフィック(デバイスが Wi-Fi に接続されているときのセル トラフィックなど)がカウントされ、そのトラフィックをクエリする NetworkStatsManager クラスのメソッドが提供されます。

特に、getMultipathPreference() は上記のネットワーク トラフィックに基づいて値を返すようになりました。Android 9 以降では、このメソッドは、モバイルデータに対しては true を返しますが、1 日に一定量以上のトラフィックが蓄積すると、false を返すようになります。Android 9 で実行されるアプリは、このヒントを尊重してメソッドを呼び出す必要があります。

ConnectivityManager.NetworkCallback クラスが VPN に関する情報をアプリに送信するようになりました。この変更により、同期呼び出しと非同期呼び出しを混在させたり、制限された API を使用したりする必要なく、アプリで接続イベントをリッスンすることがはるかに簡単になります。また、デバイスが複数の Wi-Fi ネットワークまたは複数のモバイル ネットワークに同時に接続されている場合、情報転送が想定どおりに機能することを意味します。

Apache HTTP クライアントのサポートの終了

Android 6.0 で、Apache HTTP クライアントのサポートが削除されました。Android 9 以降、このライブラリはブート クラスパスから削除され、デフォルトではアプリで使用できません。

Android 9 以降をターゲットとするアプリでは、Apache HTTP クライアントを引き続き使用するために、AndroidManifest.xml に以下を追加できます。

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

アプリでは、Apache ランタイム ライブラリを使用する代わりに、APK に独自のバージョンの org.apache.http ライブラリをバンドルできます。これを行う場合は、ランタイムで提供されるクラスとのクラス互換性の問題を回避するために、(Jar Jar などのユーティリティを使用して)ライブラリを再パッケージ化する必要があります。

UI の変更

View のフォーカス

面積が 0 のビュー(幅または高さが 0)はフォーカス不可となりました。

また、タッチモードでは、アクティビティは初期フォーカスを暗黙的に割り当てなくなりました。代わりに、必要に応じて、ユーザーが明示的に初期フォーカスをリクエストします。

CSS RGBA 16 進値の処理

Android 9 以降をターゲットとするアプリでは、4 桁と 8 桁の 16 進数 CSS 色を処理するために、ドラフト CSS Color Module Level 4 動作を有効にする必要があります。

Chrome ではリリース 52 以降、CSS カラー モジュール レベル 4 がサポートされていますが、現在 WebView ではこの機能が無効になっています。これは、既存の Android アプリの Android の順序付け(ARGB)に 32 ビットの 16 進数色が含まれ、レンダリング エラーの原因となるためです。

たとえば、現在、API レベル 27 以前をターゲットとするアプリでは、WebView#80ff8080 という色が不透明な薄い赤(#ff8080)としてレンダリングされます。現在、先頭のコンポーネント(Android によってアルファ コンポーネントとして解釈される)は無視されます。API レベル 28 以降をターゲットとしているアプリの場合、#80ff8080 は透明度 50% のライトグリーン(#80ff80)として解釈されます。

ファイルの MIME タイプ スニッフィング: URI

Android 9 より前のバージョンの Android では、ファイル コンテンツから MIME タイプを推測できました。Android 9(API レベル 28)以降のアプリでは、WebViewfile: URI を読み込む際に、正しいファイル拡張子を使用する必要があります。

ファイルの内容から MIME タイプを推測することは、セキュリティ バグの原因となる可能性がありますが、最新のブラウザではこのような操作は通常認められていません。

.html.txt.js.css などの認識されているファイル拡張子を持つ場合、MIME タイプはその拡張子によって決まります。ファイルに拡張子がない場合や認識できない場合、MIME タイプは書式なしテキストになります。

たとえば、file:///sdcard/test.html のような URI は HTML としてレンダリングされますが、file:///sdcard/test のような URI は、ファイルに HTML データが含まれていても書式なしテキストとしてレンダリングされます。

ドキュメントのスクロール要素

Android 9 では、ドキュメントのルート要素がスクロール要素である場合を適切に処理します。以前のバージョンでは、スクロール位置は本文要素で設定され、ルート要素のスクロール値は 0 でした。Android 9 では、スクロール要素がルート要素である標準に準拠した動作が可能です。

また、document.body.scrollTopdocument.body.scrollLeftdocument.documentElement.scrollTopdocument.documentElement.scrollLeft に直接アクセスした場合の動作は、ターゲット SDK によって異なります。ビューポートのスクロール値にアクセスするには、document.scrollingElement を使用します(使用可能な場合)。

停止中のアプリからの通知

Android 9 より前では、停止中のアプリからの通知はキャンセルされていました。Android 9 以降、停止中のアプリからの通知は、アプリが再開されるまで非表示になります。