Pull to refresh

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

Development for Android *
Sandbox
Прочитав статью «Переезд временной зоны 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, проверяем, что раздел /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. Телефон перезагрузится в обычном режиме, обновление установлено.



На этом, пожалуй, всё. Замечания, исправления, дополнения — приветствуются.
Tags:
Hubs:
Total votes 70: ↑68 and ↓2 +66
Views 48K
Comments 85
Comments Comments 85

Posts