זיהוי אוטומטי של זמן

התכונה זיהוי אוטומטי של זמן מקבלת הצעות לזמן ממקורות שונים, בוחרת את האפשרות הטובה ביותר ואז מגדירה את השעון במערכת Android בהתאם. בגרסאות קודמות של Android היו שתי דרכים להגדיר את התאריך והשעה: הגדרה ידנית לכל משתמש או הגדרה באמצעות זיהוי אוטומטי של השעה. ההגדרה מתבצעת באחת מהאפשרויות הבאות:

  • telephony משתמשת באותות טלפוניה של זהות הרשת ואזור הזמן (NITZ).
  • network משתמש בשרתי זמן של Network Time Protocol‏ (NTP).

כל אחת מהאפשרויות דורשת חיבור לרשתות חיצוניות, שלא תמיד זמינות ב-Android Automotive. לדוגמה, במדינות מסוימות, יכול להיות שלחלק מהמכוניות אין טלפוניה מובנית. לכן, הזמן של מערכות גלובליות לניווט לווייני (GNSS) מסופק כמקור של זמן המערכת לשימוש במקרים שבהם אין קישוריות לרשת.

בגרסת Android הקרובה יהיו עוד שתי אפשרויות לזיהוי והגדרה אוטומטיים של השעה:

  • ב-gnss נעשה שימוש במערכות גלובליות לניווט לווייני (GNSS).
  • external משתמש במאפיין VHAL או ב-System API.

הפעלת זיהוי אוטומטי של השעה

כדי להפעיל זיהוי אוטומטי של השעה, צריך לבחור באפשרות הגדרות > תאריך ושעה > תאריך ושעה אוטומטיים:

איור 1. בחירה באפשרות 'תאריך ושעה אוטומטיים'

הגדרת מקורות זמן

כדי לציין אילו מקורות זמן לכלול בזיהוי זמן אוטומטי, ואת העדיפות שבה צריך להתייחס למקורות הזמן האלה, צריך לשנות את קובץ הגדרות המשאבים של המכשיר, 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>

בדוגמה הזו, המערכת מתחשבת באפליקציות telephony ו-network בזיהוי אוטומטי של הזמן, וההצעות לזמן של telephony מקבלות עדיפות על פני ההצעות לזמן של network.

באופן כללי, המערכת מתעלמת מהצעות ממקור עם עדיפות גבוהה יותר אם ההצעה לא תקפה או אם היא ישנה מדי. בנוסף, אם ההצעה התקפה בעדיפות הכי גבוהה תואמת לזמן הנוכחי בשעון המערכת של המכשיר בטווח של כמה שניות (ערך ברירת המחדל הוא שתי (2) שניות), השעה לא תשתנה.

הגבול התחתון של הזמן

ב-Android 12 יש גבול זמן תחתון חדש שאפשר להשתמש בו כשמאמתים הצעות לזמנים. לפני שהוספנו את התכונה הזו, המערכת לא בדקה את הזמן הנכנס ב-UTC שהוצע. התכונה הזו מאפשרת להשליך את הזמנים שחלפו לפני הגבול התחתון.

הערך של הגבול התחתון נקבע לפי תאריך שנגזר מחותמת הזמן של הבנייה. השיטה הזו מבוססת על העיקרון שלפיו שעה תקינה לא יכולה להיות לפני שהתמונה של המערכת נוצרה. ב-Android לא מוגדר גבול עליון.

הצעות למועדים ב-GNSS

מקור הזמן gnss הוא חדש ב-Android 12 ומסופק על ידי אותות GPS. זהו מקור מהימן לזמן כשtelephony ו-network לא זמינים. האפשרות הזו נוספת ל-GnssTimeUpdateService החדש ב-SystemServer שמגיב באופן פסיבי לעדכוני מיקום. כשמתקבל מיקום תקין, GnssTimeUpdateService מציע הצעה ל-TimeDetectorService, ואז TimeDetectorService קובע אם צריך לעדכן את שעון המערכת.

כברירת מחדל, gnss מקור הזמן לא מופעל ב-AOSP, ולכן השותפים צריכים להפעיל אותו:

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

