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 以降では、アプリの APK ファイルから埋め込み DEX コードを直接実行するようにプラットフォームに指示できます。このオプションにより、攻撃者がデバイス上のローカル コンパイル コードを改ざんした場合の攻撃を防ぐことができます。

詳しくは、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 ネットワーク リクエスト API をご覧ください。

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

Android 10 では、アプリが Wi-Fi アクセス ポイントに接続するようユーザーに促す機能のサポートが追加されています。接続先のネットワークの候補を指定できます。プラットフォームは、アプリと他のアプリからの入力に基づいて、受け入れるアクセス ポイントを選択します。

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

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

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

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

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

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

Android 10 では、クリアテキスト ルックアップと DNS over TLS モードの両方を使用した特殊な DNS ルックアップのネイティブ サポートが追加されています。これまで、プラットフォームの DNS リゾルバは、名前に関連付けられた IP アドレスのみを検索できるように A レコードと AAAA レコードのみをサポートしていましたが、他のレコードタイプはサポートされていませんでした。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 レイヤが必要です。現在、Thermal API は Android 10 を搭載した Pixel デバイスでサポートされています。Google は、デバイス メーカー パートナーと協力して、可能な限り迅速にエコシステムに幅広いサポートを提供するよう取り組んでいます。

カメラと画像

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

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

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

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

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

Dynamic Depth 形式

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

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

High Efficiency Image File 形式

High Efficiency Image File(HEIF)形式は画像と動画の標準の形式であり、他のファイル形式に比べてエンコードの品質が高く、ファイルサイズが小さくなっています。

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

マルチカメラの改善

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

  • isSessionConfigurationSupported(SessionConfiguration sessionConfig) - 渡されたセッション構成を使用してカメラ キャプチャ セッションを作成できるかどうかをクエリできます。

  • LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID - 論理カメラデバイスに関連付けられているアクティブな物理カメラの ID を特定できます。返された ID を使用して論理ストリームと物理サブカメラ ストリームをリクエストし、電力効率を改善できます。

ユーザー補助サービス 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 要素に対して、ユーザー定義のタイムアウトがサポートされます。戻り値は、ユーザーの設定とユーザー補助サービス API の両方の影響を受けます。

自動入力の改善

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

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

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

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

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

保存 UI のユーザー操作

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

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

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

フィールド分類の改善

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

UserData.Builder コンストラクタ

Builder パターンに合わせて、UserData.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 が応答しない場合、システムは onRenderProcessUnresponsive() を定期的に(5 秒に 1 回未満)呼び出しますが、他のアクションは行いません。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

Sharing Shortcuts APIDirect Share API に置き換わるものです。

Sharing Shortcuts API を使用すると、事後的にオンデマンドで結果を取得するのではなく、事前にダイレクト シェア ターゲットを公開できます。ShortcutManager の仕組みは次のとおりです。2 つの API は類似しているため、両方の機能を簡単に使用できるように ShortcutInfo API を拡張しました。Sharing 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-freedouble-free に関するバグに似ていますが、診断や修正が非常に困難になる傾向があります。fdsan は、ファイル記述子の不適切な管理を検出、防止します。

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

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 では、ガベージ コレクタ(GC)がシステム malloc() によって割り当てられたヒープの合計サイズを追跡し、大きな 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() を使用して、システムが生成した返信やアクションをオプトアウトできます。