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 ネットワーク リクエスト 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 は汎用の非同期解決に使用でき、SRV、NAPTR などのレコードタイプを検索できます。応答の解析はアプリが行う必要があります。
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 では、WifiP2pConfig API クラスと WifiP2pManager 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で指定)が 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 レイヤが必要です。現在、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 Format をご覧ください。
高効率画像ファイル形式
高効率画像ファイル(HEIF)形式は、他のファイル形式と比較して、より高品質なエンコードとより小さいファイルサイズを実現する標準的な画像および動画形式です。
ファイル形式の詳細については、HEIC をご覧ください。
マルチカメラの改善
Android 10 では、複数のカメラを 1 つの論理カメラに統合する機能が改善されました。この機能は 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 では、サービスがリクエストすると、ダイアログにテキスト読み上げプロンプトを表示できます。
ジェスチャー ナビゲーションが有効であるときのユーザー補助ショートカット
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 が応答しなくなったかどうかを検出できます。このクラスを使用するには:
- 独自のサブクラスを定義し、その
onRenderProcessResponsive()メソッドとonRenderProcessUnresponsive()メソッドを実装します。 WebViewRenderProcessClientのインスタンスを 1 つ以上のWebViewオブジェクトにアタッチします。WebViewが応答しなくなった場合、システムはクライアントのonRenderProcessUnresponsive()メソッドを呼び出し、WebViewとWebViewRenderProcessを渡します。(WebViewが単一プロセスの場合は、WebViewRenderProcessパラメータは null です)。アプリは、レンダリング プロセスを停止するかどうかをユーザーに尋ねるダイアログ ボックスを表示するなど、適切なアクションを実行できます。
WebView が応答しない場合、システムは onRenderProcessUnresponsive() を定期的に呼び出しますが(5 秒に 1 回以下)、それ以外のアクションは行いません。WebView が再び応答するようになると、システムは onRenderProcessResponsive() を 1 回だけ呼び出します。
設定パネル
Android 10 では、設定パネルが導入されました。これは、アプリのコンテキストでユーザーに設定を表示できるようにする API です。これにより、ユーザーはアプリを使用するために [設定] に移動して [NFC] や [モバイルデータ] などを変更する必要がなくなります。
たとえば、デバイスが機内モードのときにユーザーがウェブブラウザを開いたとします。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 API は、Direct Share API に代わるものです。
Sharing Shortcuts API を使用すると、アプリはオンデマンドで結果を取得するのではなく、ダイレクト シェア ターゲットを事前に公開できます。ShortcutManager の仕組みは次のとおりです。2 つの API は類似しているため、ShortcutInfo API を拡張して、両方の機能を簡単に使用できるようにしました。Sharing Shortcuts API を使用すると、カテゴリまたはユーザーを共有ターゲットに直接割り当てることができます。共有ターゲットは、同じアプリが更新するか、アプリがアンインストールされるまで、システムに保持されます。
古い Direct Share メカニズムは引き続き機能しますが、このメカニズムを使用するアプリは、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 is now more Kotlin-friendly をご覧ください。
NDK
Android 10 では、NDK が次のように変更されています。
ファイル記述子オーナー権限のデバッグの改善
Android 10 では、ファイル記述子のオーナー権限に関する問題をより簡単に見つけて修正できる fdsan が追加されています。
ファイル記述子の所有権の誤った処理に関連するバグは、use-after-close や double-close として現れる傾向があり、メモリ割り当ての use-after-free や double-free バグに似ていますが、診断と修正がはるかに困難になる傾向があります。fdsan は、ファイル記述子の所有権を適用することで、ファイル記述子の管理ミスを検出または防止しようとします。
これらの問題に関連するクラッシュの詳細については、fdsan によって検出されたエラーをご覧ください。fdsan の詳細については、fdsan に関する Googlesource ページをご覧ください。
ELF TLS
NDK を使用してビルドされたアプリで、最小 API レベルが 29 の場合は、emutls の代わりに ELF TLS を使用できます。このスレッドローカル変数の処理方法をサポートするために、動的リンカーと静的リンカーのサポートが追加されました。
API レベル 28 以前向けにビルドされたアプリの場合、emutls の問題を回避するために libgcc/compiler-rt が改善されました。
詳しくは、NDK デベロッパー向けの Android の変更点をご覧ください。
ランタイム
Android 10 では、ランタイムが次のように変更されています。
Mallinfo ベースのガベージ コレクション トリガー
小さなプラットフォーム Java オブジェクトが C++ ヒープ内の巨大なオブジェクトを参照している場合、C++ オブジェクトは、Java オブジェクトが収集され、ファイナライズされた場合にのみ再利用されることがよくあります。以前のリリースでは、プラットフォームは 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() を使用して、システム生成の返信や操作を無効にできます。