Android 8.0 の動作の変更点

新機能に加え、Android 8.0(API レベル 26)では には、システムと API の動作に関するさまざまな変更が含まれます。このドキュメント 把握および考慮しておくべき主な変更点が 選択できます。

これらの変更のほとんどは、 ターゲットとする Android。ただし、アプリ ターゲティングにのみ影響する変更もあります。 Android 8.0。わかりやすくするために ページは、すべてのアプリに関する変更アプリ ターゲティングに関する変更の 2 つのセクションに分かれています。 Android 8.0

すべてのアプリ向けの変更

これらの動作変更は、次の場合、すべてのアプリに適用されます。 Android 8.0(API レベル 26)プラットフォームで動作する API レベルを指定します。すべてのデベロッパーが それらの変更を適切にサポートするようにアプリを修正し、 確認してください。

バックグラウンド実行の上限

Android 8.0(API レベル 26)で導入された変更の一つとして、 バッテリーを長持ちさせるため、 キャッシュ済み アクティブな状態では コンポーネント システムが保持しているすべてのウェイクロックを解放する。

さらに、デバイスのパフォーマンスを向上させるため、 フォアグラウンドで実行されていないアプリによる動作詳細は以下のとおりです。

  • バックグラウンドで実行されているアプリの速度に制限が課されるようになりました バックグラウンド サービスにアクセスできます。
  • アプリはマニフェストを使用してほとんどの暗黙的ブロードキャストを登録できない (つまり、特定のアプリを対象としていないブロードキャスト)。

デフォルトでは、これらの制限は O を対象とするアプリにのみ適用されます。ただし、 ユーザーは [設定] 画面からアプリに対してこれらの制限を有効にできます。 ターゲットにしなくてもかまいません

Android 8.0(API レベル 26)では、特定のメソッドに対して以下の変更も行われています。

  • startService() メソッドは アプリの場合 IllegalStateException Android 8.0 をターゲットとする場合は、その方法の使用が試行されます。 バックグラウンド サービスの作成が許可されていない状況で使用する。
  • 新しい Context.startForegroundService() メソッドは、 使用します。システムがアプリを許可する アプリが使用中の場合でも Context.startForegroundService() を呼び出す 確認できます。ただし、アプリはそのサービスの startForeground() メソッドを呼び出す必要があります。 作成されます。

詳細については、次をご覧ください: バックグラウンド実行制限

Android のバックグラウンドでの位置情報の制限

バッテリー、ユーザー エクスペリエンス、システムの健全性を維持するには、 バックグラウンド アプリをデバイスで使用している場合、位置情報の更新を受信する頻度が低くなる ダウンロードしますこの動作変更はすべてのアプリに影響します Google Play 開発者サービスなど、位置情報の更新を受信するアプリ

これらの変更は、次の API に影響します。

  • Fused Location Provider(FLP)
  • ジオフェンス
  • GNSS の測定
  • Location Manager
  • Wi-Fi Manager

アプリが想定どおりに動作することを確認するには、次の手順を行います。

  • アプリのロジックを見直して、最新の場所を使用していることを確認する API
  • 各使用で期待される動作をアプリが示すかテストする あります。
  • 次の使用を検討してください: 融合 Location Provider(FLP)またはジオフェンスを使用して、 ユーザーの現在地を表示します。

これらの変更の詳細については、 バックグラウンドでの位置情報 制限

アプリのショートカット

Android 8.0(API レベル 26)では、アプリ ショートカットが次のように変更されています。

  • com.android.launcher.action.INSTALL_SHORTCUT ブロードキャスト番号 アプリは非公開の暗黙的なリソースであるため、 あります。代わりに、Terraform Registry の requestPinShortcut() メソッド ShortcutManager クラスのメソッドを使用します。
  • ACTION_CREATE_SHORTCUT インテントで、アプリのショートカットを作成できるようになりました。 ShortcutManager クラス。このインテントでは やり取りしないレガシー ランチャー ショートカット ShortcutManager。以前は、このインテントは レガシー ランチャーのショートカットのみを作成します。
  • を使用して作成されたショートカット requestPinShortcut() アクティビティを処理するアクティビティで作成される ACTION_CREATE_SHORTCUT インテントが本格的なアプリ ショートカットになりました。これにより、アプリがそれらの機能を更新できるようになり、 ShortcutManager のメソッドを使用します。
  • 従来のショートカットは、以前のバージョンの ただし、アプリ内で手動でアプリのショートカットに変換する必要があります。

