تشخیص زمان GNSS

در اندروید ۱۲ و بالاتر، اندروید می‌تواند به صورت اختیاری از سیستم ماهواره‌ای ناوبری جهانی (GNSS) برای پیشنهاد زمان‌های آغازین یونیکس به سرویس time_detector استفاده کند. این قابلیت به طور پیش‌فرض در AOSP فعال نیست.

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

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

gnss_time_update_service در AOSP به صورت غیرفعال به به‌روزرسانی‌های موقعیت مکانی گوش می‌دهد. این بدان معناست که این سرویس هرگز به طور فعال GPS را روشن نمی‌کند یا انرژی اضافی مصرف نمی‌کند. همچنین این بدان معناست که مگر اینکه برنامه یا سرویس دیگری در سیستم به طور فعال درخواست به‌روزرسانی موقعیت مکانی را داشته باشد، gnss_time_update_service به‌روزرسانی موقعیت مکانی را دریافت نمی‌کند و زمان GNSS را پیشنهاد نمی‌دهد.

پیاده‌سازی

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

برای فعال کردن این ویژگی، هر دو مقدار config_enableGnssTimeUpdateService و config_autoTimeSourcesPriority در فایل core/res/res/values/config.xml باید به‌روزرسانی شوند. مقدار config_enableGnssTimeUpdateService را روی true تنظیم کنید و gnss را به لیست آیتم‌های config_autoTimeSourcesPriority اضافه کنید. موقعیت gnss در لیست اولویت، اولویت داده شده به پیشنهادهای 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