Android 10 の機能と API

Android 10 では、ユーザーとデベロッパー向けの優れた機能が導入されています。このドキュメントでは、デベロッパー向けの機能について紹介します。

API について詳しくは、API 差分レポートまたは Android API リファレンス(「API レベル 29 で追加」された API)をご覧ください。また、プラットフォームの変更がアプリに影響を及ぼす可能性がある領域については、Android 10 の動作変更(API レベル 29 をターゲットとするアプリすべてのアプリ向け)とプライバシーに関する変更点もご確認ください。

セキュリティの機能強化

Android 10 には、以降のセクションで説明するさまざまなセキュリティ機能が導入されています。

生体認証ダイアログの改善

Android 10 では、生体認証のサポートが次のように改善されています。

  • 生体認証機能の確認。
  • 生体認証入力で認証できない場合に、ユーザーがデバイスの PIN、パターン、またはパスワードを使用して認証できるようにするフォールバック メカニズム。
  • 暗黙的な生体認証モダリティを使用してユーザーが認証された後は、ユーザーの確認を要求しないようシステムに指示するヒント。たとえば、ユーザーが顔認証を使用して認証した後は、それ以上の確認が不要であることをシステムに伝えることができます。

APK から埋め込み DEX コードを直接実行する

Android 10 では、埋め込み DEX コードをアプリの APK ファイルから直接実行するようプラットフォームに指示できます。このオプションは、攻撃者がデバイス上のローカルにコンパイルされたコードを改ざんできた場合の攻撃を防止するのに役立ちます。

詳しくは、APK から埋め込み DEX コードを直接実行するをご覧ください。

TLS 1.3 のサポート

Android 10 では、TLS 1.3 のサポートが追加されています。TLS 1.3 は TLS 標準のメジャー リビジョンで、パフォーマンスの向上とセキュリティの強化が含まれています。Google のベンチマークでは、TLS 1.3 では TLS 1.2 と比較して、安全な接続を確立できるまでの時間が 40% 短縮されています。

TLS 1.3 の実装について詳しくは、「すべてのアプリに対する動作変更」ページの TLS のセクションをご覧ください。

公開 Conscrypt API

Android 10 以降、Conscrypt セキュリティ プロバイダには TLS 機能用の公開 API が含まれています。

android.net.ssl の下のクラスのコレクションには、汎用の javax.net.ssl API では利用できない機能にアクセスするための静的メソッドが含まれています。これらのクラスの名前は、対応する javax.net.ssl クラスの複数形として推測できます。たとえば、javax.net.ssl.SSLSocket のインスタンスで動作するコードでは、代わりに SSLSockets のメソッドを使用できます。

接続機能

Android 10 では、ネットワークおよび接続に関する機能がいくつか改善されています。

Wi-Fi ネットワーク接続 API

Android 10 では、ピアツーピア接続がサポートされるようになりました。この機能により、アプリは WifiNetworkSpecifier を使用してリクエストされたネットワークのプロパティを記述することで、デバイスが接続されているアクセス ポイントを変更するようユーザーに促すことができます。ピアツーピア接続は、Chromecast や Google Home ハードウェアなどのセカンダリ デバイスのブートストラップ設定など、ネットワーク提供以外の目的で使用されます。

詳細については、ピアツーピア接続のための Wi-Fi Network Request API をご覧ください。

Wi-Fi ネットワーク候補 API

Android 10 では、アプリがユーザーに Wi-Fi アクセス ポイントへの接続を求めるサポートが追加されました。接続先のネットワークを提案できます。プラットフォームは最終的に、デベロッパーや他のアプリからの入力に基づいて、受け入れるアクセス ポイントを選択します。

この機能の詳細については、Wi-Fi の提案をご覧ください。

Wi-Fi 高性能モードと Wi-Fi 低遅延モードの改善

Android 10 では、基盤となるモデムにヒントを提供してレイテンシを最小限に抑えることができます。

