Android 7.0 の動作の変更点

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

過去に Android 向けアプリを公開したことがある場合は、 プラットフォームの変更による影響を受ける可能性があります。

バッテリーとメモリ

Android 7.0 では、バッテリー駆動時間を改善するためのシステム動作が変更されています。 RAM 使用量の削減にも取り組んでいますこれらの変更は、アプリによる以下へのアクセスに影響する アプリが他のアプリとやり取りする方法を確認できます。 特定の暗黙的インテントに 割り当てることができます

Doze

Android 6.0(API レベル 23)で導入された Doze モードは、 ユーザーがデバイスを電源から外したままにしたときに、CPU とネットワークのアクティビティを遅らせる 静止し、画面はオフにします。Android 7.0 では、 CPU とネットワークの制限の一部を適用することで Doze モードを強化 画面をオフにした状態でデバイスを電源から外しますが、 たとえば、ハンドセットをユーザーのポケットに入れて持ち歩いている場合などです。

Doze が第 1 レベルのアプリケーション データを適用する
  バッテリー駆動時間を延ばすためのシステム アクティビティ制限

図 1. Doze が第 1 レベルのアプリケーション データを適用する システム アクティビティの制限を使用してバッテリーを長持ちさせます。

デバイスがバッテリー駆動中で、画面が一定時間オフのままだった デバイスが Doze モードに入り、制限の最初のサブセットが適用されます。 アプリのネットワーク アクセスを遮断し、ジョブと同期を延期する。デバイスが Doze モードに入ってからしばらくの間静止状態が続くと、 その他の Doze 制限を PowerManager.WakeLock に変更 AlarmManager のアラーム、GPS、Wi-Fi スキャン。条件と Doze 制限の一部またはすべてが適用されているかに関係なく、 短時間のメンテナンス時間の間は、アプリケーションの実行を ネットワーク アクセスが許可され、遅延ジョブ/同期を実行できます。

Doze が第 2 レベルの
  デバイスが一定時間静止した後のシステム アクティビティの制限

図 2. Doze が第 2 レベルの デバイスが一定時間静止した後のシステム アクティビティの制限。

画面をオンにするかデバイスを電源に接続すると Doze モードは終了し、 処理の制限を取り除きますこの追加動作は、 アプリを事前適応化するための推奨事項やベスト プラクティスに影響する Android 6.0(API レベル 23)で導入された Doze のバージョンが、 <ph type="x-smartling-placeholder"></ph> Doze とアプリ スタンバイの最適化それでも Firebase Cloud Messaging(FCM)を使用して、 メッセージを送受信できるようにして Doze の動作が変わります。

Project Svelte: バックグラウンド処理の最適化

Android 7.0 では、両方のブロードキャストを最適化するために、3 つの暗黙的なブロードキャストが削除されました 自動的に最適化されます。この変更が必要なのは、 ブロードキャストによって、リッスンするように登録されているアプリが頻繁に起動します。 できます。これらのブロードキャストを削除すると、デバイスに大きなメリットがある 向上させることができます

モバイル デバイスでは、移動時など、接続が頻繁に変更されます。 Wi-Fi とモバイルデータに接続できます。現在のところ、アプリでの 暗黙的な CONNECTIVITY_ACTION ブロードキャストのレシーバを登録して接続を 使用します。多くのアプリがこのブロードキャストを受信するよう登録しているため、 すべてのネットワーク スイッチが復帰し、ブロードキャストが 1 回だけです。

同様に、以前のバージョンの Android では、アプリが次のような他のアプリから暗黙的な ACTION_NEW_PICTURE ブロードキャストと ACTION_NEW_VIDEO ブロードキャストを受信するように登録できました。 カメラ。ユーザーがカメラアプリで写真を撮ると、これらのアプリが復帰します ブロードキャストを処理します。

これらの問題を軽減するために、Android 7.0 では以下の対策を適用しました。 最適化:

  • Android 7.0(API レベル 24)以降を対象とするアプリは、マニフェストでブロードキャスト レシーバを宣言している場合は、CONNECTIVITY_ACTION ブロードキャストを受信しません。アプリは 登録した場合に CONNECTIVITY_ACTION ブロードキャストを受信する Context.registerReceiver() さんとの BroadcastReceiver コンテキストは引き続き有効です。
  • システムから ACTION_NEW_PICTURE ブロードキャストまたは ACTION_NEW_VIDEO ブロードキャストが送信されなくなります。この最適化 は、Android 7.0 をターゲットとするアプリだけでなく、すべてのアプリに影響します。

