動作の変更点: すべてのアプリ

Android 10 には、アプリに影響する可能性がある動作変更が含まれています。 このページに記載されている変更は、実行時にアプリに適用されます。 アプリの targetSdkVersion に関係なく、Android 10 では正常に動作します。まず、 これらの変更に適切に対応できるよう、必要に応じて変更してください。

アプリの targetSdkVersion が 29 以降の場合は、次のことも必要です。 その他の変更もサポートしますアプリの動作変更に関する注意事項を必ずお読みください。 ターゲティング 29 をご覧ください。

注: Android 10 では、このページに記載されている変更に加えて、 では、プライバシーに関する数多くの変更や制限が導入されています。たとえば、次のようなものです。 次のとおりです。

  • デバイスの位置情報へのバックグラウンドでのアクセス
  • バックグラウンドからのアクティビティの起動
  • 連絡先アフィニティの情報
  • MAC アドレスのランダム化
  • カメラのメタデータ
  • 権限モデル

この変更はすべてのアプリに影響を与え、ユーザーのプライバシーを強化します。詳細情報 詳しくは、 プライバシーの変更ページ。

非 SDK インターフェースの制限

アプリの安定性と互換性を確保するために、Google Play プラットフォームでは 非 SDK インターフェースが Android 9(API レベル 28)で使用できます。Android 10 では、Android デベロッパーの協力や最新の内部テストに基づいて、制限対象となる非 SDK インターフェースのリストが更新されています。Google の目標は、パブリック インターネットの 以外の代替手段が利用可能になります。

Android 10(API レベル 29)を対象としていない場合、これらの変更の一部 すぐには影響しない可能性があります。ただし、現時点で(アプリのターゲット API レベルに応じて)一部の非 SDK インターフェースを利用できていても、非 SDK のメソッドまたはフィールドをそのまま使用し続けると、将来的にアプリが機能しなくなるリスクが高くなります。

アプリが非 SDK インターフェースを使用しているかどうか不明な場合は、 アプリをテストし、 あります。アプリが非 SDK インターフェースに依存している場合は、 移行する方法を学びましたただし Google も、一部のアプリには非 SDK インターフェースを使用する正当なユースケースがあると承知しています。代わりのツールが見つからない場合 アプリの機能で非 SDK インターフェースを使用する場合、 新しい公開 API をリクエストします。

詳しくは、非 SDK インターフェースの制限に関する Android 10 での変更点をご覧ください。 非 SDK インターフェースの制限をご覧ください。

ジェスチャー ナビゲーション

Android 10 以降、デバイス全体でジェスチャー ナビゲーションを有効にできます。ユーザーがジェスチャー ナビゲーションを有効にすると、 (API レベル 29 をターゲットとするかどうかに関係なく)たとえばユーザーが 操作すると、システムはそのジェスチャーを「戻る」と解釈します。 ただし、アプリの一部でそのジェスチャーを明示的にオーバーライドする場合を除く 画面に表示されます。

アプリをジェスチャー ナビゲーションに対応させるには、アプリのコンテンツを画面全体に拡大し、競合するジェスチャーに適切に対処する必要があります。詳しくは、ジェスチャー ナビゲーションのドキュメントをご覧ください。

NDK

Android 10 では、NDK が次のように変更されています。

共有オブジェクトにテキストの再配置を含めることはできません

Android 6.0(API レベル 23)で使用できない使用 共有オブジェクト内でのテキスト再配置の繰り返しです。コードはそのままの状態で読み込む必要があり、 変更できます。この制限により、アプリの読み込み時間とセキュリティが改善されます。

Android 10 以降をターゲットとするアプリでは、この制限は、SELinux によって適用します。これらのアプリでテキストを含む共有オブジェクトを引き続き使用する場合 データ侵害のリスクが高くなります

Bionic ライブラリと動的リンカーのパスの変更

