الكشف التلقائي عن الوقت

يتلقى الاكتشاف التلقائي للوقت اقتراحات الوقت من مصادر مختلفة، ويحدد الخيار الأفضل، ثم يضبط ساعة النظام في Android لتتناسب. قدمت إصدارات Android السابقة طريقتين لتعيين التاريخ والوقت، إما تعيينهما يدويًا لكل مستخدم أو عن طريق الكشف التلقائي عن الوقت، ويتم تعيينهما بواسطة أحد هذه الخيارات:

  • تستخدم telephony إشارات الاتصال الهاتفي الخاصة بهوية الشبكة والمنطقة الزمنية (NITZ).
  • تستخدم network خوادم وقت بروتوكول وقت الشبكة (NTP).

يتطلب كل خيار اتصالات بالشبكات الخارجية، والتي لا تتوفر دائمًا في Android Automotive. على سبيل المثال، في بعض البلدان، قد لا تحتوي بعض السيارات على هاتف مدمج. ولذلك، يتم توفير وقت الأنظمة العالمية للملاحة عبر الأقمار الصناعية (GNSS) كمصدر لوقت النظام الذي يمكنك استخدامه عندما لا يكون الاتصال بالشبكة متاحًا.

يوفر إصدار Android القادم خيارين إضافيين لاكتشاف الوقت وضبطه تلقائيًا:

  • يستخدم نظام تحديد المواقع العالمي ( gnss ) الأنظمة العالمية للملاحة عبر الأقمار الصناعية (GNSS).
  • يستخدم external خاصية VHAL أو واجهة برمجة تطبيقات النظام.

تمكين الكشف التلقائي عن الوقت

لتمكين الكشف التلقائي عن الوقت، تأكد من تحديد الإعدادات > التاريخ والوقت > التاريخ والوقت التلقائي :

الشكل 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 ، والذي يحدد بعد ذلك ما إذا كان يجب تحديث ساعة النظام أم لا.

افتراضيًا، لا يتم تمكين مصدر وقت 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 بالتوقيت العالمي. يمكن تمرير قيمتها إلى Android TimeManager لاقتراح وقت جديد للنظام. يتم توفير نموذج لتطبيق VHAL يقوم بتحديث هذه الخاصية في التطبيق المرجعي أدناه.
  • واجهات برمجة تطبيقات النظام. تتوفر طريقة جديدة تسمى 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 بعد ذلك استخدام الطابع الزمني المقدم كقيمة ساعة النظام الجديدة.