تشخیص خودکار زمان

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

  • telephony از سیگنال‌های تلفن مبتنی بر هویت شبکه و منطقه زمانی (NITZ) استفاده می‌کند.
  • network از سرورهای زمان پروتکل زمان شبکه (NTP) استفاده می‌کند.

هر گزینه نیاز به اتصال به شبکه‌های خارجی دارد که همیشه در Android Automotive در دسترس نیستند. به عنوان مثال، در برخی کشورها، برخی از خودروها ممکن است تلفن داخلی نداشته باشند. بنابراین، زمان سیستم‌های ناوبری ماهواره‌ای جهانی (GNSS) به عنوان منبع زمان سیستم برای شما ارائه می‌شود تا در صورت عدم دسترسی به اتصال شبکه از آن استفاده کنید.

این نسخه جدید اندروید دو گزینه دیگر برای تشخیص و تنظیم خودکار زمان ارائه می‌دهد:

  • gnss از سیستم‌های ناوبری ماهواره‌ای جهانی (GNSS) استفاده می‌کند.
  • external از یک ویژگی VHAL یا API سیستم استفاده می‌کند.

فعال کردن تشخیص خودکار زمان

برای فعال کردن تشخیص خودکار زمان، حتماً تنظیمات > تاریخ و زمان > تاریخ و زمان خودکار را انتخاب کنید:

شکل ۱. انتخاب تاریخ و زمان خودکار

پیکربندی منابع زمانی

برای مشخص کردن اینکه کدام منابع زمانی در تشخیص خودکار زمان لحاظ شوند و اولویتی که این منابع زمانی باید در نظر گرفته شوند، باید فایل پیکربندی منابع دستگاه، 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) ثانیه است)، زمان تغییر نخواهد کرد.

محدودیت زمانی کمتر

اندروید ۱۲ یک کران زمانی پایین‌تر جدید برای استفاده در هنگام اعتبارسنجی پیشنهادات زمانی ارائه می‌دهد. قبل از این ویژگی، تشخیص خودکار زمان، زمان UTC ورودی پیشنهادی را اعتبارسنجی نمی‌کرد. با این ویژگی، زمان‌هایی که قبل از کران پایین سپری می‌شوند، نادیده گرفته می‌شوند.

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

پیشنهادهای زمانی GNSS

منبع زمان gnss در اندروید ۱۲ جدید است و توسط سیگنال‌های 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>

پیشنهادهای زمان خارجی

پیشنهادهای زمان خارجی روش دیگری برای ارائه پیشنهادهای زمان خودکار به اندروید است. این گزینه‌های جدید شما را قادر می‌سازد تا پیشنهادهای زمان کاملاً سفارشی‌شده‌ای را به اندروید ارائه دهید که می‌توانند از ECUهای مختلفی سرچشمه بگیرند که به نوبه خود می‌توانند از ترکیبی از ساعت بلادرنگ، GNSS، NITZ یا هر منبع زمانی دیگری استفاده کنند.

پیشنهادهای زیر در اندروید ۱۲ برای در نظر گرفتن به عنوان پیشنهادهای زمان external در دسترس هستند:

  • ویژگی‌های VHAL. یک ویژگی VHAL جدید به نام EPOCH_TIME ارائه شده است. این ویژگی تعداد میلی‌ثانیه‌هایی را که از تاریخ ۱/۱/۱۹۷۰ 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>

    انجام این کار به اندروید دستور می‌دهد که هنگام تنظیم ساعت سیستم، به پیشنهادهای زمان خارجی بالاترین اولویت را بدهد. سخت‌افزار موجود در وسیله نقلیه، یک پیشنهاد مهر زمانی را در ویژگی جدید EPOCH_TIME VHAL می‌نویسد.

  2. یک برنامه ارائه شده توسط فروشنده، این ویژگی را می‌خواند و TimeManager.suggestExternal() را فراخوانی می‌کند. سپس اندروید می‌تواند از برچسب زمانی ارائه شده به عنوان مقدار ساعت جدید سیستم استفاده کند.