8 votes

Comment importer un mmssms.db existant sur un appareil virtuel Android ?

J'ai rétrogradé de Cyanogenmod 13 (Android 6.0.1) à Android stock 5.1.1, et j'ai conservé mon ancien fichier mmssms.db, mais il est incompatible avec les anciennes versions d'Android. Je voudrais importer cette base de données dans un appareil virtuel Android fonctionnant sous Android 6.0, la sauvegarder à l'aide de SMS Save & Restore, puis restaurer le fichier .xml produit par cette application sur mon appareil.

Cependant, lorsque je copie mon ancienne com.Android.providers.telephony dans le répertoire /data/data/ de l'AVD, ni l'application Messenger, ni SMS Backup & Restore ne voient de message. Le répertoire et son contenu sont la propriété de l'application radio utilisateur, appartiennent au groupe radio, et ont chmod fixé à 771.

Comment puis-je vérifier ce qui empêche le système d'accéder à ma base de données ?

Ou comment puis-je récupérer mes sms ?

2voto

Cutter Points 341

J'ai finalement réussi à restaurer le contenu de ma précédente base de données sur mon appareil actuel et je vais vous expliquer comment.

L'idée était de copier la sauvegarde de /données/données/com.Android.providers.telephony de mon installation précédente, vers un appareil virtuel Android, le sauvegarder au format XML à l'aide de SMS Backup & Restore, puis restaurer cette sauvegarde XML sur mon appareil. SMS Backup & Restore a fusionné les messages de la sauvegarde avec les messages de l'appareil actuel, ce qui m'a évité d'avoir à fusionner les deux bases de données à la main.

Dans ma question, l'AVD fonctionnant en 6.0.0 ne pouvait pas lire le contenu de ma base de données car elle avait été créée sur CM 13 qui est basé sur Android 6.0.1. Mais Google ne semble pas fournir une image d'émulateur basée sur Android 6.0.1, donc j'ai quand même utilisé un AVD fonctionnant en 6.0.0. Pour des raisons de performance, je l'ai configuré pour émuler une image de type Intel Atom (x86) CPU et j'ai installé le pilote Intel HAXM sur mon PC (j'ai suivi les instructions du fabricant). cette réponse pour le faire).

La base de données mmssms.db contient des propriétés sur elle-même, en particulier les numéros de version, donc je les ai édités pour faire croire à Android qu'il traitait avec une base de données d'une version qu'il pouvait traiter. J'ai ouvert mmssms.db dans le dossier Expert SQLite J'ai cliqué sur l'onglet "Base de données" et, dans la liste des propriétés, j'ai trouvé les lignes suivantes :

  • version du schéma
  • version_utilisateur

Je les ai rétrogradés à 44 et 60, respectivement.

Puis j'ai transféré ma sauvegarde de /data/data/com.Android.providers.telephony à l'AVD en utilisant adb push après s'être assuré que l'emplacement était déjà vide à cet endroit. Utilisation de shell adb J'ai défini le propriétaire et le groupe de tout ce qui se trouve dans ce répertoire et ses sous-répertoires à radio et dans le base de données le sous-répertoire chmod à 660.

J'ai redémarré l'appareil.

J'ai installé SMS Backup & Restore sur l'AVD via ADB. (Le .apk de cette application peut être trouvé dans /data/app sur un appareil où elle est déjà installée. Je n'ai pas pris la peine d'installer Google Play Services sur l'émulateur pour l'obtenir depuis le Play Store, mais vous pouvez le faire).

J'ai sauvegardé les messages et copié le fichier .xml résultant sur mon appareil réel, où j'ai utilisé SMS Backup & Restore pour le restaurer. Voilà.

2voto

jansohn Points 121

J'ai dû faire une étape supplémentaire par rapport à la réponse de @Cutter pour qu'il fonctionne avec LineageOS 14.1 (original mmssms.db vient d'Android 5.1).

Changez le user_version de 64 a 68 :

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

En mode de récupération ( 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

L'important était de modifier en plus le fichier SELinux security context avec chcon .

Et après le redémarrage, les anciens messages SMS ont enfin été reconnus !

0voto

coxe87b Points 111

La solution de jansohn fonctionne pour moi.

J'ai récupéré le fichier mmssms.db d'une précédente sauvegarde NANDROID de mon téléphone et j'ai pu restaurer tous les anciens messages SMS en exécutant ces commandes dans un shell adb.

Ça ne marchait pas jusqu'à ce que je l'utilise : adb shell chcon u:object_r:radio_data_file:s0 /data/user_de/0/com.android.providers.telephony/databases/mmssms.db

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X