Проблеми часу і часових поясів в Android та шляхи їх вирішення

Припустимо, ви вже давно використовуєте Android, а тому може здатися, що він прекрасно справляється з завданнями синхронізації часу - будильники спрацьовують вчасно, якихось явних відхилень часу не спостерігається і т. Д. Однак чи впевнені ви повністю в тому, звідки Android на насправді отримує дані про точний час і часові пояси? Якщо у вас є хоч якісь сумніви про те, як це працює - ласкаво просимо під кат.
Припустимо, ви вже давно використовуєте Android, а тому може здатися, що він прекрасно справляється з завданнями синхронізації часу - будильники спрацьовують вчасно, якихось явних відхилень часу не спостерігається і т

В Android існує дві проблеми з часом: це його непередбачувана синхронізація і необхідність в актуалізації даних часового поясу навіть в найсвіжішої версії ОС.
Передісторія: Android є мобільною ОС, що базується на ядрі Linux, він спокійно підключається до інтернету і, звичайно ж, можна припустити, що синхронізація часу здійснюється за допомогою NTP , Однак, це не так. Історично склалося, що Android був призначений для використання виключно в мобільних телефонах (згадайте версію 1.6). При цьому тільки до 3 мажорній версії він обзавівся інтерфейсом для планшетів і почалися інші зрушення до уніфікації інтерфейсу і начинки ОС. Однак навіть версії 4.4 і Android L отримують сигнали точного часу тими ж методами, що їх отримувала Nokia 3310 і інші, більш ранні GSM / 3GPP телефони, т. Е. Від веж стільникового зв'язку при реєстрації в мережі (при підключенні до вишки). При цьому планшети або інші пристрої без модуля зв'язку, в принципі не мають можливості синхронізувати час автоматично.
На превеликий жаль, щоб навчити Android синхронізувати час повністю автоматично за допомогою NTP нам знадобитися root доступ бо API для точного встановлення часу в Android нині відсутня.
Приступимо. Перше, що необхідно зробити, це вимкнути синхронізацію часу бездротову локальну мережу. При цьому установку часового поясу я рекомендую залишити в автоматичному режимі, а відключати її варто, тільки якщо є гарантія, що пристрій буде працювати в стаціонарному режимі.
Скріншот вікна налаштувань «Налаштування -> Дата і час» версії Android 4.x:
Далі, необхідно встановити додаток ClockSync , Яке і буде виступати для нас альтернативою демона синхронізації часу за допомогою NTP.
Скріншоти вікна програми ClockSync до синхронізації (зліва) і після (праворуч):
На скріншотах видно, що різниця з точним часом виявилася досить маленькою, однак, бувають різні ситуації, у деяких час на пристрої може навіть плавати туди-сюди оскільки оператор не спромігся навести порядок у себе на БС.
Переконавшись, що все працює, налаштуємо автоматичну синхронізацію в програмі ClockSync. Для підвищення точності я рекомендую включити опції «Режим високої точності» і «Тільки через WI-FI». Якщо з першої опцією все зрозуміло з опису в програмі (див. Скріншот нижче), то другу опцію я рекомендую включити в першу чергу не з міркувань економії мобільного трафіку, а через те, що мобільний інтернет не здатний гарантувати хоч скільки-небудь стабільні затримки.
Трохи докладніше про точність:

Все ще поширений мобільний інтернет 2-го (GPRS / EDGE) в принципі не в змозі забезпечити стабільні затримки при передачі. Навіть інтернет 3-го (3G) і, в деякій мірі, 4-го (LTE / LTE-advanced) поколінь при сильному завантаженні мережі або каналів зв'язку між БС, що є типовою ситуацією для великих населених пунктів, не може гарантувати стабільні затримки. Тому навіть з апроксимацією кінцева точність установки часу може бути гірше часткою секунд і навіть легко досягати декількох секунд.


Крім цього я рекомендую включити опцію «При включенні», щоб зайвий раз не виводити пристрій з глибокого сну і тим самим заощадити енергію.
Скріншот налаштувань автоматичної синхронізації в ClockSync:
У зв'язку з масштабними змінами часових поясів в РФ восени цього року необхідно вже зараз замислитися про актуалізацію інформації про них на всіх пристроях і якщо з підтримуваними настільними ОС проблем не виникає, то в Android навіть найсвіжіша версія ОС містить застарілі дані. Для того щоб в цьому переконатися встановлюємо TimeZone Fixer і спостерігаємо непривабливу картину.
Скріншот програми TimeZone Fixer, запущеної на Android 4.4.4 (прошивка Cyanogenmod від 4 серпня 2014 року), на якому добре видно, що дані в прошивці неактуальні:
Трішечки здорового занепокоєння і турботи про користувачів:
Після поновлення даних часового поясу програма запропонує перезавантажиться, однак, я рекомендую перезавантажити пристрій самостійно через системне меню оскільки програма здійснює перезавантаження фактично еквівалентну reset, що, нехай і з малою ймовірністю, але може привести до проблем і втрати даних.
Із задоволенням відповім на будь-які питання або внесу доповнення, які співтовариство вважає необхідним, проте, хочеться уникнути перевантаженості статті додатковою інформацією, щоб дотримуватися формату компактного керівництва за рішенням конкретної проблеми.
UPD: Ця інструкція повністю вирішує проблему часових поясів тільки для версій молодше 4.4. З версії 4.4 потрібен додатковий патчінга, поки питання знаходиться на стадії дослідження можливостей для створення юзер-френдлі рішення.

Однак чи впевнені ви повністю в тому, звідки Android на насправді отримує дані про точний час і часові пояси?