Android 10 では、Wi-Fi lock API が拡張され、高パフォーマンス モードと低遅延モードを効果的にサポートします。高パフォーマンス モードと低遅延モードでは、Wi-Fi 省電力モードが無効になります。モデムのサポートに応じて、低遅延モードでは、さらにレイテンシの最適化が有効になることがあります。

低遅延モードは、ロックを取得するアプリがフォアグラウンドで実行され、画面がオンになっている場合にのみ有効になります。低遅延モードは、リアルタイムのモバイルゲーム アプリケーションに特に役立ちます。

DNS リゾルバの特殊ルックアップ

Android 10 では、平文ルックアップと DNS-over-TLS モードの両方を使用する特殊な DNS ルックアップのネイティブ サポートが追加されています。これまで、プラットフォームの DNS リゾルバは A レコードと AAAA レコードのみをサポートしていました。これらのレコードでは、名前に関連付けられた IP アドレスのみを検索できましたが、他のレコードタイプはサポートしていませんでした。DnsResolver API は汎用の非同期解決を提供し、SRVNAPTR などのレコードタイプをルックアップできます。応答の解析はアプリが行う必要があります。

NDK ベースのアプリについては、android_res_nsend をご覧ください。

Wi-Fi Easy Connect

Android 10 では、Easy Connect を使用してピアデバイスに Wi-Fi 認証情報をプロビジョニングできます。これは、サポートが終了した WPS に代わるものです。アプリでは、ACTION_PROCESS_WIFI_EASY_CONNECT_URI インテントを使用して、セットアップとプロビジョニングのフローに Easy Connect を統合できます。

この機能の詳細については、Wi-Fi Easy Connect をご覧ください。

Wi-Fi Direct connection API

Android 10 では API クラス WifiP2pConfigWifiP2pManager が更新され、事前に定義された情報を使用して Wi-Fi Direct への高速接続を確立する機能がサポートされるようになりました。この情報は、Bluetooth や NFC などのサイドチャネルを介して共有されます。

次のコードサンプルは、事前に決められた情報を使用してグループを作成する方法を示しています。

Kotlin

val manager = getSystemService(Context.WIFI_P2P_SERVICE) as WifiP2pManager
val channel = manager.initialize(this, mainLooper, null)

// prefer 5G band for this group
val config = WifiP2pConfig.Builder()
    .setNetworkName("networkName")
    .setPassphrase("passphrase")
    .enablePersistentMode(false)
    .setGroupOperatingBand(WifiP2pConfig.GROUP_OWNER_BAND_5GHZ)
    .build()

// create a non-persistent group on 5GHz
manager.createGroup(channel, config, null)

Java

WifiP2pManager manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
Channel channel = manager.initialize(this, getMainLooper(), null);

// prefer 5G band for this group
WifiP2pConfig config = new WifiP2pConfig.Builder()
.setNetworkName("networkName")
.setPassphrase("passphrase")
.enablePersistentMode(false)
.setGroupOperatingBand(WifiP2pConfig.GROUP_OWNER_BAND_5GHZ)
.build();

// create a non-persistent group on 5GHz
manager.createGroup(channel, config, null);

認証情報を使用してグループに参加するには、manager.createGroup() を次のように置き換えます。

Kotlin

manager.connect(channel, config, null)

Java

manager.connect(channel, config, null);

Bluetooth LE Connection Oriented Channels(CoC)

Android 10 では、アプリから BLE CoC 接続を使用して、2 台の BLE デバイス間で大規模なデータ ストリームを転送できます。このインターフェースは Bluetooth と接続の仕組みを抽象化し、実装を簡素化します。

電話機能

Android 10 では、電話機能に関して以下のように改善されています。

通話品質の向上

Android 10 には、進行中の IP マルチメディア サブシステム(IMS)通話の品質に関する情報(ネットワークとの間の品質など)を収集する機能が追加されています。

コール スクリーニングと発信者番号

