時間概覽

本頁介紹了時間和時區檢測在 Android 上的工作原理。這包括 Android 如何自動檢測時間和時區、設備製造商的配置選項以及測試信息。

時間和時區概述

為了確定用戶在狀態欄等位置顯示的本地時間,Android 會跟踪兩個相關但獨立的狀態:

  • 當前的 Unix 紀元時間
  • 當前時區

當前 Unix 紀元時間和當前時區是設備範圍的狀態,這意味著它們由設備的所有用戶共享。

當前的 Unix 紀元時間不是固定值。它會自動更新以反映時間的流逝。除了正常的時間流逝之外,如果發現設備的當前 Unix 紀元時間不正確,例如在設備斷電後,還會調整設備的當前 Unix 紀元時間。

當前時區決定了將當前 Unix 紀元時間轉換為本地時間的調整。例如,在洛杉磯的夏季,設備會從當前的 Unix 紀元時間中減去 7 小時,而在冬季,它會減去 8 小時。

為了支持這些本地時間計算,所有 Android 設備都有一個包含所有全球時區規則的數據庫。有關時區規則的更多信息,請參閱時區規則

當用戶前往使用不同時區的新位置時,不需要調整當前的 Unix 紀元時間,但用戶通常希望查看本地時間而不是其先前位置的時間。更改當前時區可確保將正確的偏移量應用於當前 Unix 紀元時間,以顯示新位置的正確本地時間。

AOSP 允許用戶通過以下機制獨立控制是否為他們自動設置時間和時區。

  • 自動時間檢測:確保設備具有正確的當前 Unix 紀元時間。
  • 自動時區檢測:確保設備具有正確的當前時區。

自動時間檢測

本節概述了管理自動時間檢測、用戶控制、配置選項和測試詳細信息的time_detector服務。

time_detector 服務

運行 Android 10 或更高版本的設備上的time_detector服務管理自動時間檢測。當啟用自動時間檢測時,它會根據需要調整設備的當前 Unix 紀元時間。

time_detector服務始終處於以下兩種狀態之一:不確定確定。服務的確定或不確定狀態由它從各種來源接收的時間建議確定。

time_detector服務確定時,意味著它已收到帶有 Unix 紀元時間信息的建議,如果時間建議與當前 Unix 紀元時間不同,它會覆蓋當前的 Unix 紀元時間。

time_detector不確定時,它不會覆蓋當前時間。不確定狀態通常意味著time_detector服務沒有收到時間建議。如果time_detector服務收到的建議被認為太舊而無法使用,它也會變得不確定。考慮建議的年齡是因為使用舊的 Unix 紀元時間建議的調整依賴於設備上經過的實時時鐘,這在很長一段時間內被認為是不准確的。

為了自動建立當前的 Unix 紀元時間,設備可以使用各種來源。這些在本文檔中稱為起源time_detector服務根據其來源將建議序列視為不同的序列。

time_detector服務是有狀態的,這意味著它會記錄每個來源提出的最新建議。如果源有更新的 Unix 紀元時間信息可用,則會向time_detector提出新建議。 time_detector服務重新評估新的和現有的建議,並在收到建議時更新設備狀態。

儘管 UTC 時間在國際上已達成一致,但對於 Android 設備而言,建立當前 Unix 紀元時間並不總是那麼簡單,原因有很多:

  • Unix 紀元時間是與 UTC 時間略有不同的計時系統。在兩者之間進行轉換需要了解閏秒何時發生以及它們是如何被來源處理的。
  • 起源可能僅在特定時間或特定情況下可用。例如,如果源需要網絡連接,則它可能僅在設備連接到互聯網時可用。
  • 來源可能不准確或不精確,或者有錯誤。例如,如果電話信號塔沒有正確跟踪“通用時間”,則電話來源可能會提供不准確的時間建議。
  • 在獲取 Unix 紀元時間時可能會引入不准確性。例如,網絡延遲、緩衝或進程調度可能會導致 Unix 紀元時間不准確。
  • 用於調整建議自收到建議以來經過的時間的參考時鐘可能不准確。

在 AOSP 中默認配置了兩個主要的時間檢測源:

  • 電話:使用網絡身份和時區 (NITZ) 電話信號。
  • 網絡:使用網絡時間協議 (NTP) 時間服務器。

