자동 시간 감지

자동 시간 감지는 다양한 소스에서 시간 추천을 수신하고 최적의 옵션을 선택하여 Android의 시스템 시계를 일치하도록 설정합니다. 이전 Android 출시에서는 날짜와 시간을 설정하는 2가지 방법을 제공했습니다. 하나는 사용자마다 수동으로 설정하는 방법이고 다른 하나는 다음 두 옵션 중 하나로 설정되는 자동 시간 감지입니다.

  • telephony는 네트워크 ID와 시간대(NITZ) 텔레포니 신호를 사용합니다.
  • network는 네트워크 시간 프로토콜(NTP) 시간 서버를 사용합니다.

각 옵션에는 외부 네트워크 연결이 필요한데, 이는 Android Automotive에서 항상 사용할 수 있는 것은 아닙니다. 예를 들어 일부 국가의 일부 자동차에는 텔레포니가 기본으로 제공되지 않을 수 있습니다. 따라서 이제 네트워크 연결을 사용할 수 없을 때 사용하도록 글로벌 항법 위성 시스템(GNSS) 시간도 시스템 시간 소스로 제공됩니다.

이 예정된 Android 출시에서는 시간을 자동으로 감지하여 설정하는 옵션을 두 가지 더 제공합니다.

  • gnss는 글로벌 항법 위성 시스템(GNSS)을 사용합니다.
  • external은 VHAL 속성이나 System 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 신호로 제공됩니다. 텔레포니와 네트워크를 사용할 수 없을 때 신뢰할 수 있는 시간 소스로 간주됩니다. 이 옵션은 위치 업데이트를 수동적으로 수신하는 SystemServer의 새 GnssTimeUpdateService에 추가되었습니다. 유효한 위치가 수신되면 GnssTimeUpdateServiceTimeDetectorService가 시스템 시계를 업데이트해야 할지 결정하도록 추천합니다.

기본적으로 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를 업데이트합니다. gnssconfig_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에 제공할 수 있습니다. 실시간 시계, GNSS, NITZ, 기타 시간 소스의 조합을 사용할 수 있는 다양한 ECU에서 이러한 추천을 제공할 수 있습니다.

이제 다음 추천을 Android 12에서 사용하여 external 시간 추천으로 고려할 수 있습니다.

  • VHAL 속성. EPOCH_TIME이라는 새 VHAL 속성이 제공됩니다. 이 속성은 1970년 1월 1일(UTC) 이후 경과된 밀리초 수를 나타냅니다. 이 값을 Android TimeManager에 전달하여 새 시스템 시간을 추천할 수 있습니다. 이 속성을 업데이트하는 샘플 VHAL 구현은 아래 참조 구현에서 제공됩니다.
  • 시스템 API. 이제 suggestExternalTime()이라는 새 메서드를 TimeManager에서 사용하여 시스템에 외부 시간 추천을 제공할 수 있습니다. 시스템이 외부 시간 추천을 고려하도록 구성되어 있는 경우(구성 파일의 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에서는 제공된 타임스탬프를 새 시스템 시계 값으로 사용할 수 있습니다.