Android: résoudre "Can't downgrade database from version X to Y"
Il y a peu, j'ai changé l'OS installé sur mon smartphone, pour repasser de LineageOS vers la version officielle de Fairphone OS. Si l'opération s'est globalement bien passée, j'ai perdu l'accès à mes SMS. Lancer Simple SMS me retournait une erreur :
android.database.sqlite.SQLiteExcepion:
Can't downgrade database from version 68 to 67
Le souci ne vient pas de l'application de SMS mais d'Android même. LineageOS fonctionnait avec une base de donnée SQLite à la version utilisateur 68. Fairphone OS fonctionne avec la version 67. En essayant d'accéder à la liste des messages, Android détecte l'incohérence de version et refuse de continuer.
Voici comment j'ai réussi à résoudre ce souci :
- Gagner un accès root sur le téléphone en installant Magisk
- Extraire la base de données. Vu que l'on ne peut pas utiliser
adb pull
sur un fichier protégé, il faut un peu ruser :$ adb shell; su FP3:/# cp /data/data/com.android.providers.telephony/databases/mmssms.db /sdcard/mmssms.db FP3:/# chown shell.shell /sdcard/mmssms.db FP3:/# exit $ adb pull /sdcard/mmssms.db
- Une fois le fichier récupéré, on confirme la version 68 et la change à la valeur voulue :
$ file mmssms.db mmssms.db: SQLite 3.x database, user version 68, last written using SQLite version 3028000, file counter 3639, database pages 213, cookie 0x31, schema 4, largest root page 24, UTF-8, version-valid-for 3639 $ sqlite3 mmssms.db SQLite version 3.42.0 2023-05-16 12:36:15 Enter ".help" for usage hints. sqlite> PRAGMA user_version = 67;
- On renvoie maintenant le fichier modifié:
$ adb push mmssms.db /sdcard/mmssms67.db FP3:/# chown radio.radio /sdcard/mmssms67.db FP3:/# cp /sdcard/mmssms67.db /data/data/com.android.providers.telephony/databases/mmssms.db
Le user_version
est une information arbitraire propre aux applications, non utilisée par SQLite. Si différence de schéma entre les deux versions il y a, je ne l'ai pas remarquée et la procédure ci-dessus m'a débloqué mon téléphone.
Ce problème était lié à la base de donnée de message, localisée dans /data/data/com.android.providers.telephony/databases/mmssms.db
, mais une procédure similaire peut évidement être transposée à d'autres bases de donnée.
