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

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

  • telephony использует сигналы телефонии, основанные на идентификаторе сети и часовом поясе (NITZ).
  • network используются серверы времени, работающие по протоколу NTP (Network Time Protocol).

Для каждого варианта требуется подключение к внешним сетям, которые не всегда доступны в 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

В Android 12 появилась новая функция определения времени gnss , которая использует сигналы 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)

Для проверки доступности времени, полученного от 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, которые могут поступать от различных блоков управления (ЭБУ), которые, в свою очередь, могут использовать комбинацию часов реального времени, GNSS, NITZ или любого другого источника времени.

В Android 12 доступны следующие варианты отображения времени, которые можно использовать в качестве external подсказок:

  • Свойства VHAL. Добавлено новое свойство VHAL с именем EPOCH_TIME . Это свойство обозначает количество миллисекунд, прошедших с 1 января 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 может использовать предоставленную метку времени в качестве нового значения системных часов.