Android 10 には、ユーザーのアドレス帳にない通話を潜在的な迷惑電話として識別し、ユーザーに代わって迷惑電話を自動的に拒否する手段がアプリが用意されています。ブロックされた通話に関する情報は、ブロックされた通話として通話履歴に記録されるため、不在着信時のユーザーに対する透明性が高まります。この API を使用すると、通話スクリーニングと発信者番号の機能を提供するために、ユーザーから READ_CALL_LOG 権限を取得する必要がなくなります。

通話転送サービス API

Android 10 では、通話インテントの処理方法が変更されました。NEW_OUTGOING_CALL ブロードキャストは非推奨になり、CallRedirectionService API に置き換えられました。CallRedirectionService API には、Android プラットフォームから行われた発信を変更するためのインターフェースが用意されています。たとえば、サードパーティ アプリが通話をキャンセルし、VoIP 経由で再ルーティングすることがあります。

外部ストレージ上でのファイルの作成に関する改善点

Android 10 では、対象範囲別ストレージが導入されているほか、外部ストレージに関連する次の機能が追加されています。

  • IS_PENDING フラグを使用すると、ディスクに書き込まれるメディア ファイルへの排他的なアクセス権をアプリに付与できます。
  • ファイルを保存するべき特定の場所がわかっている場合は、新たに書き込まれたファイルの保存場所に関するヒントをシステムに提供できます。
  • 各外部ストレージ デバイスには一意のボリューム名があります。

メディアとグラフィック

Android 10 では、メディアとグラフィックに関する以下の機能および API が新しく導入されています。

音声入力の共有

Android 10 では、2 つのアプリで音声入力を同時に共有する機能が追加されています。 詳しくは、音声入力を共有するをご覧ください。

音声再生キャプチャ

Android 10 では、他のアプリからの音声再生をキャプチャできます。 詳しくは、再生キャプチャをご覧ください。

MediaStyle 通知のシークバー

Android 10 以降では、MediaStyle 通知にシークバーが表示されます。シークバーは、PlaybackState.getPosition() からの再生進行状況を示します。場合によっては、シークバーを使用して、再生中のプログラム内の位置をシークできます。シークバーの外観と動作は、以下のルールによって制御されます。

  • シークバーは、アクティブな MediaSession が存在し、その期間(MediaMetadata.METADATA_KEY_DURATION で指定)が 0 より大きい場合に表示されます。つまり、ライブ配信やラジオ放送などの不確定ストリームでは、バーは表示されません。
  • セッションで ACTION_SEEK_TO が実装されている場合、ユーザーはシークバーをドラッグして再生場所を制御できます。

Native MIDI API

Android Native MIDI API(AMidi)を使用すると、アプリ デベロッパーは C/C++ コードで MIDI データを送受信できるようになり、C/C++ のオーディオ/制御ロジックとより緊密に統合され、JNI の必要性を最小限に抑えることができます。

詳細については、Android Native MIDI API をご覧ください。

MediaCodecInfo の改善

Android 10 では、コーデックに関する詳細情報を取得するメソッドが MediaCodecInfo に追加されました。

詳しくは、メディア コーデックをご覧ください。

Thermal API

デバイスの温度が上がりすぎると、CPU や GPU がスロットリングされ、アプリやゲームに予期しない影響が及ぶ可能性があります。複雑なグラフィック、大量のコンピューティング、持続的なネットワーク アクティビティを使用するアプリは、問題が発生する可能性が高くなります。また、チップセットやコア周波数、統合レベル、デバイスのパッケージングやフォーム ファクタに応じてデバイスによって異なる場合があります。

Android 10 では、アプリやゲームは Thermal API を使用してデバイスの変化を監視し、消費電力を抑えて正常な温度に戻すための対策を講じることができます。アプリは PowerManagerリスナーを登録します。これにより、システムは熱ステータス(低、中、重、重大、緊急、シャットダウン)を継続的に報告します。