アプリのショートカットの変更について詳しくは、 固定ショートカットと ウィジェット機能ガイドをご覧ください。

ロケールと国際化

Android 7.0(API レベル 24)では、 デフォルトの Category Locale を指定していましたが、一部の API では引き続き 汎用 Locale.getDefault() メソッド。引数なしで、デフォルトの DISPLAY カテゴリ ロケールを使用すべきでした。Android 8.0(API レベル 26)では、 以下のメソッドで Locale.getDefault(Category.DISPLAY) が使用されるようになりました Locale.getDefault() の代わりに次のようになります。

その他: Locale.getDisplayScript(Locale) Locale.getDefault() にフォールバックすると、 LocaledisplayScript 値が指定されている 使用していません。

ロケールと国際化に関連するその他の変更は次のとおりです。 次のようになります。

  • Currency.getDisplayName(null) を呼び出すと NullPointerException がスローされ、 動作が一致するようにしてください。
  • タイムゾーン名の解析方法が変更されました。以前は、 Android デバイスが起動時にサンプリングされたシステム クロック値を使用 日付の解析に使用されるタイムゾーン名をキャッシュに保存する時間 あります。その結果、システムでエラーが発生すると、解析に悪影響が クロックが起動時や他のまれなケースで間違っていた。

    一般的なケースでは、解析ロジックでは ICU と タイムゾーン名の解析時に現在のシステム クロック値を使用します。この より正確な結果が得られるため、 アプリで次のようなクラスを使用する場合の Android バージョン SimpleDateFormat

  • Android 8.0(API レベル 26)では、ICU のバージョンがバージョン 58 に更新されます。

アラート ウィンドウ

アプリが SYSTEM_ALERT_WINDOW を使用している場合 権限があり、次のいずれかのウィンドウ タイプを使用して、 他のアプリやシステム ウィンドウの上にアラート ウィンドウを表示します。

これらのウィンドウは常に TYPE_APPLICATION_OVERLAY ウィンドウ あります。Android 8.0(API レベル 26)をターゲットとするアプリの場合、 TYPE_APPLICATION_OVERLAY アラート ウィンドウを表示します。

詳細については、一般的なウィンドウ タイプに関するページ アラート ウィンドウセクション内の Android 8.0 がターゲットです

入力とナビゲーション

ChromeOS やその他の大型フォーム ファクタで Android アプリが登場したことで、 キーボードナビゲーションの使用が 再び活発化しており Android アプリ。Android 8.0(API レベル 26)では、 キーボードをナビゲーション入力デバイスとして使い、 矢印ベースとタブベースのナビゲーション用の予測可能なモデル

特に、要素のフォーカスに以下の変更を加えました。 動作:

  • フォーカス状態の色を定義していない場合は、 View オブジェクト(フォアグラウンドまたはバックグラウンド) ドローアブル)には、フレームワークでデフォルトのフォーカス ハイライト色が設定され、 View。このフォーカス ハイライトは、 おすすめします。

    View オブジェクトでこのデフォルトを使用しない場合 フォーカスを受けたらハイライト表示するには、 android:defaultFocusHighlightEnabled 属性を レイアウト XML ファイル内の falseView、または false を渡して アプリの UI ロジック内の setDefaultFocusHighlightEnabled()

  • キーボード入力が UI 要素のフォーカスにどのように影響するかをテストするには、 図形描画 >[レイアウト境界を表示する] 開発者向けオプション。Android の場合 8.0 を使用している場合、このオプションには「X」が表示されます。要素の上にカーソルを置いて、 焦点を当てます

また、Android 8.0 のすべてのツールバー要素が自動的に キーボード ナビゲーション クラスタ ナビゲーションバーとして 各ツールバー内外への移動が できます。

Google Chat 内でのキーボード ナビゲーションのサポートを改善する方法について詳しくは、 詳しくは、 キーボード ナビゲーション ガイドをご覧ください。

ウェブフォームの自動入力

Android の自動入力は Framework には、自動入力機能の組み込みサポートが備わっており、 WebView オブジェクトに関連する次のメソッドが変更されました Android 8.0(API レベル 26)を搭載しているデバイスにインストールされているアプリの場合:

WebSettings
  • getSaveFormData() メソッドは false を返すようになりました。以前、このメソッドは 代わりに true を使用してください。
  • 発信中 不参加 setSaveFormData() 人 効果はなくなります。
