كشف وقت الشبكة

تحاول أجهزة Android تلقائيًا الحصول على وقت حقبة Unix الصحيح من مصدر الشبكة. يستخدم Android بروتوكول SNTP، الذي يستخدم بروتوكول UDP، للحصول على معلومات الوقت.

تعد المكونات الموضحة في هذه الصفحة جزءًا من نظام الكشف التلقائي عن الوقت والمشار إليه بأصل وقت الشبكة . يمكن استخدام إشارة زمنية من خادم وقت الشبكة لتعيين ساعة نظام جهاز Android عندما يكون الكشف التلقائي عن الوقت مدعومًا على الجهاز ويتم تكوين خدمة time_detector لاستخدامها.

افتراضيًا، يستخدم Android أصل وقت الشبكة باعتباره الأصل الأساسي لاكتشاف الوقت التلقائي.

نظام الكشف عن وقت الشبكة

تقوم خدمة network_time_update_service التي تعمل في خادم نظام Android بتنفيذ نظام اكتشاف وقت الشبكة. تستخدم الخدمة بشكل دوري SNTP للحصول على إشارة زمنية من الخادم. تراقب الخدمة أيضًا اتصال الشبكة وتقوم بتشغيل تحديث الوقت عندما لا تتوفر إشارة زمنية حديثة بعد فترات طويلة من ضعف الاتصال.

تحاول خدمة network_time_update_service الحصول على إشارة زمنية بعد التمهيد وعند إنشاء اتصال الشبكة لأول مرة. تحاول الخدمة بعد ذلك الاحتفاظ بأحدث إشارة محدثة. فهو يوازن بين احتياجات أجهزة Android الفردية والحمل الكبير الذي يمكن أن تولده العديد من أجهزة Android في جميع أنحاء العالم لتحديث وقتها.

باستخدام واجهات برمجة التطبيقات الداخلية، ترسل network_time_update_service اقتراحات وقت الشبكة إلى خدمة time_detector . ثم تستخدم مكونات نظام Android الأخرى اقتراحات وقت الشبكة هذه.

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

لتكوين نظام اكتشاف الوقت التلقائي لاستخدام اقتراحات أصل الشبكة لضبط ساعة النظام تلقائيًا، استخدم ملف تكوين خادم النظام core/res/res/values/config.xml . تأكد من وجود network القيمة في config_autoTimeSourcesPriority في الموضع المطلوب. لمزيد من التفاصيل، راجع أولوية مصدر الوقت .

تكوين الجهاز

يصف هذا القسم كيف يمكن لمصنعي الأجهزة تكوين نظام اكتشاف وقت الشبكة.

تكوين AOSP الأساسي موجود في frameworks/base/core/res/res/values/config.xml :

مفتاح التكوين قيمة AOSP وصف
config_ntpRetry 3 بعد الفشل في التحديث، هذا هو عدد المرات التي يحاول فيها النظام استقصاء وقت الشبكة بفاصل زمني أقصر لاستقصاء NTP ( config_ntpPollingIntervalShorter )، قبل التراجع واستخدام الفاصل الزمني للاستقصاء العادي ( config_ntpPollingInterval ). تعني القيمة الأقل من 0 أن النظام يعيد محاولة الاستقصاء عند الفاصل الزمني الأقصر لاستقصاء NTP حتى يتمكن من التحديث بنجاح.
config_ntpPollingInterval 64800000 (18 ساعة) الفاصل الزمني العادي لاستقصاء وقت الشبكة بالمللي ثانية.
config_ntpPollingIntervalShorter 60000 (دقيقة واحدة) الفاصل الزمني لاستقصاء وقت إعادة محاولة الشبكة بالمللي ثانية. يستخدم عند فشل تحديث الوقت.
config_ntpServers إدخال واحد: ntp://time.android.com خوادم NTP لاستخدامها للحصول على وقت دقيق. يجب أن تكون العناصر بالشكل: ntp://<host>[:port] .
هذا ليس مخطط IANA URI مسجلاً.
config_ntpTimeout 5000 حان الوقت لانتظار استجابة خادم NTP بالمللي ثانية قبل انتهاء المهلة.

الخوادم

