Прочитав статью «Переезд временной зоны MSD в MSK — новый Y2K локального масштаба» — был, мягко говоря, озадачен. Неужели никто до сих пор не сделал какого-либо патча для Android? Вдумчивое гугление привело к подтверждению информации: да, патчей нет. Обновлений тоже нет. Что хотите — то и делайте.
Ну вот, собственно — и начал делать…
По информации, найденной в Сети, файл временных зон в Android находится:
Взяв в руки adb, far и прочие нужные вещи, принялся за мини-исследование. Итог:
Кратко, потому что «растекания мысью по древу» вряд ли будут кому-то интересны.
В итоге всё оказалось намного проще. После получаса настойчивых поисков была найдена ссылка, по которой лежал набор development tools для android, в том числе — шелл-скрипт, вызвающий zic для определенного набора каталогов и генерирующий выходные данные, и исходник на Java для, собственно, создания zoneinfo.dat и zoneinfo.idx.
Архив с данными временных зон, на который надо натравливать скрипт, нашёлся здесь.
В итоге — получаем актуальные файлы временных зон для Android, осталось залить их в устройство. Увы, пользователям без root-доступа к телефону обновление не грозит.
Вариантов обновления — два.
Предполагаю, что с базовыми знаниями о adb: что это такое, как им пользоваться, где брать — вы знакомы. Если нет — то вот первая найденная с ходу ссылка, изучаем…
Описание относится к HTC Desire A8181; на телефонах других моделей процесс входа в recovery может слегка отличаться.
На этом, пожалуй, всё. Замечания, исправления, дополнения — приветствуются.
Ну вот, собственно — и начал делать…
Противоречивая информация
По информации, найденной в Сети, файл временных зон в Android находится:
- /etc/timezones.db — как было сказано в вышеуказанной статье;
- /etc/WPDB.zip — найдено на нескольких форумах;
- /system/usr/share/zoneinfo/ — опять-таки, найдено в форумах.
Взяв в руки adb, far и прочие нужные вещи, принялся за мини-исследование. Итог:
- /etc/timezones.db — нет. Не часовые пояса. Просто файл в формате SQLite, содержащий в себе соответствия ID зоны и ее названий на разных языках (таблица timezone) и некоторые метаданные в количестве одной штуки (таблица android_metadata);
- /etc/WPDB.zip — часовые пояса. И не только. Внутри архива — 22 файла с именами а-ля «WP_0419RUS.db». Файлы — всё тот же SQLite. В файле по три таблицы, в каждой из которых — да, названия страны, города и смещение от UTC в минутах — но насчет зимнего/летнего времени информации никакой;
- /system/usr/share/zoneinfo/ — вот и то, что нам нужно. В каталоге — три файла: zoneinfo.dat, zoneinfo.idx, zoneinfo.version. Вот только где их брать?..
Инструменты
Кратко, потому что «растекания мысью по древу» вряд ли будут кому-то интересны.
- Заголовок у zoneinfo.dat оказался ожидаемый: TZif2. Вот только встречался в файле он очень часто;
- zoneinfo.idx наводил на мысли, что перед нами БД — только чем ее собрать? В голове начали мелькать идиотские мысли из серии: «Разобраться с форматом, написать «сборщик», взяв за основу нужные файлы временных зон с домашнего сервера на FreeBSD;
В итоге всё оказалось намного проще. После получаса настойчивых поисков была найдена ссылка, по которой лежал набор development tools для android, в том числе — шелл-скрипт, вызвающий zic для определенного набора каталогов и генерирующий выходные данные, и исходник на Java для, собственно, создания zoneinfo.dat и zoneinfo.idx.
Архив с данными временных зон, на который надо натравливать скрипт, нашёлся здесь.
Результаты
В итоге — получаем актуальные файлы временных зон для Android, осталось залить их в устройство. Увы, пользователям без root-доступа к телефону обновление не грозит.
Вариантов обновления — два.
- Через ADB (Android Debug Bridge, часть Android SDK);
- Через кастомный recovery, позволяющий устанавливать ZIP-файлы с корня SD-карты (У меня установлен CWM-AlphaRev Recovery)
Обновление через ADB
Предполагаю, что с базовыми знаниями о adb: что это такое, как им пользоваться, где брать — вы знакомы. Если нет — то вот первая найденная с ходу ссылка, изучаем…
- Скачиваем архив с новыми временными зонами;
- Распаковываем архив куда-нибудь поудобнее. К примеру, в c:\Temp\tz\;
- Запускаем adb shell, проверяем, что раздел /dev/block/mtdblock3 примонтирован к /system:
# mount|grep system
mount|grep system
/dev/block/mtdblock3 /system yaffs2 ro,relatime 0 0
- Монтируем раздел /system в RW-режиме (если к /system примонтирован не mtdblock3 — заменить значение на своё):
su
mount -rw -o remount /dev/block/mtdblock3 /system
exit
- Закачиваем новые файлы временных зон в устройство:
adb push c:\Temp\tz\zoneinfo.version /system/usr/share/zoneinfo/zoneinfo.version
adb push c:\Temp\tz\zoneinfo.dat /system/usr/share/zoneinfo/zoneinfo.dat
adb push c:\Temp\tz\zoneinfo.idx /system/usr/share/zoneinfo/zoneinfo.idx
- Перезагружаем устройство.
Обновление через custom recovery на примере CWM-AlphaRev Recovery
Описание относится к HTC Desire A8181; на телефонах других моделей процесс входа в recovery может слегка отличаться.
- Скачиваем архив с обновлением временных зон;
- Кладём файл в корень SD-карты устройства;
- Входим в Recovery: при выключенном телефоне (владельцы телефонов с Android 2.3.x — перед выключением устройства проверьте, что пункт меню Настройка — Приложения — Быстрая загрузка отключен!) нажимаем и удерживаем кнопку «уменьшить громкость», нажимаем кнопку питания;
- В появившемся меню клавишами громкости выбираем пункт меню Recovery, подтверждаем выбор кнопкой включения питания; телефон загружается в recovery-режиме;
- Последовательно выбираем пункты меню (подтверждение — нажатием оптического джойстика):
-install zip from sdcard
-choose zip from sdcard
-выбрать zip
- Появляется навигация по файловой системе. Выбираем файл timezone2011i.zip, который мы туда и загрузили;
- Подтверждаем желание установить выбранный файл;
- После окончания процесса установки с помощью клавиши «назад» поднимаемся на два уровня выше, выбираем пункт меню reboot. Телефон перезагрузится в обычном режиме, обновление установлено.
На этом, пожалуй, всё. Замечания, исправления, дополнения — приветствуются.