כדי להפעיל את התכונה הזו:

  1. יש לעדכן את config_enableGnssTimeUpdateService. הערך של config_enableGnssTimeUpdateService חייב להיות true.
  2. יש לעדכן את config_autoTimeSourcesPriority. צריך להוסיף את gnss לרשימת הפריטים של config_autoTimeSourcesPriority. המיקום של gnss ברשימת העדיפויות קובע את העדיפות שניתנת להצעות GNSS, ביחס לערכים ממקורות אחרים.

ההשפעה על צריכת החשמל

GnssTimeUpdateService מאזין באופן פסיבי לעדכוני מיקום, כלומר הוא אף פעם לא מפעיל את ה-GPS באופן פעיל כדי לצרוך יותר חשמל. כתוצאה מכך, צריכת החשמל כשמקור ה-GNSS מופעל היא זניחה. המשמעות היא גם שאם אפליקציה או שירות אחרים במערכת לא יבקשו באופן פעיל עדכוני מיקום, GnssTimeUpdateService לא יקבל עדכון מיקום ולא יציע זמן GNSS.

בדיקה

חבילה לבדיקות תאימות (CTS)

בדיקת CTS מסופקת כדי לוודא שהשעה שסופקה על ידי GNSS זמינה. מידע נוסף זמין במאמר LocationShellCommand.java.

בדיקות יחידה

אפשר לראות את בדיקות היחידה הבסיסיות בקובץ הבא:

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

בדיקות ידניות

כדי לבדוק את התכונה הזו, נוספו פקודות חדשות לLocationShellCommand.java. אפשר להשתמש בפקודות האלה כדי להוסיף ספקי בדיקה שבעזרתם אפשר לציין מיקום ואת הזמן המשויך של GNSS. ‫GnssTimeUpdateService מקשיב לעדכוני המיקום האלה ומציע הצעות מדי פעם.

הערה: הממשק של הפקודות האלה עשוי להשתנות בין גרסאות.

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

הצעות למועדים חיצוניים

הצעות לזמנים חיצוניים הן דרך נוספת לספק הצעות אוטומטיות לזמנים ב-Android. האפשרות החדשה הזו מאפשרת לספק הצעות מותאמות אישית לגמרי לגבי השעה ב-Android. ההצעות יכולות להגיע מיחידות בקרה אלקטרוניות שונות, שיכולות להשתמש בשילוב של שעון זמן אמת, GNSS,‏ NITZ או כל מקור אחר של נתוני שעה.

ההצעות הבאות זמינות ב-Android 12, ואפשר להשתמש בהן כהצעות לexternal שעות:

  • מאפייני VHAL. מוצג מאפיין VHAL חדש בשם EPOCH_TIME. המאפיין הזה מציין את מספר אלפיות השנייה שעברו מאז 1/1/1970 UTC. אפשר להעביר את הערך שלו אל Android TimeManager כדי להציע שעת מערכת חדשה. דוגמה להטמעה של VHAL שמעדכנת את המאפיין הזה מופיעה בדף הטמעה לדוגמה.
  • ממשקי API של המערכת. ב-TimeManager יש method חדש שנקרא suggestExternalTime() שמאפשר לספק למערכת הצעה לזמן חיצוני. אם המערכת מוגדרת להתחשב בהצעות חיצוניות לגבי שעה (באמצעות config_autoTimeSourcesPriority בקובץ ההגדרה), חותמת הזמן שמועברת לשיטה הזו משמשת להגדרת שעת המערכת, אם אין הצעות לגבי שעה עם עדיפות גבוהה יותר.

אפשר להטמיע פתרון חיצוני לניהול זמן כמו שמתואר בהמשך:

  1. מעדכנים את קובץ הגדרות המשאב (core/res/res/values/config.xml) ומוסיפים את הערך external ל-config_autoTimeSourcesPriority:
    <string-array name="config_autoTimeSourcesPriority>
            <item>external</item>
            <item>gnss</item>
    </string-array>

    כך מערכת Android מקבלת הוראה לתת עדיפות גבוהה ביותר להצעות חיצוניות לגבי השעה כשמגדירים את השעון של המערכת. החומרה ברכב כותבת הצעה לסימן זמן EPOCH_TIME במאפיין VHAL החדש.

  2. אפליקציה שסופקה על ידי ספק קוראת את המאפיין הזה ומבצעת קריאה ל-TimeManager.suggestExternal(). לאחר מכן, מערכת Android יכולה להשתמש בחותמת הזמן שסופקה כערך החדש של שעון המערכת.