デバイスが熱ストレスを報告すると、アプリとゲームは、進行中のアクティビティを中断してさまざまな方法で電力使用量を削減します。たとえば、ストリーミング アプリで解像度/ビットレートやネットワーク トラフィックを下げる、カメラアプリでフラッシュや集中的な画像補正を無効にする、ゲームでフレームレートやポリゴン テッセレーションを減らす、メディアアプリでスピーカーの音量を下げる、地図アプリで GPS をオフにする、といったことが可能です。

Thermal API には、新しいデバイス HAL レイヤが必要です。現在、この HAL レイヤは Android 10 を搭載した Google Pixel デバイスでサポートされています。Google はパートナー デバイス メーカーと協力して、エコシステムへの幅広いサポートをできるだけ早く提供できるよう取り組んでいます。

カメラと画像

Android 10 では、カメラと画像に関連する次の新機能が導入されています。

モノクロカメラのサポート

Android 9(API レベル 28)で初めてモノクロカメラ機能が導入されました。 Android 10 では、モノクロカメラのサポートに次のような機能が追加されています。

  • Y8 ストリーム形式がサポートされ、メモリ効率が改善されています。
  • モノクロ RAW DNG キャプチャがサポートされるようになりました。
  • 通常のモノクロカメラと近赤外線カメラを区別するための MONO と NIR CFA 列挙が導入されました。

この機能を使用することで、ネイティブ モノクロ画像をキャプチャすることができます。論理マルチカメラ デバイスでは、低光量時の画質を向上させるために、モノクロカメラを物理サブカメラとして使用できます。

Dynamic Depth 形式

Android 10 以降、カメラは Dynamic Depth Format(DDF)という新しいスキーマを使用して、画像の奥行きデータを別のファイルに保存できます。アプリは JPG 画像とその奥行きメタデータの両方をリクエストし、その情報を使用して、元の画像データを変更することなく、後処理で必要なぼかしを適用できます。

この形式の仕様については、Dynamic Depth 形式をご覧ください。

High Efficiency Image File 形式

High Efficiency Image File(HEIF)形式は、他のファイル形式と比べて高画質のエンコードを実現し、ファイルサイズを小さくする標準的な画像および動画形式です。

ファイル形式について詳しくは、HEIC をご覧ください。

マルチカメラの改善

Android 10 では、複数のカメラを単一の論理カメラに融合する機能が改善されています。これは Android 9(API レベル 28)で導入された機能です。Camera2 API に以下が追加されました。

ユーザー補助サービス API

Android 10 では、以下の新しいユーザー補助サービスの機能と API が導入されています。

AccessibilityNodeInfo 入力キーフラグ

Android 10 では、isTextEntryKey() を呼び出して、特定の AccessibilityNodeInfo がキーボードまたはキーパッドの一部であるテキスト入力キーを表しているかどうかを判断できます。

ユーザー補助ダイアログ音声フィードバック

Android 10 では、ユーザー補助のショートカットを実行してユーザー補助サービスを開始する必要がある場合、サービスからリクエストがあれば、ダイアログにテキスト読み上げプロンプトを表示できます。

ジェスチャー ナビゲーションが有効であるときのユーザー補助ショートカット

Android 10 でジェスチャー ナビゲーション機能が有効になっている場合、ユーザー補助機能ボタンは表示されず、選択もできません。ユーザー補助サービスのメニューにアクセスするには、ユーザーは次のいずれかの操作を行う必要があります。

  • 2 本の指で上にスワイプ
  • 2 本の指で上にスワイプして長押し

物理キーボード用のユーザー補助ショートカット

Android 10 では、物理キーボードで Ctrl+Alt+Z キーを押すことで、ユーザー補助のショートカットをトリガーできます。

ソフト キーボード コントローラの機能強化

Android 10 では、デバイスがハード キーボードの接続を検出した場合でも、ユーザー補助サービスはソフト キーボードの表示をリクエストできます。ユーザーはこの動作をオーバーライドできます。

