Пользователь
0,0
рейтинг
12 августа 2014 в 17:07

Администрирование → Проблемы времени и часовых поясов в Android и пути их решения из песочницы tutorial

Предположим, вы уже давно используете 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), на котором хорошо видно, что данные в прошивке неактуальные:


Немножечко здравого беспокойства и заботы о пользователях:
Автор программы TimeZone Fixer предупреждает нас, что обновление файлов данных о часовых поясах может полностью «сломать» устройство и даже даёт рекомендации о том как обезопасить себя от дополнительных проблем, хоть случаи проблем единичные и очень специфичные — это действительно хорошая забота о простых пользователях.



Только поэтому я и внёс этот кусочек в статью, он хоть и не имеет непосредственного отношения к проблеме, но это действительно хороший пример заботы о пользователях. В то же время предупреждение насчёт версий 4.3+ вызвано лишь малым количеством отзывов о программе для устройств с новыми версиями ОС, поэтому, пожалуйста, после использования обязательно напишите о́тзыв об этом приложении.

После обновления данных о часовых поясах программа предло́жит перезагрузится, однако, я рекомендую перезагрузить устройство самостоятельно через системное меню поскольку программа осуществляет перезагрузку фактически эквивалентную reset, что, пусть и с малой вероятностью, но может привести к проблемам и потери данных.

С удовольствием отвечу на любые вопросы или внесу дополнения, которые сообщество посчитает необходимыми, однако, хочется избежать перегруженности статьи дополнительной информацией, дабы придерживаться формата компактного руководства по решению конкретной проблемы.

