時刻の自動検出

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

  • telephony Network Identity and Time Zone (NITZ) 電話信号が使用されます。
  • 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自動時刻検出で考慮され、 telephony時間の提案がnetwork時間の提案よりも優先されます。

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

下限時間

Android 12 では、時間の提案を検証するときに使用する新しい下限時間制限が提供されます。この機能が導入される前は、自動時刻検出では、推奨される受信 UTC 時刻が検証されませんでした。この機能を使用すると、下限より前に経過した時間が破棄されます。

下限値は、ビルドのタイムスタンプから導出された日付から決定されます。これは、システム イメージが構築される前に有効な時間が発生することはできないという原則に基づいて機能します。 Android では上限は強制されません。

GNSS 時間の提案

gnssタイム ソースは Android 12 の新機能で、GPS 信号によって提供されます。これは、 telephonynetwork利用できない場合に信頼できる情報源です。このオプションは、位置の更新を受動的にリッスンする SystemServer の新しいGnssTimeUpdateServiceに追加されます。有効な位置を受信すると、 GnssTimeUpdateService 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を更新します。 gnss config_autoTimeSourcesPriorityの項目リストに追加する必要があります。優先リスト内のgnssの位​​置によって、他のソースからの値に対して GNSS 提案に与えられる優先順位が決まります。

電力への影響

GnssTimeUpdateService位置の更新を受動的にリッスンします。つまり、追加の電力を消費するために GPS をアクティブにオンにすることはありません。その結果、GNSS ソースが有効になっているときに消費される電力は無視できます。これは、システム内の別のアプリまたはサービスが位置の更新を積極的に要求しない限り、 GnssTimeUpdateService位置の更新を取得して GNSS 時刻を提案しないことも意味します。

テスト

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

CTS テストは、GNSS が提供する時刻が利用可能であることを確認するために提供されます。詳細については、 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 に自動の時刻の提案を提供するもう 1 つの方法です。この新しいオプションを使用すると、完全にカスタマイズされた時刻の提案を 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 ) を更新し、値をconfig_autoTimeSourcesPriorityexternalに追加します:
    <string-array name="config_autoTimeSourcesPriority>
            <item>external</item>
            <item>gnss</item>
    </string-array>
    

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

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