mart-e

La vie, Linux, la tartiflette...

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 :

  1. Gagner un accès root sur le téléphone en installant Magisk
  2. 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
  3. 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; 
  4. 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.

Réagissez à cet article.