ユーザー定義のユーザー補助機能タイムアウト

Android 10 では、getRecommendedTimeoutMillis() API が導入されています。このメソッドでは、インタラクティブ UI 要素と非インタラクティブ UI 要素のユーザー定義のタイムアウトがサポートされます。戻り値は、ユーザー設定とユーザー補助サービス API の両方の影響を受けます。

自動入力の改善

Android 10 では、自動入力サービスが以下のように改善されています。

互換性に関連する自動入力リクエスト

FillRequest.FLAG_COMPATIBILITY_MODE_REQUEST フラグを使用すると、自動入力リクエストが互換モードで生成されたかどうかを確認できます。

ユーザー名とパスワードを同時に保存する

SaveInfo.FLAG_DELAY_SAVE フラグを使用することで、アプリが複数のアクティビティを使用してユーザー名やパスワードなどのフィールドを表示するケースをサポートできます。

保存 UI のユーザー操作

保存ダイアログでアクション リスナーを設定し、対応するパスワード リモートビューの公開設定を変更することで、保存ダイアログのパスワード フィールドの表示と非表示を切り替えることができます。

データセット更新のサポート

自動入力で既存のパスワードを更新できます。たとえば、ユーザーがすでにパスワードを保存しているときに新しいパスワードを保存した場合、自動入力は、新しいパスワードを保存するのではなく、既存のパスワードを更新するようユーザーに求めます。

フィールド分類の改善

Android 10 では、Field Classification API が以下のように改善されています。

UserData.Builder コンストラクタ

UserData.Builder コンストラクタが、Builder パターンに合わせて変更されました。

1 つの値を複数のカテゴリ ID タイプにマッピング可能にする

Android 10 で UserData.Builder を使用する際に、値を複数のタイプのカテゴリ ID にマッピングできるようになりました。以前のリリースでは、値が複数回追加されると例外がスローされていました。

クレジット カード番号のサポート向上

フィールド分類で、クレジット カード番号の末尾 4 桁として 4 桁の数字を検出できるようになりました。

アプリ固有のフィールド分類のサポート

Android 10 には、FillResponse.setUserData() が追加されています。これにより、セッション中にアプリ固有のユーザーデータを設定できます。これにより、自動入力サービスがアプリ固有のコンテンツを含むフィールドの型を検出できるようになります。

UI とシステム制御

Android 10 では、ユーザー インターフェースが次のように改善されています。

JVMTI PopFrame キャップのサポート

Android 10 では、Android JVMTI 実装で can_pop_frames 機能のサポートが追加されています。この機能を使用すると、デバッグ時にブレークポイントで一時停止し、ローカル、グローバル、関数の実装を調整してから関数を再実行できます。詳細については、Oracle の Pop Frame リファレンス ページをご覧ください。

Surface Control API

Android 10 には、システム コンポジタ(SurfaceFlinger)への低レベル アクセス用の SurfaceControl API が用意されています。ほとんどのユーザーにとって、SurfaceView はコンポジタを活用するのに適した方法です。SurfaceControl API は、次のような特定のケースで役に立ちます。

  • 複数のサーフェスの同期
  • クロスプロセス サーフェス埋め込み
  • ローレベル ライフタイム管理

SurfaceControl API は、SDK バインディングと NDK バインディングの両方で使用できます。NDK 実装には、バッファをコンポジタと手動で交換するための API が含まれています。これは、BufferQueue の制限に達したユーザーに代替手段を提供します。

WebView ハングレンダラの検出

