Phát hiện thời gian mạng

Các thiết bị Android tự động tìm cách lấy thời gian Unix chính xác từ một nguồn mạng. Android sử dụng giao thức SNTP (giao thức thời gian mạng đơn giản), giao thức này sử dụng giao thức UDP để lấy thông tin về thời gian.

Các thành phần được mô tả trên trang này là một phần của hệ thống tự động phát hiện thời gian, còn được gọi là nguồn thời gian mạng. Bạn có thể dùng tín hiệu thời gian từ máy chủ thời gian mạng để đặt đồng hồ hệ thống của thiết bị Android khi thiết bị hỗ trợ tính năng tự động phát hiện thời gian và dịch vụ time_detector được định cấu hình để sử dụng tín hiệu này.

Theo mặc định, Android sử dụng nguồn gốc thời gian mạng làm nguồn gốc chính cho tính năng tự động phát hiện thời gian.

Hệ thống phát hiện thời gian mạng

Dịch vụ network_time_update_service chạy trong máy chủ hệ thống Android sẽ triển khai hệ thống phát hiện thời gian mạng. Dịch vụ này định kỳ sử dụng SNTP để lấy tín hiệu thời gian từ một máy chủ. Dịch vụ này cũng giám sát khả năng kết nối mạng và kích hoạt tính năng làm mới thời gian khi không có tín hiệu thời gian gần đây sau một thời gian dài kết nối kém.

Dịch vụ network_time_update_service cố gắng lấy tín hiệu thời gian sau khi khởi động và khi kết nối mạng được thiết lập lần đầu. Sau đó, dịch vụ này sẽ cố gắng duy trì tín hiệu mới nhất mà dịch vụ nắm giữ. API này cân bằng nhu cầu của từng thiết bị Android với mức tải đáng kể mà nhiều thiết bị Android trên toàn thế giới có thể tạo ra khi làm mới thời gian.

Bằng cách sử dụng các API nội bộ, network_time_update_service sẽ gửi các đề xuất về thời gian mạng cho dịch vụ time_detector. Các thành phần khác của nền tảng Android sau đó sẽ sử dụng những đề xuất về thời gian mạng này.

Sau khi nhận được đề xuất từ nguồn gốc thời gian mạng, dịch vụ time_detector sẽ xác định xem có nên cập nhật đồng hồ hệ thống theo các quy tắc ưu tiên đã định cấu hình hay không.

Để định cấu hình hệ thống tự động phát hiện thời gian sử dụng các đề xuất về nguồn gốc mạng để tự động đặt đồng hồ hệ thống, hãy sử dụng tệp cấu hình máy chủ hệ thống core/res/res/values/config.xml. Đảm bảo giá trị network nằm trong config_autoTimeSourcesPriority ở vị trí mong muốn. Để biết thông tin chi tiết, hãy xem phần Mức độ ưu tiên của nguồn thời gian.

Cấu hình thiết bị

Phần này mô tả cách các nhà sản xuất thiết bị có thể định cấu hình hệ thống phát hiện thời gian mạng.

Cấu hình AOSP cơ bản nằm ở frameworks/base/core/res/res/values/config.xml:

Khoá cấu hình Giá trị AOSP Mô tả
config_ntpRetry 3 Sau khi không làm mới được, đây là số lần hệ thống cố gắng thăm dò thời gian mạng với khoảng thời gian thăm dò NTP ngắn hơn (config_ntpPollingIntervalShorter), trước khi quay lại và sử dụng khoảng thời gian thăm dò thông thường (config_ntpPollingInterval). Giá trị nhỏ hơn 0 có nghĩa là hệ thống sẽ thử lại việc thăm dò ở khoảng thời gian thăm dò NTP ngắn hơn cho đến khi có thể làm mới thành công.
config_ntpPollingInterval 64800000 (18 giờ) Khoảng thời gian thăm dò ý kiến thông thường của mạng tính bằng mili giây.
config_ntpPollingIntervalShorter 60000 (1 phút) Khoảng thời gian thăm dò mạng để thử lại tính bằng mili giây. Được dùng khi quá trình làm mới thời gian không thành công.
config_ntpServers Một mục duy nhất: ntp://time.android.com Các máy chủ NTP dùng để lấy thời gian chính xác. Các mục phải có dạng: ntp://<host>[:port].
Đây không phải là một giao thức URI đã đăng ký của IANA.
config_ntpTimeout 5000 Thời gian chờ phản hồi của máy chủ NTP tính bằng mili giây trước khi hết thời gian chờ.

Máy chủ

Theo mặc định, AOSP sử dụng máy chủ thời gian tại time.android.com, đây là một bí danh cho NTP công khai của Google. Dịch vụ này không có SLA. Để biết thông tin chi tiết, hãy xem Câu hỏi thường gặp về NTP công khai của Google.

Hỗ trợ nhiều máy chủ

Đối với Android 14 trở lên, khung này hỗ trợ nhiều máy chủ NTP. Điều này hỗ trợ những trường hợp thiết bị được phân phối trên toàn cầu với một cấu hình duy nhất, nhưng quyền truy cập vào các máy chủ như time.android.com bị hạn chế ở một số nơi.