Android 10 以降、一部のパスがシンボリック リンクになっています。これは通常のファイルではありません。パスが通常のファイルであることに依存してきたアプリ 破損する可能性があります:

  • /system/lib/libc.so -> /apex/com.android.runtime/lib/bionic/libc.so
  • /system/lib/libm.so -> /apex/com.android.runtime/lib/bionic/libm.so
  • /system/lib/libdl.so -> /apex/com.android.runtime/lib/bionic/libdl.so
  • /system/bin/linker -> /apex/com.android.runtime/bin/linker

これらの変更は 64 ビット版のファイルにも適用されます。 lib/lib64/ に置き換えました。

互換性を維持するために、シンボリック リンクは古いパスで提供されます。たとえば /system/lib/libc.so は次のシンボリック リンクです: /apex/com.android.runtime/lib/bionic/libc.so。まず dlopen(“/system/lib/libc.so”) は引き続き機能しますが、アプリが 読み込み済みのライブラリを実際に /proc/self/maps などです。これは一般的ではありませんが、 一部のアプリでは、ハッキング対策プロセスの一環としてこの処理を行っています。その場合、 /apex/… パスは、Bionic ファイルの有効なパスとして追加する必要があります。

システムのバイナリやライブラリを実行専用メモリにマッピング

Android 10 以降、システム バイナリの実行可能セグメント セキュリティ強化のため、実行専用(読み取り不可)メモリにマッピングされる 攻撃から保護する方法を学びました。アプリで読み取りオペレーションが 実行専用としてマークされたメモリ セグメント(バグ、脆弱性、 意図的なメモリ検査 - システムが SIGSEGV シグナルをアプリに送信します。

関連する /data/tombstones/ にある tombstone ファイル。実行のみに関連するクラッシュ 次の中止メッセージが含まれています。

Cause: execute-only (no-read) memory access error; likely due to data in .text.

この問題を回避してメモリ インスペクションなどの操作を行うには、 次の呼び出しによって、実行専用セグメントを読み取り + 実行としてマークできます。 mprotect()。ただし、デフォルトのステータスに戻すことを強くおすすめします。 実行のみに制限することをおすすめします。このアクセス権限の設定により、 アプリとユーザーを保護します

セキュリティ

Android 10 では、セキュリティが次のように変更されています。

TLS 1.3 はデフォルトで有効

Android 10 以降、すべての TLS 接続に対して TLS 1.3 がデフォルトで有効になっています。TLS 1.3 に関する重要な詳細情報 実装:

  • TLS 1.3 暗号スイートはカスタマイズできません。TLS 1.3 が有効な場合、サポート対象の TLS 1.3 暗号スイートは常に有効です。無効化を試みると 呼び出すことで、 setEnabledCipherSuites() は無視されます。
  • TLS 1.3 がネゴシエートされると、 HandshakeCompletedListener セッションがセッション キャッシュに追加される前に、これらのオブジェクトが呼び出されます。(TLS 1.2 以前のバージョンでは、このオブジェクトは、セッションがセッション キャッシュに追加されてから呼び出されます)。
  • SSLEngine インスタンスが SSLHandshakeException オン 使用している場合、このようなインスタンスは 代わりに SSLProtocolException
  • 0-RTT モードはサポートされていません。

必要に応じて、TLS 1.3 が無効になっている SSLContext を取得するには、 SSLContext.getInstance("TLSv1.2")。 接続ごとにプロトコル バージョンを有効または無効にすることもできます。 setEnabledProtocols() を呼び出し中 自動的に作成されます。

SHA-1 で署名された証明書は TLS では信頼されない

Android 10 では、SHA-1 ハッシュ アルゴリズムを使用する証明書 TLS 接続では信頼されません。ルート CA はこのような証明書を発行していません 2016 年から導入され、Chrome などの主要なブラウザで信頼されなくなりました。

接続しようとしているサイトへの接続に失敗すると、 SHA-1 を使用して暗号化されます。

KeyChain の動作変更と機能強化

Google Chrome など一部のブラウザでは、TLS サーバーが TLS handshake の一環として証明書リクエスト メッセージを送信するときに、ユーザーが証明書を選択できます。時点 Android 10、 KeyChain オブジェクトは発行元を尊重し、 KeyChain.choosePrivateKeyAlias() を呼び出す際のキー指定パラメータ 証明書の選択プロンプトをユーザーに表示します。特に、このプロンプトは サーバー仕様に準拠していない選択肢が含まれている。

ユーザーが選択できる証明書がない場合(存在しない場合など)は、 サーバーの仕様に一致するか、デバイスに証明書が 証明書を選択するプロンプトがまったく表示されません。

また、Android 10 以降では、 鍵または CA 証明書を KeyChain オブジェクトにインポートするためのデバイスの画面ロック。

TLS と暗号化に関するその他の変更

TLS と暗号化ライブラリには、いくつかの軽微な変更が加えられています。 Android 10 で有効になります。

  • AES/GCM/NoPadding および ChaCha20/Poly1305/NoPadding 暗号は、 getOutputSize() からの正確なバッファサイズ。
  • TLS_FALLBACK_SCSV 暗号スイートは、次の接続試行から省略されます。 TLS 1.2 以降の最大プロトコルが必要です。TLS サーバーの改良により、 TLS 外部のフォールバックを試みることはおすすめしません。代わりに TLS バージョンネゴシエーションの使用をおすすめします
  • ChaCha20-Poly1305 は、ChaCha20/Poly1305/NoPadding のエイリアスとして機能します。
  • 末尾にピリオドが付いたホスト名は、有効な SNI ホスト名とは見なされません。
  • CertificateRequest の supported_signature_algorithms 拡張機能は次のとおりです。 選ぶ際の参考になります。
  • Android Keystore の署名鍵など、不透明な署名鍵は TLS の RSA-PSS 署名で使用できます。

Wi-Fi Direct ブロードキャスト

Android 10 では、Wi-Fi に関連する以下のブロードキャストは ノーリファラーは固定ではありません。

スティッキー ブロードキャストであることを前提として登録時にこれらのブロードキャストを受信する仕様のアプリの場合は、代わりに初期化時に適切な get() メソッドを使用して情報を取得するようにしてください。

Wi-Fi Aware 機能

Android 10 では、Wi-Fi Aware を使用して TCP/UDP ソケットを簡単に作成できるようになりました 作成します。ServerSocket に接続する TCP/UDP ソケットを作成するには、クライアントが デバイスがサーバーの IPv6 アドレスとポートを認識している必要があります。これは、 BT または Wi-Fi Aware レイヤを使用するなど、帯域外で通信する必要がある または mDNS などの他のプロトコルを使用して帯域内で検出されるあり Android 10 の場合、この情報はネットワーク設定の一部として伝達できます。

サーバーは次のいずれかを実行します。

  • ServerSocket を初期化し、使用するポートを設定または取得します。
  • Wi-Fi Aware ネットワーク リクエストの一部としてポート情報を指定する。

次のコードサンプルは、ネットワーク リクエストの一部としてポート情報を指定する方法を示しています。

Kotlin

val ss = ServerSocket()
val ns = WifiAwareNetworkSpecifier.Builder(discoverySession, peerHandle)
  .setPskPassphrase("some-password")
  .setPort(ss.localPort)
  .build()

val myNetworkRequest = NetworkRequest.Builder()
  .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
  .setNetworkSpecifier(ns)
  .build()

Java

ServerSocket ss = new ServerSocket();
WifiAwareNetworkSpecifier ns = new WifiAwareNetworkSpecifier
  .Builder(discoverySession, peerHandle)
  .setPskPassphrase(some-password)
  .setPort(ss.getLocalPort())
  .build();

NetworkRequest myNetworkRequest = new NetworkRequest.Builder()
  .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
  .setNetworkSpecifier(ns)
  .build();

その後、クライアントは Wi-Fi Aware ネットワーク リクエストを実行して IPv6 と サーバーから提供されたポート:

Kotlin

val callback = object : ConnectivityManager.NetworkCallback() {
  override fun onAvailable(network: Network) {
    ...
  }
  
  override fun onLinkPropertiesChanged(network: Network,
      linkProperties: LinkProperties) {
    ...
  }

  override fun onCapabilitiesChanged(network: Network,
      networkCapabilities: NetworkCapabilities) {
    ...
    val ti = networkCapabilities.transportInfo
    if (ti is WifiAwareNetworkInfo) {
       val peerAddress = ti.peerIpv6Addr
       val peerPort = ti.port
    }
  }
  override fun onLost(network: Network) {
    ...
  }
};

connMgr.requestNetwork(networkRequest, callback)

Java

callback = new ConnectivityManager.NetworkCallback() {
  @Override
  public void onAvailable(Network network) {
    ...
  }
  @Override
  public void onLinkPropertiesChanged(Network network,
      LinkProperties linkProperties) {
    ...
  }
  @Override
  public void onCapabilitiesChanged(Network network,
      NetworkCapabilities networkCapabilities) {
    ...
    TransportInfo ti = networkCapabilities.getTransportInfo();
    if (ti instanceof WifiAwareNetworkInfo) {
       WifiAwareNetworkInfo info = (WifiAwareNetworkInfo) ti;
       Inet6Address peerAddress = info.getPeerIpv6Addr();
       int peerPort = info.getPort();
    }
  }
  @Override
  public void onLost(Network network) {
    ...
  }
};

connMgr.requestNetwork(networkRequest, callback);

Go デバイス上の SYSTEM_ALERT_WINDOW

Android 10(Go バージョン)デバイスで実行されているアプリは、 SYSTEM_ALERT_WINDOW 付与します。これは、オーバーレイ ウィンドウの描画に大量のメモリが使用されるためです。メモリの少ない Android デバイスのパフォーマンスに悪影響をもたらす可能性があります。

Android 9 以前を搭載した Go エディションのデバイスで実行されているアプリが SYSTEM_ALERT_WINDOW 権限を設定すると、 デバイスが Android 10 にアップグレードされている。ただし、そのようにインストールされていないアプリでは、 権限を付与することはできません。

Go デバイス上のアプリがアクションを含むインテントを送信した場合 ACTION_MANAGE_OVERLAY_PERMISSION リクエストが自動的に拒否され、ユーザーは [設定] 画面に、権限がないために権限が無効になっていることを示す デバイスの動作が遅くなりますGo デバイス上のアプリが Settings.canDrawOverlays() を呼び出した場合、このメソッドは常に false を返します。これらの制限はアプリには デバイスが以前に SYSTEM_ALERT_WINDOW 権限を与えられていたため、 Android 10 にアップグレードしました。

古いバージョンの Android をターゲットにしているアプリに関する警告

Android 10 以降では、Android 5.1(API レベル 22)以前をターゲットにしているアプリを初めて実行したときに、ユーザーに警告が表示されます。アプリが ユーザーに権限を付与するよう求める場合、ユーザーに機会が与えられます。 アプリの最初の実行を許可する前に、アプリの権限を調整する あります。

Google Play の対象 API による 要件 これらの警告は、アップデートされていないアプリを実行しているユーザーにのみ表示されます できます。他のストアを通じて配布されるアプリの場合、同様の対象 API 2019 年中に施行されますこれらの詳細については 対象 API レベル要件の拡張 2019 年

SHA-2 CBC 暗号スイートの削除

以下の SHA-2 CBC 暗号スイートがプラットフォームから削除されました。

  • TLS_RSA_WITH_AES_128_CBC_SHA256
  • TLS_RSA_WITH_AES_256_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384

これらの暗号スイートは、GCM を使用する同様の暗号スイートよりも安全性が低くなります。 また、ほとんどのサーバーは、これらの暗号の GCM および CBC 両方のバリエーションをサポートしています。 どちらもサポートしていません

アプリの使用

Android 10 では、アプリの利用に関して次のように動作が変更されました。

  • UsageStats アプリの使用状況の改善 - Android 10 では、Android 10 の UsageStats(アプリが動作している場合) 分割画面モードやピクチャー イン ピクチャー モードでも使用できます。また Android 10 では、Instant App の使用状況が正しくトラッキングされます。

  • アプリごとのグレースケール - Android 10 では、アプリごとにグレースケール表示モードを設定できます。

  • アプリごとの注意散漫状態 - Android 10 では、アプリを選択的に「注意散漫状態」に設定できますここで 通知が抑制され、おすすめのアプリとして表示されません。

  • 一時停止と再生 - Android 10 では、停止中のアプリは音声を再生できません。

HTTPS 接続の変更

Android 10 を搭載したアプリが nullsetSSLSocketFactory() IllegalArgumentException 発生します。以前のバージョンでは、nullsetSSLSocketFactory() に渡していました。 現在の default ファクトリで確認できます。

android.preference ライブラリのサポート終了

android.preference ライブラリは Android 10 で非推奨になりました。代わりにデベロッパーは Android Jetpack の一部である AndroidX Preference ライブラリをご利用ください。移行とデプロイを支援する追加リソースについては、 更新された設定 ガイド公開されているサンプル アプリリファレンス ドキュメントをご覧ください。

ZIP ファイルのユーティリティ ライブラリの変更

Android 10 では、java.util.zip のクラスに以下の変更が行われています。 これは ZIP ファイルを処理するパッケージです。これらの変更により、ライブラリの動作がより Android と、java.util.zip を使用する他のプラットフォームの間での一貫性。

Inflater

以前のバージョンでは、Inflater クラスの一部のメソッドが 次の場合は IllegalStateException end() の呼び出し後に呼び出されました。 Android 10 では、これらのメソッドは NullPointerException をご利用ください。

ZipFile

Android 10 以降では、 ZipFile File 型、int 型の引数を取り、Charset 型は 提供された ZIP ファイルの場合は ZipException ファイルが含まれていません。

ZipOutputStream

Android 10 以降では、 finish() メソッド: ZipOutputStreamZipException を書き込もうとした場合 ファイルが含まれていない ZIP ファイルの出力ストリーム

カメラに関する変更点

カメラを使用するアプリの多くは、デバイスが縦向き構成の場合、 この場合、実機も縦向きになります。詳しくは、 カメラの向き。以前は安全な想定でしたが、 折りたたみ式デバイスなどの利用可能なフォーム ファクタの拡大に伴い変わりました。 誤った回転やスケーリング(または カメラ ビューファインダーの画面に表示されます。

API レベル 24 以降をターゲットとするアプリでは、明示的に android:resizeableActivityして、必要な機能を提供して、 マルチウィンドウ処理です

電池使用量のトラッキング

Android 10 以降、 SystemHealthManager のリセット デバイスが電源から外された際のバッテリー使用量の統計が 充電イベント。大まかに言うと、主要な充電イベントとは、 フル充電された、またはデバイスのバッテリー残量がおおむねからバッテリーがおおむねになった 充電されます。

Android 10 より前は、デバイスが 電池残量にほとんど変化がなくても、電源から外すことができます。

Android ビームを削除

Android 10 では、近距離無線通信(NFC)を介してデバイス間でデータ共有を開始するための古い機能、Android ビームが正式に終了します。また、関連する NFC API のいくつかのサポートも終了します。必要に応じて、デバイス メーカー パートナーがオプションで Android ビームを使用し続けることはできますが、開発は行われていません。ただし、他の NFC 機能と API については Android で引き続きをサポートされます。また、タグからの読み取り、支払いなどのユースケースは想定どおりに動作し続けます。

java.math.BigDecimal.stripTrailingZeros() の動作変更

BigDecimal.stripTrailingZeros() で末尾のゼロが 入力値がゼロの場合の特殊なケースです。

java.util.regex.Matcher と Pattern の動作変更

split() の結果が、空の String で始まらないように変更されました ("")は、入力の先頭でゼロ幅の一致がある場合です。また、 String.split() に影響します。たとえば、"x".split(""){"x"} を返すようになりました。 それに対して、以前のバージョンの Android では {"", "x"} を返していました。 "aardvark".split("(?=a)"{"a", "ardv", "ark"} を返すようになりました。 {"", "a", "ardv", "ark"}

無効な引数に対する例外の動作も改善されました。

  • appendReplacement(StringBuffer, String) がスローするようになりました。 次の場合は、IndexOutOfBoundsException ではなく IllegalArgumentException 置換 String は単独のバックスラッシュで終わりますが、これは誤りです。「 置換 String$ で終了した場合、同じ例外がスローされるようになりました。 以前は、このシナリオでは例外はスローされませんでした。
  • replaceFirst(null) がスローした場合に、Matcherreset() を呼び出さなくなりました。 NullPointerExceptionNullPointerException がスローされるようになった場合は、 一致しません。以前は、一致があった場合にのみスローされていました。
  • start(int group)end(int group)group(int group) で、グループ インデックスが範囲外の場合、より一般的な IndexOutOfBoundsException がスローされるようになりました。以前は、これらのメソッドは ArrayIndexOutOfBoundsException をスローしていました。

GradientDrawable のデフォルトの角度が TOP_BOTTOM になりました

Android 10 では、 GradientDrawable XML で提供します。また、角度測定、グラデーションの向きは指定しません。 デフォルトは TOP_BOTTOM。 これは、Android の以前のバージョン(デフォルト: LEFT_RIGHT

回避策として、AAPT2 を最新バージョンにアップデートすると、 以前のアプリに対して角度が指定されていない場合、角度の測定値が 0 に設定されます。 指定します。

デフォルトの SUID を使用したシリアル化されたオブジェクトのロギング

Android 7.0(API レベル 24)以降、 シリアル化可能の場合、デフォルトの serialVersionUID に変更 オブジェクト。この修正は、API レベル 23 以前をターゲットとするアプリには影響しませんでした。

Android 10 以降では、アプリが API レベル 23 以前をターゲットとし、古い間違ったデフォルトの serialVersionUID に依存している場合、システムは警告をログに記録し、コード修正を提案します。

具体的には、次の条件をすべて満たしている場合に警告がログに記録されます。

  • API レベル 23 以前をターゲットとしているアプリ。
  • クラスはシリアル化されています。
  • シリアル化されたクラスは、代わりにデフォルトの serialVersionUID を使用します。 serialVersionUID を明示的に設定しています。
  • デフォルトの serialVersionUIDserialVersionUID と異なる。 アプリが API レベル 24 以降をターゲットとしています

この警告は、影響を受けるクラスごとに 1 回記録されます。 警告メッセージには修正の提案が含まれています。この修正は、 serialVersionUID をデフォルト値(次の場合に計算される値)に設定 API レベル 24 以降をターゲットとしているアプリ。この修正を使用することで そのクラスのオブジェクトが、API レベルをターゲットとするアプリでシリアル化されている場合 24 以上をターゲットとするアプリでは、オブジェクトが正しく読み取られます。 できます。

java.io.FileChannel.map() の変更

Android 10 以降、FileChannel.map()/dev/zero のような非標準ファイルではサポートされません。非標準ファイルのサイズを truncate() を使って変更することはできません。Android の以前のバージョンでは、truncate() から返される errno をそのままにしていましたが、Android 10 は IOException をスローします。以前の動作が必要な場合は ネイティブコードを使用する必要があります