Android 10 では、WebViewRenderProcessClient 抽象クラスが導入されました。これにより、アプリは WebView が応答しなくなったことを検出できます。このクラスを使用するには:

  1. 独自のサブクラスを定義し、その onRenderProcessResponsive() メソッドと onRenderProcessUnresponsive() メソッドを実装します。
  2. WebViewRenderProcessClient のインスタンスを 1 つ以上の WebView オブジェクトにアタッチします。
  3. WebView が応答しなくなると、システムはクライアントの onRenderProcessUnresponsive() メソッドを呼び出し、WebViewWebViewRenderProcess を渡します。(WebView が単一プロセスの場合、WebViewRenderProcess パラメータは null です)。アプリは、レンダリング プロセスを停止するかどうかをユーザーに尋ねるダイアログ ボックスを表示するなど、適切なアクションを実行できます。

WebView が応答しない場合、システムは定期的に(5 秒に 1 回を超えて)onRenderProcessUnresponsive() を呼び出しますが、その他のアクションは行いません。WebView が再び応答すると、システムは onRenderProcessResponsive() を 1 回だけ呼び出します。

設定パネル

Android 10 では、設定パネルが導入されています。これは、アプリのコンテキストでユーザーに設定を表示できるようにする API です。これにより、アプリを使用するために、ユーザーは [設定] に移動して [NFC] や [モバイルデータ] などを変更する必要がなくなります。

図 1. デバイスがネットワークに接続されていないときに、ユーザーがウェブページを開こうとした。Chrome の [インターネット接続] 設定パネルがポップアップ表示されます。

図 2. ユーザーは Chrome アプリを離れることなく、Wi-Fi をオンにしてネットワークを選択できます。

たとえば、デバイスが機内モードのときにユーザーがウェブブラウザを開いたとします。Android 10 より前のバージョンでは、接続を復元するために [設定] を開くようユーザーに求める汎用メッセージしか表示できませんでした。Android 10 のブラウザアプリは、機内モード、Wi-Fi(近くのネットワークを含む)、モバイルデータなどの主要な接続設定を示すインライン パネルを表示できます。このパネルにより、ユーザーはアプリを離れることなく接続を復元できます。

設定パネルを表示するには、次のいずれかの Settings.Panel アクションでインテントを起動します。

Kotlin

val panelIntent = Intent(Settings.Panel.settings_panel_type)
startActivityForResult(panelIntent)

Java

Intent panelIntent = new Intent(Settings.Panel.settings_panel_type);
startActivityForResult(panelIntent);

settings_panel_type は、以下のいずれかになります。

ACTION_INTERNET_CONNECTIVITY
機内モード、Wi-Fi、モバイルデータなど、インターネット接続に関連する設定を示します。
ACTION_WIFI
Wi-Fi の設定が表示されますが、その他の接続設定は表示されません。これは、大規模なアップロードやダウンロードを行うために Wi-Fi 接続を必要とするアプリに役立ちます。
ACTION_NFC
近距離無線通信(NFC)に関連するすべての設定を示します。
ACTION_VOLUME
すべての音声ストリームの音量設定を示します。

共有の改善

Android 10 では、共有機能にさまざまな改善が加えられています。

Sharing Shortcuts API

Shared Shortcuts APIDirect Share API に代わるものです。

Sharing Shortcuts API を使用すると、事後的にオンデマンドで結果を取得するのではなく、事前にダイレクト共有ターゲットを公開できます。ShortcutManager の仕組みは次のとおりです。2 つの API は似ているため、両方の機能を簡単に使用できるように ShortcutInfo API を拡張しました。Shared Shortcuts API を使用すると、カテゴリやユーザーを共有ターゲットに直接割り当てることができます。共有ターゲットは、同じアプリによって更新されるか、アプリがアンインストールされるまで、システム内に保持されます。

以前のダイレクト シェア メカニズムは引き続き機能しますが、このメカニズムを使用するアプリの優先度は、Sharing Shortcuts API を使用しているアプリよりも低くなります。

ShortcutInfo.Builder は、共有ターゲットに関する追加情報を提供するメソッドを追加および強化します。

ダイレクト シェア ターゲット

動的ショートカットはダイレクト共有ターゲットとして公開できます。直接共有ターゲットを公開するをご覧ください。