アプリでこれらのインテントのいずれかを使用する場合は、依存関係を削除する必要があります。 Android 7.0 デバイスを適切にターゲットに設定できるように、できるだけ早くアップデートしてください。 Android フレームワークは、Android アプリの開発に 暗黙的なブロードキャストですたとえば、JobScheduler API は、スケジューリングを行うための堅牢なメカニズムを提供します。 接続など、特定の条件下でのネットワーク オペレーションを 非従量制ネットワークへの接続が 満たされますJobScheduler を使用して、コンテンツ プロバイダの変更に対応することもできます。

Android 7.0(API レベル)のバックグラウンド最適化の詳細 24)と、アプリを適応させる方法については、背景知識 最適化

権限の変更

Android 7.0 では、アプリに影響する可能性がある権限の変更が行われています。

ファイル システム権限の変更

プライベート ファイルのセキュリティを向上させるために、プライベート ディレクトリを Android 7.0 以上をターゲットとするアプリにはアクセスが制限されています(0700)。 この設定により、非公開ファイルのメタデータ(サイズなど)の漏洩を防ぐことができます。 あります。この権限の変更には複数の副作用があります。

  • オーナーは非公開ファイルの権限を緩和してはいけません。 Cloud Shell を使用して MODE_WORLD_READABLE および/または MODE_WORLD_WRITEABLE でトリガーされます。 SecurityException

    注: 現在のところ、この制限は完全に適用されていません。 アプリは引き続き、プライベート ディレクトリの権限を File API を使用できます。ただし、Google では プライベート ディレクトリに対する権限を緩和しないでください。

  • パッケージ ドメインの外部に file:// URI を渡すと、 アクセスできません。そのため、 file:// URI トリガー FileUriExposedException。スペースを共有するには、 プライベート ファイルのコンテンツで FileProvider が使用されている。
  • DownloadManager は非公開で共有できなくなりました 表示されます。以前のアプリケーションでは、 COLUMN_LOCAL_FILENAME にアクセスしたときにアクセスできないパス。アプリ ターゲティング Android 7.0 以降では、次の場合に SecurityException をトリガーします。 アクセスしようとしている COLUMN_LOCAL_FILENAME。 従来のアプリケーションでは、次の方法でダウンロード場所を一般公開の場所に設定します。 DownloadManager.Request.setDestinationInExternalFilesDir() または DownloadManager.Request.setDestinationInExternalPublicDir() 引き続き、Cloud Storage バケットのパスに COLUMN_LOCAL_FILENAME ですが、これは 使用しないことを強くおすすめします。ファイルへの推奨アクセス方法 DownloadManager で公開されている ContentResolver.openFileDescriptor()

アプリ間でのファイルの共有

Android 7.0 をターゲットとするアプリの場合、Android フレームワークは file:// URI の公開を禁止する StrictMode API ポリシー 使用できます。ファイル URI を含むインテントがアプリから離れると、アプリは失敗します ただし、FileUriExposedException 例外があります。

アプリ間でファイルを共有するには、content:// URI を送信する必要があります。 URI に対する一時的なアクセス権限を付与します。この権限を付与する最も簡単な方法は、 FileProvider クラスを使用します。詳細情報 権限とファイルの共有に関する ファイルの共有をご覧ください。

ユーザー補助機能の改善

Android 7.0 では、 視力障がいのあるユーザー向けの機能を開発しました。これらの変更は 通常はアプリのコード変更は必要ありませんが アプリでこれらの機能をテストし、ユーザーに対する潜在的な影響を評価します 体験できます

画面のズーム

Android 7.0 では、拡大する表示サイズをユーザーが設定できます。 画面上のすべての要素を縮小または縮小して、デバイスのユーザー補助機能を改善 ロービジョンのユーザーに 提供していますユーザーは最小画面を超えて画面をズームできない <ph type="x-smartling-placeholder"></ph>の幅 sw320dp は、一般的な中サイズのスマートフォンである Nexus 4 の幅です。

