時刻の自動検出

自動時刻検出では、さまざまな情報源から時刻の候補を受け取り、最適な候補を選択し、その時刻に合わせて Android のシステム クロックを設定します。以前の Android リリースでは、日付と時刻の設定方法として、ユーザーごとに手動で設定する方法と、自動時刻検出による方法の 2 つが用意されていました。自動時刻検出では、これらのオプションのいずれかによって日付と時刻が設定されます。

  • telephony: NITZ(ネットワーク ID とタイムゾーン)のテレフォニー信号を使用します。
  • network: NTP(ネットワーク タイム プロトコル)のタイムサーバーを使用します。

各オプションを使用するには外部ネットワークへの接続が必要ですが、Android Automotive では外部ネットワークに接続できない場合があります。たとえば、一部の国ではテレフォニーが搭載されていない車もあります。そのため、ネットワーク接続が利用できないときに使用するシステム時刻のソースとして、全地球航法衛星システム(GNSS)の時刻が提供されるようになりました。

今度の Android リリースでは、時刻を自動的に検出して設定するためのオプションが 2 つ追加されました。

  • gnss: 全地球航法衛星システム(GNSS)を使用します。
  • external: VHAL プロパティまたはシステム API を使用します。

自動時刻検出を有効にする

自動時刻検出を有効にするには、[設定] > [日付と時刻] > [日付と時刻の自動設定] を選択します。

図 1. [日付と時刻の自動設定] を選択します

タイムソースの設定

自動時刻検出に含めるタイムソースと、それらのタイムソースを考慮する優先順位を指定するには、デバイスのリソース構成ファイル core/res/res/values/config.xml を変更する必要があります。

<!-- Specifies priority of automatic time sources. Suggestions from higher entries in the list
     take precedence over lower ones. See com.android.server.timedetector.TimeDetectorStrategy for
     available sources. -->
<string-array name="config_autoTimeSourcesPriority">
    <item>telephony</item>
    <item>network</item>
</string-array>

この例では、自動時刻検出で telephonynetwork が考慮され、network 時刻の候補より telephony 時刻の候補が優先されています。

一般に、候補が無効な場合や古すぎる場合、優先度の高いソースの候補は無視されます。また、優先度が最も高い有効な候補が、デバイスの現在のシステム クロック時刻と数秒(デフォルト値は 2 秒)以内の差しかない場合は、時刻は変更されません。

下限時刻

Android 12 では、時刻の候補を検証する際に使用する下限時刻が新たに提供されています。この機能が提供される以前は、自動時刻検出で受信した UTC 時刻の候補は検証されていませんでした。この機能により、下限より前の時刻は破棄されます。

下限値は、ビルド タイムスタンプから取得された日付によって決定されます。これは、有効な時刻はシステム イメージをビルドした時刻より前にはならないという原則に基づいています。Android では、上限は適用されません。

GNSS 時刻の候補

Android 12 で新たに導入された gnss タイムソースは、GPS 信号によって提供されます。これは、telephonynetwork が利用できないときに、信頼できるソースとなります。このオプションは、位置情報の更新を受動的にリッスンする、SystemServer の新しい GnssTimeUpdateService に追加されています。有効な位置情報を受信すると、GnssTimeUpdateServiceTimeDetectorService に提案を行い、TimeDetectorService はシステム クロックを更新する必要があるかどうかを判断します。

デフォルトでは、gnss タイムソースは AOSP で有効になっていないため、パートナー側で有効にする必要があります。

<!-- Specifies priority of automatic time sources. Suggestions from higher entries in the list
    take precedence over lower ones.
    See com.android.server.timedetector.TimeDetectorStrategy for available sources. -->
<string-array name="config_autoTimeSourcesPriority">
    <item>telephony</item>
    <item>network</item>
    <item>gnss</item>
</string-array>

<!-- Enables the GnssTimeUpdate service. This is the global switch for enabling Gnss time based
    suggestions to TimeDetector service. See also config_autoTimeSourcesPriority. -->
<bool name="config_enableGnssTimeUpdateService">true</bool>

この機能を有効にするには:

  1. config_enableGnssTimeUpdateService を更新します。config_enableGnssTimeUpdateService の値は true に設定する必要があります。
  2. config_autoTimeSourcesPriority を更新します。config_autoTimeSourcesPriority の項目リストに gnss を追加する必要があります。優先度リスト内の gnss の位置によって、他のソースの値に対する GNSS の候補の優先度が決まります。