電話和網絡源都需要連接到外部網絡,而外部網絡並不總是可用的。

從 Android 12 開始,Android 還支持以下來源,默認情況下未配置使用:

  • GNSS使用 GPS 位置提供程序從 GNSS 源獲取時間。
  • 外部允許設備製造商集成他們自己的 Unix 紀元時間源的通用來源。

時間設置

用戶可以在 AOSP 設置應用中的系統 > 日期和時間中啟用自動時間檢測。

設置中的自動時間檢測

圖 1.設置中的自動時間檢測。

下表描述了 AOSP 設置應用程序中時間檢測的用戶控件。

*在 Android 11 及更低版本上,此設置標記為使用網絡提供的時間

AOSP 設置位置AOSP 設置名稱範圍行為
系統 > 日期和時間自動設置時間*所有用戶

一個切換。

on時,設備負責檢測當前的 Unix 紀元時間。關閉時,用戶可以手動設置設備時間。

當用戶手動輸入時間時,他們輸入的是本地時間,而不是 Unix 紀元時間。當前 Unix 紀元時間是通過使用當前時區推導出 Unix 紀元時間來計算的。

配置

設備製造商可以通過各種方式配置time_detector服務,例如使用哪些來源以及如何對來自它們的信號進行優先級排序。

原點優先級

從 Android 12 開始,設備製造商可以更改core/res/res/values/config.xml配置文件,以指定要在自動時間檢測中包含哪些時間來源,以及time_detector考慮這些來源的優先級。

對於運行 Android 11 或更低版本的設備,源優先級硬編碼為["telephony", "network"] ,這意味著電話建議優先於網絡建議。

默認的 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>network</item>
    <item>telephony</item>
</string-array>

在 Android 12 中,網絡和電話建議被配置為默認使用的來源。網絡時間建議優先於電話時間建議。設備製造商可以更改來源的順序以恢復到 Android 11 或更低版本中的行為,其中電話具有更高的優先級。

默認情況下,如果最高優先級的有效建議在幾秒內與設備當前系統時鐘時間匹配,則設備時間不會更改。這是為了避免為偵聽ACTION_TIME_CHANGED意圖的已安裝應用創建工作。

允許的原點值為:

下限時間

Android 12 引入了一個較低的時間限制,用於驗證time_detector服務收到的時間建議。下限時間值是根據構建時間戳設置的。這樣做的原理是有效時間不能在設備的系統映像構建之前。如果時間建議早於下限時間,則time_detector服務會丟棄該建議,因為如果構建時間戳正確,則該建議無效。

對於運行 Android 11 或更低版本的設備, time_detector服務不會驗證傳入的 Unix 紀元時間建議。

Android 不強制執行時間上限。

時間調試和測試

本節提供有關如何調試和測試time_detector服務以及所有來源共享的其他組件的行為的信息。

與 time_detector 服務交互

要查看time_detector服務的配置和time_detector服務的狀態,請使用:

adb shell cmd time_detector dump

要查看用於調試和測試時區檢測的其他命令,請使用:

adb shell cmd time_detector help

幫助輸出還描述了 device_config 服務屬性,這些屬性可用於影響time_detector在測試或生產中的行為。有關詳細信息,請參閱使用 device_config 服務配置設備

要驗證自動時間檢測,測試人員必須知道time_detector服務正在使用哪個來源。以下是adb shell cmd time_zone_detector dump命令的輸出示例,有關當前來源和服務狀態的信息以粗體顯示:

$ adb shell cmd time_detector dump

TimeDetectorStrategy:
  mLastAutoSystemClockTimeSet=null
  mEnvironment.isAutoTimeDetectionEnabled()=true
  mEnvironment.elapsedRealtimeMillis()=23717241
  mEnvironment.systemClockMillis()=1626707861336
  mEnvironment.systemClockUpdateThresholdMillis()=2000
  mEnvironment.autoTimeLowerBound()=2021-07-19T07:48:05Z(1626680885000)
  mEnvironment.autoOriginPriorities()=[network,telephony]
  Time change log:
    ...
  Telephony suggestion history:
    ...
  Network suggestion history:
    ...
  Gnss suggestion history:
    ...
  External suggestion history:
    ...

該信息可以解釋如下:

鑰匙價值
mEnvironment.isAutoTimeDetectionEnabled()是否啟用自動時間檢測。
mEnvironment.autoTimeLowerBound()當前用於驗證時間建議的下限。
mEnvironment.autoOriginPriorities()使用的來源和優先順序。

時間更改日誌指示time_detector服務更改了設備的當前 Unix 紀元時間的情況。

建議歷史信息指示每個來源已經提出了哪些建議。

自動時區檢測

本節概述了time_zone_detector服務,該服務管理自動時區檢測、設置中的用戶控制、電話和位置時區檢測以及測試詳細信息。

time_zone_detector 服務

運行 Android 11 或更高版本的設備上的time_zone_detector服務管理自動時區檢測。當啟用自動時區檢測時,它會根據需要調整設備的當前時區。

啟用自動時區檢測後, time_zone_detector可以處於以下兩種狀態之一:不確定確定

time_zone_detector服務處於某種狀態時,這意味著time_zone_detector服務收到了強時區信息,這可能導致它覆蓋當前時區。當不確定時,這意味著它沒有收到任何信息或僅收到低置信度信息,這意味著它不會覆蓋當前時區。

time_zone_detector服務的某些狀態可能包括time_zone_detector沒有時區信息可供使用,或者有多個時區可供選擇的狀態。這些狀態如下:

  • 當設備處於沒有時區的某個地方時,例如在國際水域或有爭議的地區,就會進入具有零時區的特定狀態。此狀態類似於不確定狀態,但表明time_zone_detector不需要採取進一步的行動來嘗試確定時區。
  • 在存在歧義或邊界條件的情況下進入具有多個時區的特定狀態。在這種狀態下,如果當前時區是time_zone_detector確定的時區之一,則保持當前時區不變。否則,將使用可用時區之一。如果用戶之前手動選擇了他們的時區,或者當設備接近邊界時,這會給time_zone_detector一個粘性元素。

time_zone_detector服務的確定或不確定狀態由origin發送的時區建議確定。

通常,建議有兩種與time_zone_detector的可能狀態非常匹配的類型:確定不確定。以下是建議類型的示例:

  • 類型 = “不確定”,zoneIds = []

    • 起源不知道時區是什麼。
  • 類型 = “確定”,zoneIds = [“歐洲/倫敦”]

    • 起源確定該區域是“歐洲/倫敦”。
  • 類型 = “確定”,zoneIds = []

    • 來源是確定的,但沒有與當前位置關聯的區域 ID。
  • 類型 = “某些”,zoneIds = [“美國/丹佛”,“美國/鳳凰城”]

    • 來源確定答案是兩個區域之一,但無法在“美國/丹佛”和“美國/鳳凰”之間進行選擇。

time_zone_detector服務根據其來源將建議序列視為不同的序列。根據來源,建議還可能包含指示來源確定性的元數據。

time_zone_detector服務是有狀態的,這意味著它會記錄每個來源提出的最新建議。如果先前的建議不再正確,則將新建議發送到time_zone_detector服務;也就是說,如果一個原點現在有不同的建議,或者它已經失去了檢測時區的能力。 time_zone_detector服務重新評估新的和現有的建議,並在收到建議時更新設備狀態。

Android 支持時區檢測的兩個來源:

  • 電話
  • 地點

time_zone_detector服務僅使用單一來源來確定時區。當設備支持位置原點時,當前使用的原點將根據用戶配置的時區設置確定。噹噹前原點變得不確定時區時, time_zone_detector不會切換到不同的原點。除了當前原點之外,與原點相關的建議可以由time_zone_detector保存在內存中,但除非當前原點發生變化,否則它們不會被使用。當用戶更改自動時區檢測的設置並且當前原點更改時,將使用可用於新原點的最新建議。

時區設置

用戶可以在 AOSP 設置應用中啟用和配置自動時區檢測設置。

設置中的自動時區檢測

圖 2.設置中的自動時區檢測。

下表描述了 AOSP 設置應用程序中時區檢測的用戶控件。

*在 Android 11 及更低版本上,此設置標記為使用網絡提供的時區

AOSP 設置位置AOSP 設置名稱範圍行為
系統 > 日期和時間自動設置時區*所有用戶

一個切換。

打開時,設備負責檢測當前時區。關閉時,用戶可以手動設置設備的時區。