Android 7.0 システム イメージを実行しているデバイスの、ズームしていないディスプレイ サイズを示す画面
Android 7.0 システム イメージを実行しているデバイスのディスプレイ サイズを大きくした場合の効果を示す画面

図 3. 右側の画面では Android 7.0 システム イメージを搭載しているデバイスのディスプレイ サイズを増やす

デバイスの密度が変更されると、 できます。

  • API レベル 23 以前をターゲットとしているアプリの場合、 実行されません。つまり、ユーザーが Google Workspace から [Settings] 画面を開いて [Display size] 設定の場合、システムは同じタイミングでアプリを強制終了します。 メモリ不足の場合と同様に処理できます。アプリにフォアグラウンドがある場合 構成の変更がシステム プロセスに通知されます。 詳しくは、 実行時の変更にスローされます。
  • Android 7.0 をターゲットとするアプリの場合、そのすべてのプロセス (フォアグラウンドとバックグラウンド)に構成変更が通知されます。 詳しくは、 ランタイムの変更

ほとんどのアプリでは、この機能をサポートするために変更を加える必要はありません。 アプリが Android のベスト プラクティスに従っている。具体的な確認事項:

  • 画面幅が sw320dp のデバイスでアプリをテストする 適切に機能するようにします
  • デバイス設定が変更された場合は、画面密度に依存する たとえば、キャッシュに保存されたビットマップや 接続しますアプリが一時停止状態から再開したときに構成の変更を確認 あります。

    注: 構成に依存するデータをキャッシュに保存すると、 動画内には適切な画面などの関連メタデータを サイズやピクセル密度を指定します。このメタデータを保存すると 構成後にキャッシュ データを更新する必要があるかどうかを決定する あります。

  • ピクセル単位でサイズが拡大縮小されないため、サイズをピクセル単位で指定しないでください。 [画面密度] を選択します。代わりに、密度非依存 ピクセルdp)単位。

セットアップ ウィザードのビジョン設定

Android 7.0 では、ウェルカム画面に [ビジョン設定] が追加され、 新しいデバイスで以下のユーザー補助設定をセットアップします。 拡大操作フォントサイズ 表示サイズTalkBack。この変更 さまざまな画面設定に関連するバグが見つかりやすくなります。宛先 この機能の影響を評価するには 設定を有効にします。この設定は、[設定] > ユーザー補助

プラットフォーム ライブラリにリンクしている NDK アプリ

Android 7.0 以降、システムはアプリを動的にリンクできなくなります。 非 NDK ライブラリに対して行われ、アプリがクラッシュする可能性があります。この プラットフォーム アップデート全体で一貫したアプリ エクスペリエンスを実現することを目的とした動作 さまざまなデバイスで動作します。コードが実際には 使用している場合、サードパーティの静的ライブラリが 可能性があります。そのため、すべてのデベロッパーが Android 7.0 デバイスで アプリがクラッシュしないことを確認しましたアプリで 公開 NDK API のみを使用する必要があります。

アプリがプライベート プラットフォームにアクセスを試みる方法は 3 つあります。 API:

  • アプリがプライベート プラットフォーム ライブラリに直接アクセスする。更新が必要です それらのライブラリの独自のコピーを組み込むか、公開 NDK API を使用します。
  • お客様のアプリは、プライベート プラットフォームにアクセスするサードパーティ ライブラリを使用しています 使用できます。アプリがプライベート ライブラリにアクセスしないことがわかっていても、 このシナリオについてアプリをテストする必要があります。
  • アプリが APK に含まれていないライブラリを参照しています。対象 OpenSSL のコピーを使用しようとしたときに、 アプリの APK にバンドルするのを忘れている。アプリは、次のバージョンでも正常に動作する可能性があります libcrypto.so を含む Android プラットフォームただし、 このライブラリを含まない Android の新しいバージョンではクラッシュする可能性があります (Android 6.0 以降など)。この問題を解決するには 非 NDK ライブラリを APK と一緒に使用できます。

アプリで NDK に含まれていないネイティブ ライブラリを使用すべきではありません。理由は以下のとおりです。 Android のバージョンが異なれば変更または削除される場合があります。「 OpenSSL から BoringSSL への切り替えもその一例です。また、 プラットフォーム ライブラリには互換性要件が NDK に含まれている場合は、デバイスによって、提供できるレベルが異なる場合があります。 サポートしています。

