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

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

  • telephony использует сигналы телефонной идентификации сети и часового пояса (NITZ).
  • network используются серверы времени 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. Это надежный источник информации о времени, когда telephony и network недоступны. Эта опция добавлена ​​в новую 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. Подробности см. 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 полностью настраиваемые предложения времени, которые могут исходить от различных блоков управления двигателем, которые, в свою очередь, могут использовать комбинацию часов реального времени, 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 отдавать внешним предложениям времени наивысший приоритет при настройке системных часов. Аппаратное обеспечение автомобиля записывает предложение временной метки в новое свойство VHAL EPOCH_TIME .

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