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

Phát hiện thời gian tự động nhận đề xuất về thời gian từ nhiều nguồn, sau đó chọn tốt nhất rồi đặt đồng hồ hệ thống trong Android sao cho khớp. Các bản phát hành Android trước đây được cung cấp hai 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 phát hiện thời gian tự động, và đặt bằng một trong các cách sau:

  • telephony sử dụng tín hiệu điện thoại về Danh tính 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 lựa chọn đều yêu cầu kết nối với mạng bên ngoài, một mạng không phải lúc nào cũng hoạt động trên Android Ô tô. Ví dụ: ở một số quốc gia, một số ô tô có thể không có điện thoại tích hợp sẵn. Do đó, Thời gian Hệ thống điều hướng vệ tinh toàn cầu (GNSS) được cung cấp làm nguồn 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 hai tuỳ chọn để tự động phát hiện và đặt thời gian:

  • gnss sử dụng vệ tinh chung Hệ thống điều hướng (GNSS).
  • external lần sử dụng thuộc tính VHAL hoặc System API.

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 Cài đặt > Ngày & Thời gian > Ngày tự động và Thời gian:

Hình 1. Chọn Ngày tự động và Thời gian

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

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

Nói chung, đề 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 nếu đề xuất 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 theo đồ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à hai (2) giây), nên thời gian sẽ không thay đổi.

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

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

Giá trị giới hạn dưới được xác định từ một ngày thu được từ dấu thời gian của bản dựng. Tính năng này hoạt động trên nguyên tắc cho biết 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 thì không thực thi giới hạn trên.

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

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

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

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

Để bật tính năng này:

  1. Cập nhật config_enableGnssTimeUpdateService. Giá trị cho Phải đặt 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ặt hàng cho config_autoTimeSourcesPriority. Vị trí của gnss trong danh sách ưu tiên sẽ xác định mức độ ưu tiên cho các đề xuất GNSS đối với các giá trị từ các nguồn khác.

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

GnssTimeUpdateService lắng nghe thông tin cập nhật vị trí một cách thụ động, điều này có nghĩa là tuyệt đối không bật GPS để tiêu thụ thêm pin. Kết quả là, năng lượng tiêu thụ khi nguồn GNSS được bật 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í, GnssTimeUpdateService sẽ không nhận được thông tin vị trí cập nhật và đề xuất thời gian GNSS.

Thử nghiệm

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

Bạn tiến hành kiểm tra CTS để xác minh rằng có thời gian do GNSS cung cấp. Để 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

Để thử nghiệm tính năng này, chúng tôi đã thêm các lệnh mới vào LocationShellCommand.java. Dùng các lệnh sau để thêm chương trình kiểm thử những nhà cung cấp dịch vụ mà bạn có thể chỉ định một 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ị 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

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

Các đề xuất sau đây đã có trên Android 12 để bạn có thể xem xét là external gợi ý thời gian:

  • Thuộc tính VHAL. Một mô hình Thuộc tính VHAL có tên là EPOCH_TIME sẽ đượ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 biến này có thể được chuyển đến Android TimeManager để đề xuất thời gian hệ thống mới. VHAL mẫu để cập nhật thuộc tính này được cung cấp trong cách triển khai tệp đối chiếu bên dưới.
  • API hệ thống. Một phương thức mới có tên là suggestExternalTime() có sẵn trong TimeManager để cung cấp cho hệ thống đề xuất 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 theo thời gian bên ngoài (sử dụng config_autoTimeSourcesPrioritytrong tệp cấu hình), dấu thời gian được truyền vào phương thức này dùng để đặt thời gian hệ thống, nếu không có thời gian nào cao hơn đề xuất thời gian ưu tiên.

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

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

    Thao tác này sẽ hướng dẫn Android đưa ra mức độ ưu tiên cao nhất cho việc đề xuất theo thời gian bên ngoài đồng hồ hệ thống. Phần cứng trên xe sẽ ghi nội dung đề xuất về dấu thời gian cho EPOCH_TIME Thuộc tính VHAL.

  2. Ứng dụng do nhà cung cấp cung cấp đọ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.