この制限が現在 主な用途が見込まれているライブラリのセットです。 libandroid_runtime.so さん、libcutils.so さん、 libcrypto.solibssl.so - 一時的な API レベル 23 以下をターゲットとするアプリの場合、Android 7.0(API レベル 24)でアクセス可能 低くなります。アプリがこれらのライブラリのいずれかを読み込むと、logcat によって警告が生成されます ターゲット デバイスにトーストが表示されます。これらが表示される場合 警告がある場合は、そのアプリの独自のコピーを含めるようアプリを更新します。 NDK API のみを使用する場合があります。Android の今後のリリース プラットフォームによってプライベート ライブラリの使用がまったく制限され、 アプリがクラッシュします。

すべてのアプリは、次のいずれにも該当しない API を呼び出すとランタイム エラーを生成する または一時的にアクセス可能な状態でなければなりません。その結果、 System.loadLibrarydlopen(3) の両方が返される NULL。アプリがクラッシュする可能性があります。お客様の プライベート プラットフォーム API の使用を排除し、アプリを徹底的にテストするためのアプリコード Android 7.0(API レベル 24)を搭載したデバイスまたはエミュレータを使用する。もし アプリが非公開ライブラリを使用しているかどうかわからない場合は、logcat を確認してランタイム エラーを特定できます。

次の表に、 (プライベート ネイティブ ライブラリの使用状況とターゲット API に応じて) レベル(android:targetSdkVersion)。

ライブラリ 対象 API レベル ダイナミック リンカーを介したランタイム アクセス Android 7.0(API レベル 24)の動作 今後の Android プラットフォームの動作
NDK パブリック 制限なし バリアフリー 想定どおりの動作 想定どおりの動作
非公開(一時的にアクセス可能なプライベート ライブラリ) 23 以下 一時的にアクセス可能 想定どおりに動作するが、logcat 警告が表示される。 ランタイム エラー
非公開(一時的にアクセス可能なプライベート ライブラリ) 24 以上 制限あり ランタイム エラー ランタイム エラー
非公開(その他) 制限なし 制限あり ランタイム エラー ランタイム エラー

アプリが非公開ライブラリを使用しているかどうかを確認する

専用ライブラリの読み込みに関する問題を特定できるように、logcat は ランタイム エラーが表示されます。たとえば、アプリが API レベル 23 または Android 7.0 搭載デバイスでプライベート ライブラリへのアクセスを試みた場合、 次のような警告が表示されることがあります。

03-21 17:07:51.502 31234 31234 W linker  : library "libandroid_runtime.so"
("/system/lib/libandroid_runtime.so") needed or dlopened by
"/data/app/com.popular-app.android-2/lib/arm/libapplib.so" is not accessible
for the namespace "classloader-namespace" - the access is temporarily granted
as a workaround for http://b/26394120

この logcat 警告は、どのライブラリがアクセスしようとしているかを示します。 アプリがクラッシュすることはありません。アプリが API レベル 24 以降をターゲットとしていますが、logcat は次のように生成します。 ランタイム エラーが発生し、アプリがクラッシュする可能性があります。

java.lang.UnsatisfiedLinkError: dlopen failed: library "libcutils.so"
("/system/lib/libcutils.so") needed or dlopened by
"/system/lib/libnativeloader.so" is not accessible for the namespace
"classloader-namespace"
  at java.lang.Runtime.loadLibrary0(Runtime.java:977)
  at java.lang.System.loadLibrary(System.java:1602)

アプリでサードパーティのライブラリを使用している場合も、このような logcat 出力が表示されることがあります。 プライベートプラットフォーム API に動的にリンクします。Google Chat の readelf ツール Android 7.0DK では、動的にリンクされているすべての共有リソースのリストを 特定の .so ファイルのライブラリを使用するには、次のコマンドを実行します。

aarch64-linux-android-readelf -dW libMyLibrary.so

アプリを更新する

