Tự động phát hiện thời gian

Tính năng tự động phát hiện thời gian nhận đề xuất về thời gian từ nhiều nguồn, chọn đề xuất tốt nhất, sau đó đặt đồng hồ hệ thống trong Android cho phù hợp. Các bản phát hành Android trước đây cung cấp 2 cách đặt ngày và giờ, đặt theo cách thủ công cho mỗi người dùng hoặc bằng tính năng tự động phát hiện thời gian và đặt theo một trong các cách sau:

  • telephony sử dụng tín hiệu điện thoại Nhận dạng mạng và Múi giờ (NITZ).
  • network sử dụng máy chủ thời gian Giao thức thời gian mạng (NTP).

Mỗi cách đều yêu cầu kết nối với mạng bên ngoài, nhưng không phải lúc nào cũng có sẵn trong Android Automotive. Ví dụ: ở một số quốc gia, một số ô tô có thể không có tính năng điện thoại tích hợp. Do đó, thời gian Hệ thống vệ tinh định vị toàn cầu (GNSS) được cung cấp làm nguồn thời gian hệ thống để bạn sử dụng khi không có kết nối mạng.

Bản phát hành Android sắp tới này cung cấp thêm 2 cách để tự động phát hiện và đặt thời gian:

  • gnss sử dụng Hệ thống vệ tinh định vị toàn cầu (GNSS).
  • external sử dụng thuộc tính VHAL hoặc API hệ thống.

Bật tính năng tự động phát hiện thời gian

Để bật tính năng tự động phát hiện thời gian, hãy nhớ chọn Settings (Cài đặt) > Date & Time (Ngày và giờ) > Automatic Date & Time (Ngày và giờ tự động):

Hình 1. Chọn Automatic Date &Time (Ngày và giờ tự động)

Định cấu hình nguồn thời gian

Để chỉ định nguồn thời gian cần đưa vào tính năng tự động phát hiện thời gian và mức độ ưu tiên mà các nguồn thời gian này cần được xem xét, bạn phải sửa đổi tệp cấu hình tài nguyên của thiết bị, 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>

Trong ví dụ này, telephonynetwork được xem xét trong tính năng tự động phát hiện thời gian và các đề xuất về thời gian telephony được ưu tiên hơn các đề xuất về thời gian network.

Nói chung, các đề xuất từ nguồn có mức độ ưu tiên cao hơn sẽ bị bỏ qua nếu đề xuất đó không hợp lệ hoặc quá cũ. Ngoài ra, nếu đề xuất hợp lệ có mức độ ưu tiên cao nhất khớp với thời gian đồng hồ hệ thống hiện tại của thiết bị trong vòng vài giây (giá trị mặc định là 2 giây), thì thời gian sẽ không thay đổi.

Giới hạn dưới về thời gian

Android 12 cung cấp một giới hạn dưới về thời gian mới để sử dụng khi xác thực các đề xuất về thời gian. Trước tính năng này, tính năng tự động phát hiện thời gian sẽ không xác thực thời gian UTC đến được đề xuất. Với tính năng này, những thời gian trôi qua trước khi đạt đến giới hạn dưới sẽ bị loại bỏ.

Giá trị giới hạn dưới được xác định từ một ngày bắt nguồn từ dấu thời gian bản dựng. Nguyên tắc hoạt động của tính năng này là thời gian hợp lệ không thể xảy ra trước khi hình ảnh hệ thống được tạo. Android không áp dụng giới hạn trên.

Đề xuất về thời gian GNSS

Nguồn thời gian gnss là nguồn mới trong Android 12 và được cung cấp bởi tín hiệu GPS. Đây là nguồn thời gian đáng tin cậy khi telephonynetwork không có sẵn. Tuỳ chọn này được thêm vào GnssTimeUpdateService mới trong SystemServer, giúp thụ động theo dõi các thông tin cập nhật về vị trí. Khi nhận được vị trí hợp lệ, GnssTimeUpdateService sẽ đưa ra đề xuất cho TimeDetectorService, sau đó xác định xem đồng hồ hệ thống có cần được cập nhật hay không.

Theo mặc định, nguồn thời gian gnss không được bật trong AOSP và do đó, đối tác phải bật nguồn này:

<!-- 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>

Cách bật tính năng này:

  1. Cập nhật config_enableGnssTimeUpdateService. Bạn phải đặt giá trị cho config_enableGnssTimeUpdateService thành true.
  2. Cập nhật config_autoTimeSourcesPriority. Bạn phải thêm gnss vào danh sách mục cho config_autoTimeSourcesPriority. Vị trí của gnss trong danh sách ưu tiên xác định mức độ ưu tiên được gán cho các đề xuất GNSS, liên quan đến các giá trị từ các nguồn khác.

