সময়ের সোর্স সংক্রান্ত অগ্রাধিকার

Android ফ্রেমওয়ার্ক সময় সিঙ্ক করার জন্য বিভিন্ন টাইম সোর্স ব্যবহার করে। এই পৃষ্ঠায় নেটওয়ার্ক টাইম প্রোটোকল (NTP) এবং নেটওয়ার্ক আইডেন্টিটি ও টাইম জোন (NITZ) অটোমেটিক টাইম সোর্সের উপর ফোকাস করা হয়েছে। Android 12 বা তার পরবর্তী যেকোনও ভার্সনে, ফ্রেমওয়ার্ক ডিফল্ট হিসেবে NITZ-এর পরিবর্তে NTP-কে টাইম সোর্স হিসেবে বেশি অগ্রাধিকার দেয়, কারণ NTP হল NITZ-এর তুলনায় আরও বেশি নির্ভুল ও নির্ভরযোগ্য। যেসব পরিস্থিতিতে NTP উপলভ্য থাকে না, ফ্রেমওয়ার্ক NITZ-এর উপর নির্ভর করে। এটি হল প্ল্যাটফর্মের আগের ভার্সন থেকে ডিফল্ট অগ্রাধিকারের বিপরীত প্রক্রিয়া। Android 11 ও এর আগের যেকোনও ভার্সনে ডিফল্ট হিসেবে, ফ্রেমওয়ার্ক NTP-এর তুলনায় NITZ-কে অগ্রাধিকার দেয়।

এই পরিবর্তন সম্পর্কে আরও বিবরণের জন্য, নিম্নলিখিত AOSP প্যাচ দেখুন: 1563678, 1513323.

টাইম সোর্স সংক্রান্ত প্রায়োরিটি কনফিগার করা

নির্দিষ্ট Android ভার্সনের জন্য কোন টাইম সোর্স ডিফল্ট হিসেবে অগ্রাধিকার পাবে তা কনফিগার করতে, বিল্ড টাইমে frameworks/base/core/res/res/values/config.xml-এ config_autoTimeSourcesPriority কী কনফিগার করুন। তালিকার উপরের দিকে থাকা টাইম সোর্স থেকে পাওয়া টাইম সাজেশন, তালিকার নিচের দিকে থাকা সোর্সের তুলনায় বেশি অগ্রাধিকার পায়।

কনফিগার করা যায় এমন Android টাইম সোর্স TimeDetectorStrategy.java-এ পাওয়া যায়। ডিফল্ট হিসেবে ব্যবহারের জন্য নিম্নলিখিত সোর্স কনফিগার করা হয়:

  • টেলিফোনি (NITZ)
  • নেটওয়ার্ক (NTP)

পরীক্ষা করা

NTP উপলভ্য না থাকলে ডিভাইসটি NITZ ব্যবহার করে কিনা তা যাচাই করতে (যখন মোবাইল ডেটা এবং ওয়াই-ফাই বন্ধ থাকে), নিম্নলিখিতগুলি করুন:

  1. DUT-তে একটি চালু সিম কার্ড আছে কিনা তা নিশ্চিত করুন
  2. মোবাইল ডেটা ও ওয়াই-ফাই বন্ধ করুন
  3. সেল রেডিও বন্ধ আছে কিনা তা নিশ্চিত করতে ডিভাইসটি বিমান মোডে রাখুন
  4. অটোমেটিক সময় শনাক্তকরণ বন্ধ করা
  5. ভবিষ্যতের কোনও ভুল সময় ভ্যালুতে ক্লক ম্যানুয়ালি সেট করুন
  6. ডিভাইস রিবুট করুন
  7. অটোমেটিক সময় শনাক্তকরণ চালু করুন
  8. ডিভাইসকে বিমান মোড থেকে বের করে আনুন

এইসব ধাপ NITZ সিগন্যাল পাওয়ার সাথে সাথেই সিস্টেম ক্লকে পরিবর্তন ট্রিগার করে। ডিভাইসের সময় কীভাবে সেট করা হয় তা চেক করতে, নিম্নলিখিত কমান্ড রান করুন:

adb shell dumpsys time_detector

সিস্টেম ক্লক NITZ ব্যবহার করে কিনা তা যাচাই করতে, কমান্ড আউটপুটে নিম্নলিখিত বিষয়গুলি কনফার্ম করুন:

  • mEnvironment.isAutoTimeDetectionEnabled() true।
  • mEnvironment.autoOriginPriorities()-এ টাইম সোর্সের একটি তালিকা থাকে এবং তালিকায় উপরের দিকে থাকা সোর্সগুলি নিচের দিকে থাকা সোর্সগুলির তুলনায় বেশি অগ্রাধিকার পায়।
  • Time change log বিভাগে দেখানো হয়েছে যে টেলিফোনি সাজেশন ব্যবহার করে সিস্টেম ক্লক সেট করা হয়েছে।
  • Telephony suggestion history বিভাগে সময় সংক্রান্ত সাজেশন থাকে।
  • Network suggestion history বিভাগটি খালি।

