تشخیص زمان GNSS

در Android 12 و نسخه‌های بالاتر، Android می‌تواند به‌صورت اختیاری از «سیستم ماهواره‌ای ناوبری جهانی» (GNSS) برای پیشنهاد دادن زمان‌های دوران Unix به سرویس time_detector استفاده کند. این ویژگی به‌طور پیش‌فرض در AOSP فعال نیست.

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

تأثیر بر مصرف برق

AOSP gnss_time_update_service به‌طور غیرفعال به به‌روزرسانی‌های مکان گوش می‌دهد. این یعنی سرویس هرگز به‌طور فعال GPS را روشن نمی‌کند یا از باتری اضافی استفاده نمی‌کند. این یعنی تا زمانی که برنامه یا سرویس دیگری در سیستم به‌طور فعال درخواست به‌روزرسانی مکان نکند، gnss_time_update_service به‌روزرسانی مکان دریافت نخواهد کرد و زمان «سامانه ماهواره‌ای ناوبری جهانی» را پیشنهاد نخواهد داد.

پیاده‌سازی

برای فعال کردن تشخیص زمان GNSS، سازندگان دستگاه باید صریحاً gnss_time_update_service را در سرور سیستم فعال کنند.

برای فعال کردن این ویژگی، باید مقادیر config_enableGnssTimeUpdateService و config_autoTimeSourcesPriority در فایل core/res/res/values/config.xml به‌روزرسانی شوند. مقدار config_enableGnssTimeUpdateService را روی true تنظیم کنید و gnss را به فهرست موارد برای config_autoTimeSourcesPriority اضافه کنید. جایگاه gnss در فهرست اولویت‌ها تعیین‌کننده اولویت داده‌شده به پیشنهادهای «سامانه ماهواره‌ای ناوبری جهانی» نسبت به پیشنهادهای منابع دیگر است.

در فایل core/res/res/values/config.xml زیر، تشخیص زمان GNSS فعال است و gnss در فهرست اولویت پس‌از network و � در جایگاه سوم قرار دارد:telephony

<!-- 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>network</item>
        <item>telephony</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>

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

برای آزمایش تشخیص زمان GNSS، از فرمان‌های adb shell cmd location استفاده کنید. از این فرمان‌ها برای افزودن ارائه‌دهندگان مکان آزمایشی استفاده کنید که در آن می‌توانید مکان و زمان GNSS مرتبط را مشخص کنید. ‫gnss_time_update_service به این به‌روزرسانی‌های مکان گوش می‌دهد و هرچند وقت یک‌بار پیشنهادهایی ارائه می‌دهد.

در زیر نمونه‌هایی از فرمان‌های adb shell cmd location نشان داده شده است:

  • کلید اصلی مکان را برای کاربر پیش‌نما (معمولاً کاربر 10 در خودرو) فعال کنید. اگر به‌تازگی فلش کرده‌اید، این کار را می‌توانید ازطریق دستیار راه‌اندازی انجام دهید.

    adb shell cmd location set-location-enabled true --user 10
  • افزودن ارائه‌دهنده آزمایشی GPS (معمولاً بار اول ناموفق است و استثنای امنیتی با android from <SOME_UID> not allowed to perform MOCK_LOCATION ایجاد می‌کند)

    adb shell cmd location providers add-test-provider gps
  • فعال کردن اجازه‌های مکان ساختگی برای UID قبلی

    adb shell appops set UID_PRINTED_IN_PREVIOUS_ERROR android:mock_location allow
  • ارائه‌دهنده آزمون GPS اضافه کنید (باید بدون خطا کار کند)

    adb shell cmd location providers set-test-provider-enabled gps true
  • فعال کردن ارائه‌دهنده آزمایش GPS

    adb shell cmd location providers set-test-provider-enabled gps true
  • تنظیم مکان با زمان (زمان نمی‌تواند کمتر از حد تعیین‌شده توسط حد پایین باشد)

    adb shell cmd location providers set-test-provider-location gps --location LATITUDE,LONGITUDE --time TIME