Tác động đến nguồn điện

GnssTimeUpdateService thụ động theo dõi các thông tin cập nhật về vị trí, nghĩa là tính năng này không bao giờ chủ động bật GPS để tiêu thụ thêm điện. Do đó, mức điện tiêu thụ khi bật nguồn GNSS là không đáng kể. Điều này cũng có nghĩa là trừ phi một ứng dụng hoặc dịch vụ khác trong hệ thống chủ động yêu cầu thông tin cập nhật về vị trí, nếu không thì GnssTimeUpdateService sẽ không nhận được thông tin cập nhật về vị trí và đề xuất thời gian GNSS.

Thử nghiệm

Bộ kiểm tra tính tương thích (CTS)

Một bài kiểm tra CTS được cung cấp để xác minh rằng thời gian do GNSS cung cấp có sẵn. Để biết thông tin chi tiết, hãy xem LocationShellCommand.java.

Kiểm thử đơn vị

Hãy xem các bài kiểm thử đơn vị cơ bản trong tệp sau:

atest frameworks/base/services/tests/servicestests/src/com/android/server/timedetector/GnssTimeUpdateServiceTest.java

Bài kiểm tra thủ công

Để kiểm thử tính năng này, các lệnh mới đã được thêm vào LocationShellCommand.java. Hãy sử dụng các lệnh này để thêm nhà cung cấp kiểm thử mà bạn có thể chỉ định vị trí và thời gian GNSS được liên kết. GnssTimeUpdateService theo dõi các thông tin cập nhật về vị trí này và định kỳ đưa ra đề xuất.

Lưu ý: Giao diện cho các lệnh này có thể thay đổi giữa các bản phát hành.

# 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>

Đề xuất về thời gian bên ngoài

Đề xuất về thời gian bên ngoài là một cách khác để cung cấp đề xuất về thời gian tự động cho Android. Các tuỳ chọn mới này cho phép bạn cung cấp các đề xuất về thời gian hoàn toàn tuỳ chỉnh cho Android, có thể bắt nguồn từ nhiều ECU, lần lượt có thể sử dụng tổ hợp đồng hồ thời gian thực, GNSS, NITZ hoặc bất kỳ nguồn thời gian nào khác.

Bạn có thể xem xét các đề xuất sau đây trong Android 12 làm đề xuất về thời gian external:

  • Thuộc tính VHAL. Một thuộc tính VHAL mới có tên là EPOCH_TIME được cung cấp. Thuộc tính này biểu thị số mili giây đã trôi qua kể từ ngày 1/1/1970 theo giờ UTC. Giá trị của thuộc tính này có thể được truyền đến AndroidTimeManager để đề xuất thời gian hệ thống mới. Một mẫu triển khai VHAL cập nhật thuộc tính này được cung cấp trên trang triển khai tham chiếu.
  • API hệ thống. Một phương thức mới có tên là suggestExternalTime() có trong TimeManager để cung cấp cho hệ thống một đề xuất về thời gian bên ngoài. Nếu hệ thống được định cấu hình để tính đến các đề xuất về thời gian bên ngoài (sử dụng config_autoTimeSourcesPrioritytrong tệp cấu hình), thì dấu thời gian được truyền đến phương thức này sẽ được dùng để đặt thời gian hệ thống, nếu không có đề xuất về thời gian nào có mức độ ưu tiên cao hơn.

Bạn có thể triển khai giải pháp về thời gian bên ngoài như mô tả bên dưới:

  1. Cập nhật tệp cấu hình tài nguyên (core/res/res/values/config.xml) sau đó thêm giá trị external vào config_autoTimeSourcesPriority:
    <string-array name="config_autoTimeSourcesPriority>
            <item>external</item>
            <item>gnss</item>
    </string-array>

    Khi làm như vậy, Android sẽ được hướng dẫn ưu tiên cao nhất cho các đề xuất về thời gian bên ngoài khi đặt đồng hồ hệ thống. Phần cứng trên xe sẽ ghi đề xuất về dấu thời gian vào thuộc tính VHAL mới EPOCH_TIME .

  2. Một ứng dụng do nhà cung cấp cung cấp sẽ đọc thuộc tính này và gọi TimeManager.suggestExternal(). Sau đó, Android có thể sử dụng dấu thời gian được cung cấp làm giá trị đồng hồ hệ thống mới.