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

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

  • telephony משתמש באותות טלפוניה של Network Identity and Time Zone ‏ (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. כשמשתמשים בתכונה הזו, המערכת משליכה את הזמנים שחלפו לפני התקופה התחתונה.

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

הצעות למועדים לפי GNSS

מקור הזמן gnss הוא חדש ב-Android 12, והוא מסופק על ידי אותות GPS. זהו מקור מהימן לזמן כשהאפשרויות telephony ו-network לא זמינות. האפשרות הזו מתווספת ל-GnssTimeUpdateService החדש ב-SystemServer, שמאזין באופן פסיבי לעדכוני מיקום. כשמתקבל מיקום תקין, GnssTimeUpdateService שולח הצעה ל-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 הצעות זמן בהתאמה אישית מלאה, שיכולות להגיע ממערכות ECU שונות, שבתורן יכולות להשתמש בשילוב של שעון בזמן אמת,‏ GNSS,‏ NITZ או כל מקור זמן אחר.

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

  • נכסי VHAL מאפיין VHAL חדש בשם EPOCH_TIME מסופק. המאפיין הזה מציין את מספר אלפיות השנייה שחלפו מאז 1 בינואר 1970 (UTC). אפשר להעביר את הערך שלו ל-TimeManager ב-Android כדי להציע שעון מערכת חדש. בהטמעה לדוגמה שבהמשך מופיעה דוגמה להטמעת VHAL שמעדכנת את המאפיין הזה.
  • ממשקי API של מערכת ב-TimeManager יש שיטה חדשה שנקראת 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 לתת לאפשרויות של שעון חיצוני את רמת העדיפות הגבוהה ביותר כשמגדירים את שעון המערכת. החומרה ברכב כותבת הצעה למעטפת זמן למאפיין VHAL החדש EPOCH_TIME.

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