Как импортировать существующий mmssms.db на виртуальное устройство Android?

Я перешел с Cyanogenmod 13 (Android 6.0.1) на стандартную версию Android 5.1.1 и сохранил свой предыдущий файл mmssms.db, но он несовместим со старыми версиями Android. Я хотел бы импортировать эту базу данных в виртуальное устройство Android под управлением Android 6.0, создать ее резервную копию с помощью SMS Save & Restore, а затем восстановить файл .xml, созданный этим приложением, на моем устройстве.

Однако, когда я копирую свой старый каталог com.android.providers.telephony в каталог /data/data/ AVD, ни приложение Messenger, ни SMS Backup & Restore не видят никаких сообщений. Каталог и его содержимое принадлежат пользователю радио , принадлежат к группе радио и имеют chmod , установленный на 771.

Как я могу проверить, что мешает системе получить доступ к моей базе данных?

Или как еще я могу получить свои смс?

Возможно, mmssms.db CM 13 не полностью совместим со стоковой версией 6.0.1. Вам обязательно нужно импортировать сообщения в 5.1.1 или будет достаточно доступа к ним на ПК?
Мне абсолютно необходимо объединить две базы данных, а не просто получить доступ к старой на ПК. Редактировать: основываясь на вашем предположении, что mmssms.db CM 13 не совместим со стоковой версией Android 6.0.1, я попытаюсь установить CM 13 на AVD.
Удачи с CM13 на AVD?
Эмулятор Google очень медленный и зависает, когда я использую adb для перезагрузки в рекавери/загрузчик. Возможно, он будет работать лучше с виртуальным устройством с процессором Intel Atom; Я попробую это позже сегодня.

Ответы (3)

Наконец-то мне удалось восстановить содержимое моей предыдущей базы данных на моем текущем устройстве, и я объясню, как это сделать.

Идея заключалась в том, чтобы скопировать резервную копию /data/data/com.android.providers.telephony из моей предыдущей установки на виртуальное устройство Android, создать ее резервную копию с помощью SMS Backup & Restore в формате XML, а затем восстановить эту резервную копию XML на мое устройство. SMS Backup & Restore объединил сообщения из резервной копии с сообщениями текущего устройства, поэтому мне не пришлось объединять две базы данных вручную.

В моем вопросе AVD под управлением 6.0.0 не будет читать содержимое моей базы данных, потому что она была создана на CM 13, основанном на Android 6.0.1. Но Google, похоже, не предоставляет образ эмулятора на основе Android 6.0.1, поэтому я все еще использовал AVD с 6.0.0. Из соображений производительности я настроил его для эмуляции процессора Intel Atom (x86) и установил драйвер Intel HAXM на свой компьютер (для этого я выполнил этот ответ ).

База данных mmssms.db содержит свойства о самой себе, особенно номера версий, поэтому я отредактировал их, чтобы Android считал, что он имеет дело с базой данных версии, с которой он может работать. Я открыл mmssms.db в SQLite Expert , щелкнул вкладку «База данных» и в списке свойств нашел следующие строки:

  • версия_схемы
  • user_version

Я понизил их до 44 и 60 соответственно.

Затем я перенес свою резервную копию /data/data/com.android.providers.telephony на AVD с помощью adb push , предварительно убедившись, что это место уже пусто. Используя оболочку adb, я установил владельца и группу всего в этом каталоге и его подкаталогах на radio , а в подкаталоге базы данных значение chmod равно 660.

Я перезагрузил устройство.

Я установил SMS Backup & Restore на AVD через ADB. (Файл .apk этого приложения можно найти на существующем устройстве в /data/app на устройстве, где оно уже установлено. Я не стал устанавливать службы Google Play на эмуляторе, чтобы получить его из Play Store, но вы это можно сделать.)

Я сделал резервную копию сообщений и скопировал полученный .xml на свое реальное устройство, где я использовал резервное копирование и восстановление SMS для его восстановления. Вуаля.

Мне пришлось сделать дополнительный шаг по сравнению с ответом @Cutter, чтобы заставить его работать с LineageOS 14.1 (оригинал mmssms.dbпришел из Android 5.1).

Измените user_versionс 64на 68:

sqlite3 mmssms.db
PRAGMA user_version;
PRAGMA user_version = 68;
.q

В режиме восстановления ( adb reboot recovery):

adb push mmssms.db /data/user_de/0/com.android.providers.telephony/databases/
adb shell chown radio:radio /data/user_de/0/com.android.providers.telephony/databases/mmssms.db
adb shell chmod 660 /data/user_de/0/com.android.providers.telephony/databases/mmssms.db
adb shell chcon u:object_r:radio_data_file:s0 /data/user_de/0/com.android.providers.telephony/databases/mmssms.db
adb shell ls -alZ /data/user_de/0/com.android.providers.telephony/databases/mmssms.db

Важно было дополнительно изменить контекст безопасности файла SELinux с расширением chcon.

И после перезагрузки старые СМС наконец-то распознались!

решение Янсона работает для меня.

Я вытащил файл mmssms.db из предыдущей резервной копии NANDROID моего телефона и смог восстановить из него все старые SMS-сообщения, выполнив эти команды в оболочке adb.

Это не сработало, пока я не использовал:adb shell chcon u:object_r:radio_data_file:s0 /data/user_de/0/com.android.providers.telephony/databases/mmssms.db