ShortcutManagerCompat は、古い DirectShare API との下位互換性を提供する新しい AndroidX API です。これは、共有ターゲットを公開するためのおすすめの方法です。

テキストのプレビュー

アプリがテキスト コンテンツを共有すると、Sharesheet UI にコンテンツのプレビューをオプションで表示できます。

リッチテキスト プレビューの追加をご覧ください。

さらに詳しく

アプリがデータを共有する方法の詳細については、他のアプリへのシンプルなデータの送信他のアプリからのシンプルなデータの受信をご覧ください。

ダークモード

Android 10 には、Android システム UI とデバイスで実行されるアプリの両方に適用されるダークモードが用意されています。詳細については、ダークモードをご覧ください。

フォアグラウンド サービスのタイプ

Android 10 では、foregroundServiceType XML マニフェスト属性が導入されています。この属性は、いくつかの特定のサービスの定義に含めます。特定のサービスに複数のフォアグラウンド サービス タイプを割り当てることは、ほとんど適切ではありません。

次の表に、さまざまなフォアグラウンド サービス タイプと、特定のタイプを宣言することが適切なサービスを示します。

フォアグラウンド サービスのタイプ 各タイプを宣言する必要があるサービスの例
connectedDevice ウェアラブル フィットネス トラッカーを監視する
dataSync ネットワークからファイルをダウンロードする
location ユーザーが開始したアクションを続行する
mediaPlayback オーディオブック、ポッドキャスト、音楽を再生する
mediaProjection デバイスのディスプレイに表示された動画を短時間録画する
phoneCall 通話を処理する

Kotlin

Android 10 では、Kotlin 開発向けに以下のアップデートが導入されています。

libcore API 向けの null 可能性アノテーション

Android 10 では、libcore API 用の SDK の null 可能性アノテーションのカバレッジが改善されています。これらのアノテーションを使用すると、Android Studio で Kotlin または Java の null 可能性分析を使用しているアプリ デベロッパーは、これらの API を操作するときに null 可能性情報を取得できます。

通常、Kotlin で null 可能性コントラクトに違反すると、コンパイル エラーが発生します。既存のコードとの互換性を確保するために、@RecentlyNullable アノテーションと @RecentlyNonNull アノテーションのみが追加されます。つまり、null 可能性違反では、エラーではなく警告が発生します。

また、Android 9 で追加された @RecentlyNullable アノテーションと @RecentlyNonNull アノテーションはそれぞれ @Nullable@NonNull に変更されています。つまり、Android 10 以降では、null 可能性違反が警告ではなくエラーにつながります。

アノテーションの変更について詳しくは、Android デベロッパー ブログの Android Pie SDK が Kotlin への対応を強化をご覧ください。

NDK

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

ファイル記述子オーナー権限のデバッグの改善

Android 10 では fdsan が追加されました。これにより、ファイル記述子の所有権の問題を簡単に見つけて修正できます。

ファイル記述子のオーナー権限の不適切な処理に関連するバグは、use-after-closedouble-close として現れる傾向があり、メモリ割り当ての use-after-free バグや double-free バグに似ていますが、診断と修正が非常に困難になる傾向があります。fdsan は、ファイル記述子のオーナー権限を強制適用することで、ファイル記述子の不適切な管理を検出、防止します。

これらの問題に関連するクラッシュの詳細については、fdsan によって検出されたエラーをご覧ください。fdsan の詳細については、fdsan に関する Googlesource のページをご覧ください。

ELF TLS

API レベル 29 以上の NDK を使用してビルドされたアプリでは、emutls の代わりに ELF TLS を使用できます。スレッド ローカル変数を処理するこの方法をサポートするために、動的リンカーと静的リンカーのサポートが追加されました。

API レベル 28 以前向けにビルドされたアプリの場合、一部の emutls の問題を回避するために libgcc/compiler-rt を改善しました。

