Прочитав статью
«Переезд временной зоны MSD в MSK - новый Y2K локального масштаба» - был, мягко говоря, озадачен. Неужели никто до сих пор не сделал какого-либо патча для Android? Вдумчивое гугление привело к подтверждению информации: да, патчей нет. Обновлений тоже нет. Что хотите - то и делайте.
Ну вот, собственно - и начал делать…
Противоречивая информация
По информации, найденной в Сети, файл временных зон в 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, монтируем раздел /system в RW-режиме:
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. Телефон перезагрузится в обычном режиме, обновление установлено.
На этом, пожалуй, всё. Замечания, исправления, дополнения - приветствуются.
UPD: Третий вариант. С ходу в голову почему-то не пришёл, но учитывая моё нынешнее состояние - мне простительно ;-)
Скопировать файлы из архива куда-нибудь на устройство, взять замечательную программу RootExplorer, перемонтировать с ее помощью /system в RW и ей же скопировать файлы на нужное место.