WebViewDatabase
  • 発信中 不参加 clearFormData() 人 効果はなくなります。
  • hasFormData() メソッド false が返されるようになりました。以前、このメソッドは フォームにデータが含まれていた場合は true

ユーザー補助

Android 8.0(API レベル 26)では、ユーザー補助機能が次のように変更されています。

  • ユーザー補助フレームワークでは、すべてのダブルタップ操作が ACTION_CLICK できます。この変更により、TalkBack は他のモデルと同じように ユーザー補助サービスも提供しています

    アプリの View オブジェクトがカスタム タッチを使用する場合 TalkBack でも動作することを確認する必要があります。もしかしたら、 必要な操作は、View を実行するクリック ハンドラを 使用されます。これらのデバイスで行われたジェスチャーが TalkBack で認識されない場合 View 個のオブジェクト、オーバーライド performAccessibilityAction()

  • ユーザー補助サービスでは、ユーザーが認識した ClickableSpan 個のインスタンス TextView オブジェクト。

アプリのユーザー補助機能を強化する方法について詳しくは、以下をご覧ください。 ユーザー補助

ネットワークと HTTP(S) 接続

Android 8.0(API レベル 26)では、動作が次のように変更されました。 HTTP(S) 接続:

  • 本文のない OPTIONS リクエストには Content-Length: 0 が含まれます。 できます。以前は Content-Length ヘッダーがありませんでした。
  • HttpURLConnection は、空のパスを含む URL を ホスト名または認証局名の後ろにスラッシュを付加します。たとえば、 http://example.comhttp://example.com/
  • ProxySelector.setDefault() で設定されたカスタム プロキシ セレクタ 要求された URL のアドレス(スキーム、ホスト、ポート)のみをターゲットにする。 そのため、プロキシの選択はこれらの値のみに基づいて行われる場合があります。URL カスタム プロキシ セレクタに渡される値に、リクエストされた URL が含まれていません。 クエリ パラメータ、フラグメントを指定できます。
  • URI に空のラベルを含めることはできません。

    以前、プラットフォームで空のラベルを受け入れるための回避策が URI の不正な使用法です。この回避策は 古い libcore リリースとの互換性API を使用するデベロッパー 誤って、ADB メッセージ「URI example..com has empty labels in 使用します。これは不正な形式であり、今後の Android ではサポートされません あります。 Android 8.0 では、この回避策が削除されています。システムは null を返します。

  • Android 8.0 の HttpsURLConnection 実装 安全でない TLS/SSL プロトコル バージョンのフォールバックは実行されません。
  • トンネリング HTTP(S) 接続の処理が次のように変更されました。 <ph type="x-smartling-placeholder">
      </ph>
    • 接続を介して HTTPS 接続をトンネリングする場合、 送信するときに、Host 行にポート番号(:443)が この情報を中間サーバーに送ります。これまでは CONNECT 行にのみ出現します。
    • システムからユーザー エージェントとプロキシ認証が送信されなくなる プロキシ サーバーへのトンネリング リクエストのヘッダー。

      プロキシ認証ヘッダーは、 プロキシへのトンネル化された Http(s)URLConnection が トンネルです。代わりに、システムがプロキシ認証ヘッダーを生成します。 プロキシから送信されると、そのリクエストをプロキシに 最初のリクエストに対する HTTP 407。

      同様に user-agent ヘッダーはコピーされなくなる トンネリング リクエストからプロキシ リクエストへの トンネルです。代わりに、ライブラリがユーザー エージェントのヘッダーを生成します。 リクエストできます。

  • send(java.net.DatagramPacket) メソッドは、以前に実行された connect() が SocketException をスローする メソッドが失敗しました。
    • 例外が発生している場合、DatagramSocket.connect() は pendingSocketException を設定します。 内部エラーが発生しました。Android 8.0 より前のバージョンでは、後続の recv() send() の呼び出しは成功するにもかかわらず、この呼び出しは SocketException をスローします。 整合性を保つため、どちらの呼び出しでも SocketException がスローされるようになりました。
  • InetAddress.isReachable() は TCP Echo にフォールバックする前に ICMP を試行します 構成されます。
    • google.com など、ポート 7(TCP Echo)をブロックする一部のホストでは、 ICMP Echo プロトコルを受け入れると到達可能になります。
    • この変更により、真にアクセスできないホストの場合、 呼び出しが戻るまでにかかった時間の割合です。

