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

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

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

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

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

  • 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 ورودی پیشنهادی را تأیید نمی‌کند. با این ویژگی، زمان هایی که قبل از کران پایین می گذرد، کنار گذاشته می شوند.

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

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

منبع زمانی gnss برای اندروید 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>

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

پیشنهادات زمان خارجی راه دیگری برای ارائه پیشنهادات زمانی خودکار به اندروید است. این گزینه‌های جدید شما را قادر می‌سازد تا پیشنهادات زمان کاملاً سفارشی‌شده را به اندروید ارائه دهید، که می‌تواند از 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>
    
    اضافه کنید

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

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