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

Tính năng phát hiện thời gian tự động nhận đề xuất về thời gian từ nhiều nguồn khác nhau, chọn tùy chọn tốt nhất rồi đặ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 hai cách để đặt ngày và giờ, đặt thủ công cho mỗi người dùng hoặc bằng cách phát hiện thời gian tự động và được đặt theo một trong các tùy chọn sau:

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

Mỗi tùy chọn đều yêu cầu kết nối với mạng bên ngoài. Mạng này 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ích hợp sẵn điện thoại. Do đó, thời gian của Hệ thống Định vị Vệ tinh Toàn cầu (GNSS) được cung cấp dưới dạng 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 ra mắt này cung cấp thêm hai tùy chọn để tự động phát hiện và đặt thời gian:

  • gnss sử dụng Hệ thống định vị vệ tinh 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 phát hiện thời gian tự động

Để bật tính năng phát hiện thời gian tự động, hãy đảm bảo chọn Cài đặt > Ngày & Giờ > Ngày & Giờ tự động :

Hình 1. Chọn Ngày & Giờ Tự động

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

Để chỉ định những nguồn thời gian nào sẽ được đưa vào tính năng phát hiện thời gian tự động và mức độ ưu tiên cần xem xét các nguồn thời gian này, 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 phát hiện thời gian tự động và các đề xuất về thời gian telephony được ưu tiên trước các đề xuất về thời gian network .

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 đồ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), thời gian sẽ không bị thay đổi.

Giới hạn thời gian thấp hơn

Android 12 cung cấp giới hạn thời gian mới thấp hơn để 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 phát hiện thời gian tự động sẽ không xác thực thời gian UTC sắp đến được đề xuất. Với tính năng này, thời gian trôi qua trước giới hạn dưới sẽ bị loại bỏ.

Giá trị giới hạn dưới được xác định từ ngày bắt nguồn từ dấu thời gian xây dựng. Điều này hoạt động dựa trên nguyên tắc 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 thực thi giới hạn trên.

Đề xuất 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à nguồn đáng tin cậy khi không có telephonynetwork . Tùy chọn này được thêm vào GnssTimeUpdateService mới trong SystemServer để lắng nghe các cập nhật vị trí một cách thụ động. 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ó nê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 đó, các đối tác phải bật:

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

Để kích hoạt tính năng này:

  1. Cập nhật config_enableGnssTimeUpdateService . Giá trị của config_enableGnssTimeUpdateService phải được đặt thành true .
  2. Cập nhật config_autoTimeSourcesPriority . gnss phải được thêm 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 dành cho các đề xuất GNSS, đối với các giá trị từ các nguồn khác.

Tác động đến quyền lực

GnssTimeUpdateService lắng nghe một cách thụ động các cập nhật vị trí, điều đó có nghĩa là nó không bao giờ chủ động bật GPS để tiêu thụ thêm năng lượng. Do đó, năng lượng 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ừ khi một ứng dụng hoặc dịch vụ khác trong hệ thống chủ động yêu cầu cập nhật vị trí, GnssTimeUpdateService sẽ không nhận được cập nhật vị trí và đề xuất thời gian GNSS.

Kiểm tra

Bộ kiểm tra khả năng tương thích (CTS)

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 chi tiết, hãy xem LocationShellCommand.java .

Kiểm tra đơn vị

Xem các bài kiểm tra đơn vị cơ bản trong tệp sau:

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

Kiểm tra thủ công

Để kiểm tra tính năng này, các lệnh mới đã được thêm vào LocationShellCommand.java . Sử dụng các lệnh này để thêm nhà cung cấp dịch vụ kiểm tra mà bạn có thể chỉ định vị trí và thời gian GNSS liên quan. GnssTimeUpdateService lắng nghe những 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>

Gợi ý thời gian bên ngoài

Đề xuất thời gian bên ngoài là một cách khác để cung cấp đề xuất thời gian tự động cho Android. Tùy chọn mới này cho phép bạn cung cấp các đề xuất thời gian được tùy chỉnh hoàn toàn cho Android, có thể bắt nguồn từ nhiều ECU khác nhau, do đó, có thể sử dụng kế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.

Các đề xuất sau có sẵn trong Android 12 để coi là đề xuất về thời gian external :

  • Thuộc tính VHL. Thuộc tính VHAL mới có tên 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 UTC. Giá trị của nó có thể được chuyển tới TimeManager của Android để đề xuất thời gian hệ thống mới. Triển khai VHAL mẫu cập nhật thuộc tính này được cung cấp trong triển khai tham 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 về thời gian bên ngoài (sử dụng config_autoTimeSourcesPriority trong tệp cấu hình), thì dấu thời gian được chuyển cho phương pháp này sẽ được sử dụng để đặt thời gian của hệ thống, nếu không có đề xuất về thời gian có mức độ ưu tiên cao hơn.

Bạn có thể triển khai giải pháp thời gian bên ngoài như được 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 ) rồi thêm giá trị external vào config_autoTimeSourcesPriority :
    <string-array name="config_autoTimeSourcesPriority>
            <item>external</item>
            <item>gnss</item>
    </string-array>
    

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

  2. Ứ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.