تشخیص زمان شبکه

دستگاه‌های اندروید به‌طور خودکار تلاش می‌کنند تا زمان صحیح Unix epoch را از یک منبع شبکه دریافت کنند. اندروید از پروتکل زمان شبکه ساده (SNTP) که از پروتکل داده‌نگار کاربر (UDP) استفاده می‌کند، برای دریافت اطلاعات زمانی استفاده می‌کند.

اجزای شرح داده شده در این صفحه بخشی از سیستم تشخیص خودکار زمان هستند که به عنوان مبدا زمان شبکه شناخته می‌شود. هنگامی که تشخیص خودکار زمان در دستگاه پشتیبانی می‌شود و سرویس time_detector برای استفاده از آن پیکربندی شده است، می‌توان از یک سیگنال زمانی از یک سرور زمان شبکه برای تنظیم ساعت سیستم دستگاه اندروید استفاده کرد.

به طور پیش‌فرض، اندروید از مبدا زمانی شبکه به عنوان مبدا زمانی اصلی و خودکار برای تشخیص زمان استفاده می‌کند.

سیستم تشخیص زمان شبکه

سرویس network_time_update_service که در سرور سیستم اندروید اجرا می‌شود، سیستم تشخیص زمان شبکه را پیاده‌سازی می‌کند. این سرویس به صورت دوره‌ای از SNTP برای دریافت سیگنال زمانی از سرور استفاده می‌کند. این سرویس همچنین اتصال شبکه را رصد می‌کند و در صورت عدم وجود سیگنال زمانی اخیر پس از دوره‌های طولانی اتصال ضعیف، به‌روزرسانی زمانی را آغاز می‌کند.

سرویس network_time_update_service تلاش می‌کند تا پس از بوت شدن و زمانی که اتصال شبکه برای اولین بار برقرار می‌شود، یک سیگنال زمانی دریافت کند. سپس این سرویس سعی می‌کند آخرین سیگنالی را که در اختیار دارد، به‌روز نگه دارد. این سرویس نیازهای دستگاه‌های اندروید را با بار قابل توجهی که می‌تواند توسط بسیاری از دستگاه‌های اندروید در سراسر جهان برای به‌روزرسانی زمان آنها ایجاد شود، متعادل می‌کند.

سرویس network_time_update_service با استفاده از APIهای داخلی، پیشنهادهای زمان شبکه را به سرویس time_detector ارسال می‌کند. سپس سایر اجزای پلتفرم اندروید از این پیشنهادهای زمان شبکه استفاده می‌کنند.

پس از دریافت پیشنهادات از مبدا زمان شبکه، سرویس time_detector تعیین می‌کند که آیا ساعت سیستم را طبق قوانین اولویت‌بندی پیکربندی‌شده به‌روزرسانی کند یا خیر.

برای پیکربندی سیستم تشخیص خودکار زمان به منظور استفاده از پیشنهادات مبدا شبکه برای تنظیم خودکار ساعت سیستم، از فایل پیکربندی سرور سیستم core/res/res/values/config.xml استفاده کنید. مطمئن شوید که network مقدار در config_autoTimeSourcesPriority در موقعیت دلخواه قرار دارد. برای اطلاعات بیشتر، به اولویت منبع زمان مراجعه کنید.

پیکربندی دستگاه

این بخش توضیح می‌دهد که چگونه تولیدکنندگان دستگاه می‌توانند سیستم تشخیص زمان شبکه را پیکربندی کنند.

پیکربندی پایه AOSP در فایل config.xml قرار دارد: frameworks/base/core/res/res/values/config.xml :

کلید پیکربندی مقدار AOSP توضیحات
config_ntpRetry 3 پس از عدم موفقیت در به‌روزرسانی، این تعداد دفعاتی است که سیستم قبل از انصراف و استفاده از فاصله زمانی معمول ( config_ntpPollingIntervalShorter ) اقدام به نمونه‌برداری زمانی شبکه با فاصله زمانی کوتاه‌تر برای نمونه‌برداری NTP می‌کند. مقداری کمتر از 0 به این معنی است که سیستم دوباره نمونه‌برداری را در فاصله زمانی کوتاه‌تر برای نمونه‌برداری NTP config_ntpPollingInterval می‌دهد تا زمانی که بتواند با موفقیت به‌روزرسانی کند.
config_ntpPollingInterval 64800000 (۱۸ ساعت) فاصله زمانی معمول نظرسنجی شبکه بر حسب میلی‌ثانیه.
config_ntpPollingIntervalShorter 60000 (۱ دقیقه) فاصله زمانی نظرسنجی شبکه برای تلاش مجدد بر حسب میلی‌ثانیه. زمانی استفاده می‌شود که به‌روزرسانی زمان با شکست مواجه شود.
config_ntpServers یک ورودی واحد: ntp://time.android.com سرورهای NTP برای به دست آوردن زمان دقیق. موارد باید به شکل زیر باشند: ntp://<host>[:port] .
این یک طرح ثبت شده IANA URI نیست.
config_ntpTimeout ۵۰۰۰ زمان انتظار برای پاسخ سرور NTP بر حسب میلی ثانیه قبل از اتمام زمان.