電力への影響

GnssTimeUpdateService は、位置情報の更新を受動的にリッスンします。つまり、GPS を積極的にオンにして電力を消費することはありません。そのため、GNSS ソースが有効になっているときに消費される電力はごくわずかです。また、システム内の別のアプリやサービスが位置情報の更新データを積極的に要求しない限り、GnssTimeUpdateService が位置情報の更新データを取得し、GNSS 時刻を提案することはありません。

テスト

互換性テストスイート(CTS)

GNSS の提供する時刻が利用可能であることを確認するために、CTS テストが提供されています。詳しくは、LocationShellCommand.java をご覧ください。

単体テスト

次のファイルにある基本的な単体テストをご覧ください。

atest frameworks/base/services/tests/servicestests/src/com/android/server/timedetector/GnssTimeUpdateServiceTest.java

手動テスト

この機能をテストするために、LocationShellCommand.java に新しいコマンドが追加されました。以下のコマンドを使用して、テスト用の位置情報プロバイダを追加します。このプロバイダでは、位置情報とそれに関連付けられた GNSS 時刻を指定できます。GnssTimeUpdateService はこれらの位置情報の更新をリッスンし、定期的に提案を行います。

注: 以下のコマンドのインターフェースは、リリースによって異なる場合があります。

# Enable Master Location Switch in the foreground user (usually user 10 on automotive).
# If you just flashed, this can be done through Setup Wizard.
adb shell cmd location set-location-enabled true --user 10

# Add GPS test provider (this usually fails the first time and will throw a SecurityException
# with "android from <some-uid> not allowed to perform MOCK_LOCATION".)
adb shell cmd location providers add-test-provider gps

# Enable mock location permissions for previous UID
adb shell appops set <uid printed in previous error> android:mock_location allow

# Add GPS test provider (Should work with no errors.)
adb shell cmd location providers add-test-provider gps

# Enable GPS test provider
adb shell cmd location providers set-test-provider-enabled gps true

# Set location with time (time can't be earlier than the limit set by the lower bound.)
adb shell cmd location providers set-test-provider-location gps --location <LATITUDE>,<LONGITUDE> --time <TIME>

外部時刻の候補

外部時刻の候補を使用して Android に自動時刻の候補を提供することもできます。この新しいオプションを使用すると、Android にカスタマイズした時刻の候補を提供できるようになります。これはさまざまな ECU から取得され、リアルタイム クロック、GNSS、NITZ などのタイムソースと組み合わせて使用されます。

Android 12 では、external 時刻の候補として以下が利用可能です。

  • VHAL プロパティ。EPOCH_TIME という新しい VHAL プロパティが提供されています。このプロパティは、1970 年 1 月 1 日(UTC)から経過したミリ秒数を示します。その値を Android TimeManager に渡して、新しいシステム時刻を提案できます。このプロパティを更新する VHAL 実装のサンプルについては、リファレンス実装をご覧ください。
  • システム API。TimeManager では、システムに外部時刻の候補を提供するための、suggestExternalTime() と呼ばれる新しいメソッドを使用できます。外部時刻の候補が考慮されるようにシステムが構成されている場合(構成ファイルで config_autoTimeSourcesPriority を使用している場合)、このメソッドに渡されるタイムスタンプを使用してシステム時刻が設定されます(これより優先度の高い時刻の候補がない場合)。

外部時刻を使用したソリューションは、次のように実装できます。

  1. リソース構成ファイル(core/res/res/values/config.xml)を更新して、値 externalconfig_autoTimeSourcesPriority に追加します。
    <string-array name="config_autoTimeSourcesPriority>
            <item>external</item>
            <item>gnss</item>
    </string-array>

    これにより、システム クロックの設定時に外部時刻の候補を最優先するよう Android に指示できます。車両のハードウェアが、新しい EPOCH_TIME VHAL プロパティにタイムスタンプの候補を書き込みます。

  2. ベンダー提供のアプリがこのプロパティを読み取り、TimeManager.suggestExternal() を呼び出します。Android は、提供されたタイムスタンプを新しいシステム クロック値として使用できます。