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

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

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

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

Android 9 以降をターゲットにするアプリは、フォアグラウンド サービスを使用する際に FOREGROUND_SERVICE パーミッションをリクエストする必要があります。 これは Normal パーミッションなので、リクエストしたアプリに自動で付与されます。

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 を使用しているか、システム リゾルバを優先するために、DNS クライアントが無効にされている必要があります。

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

Android 9 には、アプリのセキュリティを強化する動作の変更点がいくつか追加されていますが、これらの変更点は、アプリが API レベル 28 以降をターゲットにしている場合にのみ効果を発揮します。

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

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

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

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

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

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

注: setDataDirectorySuffix() を使用する場合でも、Cookie とその他のウェブデータはアプリのプロセスの境界をまたいで共有されません。 アプリの複数のプロセスが同じウェブデータにアクセスする必要がある場合は、デベロッパー自身がそれらのプロセス間でウェブデータをコピーする必要があります。 たとえば、getCookie()setCookie() を呼び出して、Cookie データを 1 つのプロセスから別のプロセスに手動で転送できます。

アプリ別の 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"/>

注: API レベルが 24 未満の端末では、org.apache.http.legacy ライブラリが利用できないため、23 以前の最小 SDK を使用しているアプリには android:required="false" 属性が必要です (これらの端末では、bootclasspath で Apache HTTP クラスが利用できます)。

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

UI の変更

View のフォーカス

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

また、Activity はタッチモードで暗黙的に初期フォーカスを指定することはできません。 代わりに、ご自身の判断で必要に応じて明示的に初期フォーカスを要求するようにしてください。

CSS RGBA 16 進値の処理

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

CSS Color Module Level 4 は、Chrome 52 からサポートされていますが、現在は WebView で無効になっています。これは、既存の Android アプリが Android のバイト順(ARGB)で 32 ビットの 16 進数色を含み、レンダリング エラーを引き起こす可能性があると判明したためです。

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

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

Android 9 では、ドキュメントのルート要素がスクロール要素である場合、適切な処理が実行されます。 前のバージョンでは、スクロール位置はボディ要素に設定されており、ルート要素のスクロール値は 0 でした。 Android 9 の動作は標準に準拠しており、スクロール要素はルート要素になります。

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

停止されたアプリからの通知

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