سرورها

به طور پیش‌فرض، AOSP از سرورهای زمان در time.android.com استفاده می‌کند که نام مستعار Google Public NTP است. این سرویس هیچ SLA ندارد. برای اطلاعات بیشتر، به سوالات متداول Google Public NTP مراجعه کنید.

پشتیبانی از چندین سرور

برای اندروید ۱۴ و بالاتر، این فریم‌ورک از چندین سرور NTP پشتیبانی می‌کند. این قابلیت از موقعیت‌هایی پشتیبانی می‌کند که دستگاه‌ها با یک پیکربندی واحد در سطح جهانی توزیع شده‌اند، اما دسترسی به سرورهایی مانند time.android.com در مکان‌های خاصی محدود شده است.

این الگوریتم هر سرور مشخص شده در کلید پیکربندی config_ntpServers را امتحان می‌کند. وقتی الگوریتم سروری را پیدا کرد که پاسخ می‌دهد، سیستم به استفاده از آن سرور ادامه می‌دهد تا زمانی که رفرش آن ناموفق باشد یا دستگاه دوباره راه‌اندازی شود.

دقت

همگام‌سازی پیش‌فرض زمان شبکه اندروید از SNTP با یک پرس‌وجوی زمانی تقریباً روزی یک بار استفاده می‌کند تا همیشه سیگنال زمانی اخیر را داشته باشد.

اثرات تأخیر شبکه، عامل مهمی در عدم دقت زمانی در پیاده‌سازی SNTP اندروید است. SNTP تأخیرهای شبکه متقارن را در نظر می‌گیرد، یعنی تأخیر شبکه برای درخواست برابر با تأخیر شبکه برای پاسخ است و زمان صحیح دقیقاً در وسط آن رفت و برگشت شبکه قرار دارد. اغلب، زمان رفت و برگشت شبکه در حدود چند صد میلی‌ثانیه است و در یک شبکه سیمی، تأخیر نزدیک به متقارن است که منجر به سطوحی از عدم دقت می‌شود که تقریباً برای کاربران نامحسوس است. با این حال، در تلفن همراه یا رادیو، مراحل مختلفی وجود دارد که می‌توان تأخیرهای نسبتاً طولانی و نامتقارن را در یک تراکنش شبکه وارد کرد که منجر به عدم دقت بیشتر می‌شود.

با تنظیم پیش‌فرض AOSP برای config_ntpTimeout روی 5000 میلی‌ثانیه، و اگر تمام تأخیر شبکه صرفاً روی شاخه ورودی یا خروجی متمرکز باشد، حداکثر خطای نظری تقریباً ۲.۵ ثانیه است.

دقت کلی ساعت سیستم همچنین تحت تأثیر توانایی دستگاه اندروید در ردیابی دقیق زمان سپری شده پس از دریافت سیگنال زمان قرار دارد. این موضوع در تمام زمان‌بندی‌های اندروید، نه فقط تشخیص زمان شبکه، اهمیت دارد و به همین دلیل است که سرویس 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 (مکان) را پیدا کند.

اشکال‌زدایی و آزمایش

بخش زیر دستورات پوسته را برای اشکال‌زدایی و آزمایش ویژگی تشخیص زمان شبکه شرح می‌دهد.

تعامل با سرویس network_time_update_service

برای نمایش وضعیت فعلی network_time_update_service از دستور زیر استفاده کنید:

adb shell cmd network_time_update_service dump

برای دیدن مجموعه‌ای از گزینه‌های خط فرمان که می‌توانند به آزمایش کمک کنند، از دستور زیر استفاده کنید:

adb shell cmd network_time_update_service help