Прочитав статью «Переезд временной зоны MSD в MSK — новый Y2K локального масштаба» — вспомнил, что вместе с коллегой по работе уже давно решил эту проблему на Android (HTC Hero) и хотел написать в песочницу, но все откладывал на потом. А сегодня появилась очередная статья «Обновление временных зон на Android» практически похоронившая идею написания и, подтвердившая идею, что не надо откладывать важные вещи на потом. Но… немного повспоминав, я всё-таки решился, потому что в данных статьях рассматривалась проблемы связанные с переходом на зимнее/летнее время и совсем не затрагивался момент касающийся работы виджета часов с погодой и автоматического определения времени через оператора сотовой связи.
Все началось с того, что был приобретен новый телефон HTC Desire S.
В процессе настройки выяснилось, что в настройках даты и времени нет возможности выбрать мой город — Новосибирск и приходиться выбирать альтернативный город с подходящим часовым поясом.
Так же выяснилось, что синхронизация времени от оператора работает как-то загадочно и виджет HTC Clock в режиме отображения погоды и включенной автоматической синхронизацией отображает некорректное время.
На картинке может показаться, что всё в порядке, однако время на самом деле на телефоне убежало на час назад. Можно отключить автоматическое определение и выставит зону руками, но тогда получим следующее:
Как видно, Новосибирск в списке отсутствует. Нам пришлось выбрать Bangkok, при этом системное время в телефоне стало правильным, но виджет отображает по-прежнему со смещением на час назад.
Попробовали найти решение в сети. Обнаружили что мы не одиноки, причем подобные проблемы существуют не только у жителей Новосибирска, но и у жителей других городов планеты. Комплексного решения всех указанных проблем мы не обнаружили.
Можно было на все это забить, отключить, выставлять руками и не обращать внимания на виджет, но… это же Android — а это значит, что мы можем и должны его победить!
Новый телефон был на тот момент не рутованый и сделать его таковым не представлялось возможным. Поэтому для экспериментов был взят HTC Hero с оригинальной прошивкой + root/busybox/apps2sd, на котором были точно такие же проблемы.
Нашли через osmonitor приложение, в котором выбирается часовой пояс — (com.android.settings). Посмотрели исходники пакета com.android.settings и выяснили, что ресурсы загружаются из XML файла timezones.xml.
Достали apk этого приложения /system/app/Settings.apk следующей командой:
Не стану описывать все подробности работы APK manager и Android SDK tools, думаю, заинтересованные люди легко разберутся. Остановлюсь только на ключевых моментах.
С помощью APK manager произвели следующие действия
Мы сделали изменения для своего города, по аналогии жители других городов тоже смогут попробовать устранить данную проблему на своих телефонах.
Получившийся apk поместили обратно в телефон:
Этим мы добились того что в списке ручного выбора временной зоны появился Novosibirsk.
Наш город появился в списке, но определение временной зоны в автоматическом режиме по-прежнему работало неверно. Для этого мы пошли дальше и выяснили что, настройки временных зон для городов хранятся в базе данных, а именно в файле /system/etc/WPDB.zip.
Достав его из телефона с помощью всё того же adb, мы извлекли из него две базы
для английского и русского языков соответственно. Посмотрев на данные, мы обнаружили, что для нашего города, временная зона прописана как Asia/Almaty, пришлось поправить и этот момент, для этого в базах поменяли timezoneId на Asia/Novosibirsk (использовали Lita в качестве редактора SQLite database):
Кроме того, еще в одну базу добавили запись о нашем городе, а именно в /system/etc/timezones.db
Добавили запись, timezoneId: Asia/Novosibirsk, остальные поля Novosibirsk, ru – Новосибирск.
Для того чтобы все сделанные изменения вступили в силу, сбросили кэш для приложений
Clock, Settings и Weather Provider. Ну и для полной уверенности перезапустили телефон.
В результате получили вот такие пироги:
Как мы видим, в автоматическом режиме зона определяется корректно, системное время и время на виджете одинаковое, ну и в ручном режиме все в порядке.
Ввязавшись в войну со временем, мы решили идти до конца. А именно решить и проблему отмены перехода на зимнее/летнее время.
Скачали самую свежую tzdata (aka timeinfo.dat) с, тогда еще доступного, ресурса elsie.nci.nih.gov/pub
Обнаружили, что в ней про нас еще не подумали, поправили, подготовили и залили в телефон. На момент написания статьи, данная база уже содержит правильные настройки для нашей необъятной страны, а как решать эту проблему, замечательно описано в статье «Обновление временных зон на Android»
В заключение, привожу список средств, которые мы использовали:
Надеюсь, мы не зря потратили время, и эта информация окажется кому-нибудь полезной.
П.С. уже после публикации случайно обнаружил статью описывающую добавление нового города HTC Sense и виджет погоды — добавляем свой город слегка пересекающуюся с данной.
Все началось с того, что был приобретен новый телефон HTC Desire S.
В процессе настройки выяснилось, что в настройках даты и времени нет возможности выбрать мой город — Новосибирск и приходиться выбирать альтернативный город с подходящим часовым поясом.
Так же выяснилось, что синхронизация времени от оператора работает как-то загадочно и виджет HTC Clock в режиме отображения погоды и включенной автоматической синхронизацией отображает некорректное время.
На картинке может показаться, что всё в порядке, однако время на самом деле на телефоне убежало на час назад. Можно отключить автоматическое определение и выставит зону руками, но тогда получим следующее:
Как видно, Новосибирск в списке отсутствует. Нам пришлось выбрать Bangkok, при этом системное время в телефоне стало правильным, но виджет отображает по-прежнему со смещением на час назад.
Попробовали найти решение в сети. Обнаружили что мы не одиноки, причем подобные проблемы существуют не только у жителей Новосибирска, но и у жителей других городов планеты. Комплексного решения всех указанных проблем мы не обнаружили.
Можно было на все это забить, отключить, выставлять руками и не обращать внимания на виджет, но… это же Android — а это значит, что мы можем и должны его победить!
И так, мы начинаем
Новый телефон был на тот момент не рутованый и сделать его таковым не представлялось возможным. Поэтому для экспериментов был взят HTC Hero с оригинальной прошивкой + root/busybox/apps2sd, на котором были точно такие же проблемы.
Нашли через osmonitor приложение, в котором выбирается часовой пояс — (com.android.settings). Посмотрели исходники пакета com.android.settings и выяснили, что ресурсы загружаются из XML файла timezones.xml.
Достали apk этого приложения /system/app/Settings.apk следующей командой:
adb pull /system/app/Settings.apk
Не стану описывать все подробности работы APK manager и Android SDK tools, думаю, заинтересованные люди легко разберутся. Остановлюсь только на ключевых моментах.
С помощью APK manager произвели следующие действия
- decompile
- ручками в другом окне отредактировали файлы
- compile. При компиляции APK manager задает вопросы:
«Is this a system apk (y/n)» – отвечаем yes
«Aside from the signatures, would you like to copy over any additional files that you didn't modify from the original apk in order to ensure least # of errors (y/n)» -тоже отвечаем yes.
Далее действуем по предложенной APK manager-ом инструкции, в другом окне удаляем из директории keep файлы, которые мы изменили + resources.arsc. - Завершаем сборку.
Мы сделали изменения для своего города, по аналогии жители других городов тоже смогут попробовать устранить данную проблему на своих телефонах.
Получившийся apk поместили обратно в телефон:
adb push Settings.apk /system/app/
Этим мы добились того что в списке ручного выбора временной зоны появился Novosibirsk.
Наш город появился в списке, но определение временной зоны в автоматическом режиме по-прежнему работало неверно. Для этого мы пошли дальше и выяснили что, настройки временных зон для городов хранятся в базе данных, а именно в файле /system/etc/WPDB.zip.
Достав его из телефона с помощью всё того же adb, мы извлекли из него две базы
- WP_0409WWE.db
- WP_0419RUS.db
для английского и русского языков соответственно. Посмотрев на данные, мы обнаружили, что для нашего города, временная зона прописана как Asia/Almaty, пришлось поправить и этот момент, для этого в базах поменяли timezoneId на Asia/Novosibirsk (использовали Lita в качестве редактора SQLite database):
update locationlist set timezoneId = 'Asia/Novosibirsk' where name = 'Novosibirsk' -- (для WP_0409WWE.db) update locationlist set timezoneId = 'Asia/Novosibirsk' where name = 'Новосибирск' -- (для WP_0419RUS.db)
Кроме того, еще в одну базу добавили запись о нашем городе, а именно в /system/etc/timezones.db
Добавили запись, timezoneId: Asia/Novosibirsk, остальные поля Novosibirsk, ru – Новосибирск.
Для того чтобы все сделанные изменения вступили в силу, сбросили кэш для приложений
Clock, Settings и Weather Provider. Ну и для полной уверенности перезапустили телефон.
Итоги
В результате получили вот такие пироги:
Как мы видим, в автоматическом режиме зона определяется корректно, системное время и время на виджете одинаковое, ну и в ручном режиме все в порядке.
Ввязавшись в войну со временем, мы решили идти до конца. А именно решить и проблему отмены перехода на зимнее/летнее время.
Скачали самую свежую tzdata (aka timeinfo.dat) с, тогда еще доступного, ресурса elsie.nci.nih.gov/pub
Обнаружили, что в ней про нас еще не подумали, поправили, подготовили и залили в телефон. На момент написания статьи, данная база уже содержит правильные настройки для нашей необъятной страны, а как решать эту проблему, замечательно описано в статье «Обновление временных зон на Android»
В заключение, привожу список средств, которые мы использовали:
Надеюсь, мы не зря потратили время, и эта информация окажется кому-нибудь полезной.
П.С. уже после публикации случайно обнаружил статью описывающую добавление нового города HTC Sense и виджет погоды — добавляем свой город слегка пересекающуюся с данной.