UPD: Эта инструкция полностью решает проблему часовых поясов только для версий младше 4.4. С версии 4.4 нужен дополнительный патчинг, пока вопрос находится на стадии исследования возможностей для создания юзер-френдли решения.
Алексей Соломин @IRainman
карма
14,7
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (28)

  • 0
    >>>а потому может показаться, что он прекрасно справляется с задачами синхронизации времени
    На самом деле нет. Мне вот приходится вручную выставлять часовой пояс на «Баку», потому как HTC решил не выпускать обновлений для моего телефона, когда в России поменяли время.

    Горите в аду, HTC, горите в аду.
    • +4
      Из описания TimeZone Fixer:
      ** HTC Users, due to system file protection, S-OFF is required **

      Из одного из описаний процедуры S-OFF:
      Что необходимо чтобы получить S-OFF на HTC
      1. Разблокировать Bootloader HTC
      2. Получить Root права

      Инструкция по разблокировке Bootloader HTC состоит из 21 простого шага…

      Кажется, проще всего мне просто остаться в Баку.
    • +1
      Любопытства ради, а что за телефон, сколько ему лет?

      Никого не защищаю, но всё ведь просто: что бы выпустить новую версию прошивки — нужно её не просто выпустить (поправить файлик-два), но и получить подпись от гугла. Тут не так давно нехилая такая блок-схема выкладывалась, сколько этапов мол нужно пройти, что бы это сделать. Далее HTC считает затраты на это дело (человекочасы и всё такое). Умножает на число моделей телефонов за какой-то временной период (в год не 1 моделька выходит и не 2...). Прикидывает, сколько из них приходится на Россию. Прикидывает, сколько покупателей из-за отсутствия такого обновления откажутся в дальнейшем покупать телефоны от HTC, и далее они делают вывод, что на такими пользователями можно пренебречь… Печально, но «ничего личного, просто бизнес».
      • 0
        Это не более, чем отговорка. В блок-схеме было про обновление версий, и все завязано было на поставщика SoC, а тут нужно просто обновить так называемый tzdata, а версию можно оставить такой же.
        • 0
          О, а поделитесь, плизз, ссылкой на тот топик, а то не сходу поиском не находится, а всегда было интересно, как официально выглядит этот процесс.
        • 0
          Причем здесь «отговорки»?
          Вот вам пример. У меня есть приложение. Реальное. Нужно внести правку в одну строку. Действия: внести правку, прогнать автотесты, собрать финальную версию, отдать на проверку тестеровщикам, выложить в магазин приложений, обновить описание и changelog, плюс файл версии на сервере.

          Это маленькая программа, а не прошивка, ответственность за которую выше. Ну и «выкладывать новую прошивку, не меняя версию прошивки» может быть, нельзя или из соображений здравого смысла (две прошивки с одной версией, но отличающимся функционалом — это ад), или из договора с гуглом.

          Короче, повторюсь: на нас (покупателях) банально экономят. И не одна HTC такая, поддержку старых моделей кидают почти все производители.
      • +1
        >>>Любопытства ради, а что за телефон, сколько ему лет?
        HTC Desire Z was released in Europe and Canada in November 2010, following a number of delays related to Google's quality assurance tests.
        Закон «Об исчислении времени» президент подписал 3 июня 2011, и он вступил в силу с 6 августа 2011 года.

        Итого: HTC так и не выпустила обновления timezone для телефона, с выпуска которого на тот момент смены timezone не прошло и года.
        Иначе как полным свинством я это назвать не могу.
      • 0
        Например у меня HTC Desire V версия «ведра» 4.0.3, казалось бы не такой уж и старый телефон, но обновления часовых поясов не было, нет и не будет. Рутовать ради этого телефон не вижу смысла. Живу с ручным временем, слежу за ним сам.
  • 0
    Мда, с осени появятся еще кучи моделей, где не будет работать часовой пояс Москва, т.к. многие производители забили на обновления.
  • +1
    При этом планшеты или другие устройства без модуля связи, в принципе не имеют возможности синхронизировать время автоматически.

    Можно спросить? Мне интересно тогда, почему мой Nexus 7 без модуля связи, показывает точно такое же время, что и мой Nexus 5 — с модулем связи...? С точностью до долей секунд — будильники утром срабатывают синхронно уже вот пару лет.
  • 0
    ZTE V790 часы в телефоне отсутствуют как класс. За сутки разница легко может быть в пару часов. На оператора тоже нельзя положиться.
  • 0
    Вот никогда не было проблем с синхронизацией времени из мобильной сети, а вот задержки в правильной смене часовых поясов — это постоянно.
    Особенно неудобно когда часто перелетаешь из одного в другой, или что еще хуже с пересадкой с ожиданием пару часов в аэропорту.
    Поэтому я, как раз наоборот, включил синхронизацию времени, но выключил синхронизацию часовых поясов.
  • +2
    Удивительно, что гугл плей сервисез они регулярно обновляют, проталкивая через него новые АПИ, но только не базу таймзон :(
    Зря тут люди ненавидят именно производителей, так как трабл чисто гугловский.
    • 0
      В точку. Они первые из тех, кто заинтересован в постоянном умирании «старых» версий.
  • 0
    Забавный казус произошёл с LG Nexus 5: дообновляв андроид до 4.4.4, наотрез отказался синхронизировать часы по сети оператора, показывая на час больше. Оказалось, что необходимо перейти в настройках мобильной сети с LTE на 3G; и только тогда магически часы сами перескочились на московское время.
    • 0
      Это может быть и косяк оператора. Фактически БС для каждого стандарта это отдельные устройства, т. е. для создания покрытия GSM, 3G, LTE понадобится три устройства. Возможно, это и правда какая-то волшебная проблема в прошивке. Как раз по всем этим причинами и люблю ставить прозрачно работающий механизм синхронизации времени — так надёжнее.
      • 0
        Та же самая проблема появилась и в Android 5.0.1 на этом же аппарате после обновления, только в это раз пришлось уже на 2G переставить сеть, чтобы синхронизироваться. Такой вот он мтс.
  • 0
    «С удовольствием отвечу на любые вопросы»
    Сталкивались ли вы с такой пробелмой, что несмотря на то что обновление TimeZone Fixer установилось, в самих программах время остается не корректное? например, у меня часовой пояc +5 (Екатеринбург). Если я ставлю в настройках календаря "+5 Екатринбург" — время сдвинуто на 1 час, как будто зона +6 (старая), но в названии отображается "+5, Екатеринбрг" что вводить в заблуждение.
    Если же выбрать GMT+5 (Без привязки к городу) то все ок. Ощущение что обновилось название но не обновилось где то внутри.
    Так же в настройках времени самого телефона нельзя выбрать просто GMT+5, там только «Екатеринбург», а это значит что все программы будут сдвинуты на час (как и происходит).
    Наблюдаю эту карину на 3х телефонах :(

    вопросы вот какие:
    1. как допатчить часовые пояса, может быть руками что то удалить, почитить (рут есть).
    2. или как можно задать часовй пояс в настройках телефона без привязки к городу а жестко задать GMT+5?
    • 0
      И сразу отвечу на свой вопрос: пробелма только на Android 4.4 и связана с тем, что для отображения времени там используется библиотека интернационализации ICU.
      Лежит в /system/usr/icu/icudt51l.dat
      Файл скачать с телефона. прогнать через сервис icu.ledefy.com залить обратно.
      • 0
        Сделайте, пожалуйста, подробную инструкцию, что и как делать с этим файлом ибо я сейчас попробовал эту операцию проделать прямо на телефоне с помощью ES файла менеджера, девайс перезагрузился в процессе и у меня получился почти «кирпич» :( устройство крутится на экране загрузке и дальше никак, пробовал заливать файл через adb, всё тщетно, даже заливка оригинала не помогает. Видимо, придётся сносить всё в 0 и ставить прошивку с нуля. Очень жаль :( Такой подставы не ожидал от слова совсем :(
      • 0
        Обошлось всё в итоге малыми проблемами, залил через adb на виртуальную флешку текущую прошивку и обновил аппарат из рековери, всё запустилось и работает. Этот файл больше трогать не буду, ну его нафиг.
        • +1
          все дело в правах доступа. я закидывал на sdcard. потом делал cat /sdcard/icudt51l.dat > /system/usr/icu/icudt51l.dat
          в этом случае ребута не происходит. нужно самому ребутнуть.
          если вы меняете через es то потом (после ребута) из рекавери нужно поправить права (посмотреть их можно либо на самой папке либо заранее).
          на 3х телефонах обновил таким способом. все ок.
          • 0
            Благодарю. Однако странно ибо тоже подумал про права и пробовал их менять через adb shell однако это не помогало. Попробую ещё разок через терминал прямо на устройстве.
          • 0
            Благодарю, попробовал перезаписью содержимого, но метод у меня не работает совсем:
            user_xx@maguru:/ # su
            root@maguru:/ # cat /sdcard/icudt51l.dat > /system/usr/icu/icudt51l.dat
            sh: can't create /system/usr/icu/icudt51l.dat: Read only file system
            

            При этом с правами всё нормально:
            root@maguru:/system/usr/icu # ls -a -l
            -rw-r--r-- root      root      19261024 2008-08-01  15:00 icudt51l.dat
            


            В тоже время через adb этой папки попросту нет:
            >adb shell
            ~ # cd /system/usr/icu
            cd /system/usr/icu
            /sbin/sh: cd: can't cd to /system/usr/icu
            cd /system/
            /system # ls -a
            ls -a
            .    ..   bin
            


            P.S. Терминал на девайсе это Terminal Emulator for Android, разумеется root доступ ему дан.
            • 0
              А как вы ранее заменяли файл? судя по ошибке у вас system не пермонтирован в rw. Посмотрите на 4pda инструкцию
              • 0
                Либо ES-файл менеджером, в нём нормально из под рута всё работало всегда (до вот этого файла). Либо из рекавери выкатыванием zip-архива с апдейтом (если таковой имелся).

                Ну и собственно по ссылке всё понятно:
                Не пользуйтесь для замены файла в пункте 6 ES Проводником, телефон перезагрузится во время копирования и нужна будет прошивка.


                Ладно, экспериментировать с очередной возможностью получения кирпича из телефона мне сейчас точно некогда. Может, в последствии, вернусь к вопросу.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.