Telephony suggestion history এবং Network suggestion history বিভাগে সময়ের সাজেশনকে সময়ের জন্য সত্যের উৎস হিসেবে বিবেচনা করা হয়। ডিভাইস ইন্টারনেটের সাথে কানেক্ট করা থাকলে এবং এতে সিম কার্ড থাকলে, NTP (নেটওয়ার্ক) ও NITZ (টেলিফোনি) দু'টিই ব্যবহার করে সাজেশন জেনারেট করা হয়। এই টেস্ট কেসে, শুধুমাত্র Telephony suggestion history বিভাগে সাজেশন আছে কারণ NTP বন্ধ করা আছে।

Time change log বিভাগে ডিভাইসের সিস্টেম ক্লকে করা পরিবর্তন ও ব্যবহৃত সাজেশন রেকর্ড করা হয়। config_autoTimeSourcesPriority কী-তে অগ্রাধিকারের তালিকায় থাকা সময়ের সোর্সের ক্রম অনুসারে সিস্টেম ক্লক সেট করা হয়। তবে, কোনও সাজেশন খুব পুরনো বা ভুল হলে, উচ্চ অগ্রাধিকারযুক্ত সোর্স থেকে পাওয়া সাজেশন উপেক্ষা করা হতে পারে। এছাড়াও, সবচেয়ে বেশি অগ্রাধিকার পাওয়া সঠিক সাজেশন ডিভাইসের বর্তমান সিস্টেম ক্লক টাইমের সাথে কয়েক সেকেন্ডের মধ্যে মিলে গেলে, সময় পরিবর্তন করা হবে না। এই টেস্ট কেসে, সাজেশনগুলি যতক্ষণ না পুরনো হয়ে যাচ্ছে, ততক্ষণ Telephony suggestion history থেকে পাওয়া কোনও একটি সাজেশন ব্যবহার করে সিস্টেম ক্লক সেট করা হয়।

NTP উপলভ্য না থাকলে ডিভাইস NITZ ব্যবহার করে, নিচে তার একটি উদাহরণ দেওয়া হল।

TimeDetectorStrategy:
  mLastAutoSystemClockTimeSet=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}
  mEnvironment.isAutoTimeDetectionEnabled()=true
  mEnvironment.elapsedRealtimeMillis()=73059
  mEnvironment.systemClockMillis()=1614186767818
  mEnvironment.systemClockUpdateThresholdMillis()=2000
  mEnvironment.autoTimeLowerBound()=2021-02-24T15:44:15Z(1614181455000)
  mEnvironment.autoOriginPriorities()=[network,telephony]
  Time change log:
    66261 / 2021-02-24T17:12:41.020Z - Set system clock using time=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000} cause=Found good telephony suggestion., bestTelephonySuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}, detectionReason=New telephony time suggested. timeSuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]} elapsedRealtimeMillis=66259 newSystemClockMillis=1614186761019
  Telephony suggestion history:
    key idx: 0=0
    val idx: 0=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      Historic values=[
        0@PT1M6.258S: TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      ]
  Network suggestion history:
    {Empty}
  Gnss suggestion history:
    {Empty}
  External suggestion history:
    {Empty}

টেস্টিংয়ের ক্ষেত্রে আউটপুটের সাথে তুলনা করার জন্য রেফারেন্স হিসেবে, নিচে একটি সাধারণ আউটপুটের উদাহরণ দেওয়া হল যেখানে ডিভাইসটি NTP ও NITZ, দুটি টাইম সোর্স থেকেই সময়ের সাজেশন পায়।

TimeDetectorStrategy:
  mLastAutoSystemClockTimeSet=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}
  mEnvironment.isAutoTimeDetectionEnabled()=true
  mEnvironment.elapsedRealtimeMillis()=302926
  mEnvironment.systemClockMillis()=1614186997685
  mEnvironment.systemClockUpdateThresholdMillis()=2000
  mEnvironment.autoTimeLowerBound()=2021-02-24T15:44:15Z(1614181455000)
  mEnvironment.autoOriginPriorities()=[network,telephony]
  Time change log:
    66261 / 2021-02-24T17:12:41.020Z - Set system clock using time=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000} cause=Found good telephony suggestion., bestTelephonySuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}, detectionReason=New telephony time suggested. timeSuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]} elapsedRealtimeMillis=66259 newSystemClockMillis=1614186761019
  Telephony suggestion history:
    key idx: 0=0
    val idx: 0=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      Historic values=[
        0@PT1M6.258S: TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      ]
  Network suggestion history:
    0@PT4M4.04S: NetworkTimeSuggestion{mUtcTime=TimestampedValue{mReferenceTimeMillis=244038, mValue=1614186939242}, mDebugInfo=[Origin: NetworkTimeUpdateService. event=3]}
  Gnss suggestion history:
    {Empty}
  External suggestion history:
    {Empty}