The Android Developer Challenge is back! Submit your idea before December 2.

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 が追加されました。

汎用 javax.net.ssl API から利用できない機能にアクセスするための静的メソッドを含むクラス コレクションが、android.net.ssl に追加されています。これらのクラスの名前は、対応する 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 が実行されている 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 要素に対して、ユーザー定義のタイムアウトがサポートされます。戻り値は、ユーザー設定とユーザー補助サービス 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 タイプにマッピング可能にする

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

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

フィールド分類で、クレジット カード番号の末尾 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 では SurfaceControl API を利用することで、システム コンポジタ(SurfaceFlinger)に対する低レベルアクセスが可能です。コンポジタを活用するには 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() を一度だけ呼び出します。

設定パネル

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
すべてのオーディオ ストリームの音量設定を表示します。

今後、この機能向けの AndroidX ラッパーを導入する予定です。Android 9(API レベル 28)以前を実行しているデバイスで呼び出されると、このラッパーは [設定] アプリ内で最も適切なページを開きます。

共有の改善

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

ショートカット共有 API

ダイレクト シェア APIショートカット共有 API に置き換えられました。

ショートカット共有 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-close や double-close として現れることが多く、メモリ割り当ての use-after-free バグや double-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() を使用して、システムが生成した返信文やアクションをオプトアウトします。