動作の変更点: 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 以降では、このライブラリは bootclasspath から削除されており、デフォルトではアプリで利用できません。

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

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

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

UI の変更

View のフォーカス

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

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

CSS RGBA 16 進値の処理

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

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

たとえば現在、API レベル 27 以下をターゲットとするアプリでは、色 #80ff8080WebView で不透明な明るい赤(#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 では、ドキュメントのルート要素がスクロール要素である場合を適切に処理します。以前のバージョンでは、スクロール位置は本文要素に設定され、ルート要素のスクロール値はゼロでした。Android 9 では標準に準拠した動作が有効になっており、スクロール要素がルート要素になります。

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

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

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