Bluetooth

Android 8.0(API レベル 26)では、 ScanRecord.getBytes() が処理するデータを メソッドは以下を取得します。

  • getBytes() メソッドは、 受信バイト数。そのため、アプリは 返されるバイト数の最小値または最大値。むしろ 結果の配列の長さ
  • Bluetooth 5 対応デバイスは、 以前の最大 60 バイトまでです。
  • リモート デバイスからスキャン応答がない場合、60 バイト未満 返される可能性もあります。

シームレスな接続

Android 8.0(API レベル 26)では、Wi-Fi 設定にいくつかの改良を加え、選択しやすくしています。 最適なユーザー エクスペリエンスを提供する Wi-Fi ネットワークに接続できます。具体的な変更点は次のとおりです。

  • 安定性と信頼性の向上。
  • より直感的に読みやすい UI。
  • 1 つに統合された Wi-Fi 設定メニューです。
  • 対応デバイスで、高品質な保存済みネットワークがある場合に Wi-Fi を自動的に有効化 は近くにあります。

セキュリティ

Android 8.0 には、次のセキュリティ関連機能が搭載されています。 変更点:

  • このプラットフォームは SSLv3 をサポートしなくなりました。
  • サーバーへの HTTPS 接続を確立する際に、 TLS プロトコル バージョンのネゴシエーション HttpsURLConnection は回避策を試みなくなりました 古いバージョンの TLS プロトコルに フォールバックして再試行します
  • Android 8.0(API レベル 26)では、Secure Computing(SECCOMP) すべてのアプリに絞り込んでください。許可される syscall のリストは、 表示されます。この他にもいくつかの syscall が提供されていますが、 使用はおすすめしません。
  • アプリの WebView オブジェクトがマルチプロセスで実行されるようになりました モードです。ウェブ コンテンツは、インフラストラクチャとは別の独立したプロセスで処理されます。 アプリのプロセスを含むことで セキュリティを強化できます
  • 名前が末尾のディレクトリに APK が存在することは想定できなくなりました -1 または -2 です。使用するアプリ sourceDirすると、 ディレクトリ形式に直接依存する必要はありません。
  • ネイティブ広告の使用に関連するセキュリティの機能強化については、 ネイティブ ライブラリをご覧ください。

さらに、Android 8.0(API レベル 26)では、 提供元不明のアプリ:

不明なアプリのインストールについて詳しくは、 不明なアプリ 権限のインストールに関するガイドをご覧ください

アプリのセキュリティを強化するためのその他のガイドラインについては、 Android デベロッパー向けセキュリティ

プライバシー

Android 8.0(API レベル 26)では、次のプライバシー関連が行われます。 プラットフォームに対する変更です。

  • プラットフォームにおける識別子の処理方法が異なります。
    • バージョンへの OTA の前にインストールされたアプリの場合: Android 8.0(API レベル 26) (API レベル 26)の場合、 ANDROID_IDはこれまでと同じ OTA 後にアンインストールしてから再インストールしない限り、更新されません。複数のゾーンにわたって値を保持するには、 古い値と新しい値を関連付けるには、 <ph type="x-smartling-placeholder"></ph> Key-Value バックアップをご覧ください。
    • Android 8.0 を搭載しているデバイスにインストールされているアプリの場合、 ANDROID_ID にスコープが設定されました アプリ署名鍵ごと、ユーザーごとに設定します。価値: ANDROID_ID は一意です (アプリ署名鍵、ユーザー、デバイスの組み合わせごと)に作成されます。 その結果、異なる署名鍵を持つアプリが同じデバイスで実行される 同じ Android ID が表示されなくなる(同じユーザーであっても)。
    • ANDROID_ID の値 パッケージのアンインストールや再インストールがあっても、 署名鍵が同じである(また、アプリが OTA アップデートの前にインストールされていない場合) あります。
    • ANDROID_ID の値 システム アップデートによってパッケージ署名鍵が変更されても、変更はありません。
    • Google Play 開発者サービスと広告 ID を搭載したデバイスの場合、 使用する必要があります。 <ph type="x-smartling-placeholder"></ph> 広告 ID。アプリを収益化するためのシンプルで標準的なシステム 広告 ID は、ユーザーがリセット可能な広告用の一意の ID です。提供される ダウンロードされます。

      他のデバイス メーカーは、 ANDROID_ID を指定します。

  • net.hostname システム プロパティのクエリを実行すると、null が生成される 表示されます。