系統 > 日期和時間使用位置設置時區當前用戶

一個切換。

適用於 Android 12。僅當設備支持位置時區檢測時才會顯示此切換。

地點使用位置當前用戶

一個切換。

通常允許或阻止使用設備的位置。如果設備支持位置時區檢測,則該值是相關的。

以下概述了給定用戶選擇的設置時區檢測的設備行為:

  • [日期和時間] 自動設置時區: OFF

    • 用戶必須手動選擇時區。
  • [日期和時間] 自動設置時區:

    • [位置] 使用位置: OFF

      • 電話信號用於檢測時區。 (見下面的註釋。)
    • [位置] 使用位置: ON

      • [日期和時間] 使用位置設置時區:

        • 位置用於檢測時區。
      • [日期和時間] 使用位置設置時區: OFF

        • 電話信號用於檢測時區。 (見下面的註釋。)

多用戶設備

由於所涉及的一些設置僅限於當前用戶,因此噹噹前用戶在多用戶 Android 設備上發生更改時,設備的時區檢測行為可能會發生變化。

使用位置設置時區切換的範圍僅限於當前用戶,不受設備政策的限制,這意味著用戶始終可以更改其值,即使設置時區自動切換關閉或其他時間或時區控制受設備策略控制器限制。

切換到自動檢測和從自動檢測切換時的行為

當用戶將時區檢測從手動切換到自動時, time_zone_detector可能已經確定了當前時區。如果是這樣,當用戶啟用自動檢測時,設備的時區可能會同時更改以匹配time_zone_detector服務的意見。

類似地,當用戶在設置中進行更改導致time_zone_detector服務的當前來源發生變化時, time_zone_detector可能已經收到有關新來源的建議,因此設備的時間可能會立即更改以匹配time_zone_detector服務的意見。

電話時區檢測

電話時區檢測使用電話信號來確定當前時區。有關詳細信息,請參閱電話時區檢測

位置時區檢測

位置時區檢測適用於 Android 12 或更高版本。這是一項可選的自動時區檢測功能,使設備能夠使用其位置來確定當前時區。

Android 12 中引入的location_time_zone_manager服務在系統服務器中運行,包含負責向time_zone_detector服務提交位置來源建議的代碼。有關詳細信息,請參閱位置時區檢測

功能採用注意事項

本節介紹位置時區檢測功能的各個方面,以幫助設備製造商確定是否在設備上採用該功能。

比較電話和位置檢測

下表比較了使用位置信號而不是電話信號進行時區檢測的優缺點。

電話檢測位置檢測
正確性因國家而異。

取決於 MCC、NITZ 的正確性和可用性。
取決於功能配置或插件組件。

正確性通常因以下因素而異:
  • 位置提供者的準確性和規律性。
  • 時區地圖數據的質量。
可更新性電話檢測依賴於可更新時區數據模塊(com.android.tzdata APEX) 中包含的文件。取決於功能配置或插件組件。

可更新性通常取決於設備是使用服務器還是客戶端時區地圖數據。

注意:時區地圖數據不包含在用於更新 Android 的 TZDB 副本和其他時區信息的時區數據模塊中。

設備製造商還必須考慮時區規則和時區地圖數據之間的版本一致性。
用電量無或低功耗取決於用戶位置設置、正在使用的插件以及通常其他應用程序請求位置的內容。
可用性僅限電話設備。通常需要一個有效的 SIM 卡。位置檢測取決於可用的位置提供程序。
用戶隱私

用戶的首選時區通常由他們的地理位置決定。位置是敏感數據。作為時區檢測的一部分,用戶可能會擔心他們的位置信息會被共享。與時區檢測無關,設備上運行的所有應用程序都可以讀取設備的當前時區,而無需 Android 權限,並且應用程序可以從這些信息中推斷出設備位置的不精確概念。

更具體地說,時區檢測可以通過被動或主動方式進行:

  • 被動:設備環境中的某些內容告訴設備在該環境中使用的時區。
  • 主動:設備必須自己計算時區,並根據用戶的隱私設置和他們的同意,獲取設備的位置來這樣做。然後它可以與外部服務共享其位置。有關用戶隱私和同意的詳細信息,請參閱下面的討論。

被動檢測,例如電話來源,對用戶沒有額外的隱私影響。

