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 は汎用の非同期解決に使用でき、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
と 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 レイヤが必要です。デバイス 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 要素に対して、ユーザー定義のタイムアウトがサポートされます。戻り値は、ユーザー設定とユーザー補助サービス 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
を使用する際に、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 には、システム コンポジタ(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()
を一度だけ呼び出します。
設定パネル
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
ダイレクト シェア API は Sharing 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-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()
を使用して、システム生成の返信文やアクションをオプトアウトします。