キャッチされていない例外のロギング

アプリが Thread.UncaughtExceptionHandler を デフォルトの Thread.UncaughtExceptionHandler を呼び出さない、 システムは キャッチされない例外が発生したときにアプリを強制終了しない。最低料金 Android 8.0(API レベル 26)では、例外のスタックトレースが 以前のバージョンのプラットフォームでは、 例外のスタックトレースがログに記録されました

カスタム Thread.UncaughtExceptionHandler をおすすめします。 実装は常に 使用します。この推奨事項に従うアプリは、 Android 8.0 での変更点です。

findViewById() 署名の変更

findViewById() メソッドのすべてのインスタンスが、View ではなく <T extends View> T を返すようになりました。この変更 次のような影響があります。

  • その結果、既存のコードの戻り値の型があいまいになり、 たとえば、someMethod(View) と 呼び出しの結果を受け取る someMethod(TextView) findViewById()
  • Java 8 ソース言語を使用する場合、明示的にキャストする必要があります。 View: 戻り値の型に制約がない場合( assertNotNull(findViewById(...)).someViewMethod())
  • 非 final findViewById() メソッドのオーバーライド( 例: Activity.findViewById())は返品が必要 タイプを更新しました。

連絡先プロバイダの使用統計情報の変更

以前のバージョンの Android では、連絡先プロバイダ コンポーネント を使用すると、デベロッパーは連絡先ごとに使用状況データを取得できます。この使用状況データ 各メールアドレスと、関連付けられた各電話番号の情報が 連絡先との連絡回数(その連絡先への連絡回数を含む) 最後に連絡した日時などです READ_CONTACTS 権限でこのデータを読み取ることができます。

アプリは、ユーザーがリクエストした場合は、このデータを読み取ることができます READ_CONTACTS 付与します。Android 8.0(API レベル 26)以降では、使用状況データをクエリすると、 近似値を求めることです。Android システムは 内部的には正確な値になるため、この変更は 予測入力 API を使用します

この動作変更は、次のクエリ パラメータに影響します。

コレクションの処理

AbstractCollection.removeAll() および AbstractCollection.retainAll() 常に NullPointerException がスローされるようになりました。以前の コレクションが次の場合に NullPointerException がスローされなかった 空です。この変更により、ドキュメントと一致する動作になります。

Android Enterprise

Android 8.0(API レベル 26)では、 デバイスを含むエンタープライズ アプリ用の一部の API と機能の動作 Policy Controller(DPC)に委任できます。変更内容は次のとおりです。

  • 新しい動作により、完全管理対象デバイス上でアプリが仕事用プロファイルに対応できるようになりました。
  • システム アップデートの処理、アプリの確認、認証の変更 デバイスとシステムの完全性を高められます。
  • プロビジョニング、通知、 履歴画面と常時接続 VPN。

Android 8.0(API レベル 26)におけるエンタープライズ向けのすべての変更点と、 アプリに影響する可能性があるため、 企業の Android

Android 8.0 をターゲットとするアプリ

これらの動作変更は、以下をターゲットとするアプリにのみ適用されます。 Android 8.0(API レベル 26)以降。Android 8.0 に対してコンパイルされるアプリ、 targetSdkVersion を Android 8.0 以降に設定する場合は、 それらの動作を適切にサポートする必要があります(該当する場合)。

アラート ウィンドウ

SYSTEM_ALERT_WINDOW を使用するアプリ 権限では、次のウィンドウ タイプを使用してアラート ウィンドウを表示できなくなりました 他のアプリやシステム ウィンドウの上:

代わりに、アプリ用の新しいウィンドウタイプを使用する必要があります。 TYPE_APPLICATION_OVERLAY