この種のエラーを修正する手順は、次のとおりです。 今後のプラットフォーム アップデートでアプリがクラッシュしないようにします。

  • アプリでプライベート プラットフォーム ライブラリを使用している場合は、 これらのライブラリの独自のコピーを使用するか、公開 NDK API を使用してください。
  • プライベート シンボルにアクセスするサードパーティ ライブラリをアプリで使用している場合は、 ライブラリを更新するよう指示します。
  • NDK 以外のライブラリはすべて APK にパッケージ化してください。
  • getJavaVM の代わりに標準の JNI 関数を使用する。 libandroid_runtime.so からの getJNIEnv:
    AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h>
    AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or
    JavaVM::AttachCurrentThread from <jni.h>.
    
  • 非公開の property_get ではなく __system_property_get を使用する libcutils.so の記号です。これを行うには、__system_property_get を使用します。 次の要素が含まれます。
    #include <sys/system_properties.h>
    

    注: システム プロパティの可用性と内容は、 CTS でテストされません。これを回避するには、 すべて一緒に使用します。

  • libcrypto.soSSL_ctrl 記号のローカル バージョンを使用します。たとえば、libcyrpto.a を次のように静的にリンクする必要があります。 .so ファイルにするか、BoringSSL/OpenSSL の libcrypto.so のダイナミック リンク バージョンを含めて APK にパッケージ化します。

Android for Work