افتراضيًا، يستخدم AOSP خوادم الوقت في time.android.com ، وهو اسم مستعار لـ Google Public NTP . لا تحتوي هذه الخدمة على اتفاقية مستوى الخدمة. للحصول على تفاصيل، راجع الأسئلة الشائعة الخاصة بـ Google Public NTP .

دعم خادم متعدد

بالنسبة لنظام التشغيل Android 14 والإصدارات الأحدث، يدعم إطار العمل خوادم NTP المتعددة. يدعم هذا المواقف التي يتم فيها توزيع الأجهزة عالميًا بتكوين واحد، ولكن حيث يكون الوصول إلى خوادم مثل time.android.com مقيدًا في أماكن معينة.

تحاول الخوارزمية تجربة كل خادم محدد في مفتاح التكوين config_ntpServers . عندما يعثر على خادم يستجيب، يستمر النظام في استخدام هذا الخادم حتى يفشل في التحديث أو يتم إعادة تشغيل الجهاز.

دقة

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

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

مع تعيين الإعداد الافتراضي AOSP لـ config_ntpTimeout على 5000 مللي ثانية، وإذا كان زمن استجابة الشبكة بأكمله يتركز فقط على الجزء الوارد أو الصادر، فإن الحد الأقصى للخطأ النظري هو 2.5 ثانية تقريبًا.

تتأثر أيضًا الدقة الإجمالية لساعة النظام بقدرة جهاز Android على تتبع الوقت المنقضي بدقة بعد الحصول على إشارة زمنية. يعد هذا مصدر قلق فيما يتعلق بجميع عمليات حفظ الوقت على نظام Android، وليس فقط اكتشاف وقت الشبكة، ولهذا السبب تتجاهل خدمة time_detector اقتراحات الوقت القديم. يتم تحديث خدمة network_time_update_service بانتظام باستخدام الفاصل الزمني config_ntpPollingInterval للحفاظ على خدمة time_detector مزودة باقتراحات زمنية جديدة وللتأكد من أن خدمة time_detector لا ترجع إلى الأولوية المنخفضة وغالبًا ما تكون أقل دقة أو أصول زمنية غير صحيحة في بعض الأحيان مثل telephony .

عند استخدام الكشف التلقائي عن الوقت، يمكن أن تتأثر دقة ساعة نظام الجهاز بالتكوينات الأخرى لخدمة time_detector ، مثل الثوابت والإشارات التي تؤثر على مدى اختلاف اقتراح الوقت عن وقت ساعة النظام الحالي قبل ضبط الساعة ( ServiceConfigAccessorImpl.java ).

يمكن لمصنعي الأجهزة تعديل الدقة باستخدام خيارات التكوين والثوابت السابقة. ولكن من المهم أن تكون على دراية بالقيود المفروضة على تنفيذ SNTP للنظام الأساسي، والتأثير المحتمل على استهلاك الطاقة من عمليات الشبكة الأكثر تكرارًا، والتأثير على التطبيقات التي تعمل على الجهاز من تعديلات الساعة الأكثر تكرارًا ولكن الأصغر، والتأثير على تحميل الخادم.

استخدامات أخرى لوقت الشبكة

إذا لم يتم تكوين الكشف التلقائي عن الوقت باستخدام أصل network أو إذا قام المستخدم بتعطيل الكشف التلقائي عن الوقت، فسيظل الوقت الذي تم الحصول عليه بواسطة خدمة network_time_update_service مستخدمًا بواسطة المكونات التالية:

  • طريقة SystemClock.currentNetworkTimeClock() .
  • وظائف المنصة الداخلية. على سبيل المثال، يمكن لـ A-GPS تحديد موقع GNSS (الموقع) أولاً بشكل أسرع عندما يكون لديه معلومات وقت الشبكة.

التصحيح والاختبار

يصف القسم التالي أوامر shell لتصحيح الأخطاء واختبار ميزة الكشف عن وقت الشبكة.

التفاعل مع خدمة Network_time_update_service

لتفريغ الحالة الحالية لـ network_time_update_service ، استخدم:

adb shell cmd network_time_update_service dump

لرؤية مجموعة من خيارات سطر الأوامر التي يمكن أن تساعد في الاختبار، استخدم:

adb shell cmd network_time_update_service help