8 votos

¿Cómo importar un mmssms.db existente a un dispositivo virtual Android?

He bajado de Cyanogenmod 13 (Android 6.0.1) a Android stock 5.1.1, y he conservado mi archivo mmssms.db anterior, pero es incompatible con versiones anteriores de Android. Me gustaría importar esta base de datos en un dispositivo virtual Android que ejecute Android 6.0, hacer una copia de seguridad utilizando SMS Save & Restore, y luego restaurar el archivo .xml producido por esa aplicación en mi dispositivo.

Sin embargo, cuando copio mi antiguo com.Android.providers.telephony en el directorio /datos/datos/ del AVD, ni la aplicación Messenger, ni SMS Backup & Restore ven ningún mensaje. El directorio y su contenido son propiedad del radio usuario, pertenecer al grupo de radio y tener chmod ajustado a 771.

¿Cómo puedo comprobar qué es lo que impide que el sistema acceda a mi base de datos?

¿O cómo puedo recuperar mis sms?

0 votos

Es posible que mmssms.db de CM 13 no sea totalmente compatible con stock 6.0.1. Es absolutamente necesario importar los mensajes en 5.1.1, o acceder a ellos en un PC será suficiente?

0 votos

Necesito absolutamente fusionar las dos bases de datos, no sólo acceder a la antigua en un PC. Editar: en base a su sugerencia de que mmssms.db de CM 13 no es compatible con Android 6.0.1 stock, voy a tratar de instalar CM 13 en el AVD.

0 votos

¿Ha habido suerte con CM13 en el AVD?

2voto

Cutter Puntos 86

Por fin he conseguido restaurar el contenido de mi anterior base de datos en mi actual dispositivo y voy a explicar cómo.

La idea era copiar la copia de seguridad de /data/data/com.Android.providers.telephony de mi instalación anterior, a un dispositivo virtual Android, hacer una copia de seguridad allí usando SMS Backup & Restore en formato XML, y luego restaurar esa copia de seguridad XML en mi dispositivo. SMS Backup & Restore fusionó los mensajes de la copia de seguridad con los mensajes del dispositivo actual, por lo que no tuve que fusionar las dos bases de datos a mano.

En mi pregunta, el AVD que ejecutaba 6.0.0 no leía el contenido de mi base de datos porque fue creado en CM 13 que está basado en Android 6.0.1. Pero Google no parece proporcionar una imagen de emulador basada en Android 6.0.1, así que seguí utilizando un AVD que ejecutaba la versión 6.0.0. Por razones de rendimiento lo he configurado para emular un Intel Atom (x86) CPU e instalado el controlador Intel HAXM en mi PC (he seguido esta respuesta para hacerlo).

La base de datos mmssms.db contiene propiedades sobre sí misma, especialmente números de versión, así que los he editado para hacer creer a Android que trataba con una base de datos de una versión que podía tratar. He abierto mmssms.db en Experto en SQLite , hizo clic en la pestaña "Base de datos", y en la lista de propiedades, encontró las siguientes líneas:

  • versión_del_esquema
  • versión_de_usuario

Los he rebajado a 44 y 60, respectivamente.

Luego transferí mi copia de seguridad de /data/data/com.Android.providers.telephony al AVD mediante adb push , después de asegurarse de que esa ubicación ya estaba vacía allí. Utilizando adb shell He establecido el propietario y el grupo de todo en este directorio y sus subdirectorios a radio y en el base de datos subdirectorio el chmod a 660.

He reiniciado el dispositivo.

He instalado SMS Backup & Restore en el AVD a través de ADB. (El .apk de esa app se puede encontrar en un dispositivo existente en /data/app en un dispositivo donde ya esté instalada. No me he molestado en instalar Google Play Services en el emulador para obtenerla de la Play Store, pero puedes hacerlo).

He hecho una copia de seguridad de los mensajes y he copiado el .xml resultante a mi dispositivo real, donde he utilizado SMS Backup & Restore para restaurarlo. Ya está.

2voto

user168357 Puntos 136

Tuve que hacer un paso extra en comparación con la respuesta de @Cutter para que funcionara con LineageOS 14.1 (original mmssms.db vino de Android 5.1).

Cambiar el user_version de 64 a 68 :

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

En el modo de recuperación ( 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

Lo importante era cambiar adicionalmente el contexto de seguridad del archivo SELinux con chcon .

¡Y después de reiniciar los antiguos mensajes SMS fueron finalmente reconocidos!

0voto

Laurent Puntos 1

La solución de jansohn me funciona.

Saqué el archivo mmssms.db de una copia de seguridad NANDROID anterior de mi teléfono y fue capaz de restaurar todos los viejos mensajes SMS de ella haciendo esos comandos en un shell adb.

No funcionó hasta que usé: adb shell chcon u:object_r:radio_data_file:s0 /data/user_de/0/com.android.providers.telephony/databases/mmssms.db

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X