Android 7.0 では、Android for Work をターゲットとするアプリに関して、次のような変更が行われています。 証明書のインストール、パスワードのリセット、セカンダリ ユーザーに対する変更 管理、デバイス識別子へのアクセスなどが可能です。Google Cloud 向けの Android for Work 環境では、これらの変更点をレビューし、 適切にカスタマイズする必要があります

  • DPC が設定するには、委任証明書のインストーラをインストールする必要があります できます。Android 7.0(API レベル 24)を対象とするプロファイル アプリとデバイス所有者アプリの両方の場合、 デバイス ポリシーの前に委任証明書のインストーラをインストールする必要がある コントローラ(DPC)呼び出し DevicePolicyManager.setCertInstallerPackage()。インストーラが まだインストールされていない場合、システムは IllegalArgumentException
  • デバイス管理者向けのパスワードの再設定の制限がプロファイルに適用 できます。デバイス管理者は パスワードの消去や変更を行うには、DevicePolicyManager.resetPassword() すでに設定されているものを確認できますデバイス管理者がパスワードを設定できますが、 デバイスにパスワード、PIN、またはパターンが設定されていない場合。
  • デバイスとプロファイルの所有者は、制限対象であってもアカウントを管理できる あります。デバイス所有者とプロファイル所有者は Account Management API を呼び出すことができる DISALLOW_MODIFY_ACCOUNTS ユーザー制限が適用されている場合でも削除されません。
  • デバイス所有者は、セカンダリ ユーザーをより簡単に管理できます。デバイスの デバイス所有者モードで実行している場合、DISALLOW_ADD_USER 制限 自動的に設定されます。これにより、ユーザーは管理対象外のセカンダリを作成できなくなります。 できます。また、CreateUser()createAndInitializeUser() メソッドのサポートが終了しました。新しい DevicePolicyManager.createAndManageUser() メソッドで置き換えられます。
  • デバイスの所有者はデバイス ID にアクセスできます。デバイスの所有者は デバイスの Wi-Fi MAC アドレス( DevicePolicyManager.getWifiMacAddress()。Wi-Fi 接続が一度も デバイスで有効になっている場合、このメソッドは値 null を返します。
  • 仕事用モードの設定で、仕事用アプリへのアクセスを管理します。仕事用モードがオフの場合、 仕事用アプリが利用できないことをシステム ランチャーがグレー表示有効化 通常の動作に戻ります。
  • クライアント証明書チェーンを含む PKCS #12 ファイルをインストールし、 対応する秘密鍵、Google Cloud コンソールの CA 証明書、 チェーンは、信頼できる認証情報ストレージにインストールされなくなります。これにより、 アプリがクライアントを取得しようとしたときの KeyChain.getCertificateChain() の結果に影響しない 後ほど説明します。必要に応じて、CA 証明書をインストールする必要があります。 設定 UI を介して、信頼できる認証情報ストレージに個別に ファイル拡張子が .crt または .cer で、DER でエンコードされた形式。
  • Android 7.0 以降、指紋の登録と保存は管理されます。 あります。プロファイル所有者のデバイス ポリシー クライアント(DPC)が API レベルをターゲットとしている場合 Android 7.0(API レベル 24)を搭載したデバイスで 23(またはそれ以前)を使用した場合、 指紋をデバイスに設定できますが、仕事用アプリでは アクセスデバイスのフィンガープリント。API レベル 24 以降をターゲットとしている DPC の場合、ユーザーは以下を設定できます。 仕事用プロファイルの [設定 > セキュリティ >仕事用プロファイルのセキュリティ
  • 新しい暗号化ステータス ENCRYPTION_STATUS_ACTIVE_PER_USER は次のとおりです。 DevicePolicyManager.getStorageEncryptionStatus() が返す、 は、暗号化が有効で、暗号鍵が できます。新しいステータスは、DPC が API レベル 24 以降をターゲットとしている場合にのみ返されます。 それより前の API レベルをターゲットとするアプリの場合、ENCRYPTION_STATUS_ACTIVE ユーザーまたはプロファイルに固有の暗号鍵であっても、返されます。
  • Android 7.0 では、通常、システム全体に影響を与えるいくつかのメソッドが デバイスに仕事用プロファイルがインストールされていれば、 別の仕事の課題に取り組みます。これらはデバイス全体に影響を与えるのではなく、 メソッドは仕事用プロファイルにのみ適用されます。(このようなメソッドの完全なリストについては、 DevicePolicyManager.getParentProfileInstance() ドキュメントをご覧ください)。たとえば DevicePolicyManager.lockNow() は仕事用プロファイルのみをロックします。ロックはされません。 デバイス全体をロックします。どの方法でも、古い 親インスタンスのメソッドを呼び出して、 DevicePolicyManager、次の方法でこの親を取得できます。 DevicePolicyManager.getParentProfileInstance() を呼び出しています。たとえば、 親インスタンスの lockNow() メソッドを呼び出すと、デバイス全体がロックされます。

アノテーションの保持

Android 7.0 では、アノテーションの表示が無視されていたバグが修正されています。 この問題により、ランタイムがアクセスされるべきではないアノテーションにアクセスできました できます。次のアノテーションがありました。

  • VISIBILITY_BUILD: ビルド時にのみ表示することを目的としています。
  • VISIBILITY_SYSTEM: 実行時に表示されることを意図したものの、 必要があります。

アプリがこの動作に依存している場合は、アノテーションに保持ポリシーを追加してください。 実行時に使用できます。これを行うには、@Retention(RetentionPolicy.RUNTIME) を使用します。

TLS/SSL のデフォルト構成の変更

Android 7.0 では、デフォルトの TLS/SSL 構成が次のように変更されています。 アプリが HTTPS やその他の TLS/SSL トラフィックに使用する場合:

  • RC4 暗号スイートが無効になりました。
  • CHACHA20-POLY1305 暗号スイートが有効になりました。

RC4 がデフォルトで無効になると、HTTPS または TLS/SSL に不具合が生じる可能性がある サーバーが最新の暗号スイートをネゴシエートしない場合、接続が暗号化されます。 推奨される修正方法は、サーバーの設定を改善して、 最新の暗号スイートとプロトコルが サポートされますTLSv1.2 と AES-GCM が理想的です 有効である必要があり、前方秘匿性暗号スイート(ECDHE)は 有効にする必要があります

別の方法としては、カスタムの SSLSocketFactory を使用してサーバーと通信するようにアプリを修正することもできます。「 SSLSocket を作成するためのファクトリを設計する必要があります。 サーバーに必要な暗号スイートの一部を持つインスタンス 有効になります。

注: これらの変更は WebView とは関係ありません。

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

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

シリアル化の変更

Android 7.0(API レベル 24)で、デフォルト serialVersionUID を指定します。

Serializable を実装するクラス serialVersionUID フィールドを明示的に指定しなかった場合、 デフォルトの serialVersionUID が変更されると、例外が発生する クラスのインスタンスをシリアル化解除しようとしたときにスローされます。 以前のバージョンでシリアル化されているか、以前のバージョンをターゲットとするアプリによってシリアル化されている できます。次のようなエラー メッセージが表示されます。

local class incompatible: stream classdesc serialVersionUID = 1234, local class serialVersionUID = 4567

これらの問題を修正するには、serialVersionUID フィールドを追加する必要があります。 エラー メッセージの stream classdesc serialVersionUID 値を持つ影響を受けるクラス。例:1234 インチ できます。この変更は、Google Cloud のオペレーション スイートにおける Android のすべてのバージョンで機能します。

修正された具体的なバグは、静的な イニシャライザ メソッド(<clinit> など)。「 静的イニシャライザ メソッドの有無を そのクラスに対して計算されたデフォルトの serialVersionUID に影響します。 バグを修正する前に、計算ではスーパークラスの クラスに静的イニシャライザがない場合は、このイニシャライザを使用します。

明確にするために記すと、今回の変更は、API レベル 23 または 下位、serialVersionUID フィールドを持つクラス、または 静的初期化メソッドを持つオブジェクトです

その他の重要事項

  • Android 7.0 で実行しているアプリが、より低い API レベルをターゲットとしている場合、 ユーザーがディスプレイ サイズを変更すると、アプリプロセスは強制終了されます。アプリ 適切に処理できる必要がありますそうしないと、クラッシュします ユーザーが [履歴] から復元したとき。

    アプリをテストして ないことを確認します。 そのためには、同じクラッシュをトリガーして DDMS 経由でアプリを手動で強制終了したとき。

    Android 7.0(API レベル 24)以降を対象とするアプリは、 密度の変化で強制終了されます。それでも 適切な対応ができず 自動的に適用されます。

  • Android 7.0 上のアプリは、構成の変更を適切に処理できなければなりません。 後続の起動時にクラッシュしないようにする必要があります。アプリの動作を確認できます フォントサイズを変更します([設定] > ディスプレイ >フォントサイズ)を選択してから、 [履歴] からアプリを削除します。
  • 以前のバージョンの Android のバグにより、システムで書き込みのフラグが設定されませんでした。 メインスレッドの TCP ソケットに送ります。Android 7.0 では、このバグが修正されています。 この動作を示すアプリは、android.os.NetworkOnMainThreadException をスローするようになりました。 一般に、メインスレッドでネットワーク操作を実行することはおすすめしません。これらの操作は、 レイテンシが高く ANR やジャンクが発生します
  • Debug.startMethodTracing() メソッド ファミリーのデフォルトが 共有ストレージ上のパッケージ固有のディレクトリに出力を保存する 最上位レベルではなく 。つまり、アプリがこれらの API を使用するために WRITE_EXTERNAL_STORAGE 権限をリクエストする必要がなくなりました。
  • 多くのプラットフォーム API で、送信された大きなペイロードのチェックが開始された Binder 件の取引で、 システムが TransactionTooLargeExceptions を再スローするようになりました。 アラートを通知せずにロギングまたは抑制するのではなく、RuntimeExceptions として使用します。1 本 よくある例としては、大量のデータを Activity.onSaveInstanceState(), これにより、ActivityThread.StopInfo は アプリが Android 7.0 をターゲットとする場合は RuntimeException
  • アプリが Runnable タスクを View に送信し、かつ View ウィンドウにアタッチされていない場合、 Runnable タスクを View でキューに入れます。 Runnableタスクは View が接続されています ウィンドウに追加します。この動作により、次のバグが修正されます。 <ph type="x-smartling-placeholder">
      </ph>
    • アプリが本来とは異なるスレッドから View に投稿した 結果として Runnable が間違ったスレッドで実行される可能性があります。
    • タスクが Runnable 以外のスレッドから投稿された場合 ループ スレッドで呼び出さなかった場合、アプリは Runnable タスクを公開できます。
  • Android 7.0 で、 DELETE_PACKAGES 権限がパッケージを削除しようとしたが、そのパッケージを別のアプリがインストールした ユーザーによる確認が必要です。このシナリオでは、アプリは次の動作を予期する必要があります。 STATUS_PENDING_USER_ACTION 返されたステータスとして、 PackageInstaller.uninstall()
  • Crypto という JCA プロバイダのサポートは、 SHA1PRNG アルゴリズムは暗号的に脆弱です。アプリは このプロバイダはもう存在しないため、SHA1PRNG を使用して(安全でない)鍵を導出します。 できます。詳細については、こちらのブログをご覧ください。 セキュリティの「暗号化」に関する投稿Android でサポートが終了したプロバイダ N