ネットワーク タイム検出

Android デバイスは自動的にネットワーク ソースから正しい Unix エポック時刻を取得しようとします。Android は SNTP プロトコルを使用します。SNTP プロトコルは UDP プロトコルを使用して時刻情報を取得します。

このページで説明するコンポーネントは、ネットワーク タイムオリジンと呼ばれる自動時刻検出システムの一部です。自動時刻検出がデバイスでサポートされており、time_detector サービスでその使用が設定されている場合は、ネットワーク タイムサーバーからのタイム信号を使用して、Android デバイスのシステム クロックが設定されます。

デフォルトでは Android はネットワーク タイムオリジンをメインの自動時刻検出オリジンとして使用します。

ネットワーク タイム検出システム

network_time_update_service サービスは Android システム サーバーで実行され、ネットワーク タイム検出システムを実装します。サービスは定期的に SNTP を使用して、サーバーからタイム信号を取得します。また、サービスはネットワーク接続をモニタリングして、長時間の接続不良後に最新のタイム信号が利用できない場合、時刻の更新をトリガーします。

network_time_update_service サービスは起動後とネットワーク接続が最初に確立されたときに、タイム信号の取得を試みます。その後、サービスは最新の信号が更新されるように試行します。個々の Android デバイスのニーズと、数多くの Android デバイスが世界中で時刻を更新することによって生じる膨大な負荷とのバランスを取ります。

内部 API を使用して、network_time_update_service はネットワーク タイムの提案を time_detector サービスに送信します。その後、Android プラットフォーム コンポーネントがこれらのネットワーク タイムの提案を使用します。

time_detector サービスは、ネットワーク タイムオリジンからの提案を受け取った後、設定済みの優先順位ルールに基づき、システム クロックを更新するかどうかを決定します。

ネットワーク オリジンの提案を使用してシステム クロックを自動的に設定するように自動時刻検出システムを設定するには、core/res/res/values/config.xml システム サーバー構成ファイルを使用します。値 networkconfig_autoTimeSourcesPriority の適切な場所に含まれているようにします。詳細はタイムソースの優先度をご覧ください。

デバイス設定

このセクションでは、デバイス メーカーによるネットワーク タイム検出システムの設定方法について説明します。

基本 AOSP 設定は、frameworks/base/core/res/res/values/config.xml にあります。

設定キー AOSP 値 説明
config_ntpRetry 3 更新に失敗後、システムがバックオフを行い通常のポーリング間隔(config_ntpPollingInterval)を使用する前に、短い NTP ポーリング間隔(config_ntpPollingIntervalShorter)でネットワーク タイム ポーリングを試行する回数です。0 未満の値はシステムが正常に更新されるまで、短い NTP ポーリング間隔で試行されることを示します。
config_ntpPollingInterval 64800000(18 時間) 通常のネットワーク タイム ポーリング間隔(ミリ秒単位)。
config_ntpPollingIntervalShorter 60000(1 分) 再試行ネットワーク タイム ポーリング間隔(ミリ秒単位)。時刻の更新に失敗したときに使用します。
config_ntpServers 単一エントリ: ntp://time.android.com 正確な時刻を取得するために使用する NTP サーバー。アイテムは ntp://<host>[:port] の形式である必要があります。
これは登録済みの IANA URI スキームではありません。
config_ntpTimeout 5000 タイムアウトになる前に NTP サーバー応答を待つ時間(ミリ秒単位)。

サーバー

デフォルトでは、AOSP は time.android.com のタイムサーバーを使用します。これは Google Public NTP のエイリアスです。このサービスには SLA はありません。詳細については、Google Public NTP のよくある質問をご参照ください。

複数サーバーのサポート

Android 14 以降の場合、フレームワークでは複数の NTP サーバーをサポートしています。これにより、デバイスが単一の構成でグローバルに販売されているものの、time.android.com などのサーバーへのアクセスが特定の場所では制限されるケースに対応します。

アルゴリズムは config_ntpServers 設定キーで指定された各サーバーを試行します。応答しているサーバーを見つけると、システムは更新に失敗するまで、またはデバイスが再起動するまで、そのサーバーを使用し続けます。

精度

Android のデフォルトのネットワーク タイム同期は SNTP を使用して、約 1 日に 1 回の単一のクエリで、常に最新のタイム信号を取得するようにします。

ネットワーク レイテンシによる影響が Android の SNTP 実装における不正確な時刻の主な原因です。SNTP は対称的なネットワーク遅延、つまり、リクエストのネットワーク レイテンシは応答のネットワーク レイテンシと同じであり、正確な時刻はそのネットワーク ラウンド トリップのちょうど中間であることを前提としています。通常、ネットワーク ラウンド トリップ時間は数百ミリ秒ほどで、レイテンシがほぼ対称の有線ネットワーク接続では、時刻のずれはユーザーがほぼ認識できないレベルになります。しかし、モバイルまたは無線テレフォニーの場合、比較的長い非対称の遅延がネットワーク トランザクションに挿入されるステージがいくつかあり、時刻のずれが大きくなります。

AOSP の config_ntpTimeout のデフォルト設定を 5000 ミリ秒に設定し、すべてのネットワーク レイテンシがインバウンドまたはアウトバウンドのみに集中している場合、理論上のエラーの最大値は約 2.5 秒です。

システム クロックの全体的な精度も、Android デバイスがタイム信号取得後に経過時間をどの程度正確にトラッキングできるかに影響されます。これはネットワーク タイム検出のみならず、Android での時間管理すべてに共通の問題であり、time_detector サービスでこれまでの時刻の提案を使用しない理由でもあります。network_time_update_service サービスは定期的に config_ntpPollingInterval 間隔を使って更新し、time_detector サービスに最新の時刻の提案を行い続け、time_detector サービスが telephony などの優先順位が低く、精度に欠けることが多い時刻オリジンや不正確な時刻オリジンにフォールバックしないようにします。

自動時刻検出を使用すると、デバイスのシステム クロックの精度は time_detector サービスの他の設定による影響を受ける場合があります。そのような設定には、時刻の提案が現在のシステム クロック時刻とどの程度差がある場合にクロックを調整するかに影響を及ぼす定数とフラグなどがあります(ServiceConfigAccessorImpl.java)。

デバイス メーカーは上記の構成オプションと定数を使用して精度を調整できます。ただし、プラットフォームの SNTP 実装の制限と、より頻繁なネットワーク操作による消費電力への潜在的な影響、頻度の高い軽微なクロック調整によるデバイスで実行中のアプリへの影響、サーバー負荷への影響を認識しておくことが重要です。

ネットワーク タイムのその他の使用用途

network オリジンを使用した自動時刻検出が設定されていない場合、またはユーザーが自動時刻検出を無効にした場合でも、network_time_update_service サービスが取得する時刻は引き続き次のコンポーネントに使用されます。

  • SystemClock.currentNetworkTimeClock() メソッド。
  • 内部プラットフォーム機能。たとえば、A-GPS はネットワーク タイム情報があると、GNSS(位置情報)の最初の修正を迅速に行えます。

デバッグとテスト

次のセクションでは、ネットワーク タイム検出機能のデバッグとテスト用のシェルコマンドについて説明します。

network_time_update_service サービスを操作する

network_time_update_service の現在の状態をダンプするには、次のコマンドを使用します。

adb shell cmd network_time_update_service dump

テストをサポートするコマンドライン オプションのセットを確認するには、次のコマンドを使用します。

adb shell cmd network_time_update_service help