Автоматическое определение времени

Автоматическое определение времени получает рекомендации по времени из различных источников, выбирает наилучший вариант, а затем устанавливает системные часы Android в соответствии с ними. Предыдущие выпуски Android предусматривали два способа установки даты и времени — вручную для каждого пользователя или путем автоматического определения времени, устанавливаемого одним из следующих двух вариантов:

  • телефония использует сигналы телефонии Network Identity and Time Zone (NITZ).
  • сеть использует серверы времени Network Time Protocol (NTP).

Каждый вариант требует подключения к внешним сетям, которые не всегда доступны в Android Automotive. Например, в некоторых странах некоторые автомобили могут не иметь встроенной телефонии. Поэтому время глобальных спутниковых навигационных систем (GNSS) теперь также предоставляется в качестве источника системного времени, которое вы можете использовать, когда подключение к сети недоступно.

Этот предстоящий выпуск Android предоставляет еще две опции для автоматического определения и установки времени:

  • 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>

В этом примере при автоматическом определении времени учитываются telephony и network , а предложения времени telephony имеют приоритет над предложениями времени network .

Вообще говоря, предложения из источника с более высоким приоритетом игнорируются, если предложение недействительно или если предложение слишком старое. Кроме того, если действительное предложение с наивысшим приоритетом соответствует текущему системному времени устройства с точностью до нескольких секунд (значение по умолчанию — две (2) секунды), время не будет изменено.

Нижняя граница времени

Android 12 предоставляет новый более низкий предел времени для использования при проверке предложений времени. До этой функции автоматическое определение времени не проверяло предлагаемое входящее время UTC. С помощью этой функции время, прошедшее до достижения нижней границы, отбрасывается.

Значение нижней границы определяется по дате, полученной из метки времени сборки. Это работает по тому принципу, что допустимое время не может наступить до создания образа системы. Android не применяет верхнюю границу.

Рекомендации по времени GNSS

Источник времени gnss является новым для Android 12 и обеспечивается сигналами GPS. Это считается надежным источником времени, когда телефония и сеть недоступны. Этот параметр добавлен в новую GnssTimeUpdateService в SystemServer, которая пассивно прослушивает обновления местоположения. Когда получено действительное местоположение, 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. Дополнительные сведения см. в разделе LocationManagerCoarseTest.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 . Это свойство обозначает количество миллисекунд, прошедших с 01.01.1970 UTC. Его значение можно передать в Android TimeManager , чтобы предложить новое системное время. Пример реализации VHAL, которая обновляет это свойство, представлен в приведенной ниже эталонной реализации .
  • Системные API. В TimeManager теперь доступен новый метод suggestExternalTime() для предоставления системе внешнего предложения времени. Если система настроена на учет внешних предложений времени (используя config_autoTimeSourcesPriority в файле конфигурации), отметка времени, переданная этому методу, используется для установки системного времени, если нет доступных предложений времени с более высоким приоритетом.

Вы можете реализовать решение для внешнего времени, как описано ниже:

  1. Обновите файл конфигурации ресурсов ( core/res/res/values/config.xml ), а затем добавьте external значение в config_autoTimeSourcesPriority :
    <string-array name="config_autoTimeSourcesPriority>
            <item>external</item>
            <item>gnss</item>
    </string-array>
    

    Это указывает Android, что при настройке системных часов высший приоритет должен отдаваться рекомендациям по внешнему времени. Аппаратное обеспечение на транспортном средстве записывает предложение временной метки в новое EPOCH_TIME VHAL .

  2. Приложение, предоставленное поставщиком, считывает это свойство и вызывает TimeManager.suggestExternal() . Затем Android может использовать предоставленную метку времени в качестве нового значения системных часов.