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 省電力機能は、高性能モードと低遅延モードでは無効になります。モデムのサポートによっては、低遅延モードではさらに遅延最適化が有効になる場合があります。

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

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 では、WifiP2pConfigWifiP2pManager の API クラスが更新され、事前に決定済みの情報を使用することで 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 で指定)がゼロより大きい場合に表示されます。つまり、ライブストリーム、ラジオ放送など、不確定なストリームに対しては表示されません。
  • セッションで 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 形式(DDF)と呼ばれる新しいスキーマを使用して、画像の深度データを別ファイルに保存できるようになりました。アプリは JPG 画像とその深度メタデータの両方をリクエストし、その情報を使用して、元の画像データを変更することなく、後処理で必要なぼかしを適用できます。

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

High Efficiency Image File 形式

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

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

マルチカメラの改善

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

  • isSessionConfigurationSupported(SessionConfiguration sessionConfig) - 渡されたセッション設定を使用してカメラ撮影セッションを作成できるかどうかを照会できます。

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

ユーザー補助サービス API

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

AccessibilityNodeInfo 入力キーフラグ

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

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

ユーザー補助ショートカットを実行してユーザー補助サービスを開始する必要がある場合は、ダイアログと一緒にテキスト読み上げプロンプトをユーザーに提示できます(サービスによってそれが求められている場合)。

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

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 から応答がない状態が続く場合、システムは定期的に onRenderProcessUnresponsive() を呼び出しますが(最短で 5 秒に 1 回)、それ以外のアクションは行いません。WebView が再び応答するようになると、システムは onRenderProcessResponsive() を一度だけ呼び出します。

設定パネル

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

ダイレクト シェア APISharing Shortcuts API に置き換えられました。

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

ダイレクト シェア メカニズムは引き続き機能しますが、新しい 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 とインタラクションを行う際に nullness 情報を取得できます。

通常、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++ ヒープ内の大きなオブジェクトを参照している場合、C++ オブジェクトが再利用できるようになるのは多くの場合、Java オブジェクトを収集し、たとえばファイナライズした後に限られます。以前のリリースでは、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() を使用して、システム生成の返信文やアクションをオプトアウトします。