【Android】Realmのモデルクラスを変更後、アプリを再インストールして起動するとRealmMigrationNeededExceptionが発生する

3時間ハマった

事象

Realmのモデルクラスを変更後(カラム名のリネームをしただけ)、アプリの再インストールを行って起動すると RealmMigrationNeededExceptionを吐いてアプリがクラッシュしてしまう。

原因

RealmMigrationNeededException reinstallでググったらissueに挙がっていた・・

github.com

Android6.0からアプリの自動バックアップ機能が実装されたらしく、GoogleDriveに保存するのだとか。
これが原因で、新旧realmファイルがぶつかってMigrationNeddedExceptionを起こしているっぽい。

おそらく再インストール時には以下のようになっている?
アプリのインストール

GoogleDriveからバックアップを取得

バックアップしたアプリに対して更新
(新旧realmファイルがこんにちは)

MigrationNeddedException

対策

公式ドキュメントを見る限り、以下の手順を実施すればよい。
Back up user data with Auto Backup  |  Android Developers

手順1.GoogleDriveからバックアップを削除する

f:id:hikeshiya:20180727221844p:plain
犯人
削除後にアプリを再インストールするとMigrationNeddedExceptionは起こらなかった。

手順2.realmファイルをバックアップ対象から外す

バックアップの設定ファイル(backup.xml)を作成し、AndroidManifest.xmlのapplication要素内にandroid:fullBackupContentを追加する。

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hoge">

    <application
        android:fullBackupContent="@xml/backup"

 

/xml/backup.xml

<?xml version="1.0" encoding="utf-8"?>
    <full-backup-content>
        <exclude domain="file" path="default.realm"/>
        <exclude domain="file" path="default.realm.lock"/>
    </full-backup-content>