Thuật toán sẽ thử từng máy chủ được chỉ định trong khoá cấu hình config_ntpServers. Khi tìm thấy một máy chủ phản hồi, hệ thống sẽ tiếp tục sử dụng máy chủ đó cho đến khi không thể làm mới hoặc thiết bị khởi động lại.

 Độ chính xác

Tính năng đồng bộ hoá thời gian mạng mặc định của Android sử dụng SNTP với một truy vấn thời gian duy nhất khoảng một lần mỗi ngày để cố gắng đảm bảo luôn có tín hiệu thời gian gần đây.

Các hiệu ứng độ trễ mạng là yếu tố đóng góp lớn nhất vào độ không chính xác về thời gian khi triển khai SNTP của Android. SNTP giả định độ trễ mạng đối xứng, tức là độ trễ mạng cho yêu cầu giống với độ trễ mạng cho phản hồi và thời gian chính xác nằm chính xác ở giữa chuyến khứ hồi của mạng đó. Thông thường, thời gian khứ hồi của mạng là vài trăm mili giây và trên mạng có dây, độ trễ gần như đối xứng, dẫn đến mức độ không chính xác gần như không thể nhận thấy đối với người dùng. Tuy nhiên, với điện thoại di động hoặc điện thoại vô tuyến, có một số giai đoạn mà độ trễ tương đối dài, không đối xứng có thể được chèn vào một giao dịch mạng, dẫn đến độ không chính xác cao hơn.

Với chế độ cài đặt mặc định của AOSP cho config_ntpTimeout được đặt thành 5000 mili giây và nếu tất cả độ trễ mạng chỉ tập trung vào chân đến hoặc chân đi, thì lỗi lý thuyết tối đa là khoảng 2, 5 giây.

Độ chính xác tổng thể của đồng hồ hệ thống cũng bị ảnh hưởng bởi khả năng theo dõi thời gian đã trôi qua một cách chính xác của thiết bị Android sau khi nhận được tín hiệu thời gian. Đây là vấn đề với tất cả hoạt động tính giờ trên Android, chứ không chỉ phát hiện thời gian mạng. Đó là lý do dịch vụ time_detector bỏ qua các đề xuất thời gian cũ. Dịch vụ network_time_update_service thường xuyên làm mới bằng cách sử dụng khoảng thời gian config_ntpPollingInterval để cung cấp cho dịch vụ time_detector các đề xuất mới về thời gian và đảm bảo rằng dịch vụ time_detector không quay lại các nguồn thời gian có độ chính xác thấp hơn và thường có mức độ ưu tiên thấp hơn hoặc đôi khi không chính xác, chẳng hạn như telephony.

Khi sử dụng tính năng tự động phát hiện thời gian, độ chính xác của đồng hồ hệ thống trên thiết bị có thể bị ảnh hưởng bởi các cấu hình khác của dịch vụ time_detector, chẳng hạn như các hằng số và cờ ảnh hưởng đến mức độ khác biệt giữa đề xuất thời gian và thời gian hiện tại của đồng hồ hệ thống trước khi đồng hồ được điều chỉnh (ServiceConfigAccessorImpl.java).

Các nhà sản xuất thiết bị có thể sửa đổi độ chính xác bằng cách sử dụng các hằng số và lựa chọn cấu hình nêu trên. Tuy nhiên, bạn cần lưu ý đến những hạn chế của việc triển khai SNTP trên nền tảng, cũng như tác động tiềm ẩn đến mức tiêu thụ điện năng do các hoạt động mạng diễn ra thường xuyên hơn, tác động đến các ứng dụng chạy trên thiết bị do các điều chỉnh đồng hồ diễn ra thường xuyên hơn nhưng nhỏ hơn và ảnh hưởng đến tải máy chủ.

Các trường hợp sử dụng khác của thời gian mạng

Nếu bạn không định cấu hình tính năng tự động phát hiện thời gian bằng nguồn gốc network hoặc nếu người dùng đã tắt tính năng tự động phát hiện thời gian, thì thời gian do dịch vụ network_time_update_service thu được vẫn được các thành phần sau sử dụng:

  • Phương thức SystemClock.currentNetworkTimeClock().
  • Các hàm nền tảng nội bộ. Ví dụ: A-GPS có thể xác định vị trí GNSS (vị trí) nhanh hơn khi có thông tin về thời gian mạng.

Gỡ lỗi và thử nghiệm

Phần sau đây mô tả các lệnh shell để gỡ lỗi và kiểm thử tính năng phát hiện thời gian mạng.

Tương tác với dịch vụ network_time_update_service

Để kết xuất trạng thái hiện tại của network_time_update_service, hãy sử dụng:

adb shell cmd network_time_update_service dump

Để xem một bộ tuỳ chọn dòng lệnh có thể hỗ trợ thử nghiệm, hãy sử dụng:

adb shell cmd network_time_update_service help