主動檢測(例如位置來源)涉及確定設備的位置,用戶可能不想同意,並且可以通過網絡發送位置以確定時區 ID。

Android 用於時區檢測的用戶隱私方法使用戶能夠單獨禁用預期處於活動狀態的源。此外,AOSP 平台代碼本身並不直接處理位置:位置檢測和將位置映射到時區 ID 的工作留給設備製造商配置的插件組件。

有關用戶隱私功能的更多詳細信息,請參閱位置時區檢測

時區調試和測試

本節提供有關如何調試和測試time_zone_detector服務以及所有來源共享的其他組件的行為的信息。

使用 device_config 服務配置設備

device_config服務是 Android 上使用的一種機制,用於使用通常由專有(非 AOSP)代碼從遠程服務器提取的值來配置可修改行為。使用device_config值進行測試時,尤其是在長時間運行的手動測試期間,設備可能會同步標誌,這將重置標誌並清除為測試設置的值。

在 Android 12 或更高版本中,要暫時阻止標誌同步,請使用:

adb shell cmd device_config set_sync_disabled_for_tests persistent

要在測試後恢復標誌同步,請使用:

adb shell cmd device_config set_sync_disabled_for_tests none

恢復標誌同步後,重啟設備。

有關詳細信息,請使用$ adb shell cmd device_config help

與 time_zone_detector 服務交互

要查看time_zone_detector服務的time_zone_detector配置和狀態,請使用:

adb shell cmd time_zone_detector dump

要查看用於調試和測試時區檢測的其他命令,請使用:

adb shell cmd time_zone_detector help

幫助輸出還描述了device_config服務屬性,這些屬性可用於影響time_zone_detector服務在測試或生產中的行為。有關詳細信息,請參閱使用 device_config 服務配置設備

要驗證時區檢測,測試人員必須知道time_zone_detector使用的是哪個來源。要了解和影響time_zone_detector的當前來源,請使用以下選項之一:

  • 通過設置 UI 進行目視檢查。有關詳細信息,請參閱時區設置
  • 通過 adb 使用命令行:

    • 要轉儲time_zone_detector狀態,請使用adb shell cmd time_zone_detector dump
    • 要更改設備設置,請使用其他time_zone_detector命令。有關更多信息,請使用adb shell cmd time_zone_detector help

以下是adb shell cmd time_zone_detector dump命令的輸出示例,有關當前來源和服務狀態的信息以粗體顯示:

$ adb shell cmd time_zone_detector dump
TimeZoneDetectorStrategy:
  mEnvironment.getCurrentUserId()=0
  mEnvironment.getConfiguration(currentUserId)=ConfigurationInternal{mUserId=0, mUserConfigAllowed=true, mTelephonyDetectionSupported=true, mGeoDetectionSupported=true, mAutoDetectionEnabled=true, mLocationEnabled=true, mGeoDetectionEnabled=true}
  [Capabilities=TimeZoneCapabilitiesAndConfig{mCapabilities=TimeZoneDetectorCapabilities{mUserHandle=UserHandle{0}, mConfigureAutoDetectionEnabledCapability=40, mConfigureGeoDetectionEnabledCapability=40, mSuggestManualTimeZoneCapability=30}, mConfiguration=TimeZoneConfiguration{mBundle=Bundle[{geoDetectionEnabled=true, autoDetectionEnabled=true}]}}]
  mEnvironment.isDeviceTimeZoneInitialized()=true
  mEnvironment.getDeviceTimeZone()=Europe/London
  Time zone change log:
  Manual suggestion history:
...
  Geolocation suggestion history:
...
  Telephony suggestion history:
...

該信息可以解釋如下:

鑰匙價值
mUserConfigAllowed設備策略控制器是否阻止用戶控制日期和時間設置。
mTelephonyDetectionSupported設備是否具有電話時區檢測功能。
mGeoDetectionSupported設備是否有位置時區檢測。這是基於配置至少一個 LTZP 存在的有效狀態。
mAutoDetectionEnabled是否啟用自動時區檢測。
mLocationEnabled主位置切換。
mGeoDetectionEnabled原點開關:“false”表示電話原點,“true”表示位置原點。

建議歷史信息指示已通過設置(手動)以及電話和位置來源提出了哪些建議。