Обновление временных зон на Android

Oct 14, 2011 19:10

Прочитав статью «Переезд временной зоны 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 и ей же скопировать файлы на нужное место.

android, dev, soft, жизненное

Previous post Next post
Up