воскресенье, 7 октября 2012 г.

СМС-сообщения в Android'е. Импорт/Экспорт/Восстановление

Недавно возникла необходимость восстановить пару удаленных смс на Андроиде. Возможно мой опыт окажется полезным.


1. Для начала разберемся как достать неудаленные данные:

Где лежат
База смс-сообщений лежит по адресу:
/data/data/.com.android.providers.telephony/databases/mmssms.db (для доступа необходим root)

Как достать

Это sqlite БД, в которой собственно и хранится информация обо всех СМС (время, отправитель, текст, объединение в цепочки и т.д.). Причем популярные GUI-интерфейсы (SQLite Database Browser и sqliteman) для работы с sqlite отказались открывать эту БД из-за сильно новой версии.
Остается использовать консоль sqlite или взять готовую обертку, предназначенную как раз для экспорта смс из mmssms.db - yaffs extractor, mmssms.db & contacts2.db converter.

Этот набор приложений позволяет сконвертировать нашу базу в формат xml, совметимый с программой SMS Backup & Restore.
    extract.exe -s mmssms.db

Как закинуть обратно в телефон
В дальнейшем мы можем просматривать содержимое xml в любом текстовом редакторе или же импортировать его обратно в телефон, с помощью SMS Backup & Restore:
Положить xml в /sdcard/SMSBackupRestore , запустить Restore, выбрать наш xml.

2. А теперь собственно восстановление

Как и в большинстве БД, в sqlite данные при удалении физически не стираются, а только помечаются как удаленные.Удаление из базы происходит не в момент удаления сообщений пользователем, а при записи новых сообщений.

Если после удаления сообщений, которые необходимо восстановить, не было новых сообщений, то делаем обычный экспорт БД и достаем всё что нужно.

Если же новые сообщения всё-таки были, то тут уже как повезет:
Удаленные сообщения были помечены как свободные и новые данные могли перезаписать старые.
В моём случае, после одного полученного собщения, удаленные данные не были удалены и прекрасно видны в HEX-редакторе. Готового ПО для восстановления я не нашел.

P.S. Написанное выше относится и к истории звонков, с той оговоркой, что данные хранятся в
data/data/com.android.providers.contacts/databases/contacts2.db и экспорт делается с ключём -c.