自動時刻検出は、さまざまなソースから時刻の提案を受け取り、最適なオプションを選択し、それに合わせて Android のシステム クロックを設定します。以前の Android リリースでは、日付と時刻を設定する 2 つの方法が提供されていました。ユーザーごとに手動で設定する方法と、自動時刻検出によって設定する方法のいずれかで、次のいずれかのオプションで設定します。
-
telephony
Network Identity and Time Zone (NITZ) 電話信号が使用されます。 -
network
ネットワーク タイム プロトコル (NTP) タイム サーバーを使用します。
各オプションでは外部ネットワークへの接続が必要ですが、Android Automotive では常に外部ネットワークを利用できるわけではありません。たとえば、国によっては、電話が内蔵されていない車もあります。したがって、ネットワーク接続が利用できない場合に使用できるシステム時間のソースとして、全地球衛星航法システム (GNSS)時間が提供されます。
今後の Android リリースでは、時刻を自動的に検出して設定するためのオプションがさらに 2 つ提供されます。
自動時刻検出を有効にする
自動時刻検出を有効にするには、必ず[設定] > [日付と時刻] > [自動日付と時刻]を選択してください。
図 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>
この例では、 telephony
とnetwork
自動時刻検出で考慮され、 telephony
時間の提案がnetwork
時間の提案よりも優先されます。
一般に、優先度の高いソースからの提案は、提案が無効である場合、または提案が古すぎる場合には無視されます。また、最も優先度の高い有効な提案がデバイスの現在のシステム クロック時刻と数秒以内 (デフォルト値は 2 秒) で一致する場合、時刻は変更されません。
下限時間
Android 12 では、時間の提案を検証するときに使用する新しい下限時間制限が提供されます。この機能が導入される前は、自動時刻検出では、推奨される受信 UTC 時刻が検証されませんでした。この機能を使用すると、下限より前に経過した時間が破棄されます。
下限値は、ビルドのタイムスタンプから導出された日付から決定されます。これは、システム イメージが構築される前に有効な時間が発生することはできないという原則に基づいて機能します。 Android では上限は強制されません。
GNSS 時間の提案
gnss
タイム ソースは Android 12 の新機能で、GPS 信号によって提供されます。これは、 telephony
やnetwork
利用できない場合に信頼できる情報源です。このオプションは、位置の更新を受動的にリッスンする 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>
この機能を有効にするには:
-
config_enableGnssTimeUpdateService
を更新します。config_enableGnssTimeUpdateService
の値はtrue
に設定する必要があります。 -
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) から経過したミリ秒数を示します。その値を AndroidTimeManager
に渡して、新しいシステム時間を提案することができます。このプロパティを更新するサンプル VHAL 実装は、以下のリファレンス実装で提供されます。 - システム API。 TimeManager では、システムに外部時刻の提案を提供するために
suggestExternalTime()
と呼ばれる新しいメソッドを使用できます。システムが外部時刻の提案を考慮するように構成されている場合 (構成ファイルでconfig_autoTimeSourcesPriority
を使用)、利用可能な優先度の高い時刻の提案がない場合は、このメソッドに渡されたタイムスタンプを使用してシステム時刻が設定されます。
以下で説明するように、外部時間ソリューションを実装できます。
- リソース構成ファイル (
core/res/res/values/config.xml
) を更新し、値をconfig_autoTimeSourcesPriority
のexternal
に追加します:<string-array name="config_autoTimeSourcesPriority> <item>external</item> <item>gnss</item> </string-array>
これにより、システム クロックを設定するときに外部時刻の提案を最優先するように Android に指示されます。車両上のハードウェアは、タイムスタンプの提案を新しい
EPOCH_TIME
VHAL プロパティに書き込みます。 - ベンダー提供のアプリはこのプロパティを読み取り、
TimeManager.suggestExternal()
を呼び出します。 Android は、提供されたタイムスタンプを新しいシステム クロック値として使用できます。