動作の変更点: 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 を使用して、IP アドレスと同じホスト名を システム リゾルバを優先して無効にされます。

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

Android 9 では、いくつかの動作変更により、 ただし、これらの変更は、アプリが API レベルをターゲットとしている場合にのみ有効になります。 28 以上。

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

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

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

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

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

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

アプリ別の SELinux ドメイン

Android 9 以降をターゲットとするアプリでは、どこからでもアクセス可能な UNIX 権限を使用して他のアプリとデータを共有することができません。この変更により、Android アプリケーション サンドボックスの整合性が向上し、特に、アプリのプライベート データにはそのアプリのみがアクセスできるという要件が強化されています。

ファイルを他のアプリと共有するには、 プロバイダ

接続の変更

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

Android 9 以降をターゲットとするアプリ内では、 ネットワーク上のネットワーク トラフィック 現在のデフォルト以外のトラフィック(デバイスの電源が入っているときのモバイル トラフィックなど) あらゆるタイプの通信方法を提供します。 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 から削除されており、デフォルトではアプリで利用できません。

Apache HTTP クライアントを引き続き使用するには、Android 9 以降をターゲットとするアプリ 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 以降をターゲットとするアプリでは、ドラフトを有効にする必要があります CSS カラー モジュール レベル 4 4 桁および 8 桁の 16 進数 CSS カラーを処理する場合の動作です。

CSS カラー モジュール レベル 4 サポートされてきましたが、 現在、WebView でこの機能が無効になります 既存の Android アプリが 32 ビットの 16 進数色コードを含んでいることが判明したため (ARGB)に配置されていたため、レンダリング エラーが発生していました。

たとえば、色 #80ff8080 は現在、 opaque としての WebView API レベル 27 以下をターゲットとするアプリの場合、明るい赤色(#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 以降、停止中のアプリからの通知は、次の日付になるまで非表示になります。 アプリが再開します。