詳細については、NDK デベロッパー向けの Android の変更点をご覧ください。

ランタイム

Android 10 では、ランタイムが次のように変更されています。

Mallinfo ベースのガベージ コレクション トリガー

小さなプラットフォームの Java オブジェクトが C++ ヒープ内の大きなオブジェクトを参照している場合、Java オブジェクトが収集されてファイナライズされたときなどにのみ、C++ オブジェクトを再利用できます。以前のリリースでは、Java オブジェクトに関連付けられた多くの C++ オブジェクトのサイズをプラットフォームが推定していました。この推定が常に正確であるとは限らず、プラットフォームが適切なときにガベージ コレクションを実行できなかったため、メモリ使用量が大幅に増加することがありました。

Android 10 では、システム malloc() によって割り当てられたヒープの合計サイズをガベージ コレクタ(GC)が追跡し、大規模な malloc() 割り当てが常に GC トリガー計算に含まれるようにします。大量の C++ 割り当てを Java 実行でインターリーブするアプリでは、結果としてガベージ コレクションの頻度が増加する可能性があります。他のアプリの場合は、少し減少する可能性があります。

テストとデバッグ

Android 10 では、テストとデバッグが次のように改善されています。

デバイス上のシステム トレースの改善

Android 10 では、オンデバイス システム トレースを実行する際に、トレースのサイズと期間の制限を指定できます。いずれかの値を指定すると、長いトレースが実行され、トレースの記録中にトレース バッファが宛先ファイルに定期的にコピーされます。指定したサイズまたは期間の上限に達すると、トレースが完了します。

これらの追加パラメータを使用すると、標準のトレースでテストするよりもさまざまなユースケースをテストできます。たとえば、アプリが長時間稼働した後にのみ発生するパフォーマンスのバグを診断する場合です。この場合、1 日にわたる長いトレースを記録し、CPU スケジューラ、ディスク アクティビティ、アプリスレッド、その他のデータをレポートで分析して、バグの原因を特定することができます。

Android 10 以降では、トレース ファイルはパフォーマンスの計測とトレース用のオープンソース プロジェクトである Perfetto で開くことができる形式で保存されます。Perfetto トレース ファイルは Systrace 形式に変換できます。

TextClassifier の改善

Android 10 では、TextClassifier インターフェースにテキスト分類機能が追加されています。

言語の検出

detectLanguage() メソッドは、既存の分類メソッドと同様に機能します。TextLanguage.Request オブジェクトを受け取り、TextLanguage オブジェクトを返します。

TextLanguage オブジェクトは、順序付きペアのリストで構成されます。各ペアには、ロケールと、分類に対応する信頼スコアが含まれています。

会話アクションの候補

suggestConversationActions() メソッドは、既存の分類メソッドと同様に機能します。ConversationActions.Request オブジェクトを受け取って ConversationActions オブジェクトを返します。

ConversationActions オブジェクトは、ConversationAction オブジェクトのリストで構成されています。各 ConversationAction オブジェクトには、考えられる推奨アクションとその信頼スコアが含まれます。

スマート リプライと通知でのアクション

Android 9 では、通知内に返信文の候補を表示する機能が導入されました。Android 10 ではこの機能を拡張し、インテント ベースのアクションの候補を含めることができるようになりました。さらに、プラットフォームがこれらの提案を自動的に生成することもできます。アプリは引き続き、独自の提案を提供したり、システム生成の提案をオプトアウトしたりできます。

これらの返信の生成に使用される API は TextClassifier の一部であり、Android 10 ではデベロッパーに直接公開されています。詳しくは、TextClassifier の改善に関するセクションをご覧ください。

アプリが独自の提案を提供する場合、プラットフォームは自動提案を生成しません。アプリの通知に返信やアクションの候補を表示したくない場合は、setAllowGeneratedReplies()setAllowSystemGeneratedContextualActions() を使用して、システムが生成した返信やアクションをオプトアウトできます。