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

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

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

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

כברירת מחדל, מקור הזמן 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

בדיקות יחידה (unit testing)

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

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