Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Prioritas Sumber Waktu

Kerangka kerja Android menggunakan berbagai sumber waktu untuk sinkronisasi waktu. Halaman ini berfokus pada sumber waktu otomatis Network Time Protocol (NTP) dan Network Identity and Time Zone (NITZ). Secara default di Android 12 atau lebih tinggi, framework memprioritaskan NTP sebagai sumber waktu daripada NITZ karena NTP lebih akurat dan andal daripada NITZ. Dalam situasi di mana NTP tidak tersedia, kerangka kerja kembali pada NITZ. Ini adalah pembalikan prioritas default dari versi platform sebelumnya. Secara default di Android 11 dan yang lebih rendah, framework memprioritaskan NITZ daripada NTP.

Untuk rincian lebih lanjut tentang perubahan ini, lihat AOSP patch berikut: 1563678 , 1.513.323 .

Mengonfigurasi prioritas sumber waktu

Untuk mengkonfigurasi sumber mana waktu menjadi prioritas secara default untuk versi Android tertentu, mengkonfigurasi config_autoTimeSourcesPriority kunci dalam frameworks/base/core/res/res/values/config.xml pada waktu membangun. Saran waktu dari sumber waktu yang lebih tinggi dalam daftar lebih diutamakan daripada sumber yang lebih rendah dalam daftar.

Sumber waktu android yang dapat dikonfigurasi ditemukan di TimeDetectorStrategy.java . Sumber berikut dikonfigurasi untuk digunakan secara default:

  • Telepon (NITZ)
  • Jaringan (NTP)

Pengujian

Untuk memverifikasi bahwa perangkat menggunakan NITZ saat NTP tidak tersedia (saat data seluler dan Wi-Fi dinonaktifkan), lakukan hal berikut:

  1. Pastikan ada SIM yang berfungsi di DUT
  2. Matikan data seluler dan Wi-Fi
  3. Masukkan perangkat ke mode pesawat untuk memastikan radio seluler dimatikan
  4. Matikan deteksi waktu otomatis
  5. Atur jam secara manual ke nilai waktu yang salah di masa mendatang
  6. Nyalakan ulang perangkat
  7. Aktifkan deteksi waktu otomatis
  8. Keluarkan perangkat dari mode pesawat

Langkah-langkah ini memicu perubahan pada jam sistem segera setelah sinyal NITZ diterima. Untuk memeriksa bagaimana waktu perangkat diatur, jalankan perintah berikut:

adb shell dumpsys time_detector

Untuk memverifikasi bahwa jam sistem menggunakan NITZ, konfirmasikan hal berikut di output perintah:

  • mEnvironment.isAutoTimeDetectionEnabled() adalah true .
  • mEnvironment.autoOriginPriorities() berisi daftar sumber waktu dengan sumber yang lebih tinggi pada daftar taking didahulukan dari sumber menurunkan daftar.
  • The Time change log bagian menunjukkan bahwa sistem diset menggunakan saran telephony.
  • The Telephony suggestion history bagian berisi saran waktu.
  • The Network suggestion history bagian kosong.

Saran-saran kalinya dalam Telephony suggestion history dan Network suggestion history bagian dianggap sebagai sumber kebenaran untuk waktu. Jika perangkat terhubung ke internet dan memiliki kartu SIM, saran dibuat menggunakan NTP (jaringan) dan NITZ (telepon). Dalam hal tes ini, hanya Telephony suggestion history bagian berisi saran karena NTP dinonaktifkan.

The Time change log bagian mencatat perubahan yang dibuat untuk jam sistem perangkat dan saran yang digunakan. Jam sistem diatur berdasarkan urutan dari sumber-sumber waktu dalam daftar prioritas dalam config_autoTimeSourcesPriority kunci. Namun, saran dari sumber dengan prioritas lebih tinggi mungkin diabaikan jika saran tersebut terlalu lama atau tidak valid. Juga, jika saran valid dengan prioritas tertinggi cocok dengan waktu jam sistem perangkat saat ini hingga dalam beberapa detik, waktu tidak akan berubah. Dalam hal tes ini, selama saran tidak ketinggalan jaman, jam sistem diatur menggunakan salah satu saran dari Telephony suggestion history .

Berikut ini adalah contoh output di mana perangkat kembali menggunakan NITZ saat NTP tidak tersedia.

TimeDetectorStrategy:
  mLastAutoSystemClockTimeSet=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}
  mEnvironment.isAutoTimeDetectionEnabled()=true
  mEnvironment.elapsedRealtimeMillis()=73059
  mEnvironment.systemClockMillis()=1614186767818
  mEnvironment.systemClockUpdateThresholdMillis()=2000
  mEnvironment.autoTimeLowerBound()=2021-02-24T15:44:15Z(1614181455000)
  mEnvironment.autoOriginPriorities()=[network,telephony]
  Time change log:
    66261 / 2021-02-24T17:12:41.020Z - Set system clock using time=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000} cause=Found good telephony suggestion., bestTelephonySuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}, detectionReason=New telephony time suggested. timeSuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]} elapsedRealtimeMillis=66259 newSystemClockMillis=1614186761019
  Telephony suggestion history:
    key idx: 0=0
    val idx: 0=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      Historic values=[
        0@PT1M6.258S: TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      ]
  Network suggestion history:
    {Empty}
  Gnss suggestion history:
    {Empty}
  External suggestion history:
    {Empty}

Untuk referensi sebagai perbandingan output dalam skenario pengujian, berikut ini adalah contoh output tipikal di mana perangkat menerima saran waktu dari sumber waktu NTP dan NITZ.

TimeDetectorStrategy:
  mLastAutoSystemClockTimeSet=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}
  mEnvironment.isAutoTimeDetectionEnabled()=true
  mEnvironment.elapsedRealtimeMillis()=302926
  mEnvironment.systemClockMillis()=1614186997685
  mEnvironment.systemClockUpdateThresholdMillis()=2000
  mEnvironment.autoTimeLowerBound()=2021-02-24T15:44:15Z(1614181455000)
  mEnvironment.autoOriginPriorities()=[network,telephony]
  Time change log:
    66261 / 2021-02-24T17:12:41.020Z - Set system clock using time=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000} cause=Found good telephony suggestion., bestTelephonySuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}, detectionReason=New telephony time suggested. timeSuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]} elapsedRealtimeMillis=66259 newSystemClockMillis=1614186761019
  Telephony suggestion history:
    key idx: 0=0
    val idx: 0=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      Historic values=[
        0@PT1M6.258S: TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      ]
  Network suggestion history:
    0@PT4M4.04S: NetworkTimeSuggestion{mUtcTime=TimestampedValue{mReferenceTimeMillis=244038, mValue=1614186939242}, mDebugInfo=[Origin: NetworkTimeUpdateService. event=3]}
  Gnss suggestion history:
    {Empty}
  External suggestion history:
    {Empty}