TYPE_APPLICATION_OVERLAY ウィンドウ アプリのアラート ウィンドウを表示する場合は、次の特性を維持してください。 次の点に注意してください。

  • アプリのアラート ウィンドウは、重要なシステム ウィンドウ( ステータスバーと IME になります。
  • システムは、 TYPE_APPLICATION_OVERLAY 画面の見栄えを改善できます。
  • 通知シェードを開くと、通知をブロックするための設定にアクセスできます。 使用して表示される警告ウィンドウを TYPE_APPLICATION_OVERLAY 選択します。

コンテンツ変更通知

Android 8.0(API レベル 26)では、 ContentResolver.notifyChange() および registerContentObserver(Uri, boolean, ContentObserver) Android 8.0 をターゲットとするアプリでの動作が変わります。

これらの API では、有効な ContentProvider すべての URI の認証局に対して定義されます。関連する権限を持つ有効な ContentProvider を定義すると、 悪意のあるアプリによるコンテンツの変更からアプリを保護し、 不正なアプリへの流出を防ぎます。

View のフォーカス

クリック可能な View オブジェクトをフォーカス可能に あります。View オブジェクトをクリック可能にする場合 フォーカス可能な場合、 <ph type="x-smartling-placeholder"></ph> レイアウト内の falseandroid:focusable 属性 View を含む XML ファイル、または false を渡します。 アプリの UI で setFocusable() へ できます。

ブラウザ検出でのユーザー エージェント マッチング

Android 8.0(API レベル 26)以降には、 ビルド ID 文字列 OPR。一致するパターンが ブラウザ検出ロジックで Opera 以外のブラウザが誤って Opera と認識される原因となります。 パターン一致の例を以下に示します。

if(p.match(/OPR/)){k="Opera";c=p.match(/OPR\/(\d+.\d+)/);n=new Ext.Version(c[1])}

このような誤認識による問題を回避するには、 Opera ブラウザのパターンマッチ用の OPR

セキュリティ

Android 8.0(API レベル 26)では、以下の変更がセキュリティに影響します。

  • アプリのネットワーク セキュリティ構成が 最適化 クリアテキストのトラフィックのサポート、 WebView オブジェクトは HTTP 経由でウェブサイトにアクセスできません。各 WebView オブジェクトでは、代わりに HTTPS を使用する必要があります。
  • [提供元不明のアプリを許可する] システム設定が削除されました。内で 不明なアプリのインストールは [不明なアプリのインストール] 権限で管理できます 検出されます。この新しい権限の詳細については、 不明なアプリ 権限のインストールに関するガイドをご覧ください

アプリのセキュリティを強化するためのその他のガイドラインについては、 Android デベロッパー向けセキュリティ

アカウントへのアクセスと見つけやすさ

Android 8.0(API レベル 26)では、アプリは (認証システムが所有しているアカウントまたは ユーザーがそのアクセスを許可します。「 GET_ACCOUNTS 権限 不十分ですアカウントへのアクセスを許可するには、アプリが AccountManager.newChooseAccountIntent() を使用するか 認証や認可の メソッドを呼び出します。アカウントにアクセスできるようになると、アプリは AccountManager.getAccounts() アクセスできません。

Android 8.0 のサポートを終了 LOGIN_ACCOUNTS_CHANGED_ACTION。アプリ 代わりに addOnAccountsUpdatedListener() を使って、実行時にアカウントに関する最新情報を取得できます。

アカウント アクセスのための新しい API とメソッドと、 詳しくは、アカウントへのアクセス と検出可能性をご覧ください。

プライバシー

Android 8.0(API レベル 26)では、以下の変更がプライバシーに影響します。

  • システム プロパティの net.dns1net.dns2net.dns3net.dns4 は削除されました この変更により、プラットフォームでのプライバシーが向上します。
  • ネットワーク情報を取得するために、DNS サーバー、 ACCESS_NETWORK_STATE 権限は NetworkRequest または NetworkCallback オブジェクト。 これらのクラスは Android 5.0(API レベル 21)以降で使用できます。
  • Build.SERIAL は非推奨となりました。 アプリがハードウェアのシリアル番号を知る必要がある場合は、代わりに 新しい Build.getSerial() メソッドを使用します。これは、 には READ_PHONE_STATE 付与します。
  • LauncherApps API で仕事用プロファイルを使用できなくなる プライマリ プロファイルに関する情報を取得します。ユーザーが職場にいるとき LauncherApps API は、アプリがない場合と同様に動作します。 同じプロファイル グループ内の他のプロファイルにインストールされている。前のように 無関係なプロファイルにアクセスしようとすると、SecurityExceptions が発生します。

権限

Android 8.0(API レベル 26)よりも前(アプリが権限をリクエストした場合) 権限が与えられていても、そのシステムも 同じグループに属する残りの権限をアプリに付与した 権限グループと、マニフェストに登録されている必要があります。

Android 8.0 をターゲットとするアプリでは、この動作は あります。アプリに、明示的に指定した権限のみが付与されます。 渡されます。ただし、ユーザーがアプリに権限を付与すると、 その権限グループ内の権限に対する後続のリクエストは 自動的に付与されます。

たとえば、アプリに READ_EXTERNAL_STORAGE と マニフェスト内で WRITE_EXTERNAL_STORAGE を指定します。 アプリが READ_EXTERNAL_STORAGE をリクエストし、 付与します。API レベル 25 以前をターゲットとしているアプリの場合、 同時に WRITE_EXTERNAL_STORAGE を付与します。 これは同じ STORAGE 権限グループに属しており、 呼び出すことができます。Android 8.0(API レベル 26)をターゲットとするアプリの場合、 READ_EXTERNAL_STORAGE のみ ただし、後でアプリが WRITE_EXTERNAL_STORAGE をリクエストすると、システムはすぐに ユーザーにプロンプトを表示せずにその権限を付与します。

メディア

  • フレームワークは、 自動オーディオ ダッキング 考えてみましょう。この場合、別のアプリケーションが AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK: アプリケーション フォーカスがあるものは、ボリュームを減らしますが、通常は onAudioFocusChange() 呼び出されると、 音声フォーカスが失われます。新しい API を使用すると、次の場合にこの動作をオーバーライドできます。 他のアプリケーションでも実行できます
  • ユーザーが電話に出ると、アクティブなメディア ストリームは応答している間、ミュートされます あります。
  • すべてのオーディオ関連の API で AudioAttributes を使用する必要があります。 を使用して、音声再生のユースケースを記述します。 引き続き、音量コントロールにのみ音声ストリーム タイプを使用してください。ストリーム タイプの他の用途は引き続き機能する (たとえば、非推奨のオブジェクトの streamType 引数は AudioTrack コンストラクタ)。 システムではエラーとして記録されます。
  • AudioTrack を使用する際、アプリケーションが 十分な大きさのオーディオ バッファをリクエストしても、 フレームワークは、ディープ バッファ出力が利用可能な場合、その出力を使用しようとします。
  • Android 8.0(API レベル 26)では、メディアボタン イベントの処理が次のように異なります。 <ph type="x-smartling-placeholder">
      </ph>
    1. メディアボタンの処理 変更されていない: フォアグラウンド アクティビティは引き続き優先されて処理される メディアボタン イベント。
    2. フォアグラウンド アクティビティがメディアボタン イベントを処理しない場合、システムはイベントをルーティングする 最後にローカルで音声を再生したアプリに送信されます。アクティブなステータス、フラグ、再生 どのアプリがメディアを受信するかを判断する際にメディア セッションの状態が考慮されない 作成できます。
    3. アプリのメディア セッションがリリースされている場合、 アプリがメディアボタンのイベントをアプリの 存在する場合は MediaButtonReceiver
    4. それ以外の場合、システムはメディアボタン イベントを破棄します。

ネイティブ ライブラリ

Android 8.0(API レベル 26)を対象とするアプリでは、ネイティブ ライブラリは 書き込み可能で、かつ書き込み可能な 作成します。一部のアプリは、今回の変更により動作しなくなる可能性があります。 ネイティブ ライブラリに正しくない読み込みセグメントが存在します。これは セキュリティ対策を強化します。

詳細については、<ph type="x-smartling-placeholder"></ph>をご覧ください。 書き込み可能セグメントと実行可能セグメントをご覧ください。

リンカーの変更は、アプリがターゲットとする API レベルに関連付けられます。もし リンカーの変更です。 アプリはライブラリを読み込めません。通常のショッピングキャンペーンを リンカーの変更が発生する API レベルより低い API レベル logcat に警告が表示されます。

コレクションの処理

Android 8.0(API レベル 26)では、 Collections.sort() の実装先 List.sort() の上部。逆の場合 Android 7.x(API レベル 24 と 25)では、次のように指定されていました。 List.sort() のデフォルト実装 Collections.sort() と呼ばれます。

この変更により、Collections.sort() 最適化されたList.sort()のメリットを ただし、次のような制約があります。

  • List.sort() の実装 Collections.sort() を呼び出すことはできません。 スタック オーバーフローが発生して 生じることがあります。デフォルトの動作を使用したい場合は、 List の実装では、 sort()

    親クラスが sort() を不適切に実装すると、 通常は List.sort() をオーバーライドしても問題ない Kubernetes 上に構築された実装を List.toArray(), Arrays.sort()、および ListIterator.set()。次に例を示します。

    @Override
    public void sort(Comparator<? super E> c) {
      Object[] elements = toArray();
      Arrays.sort(elements, c);
      ListIterator<E> iterator = (ListIterator<Object>) listIterator();
      for (Object element : elements) {
        iterator.next();
        iterator.set((E) element);
      }
    }
    

    ほとんどの場合、特定のプロパティを List.sort() を さまざまなデフォルト値に委任するための実装を API レベルによって異なります。次に例を示します。

    @Override
    public void sort(Comparator<? super E> comparator) {
      if (Build.VERSION.SDK_INT <= 25) {
        Collections.sort(this);
      } else {
        super.sort(comparator);
      }
    }
    

    sort() が必要なためだけに後者を行う場合 すべての API レベルで使用可能なメソッドがある場合は、そのメソッドに一意の名前を付けてください。 例: sortCompat() をオーバーライドする代わりに、 sort()

  • Collections.sort() のカウント対象になりました インフラストラクチャの変更を sort() を呼び出す実装を一覧表示します。たとえば、 Android 8.0(API レベル 26)よりも前のプラットフォームであり、 ArrayList を作成し、それに対して sort() を呼び出す ライフサイクルの途中で ConcurrentModificationException がスローされます。 並べ替えが完了しているか List.sort() を呼び出します。 Collections.sort() 例外をスローしませんでした。

    この変更により、プラットフォームの動作の一貫性が向上しました。 ConcurrentModificationException が返されるようになりました。

クラス読み込みの動作

Android 8.0(API レベル 26)では、クラスローダーが 新しいクラスを読み込むときにランタイムの前提条件が失われます。これらのチェックは クラスが Java から参照されるかどうかに関係なく forName())、 Dalvik バイトコード(JNI)です。プラットフォームは、Java から loadClass() メソッドが使用されており、 結果を出力できますこの振る舞いは、正常に動作するサービスの クラスローダーを使用します。

プラットフォームは、クラスローダーが返すクラスの記述子が 期待される記述子に一致します。返された記述子が一致しない場合、 プラットフォームは NoClassDefFoundError エラーをスローし、 例外を示す詳細なメッセージが表示されます

プラットフォームは、リクエストされたクラスの記述子が有効かどうかもチェックします。この check は、GetFieldID()、 それらのクラスに無効な記述子を渡しています。たとえば、署名付きフィールドには java/lang/String は、署名が無効なため見つかりません。 Ljava/lang/String; になっているはずです。

これは、FindClass() への JNI 呼び出しとは異なります。 ここで、java/lang/String は有効な完全修飾名です。

Android 8.0(API レベル 26)では、複数のクラスローダーによるクラスの定義はサポートされていません。 DexFile オブジェクトを使用します使用しようとすると、Android ランタイムが InternalError 「Attempt to register dex file <filename>」というメッセージが表示されるエラー 使用しないでください。

DexFile API は非推奨になりました。DexFile API を使用することを強くおすすめします。 プラットフォーム クラスローダー(PathClassLoaderBaseDexClassLoader をご利用ください。

注: 同じ APK または JAR ファイル コンテナをファイル システムからコピーする必要があります。これを行っても、 メモリのオーバーヘッドが大幅に増加します。DEX ファイルがコンテナ内の 圧縮されている場合、プラットフォームは mmap オペレーションを実行できます。 直接抽出できます。ただし、プラットフォームでコンテナから DEX ファイルを抽出する必要がある場合は、 この方法で DEX ファイルを参照すると、大量のメモリを消費する可能性があります。

Android では、すべてのクラスローダが並列対応とみなされます。 複数のスレッドが同じクラスの同じクラスを読み込むために競合した場合 処理を完了した最初のスレッドが優先され、その結果が 他のスレッドに報告しますこの動作は、クラスローダーが有効か否かにかかわらず発生します。 は、同じクラスを返したり、異なるクラスを返したり、例外をスローしたりします。 プラットフォームは、このような例外を通知なく無視します。

注意: 使用しているプラットフォームのバージョンでは、 Android 8.0(API レベル 26)よりも前のバージョンであるため、こうした前提を破ると、同じものが定義されてしまう可能性があります。 クラスの混乱によるヒープの破損、 望ましくない影響も最小限で済みます。