android – BackupManager Not Calling Backup Transport-ThrowExceptions

Exception or error:

Alright, so I’m trying to implement Data Backup into my application, and have been following this guide. I’ve implemented my BackupAgentHelper using a SharedPreferencesBackupHelper. I don’t get any errors, and I’m being sure to call dataChanged() after all preference changes, but when I test the backup (`adb shell bmgr run) I get this information in LogCat:

07-07 12:29:00.258: V/BackupManagerService(291): Scheduling immediate backup pass
07-07 12:29:00.258: V/BackupManagerService(291): Running a backup pass
07-07 12:29:00.258: V/BackupManagerService(291): clearing pending backups
07-07 12:29:00.258: V/PerformBackupTask(291): Beginning backup of 1 targets
07-07 12:29:00.289: V/BackupServiceBinder(291): doBackup() invoked
07-07 12:29:00.289: D/PerformBackupTask(291): invokeAgentForBackup on @pm@
07-07 12:29:00.297: I/PerformBackupTask(291): no backup data written; not calling transport

So for reference, in my manifest I’ve added:

<application
        android:allowBackup="true"
        android:backupAgent="com.kcoppock.sudoku.SudokuBackupAgent"

as well as

<meta-data
        android:name="com.google.android.backup.api_key"
        android:value="my_key_goes_here" />

and my BackupAgentHelper is implemented like so:

public class SudokuBackupAgent extends BackupAgentHelper {
    static final String SCORES = "SCORES";
    static final String BACKUP_ID = "sudoku_backup";

    @Override
    public void onCreate() {
        SharedPreferencesBackupHelper backupHelper = 
                new SharedPreferencesBackupHelper(this, SCORES);
        addHelper(BACKUP_ID, backupHelper);
    }
}

and finally, in my main activity, I call for a data backup like this:

edit.putString(id + "_values", valueCache.toString());
edit.putString(id + "_hints", hintCache.toString());
edit.commit();
BackupManager backup = new BackupManager(this);
backup.dataChanged();

I’ve tried debugging, and it seems my onCreate() in SudokuBackupAgent is never called. Or at least it’s never reached from the debugger. It seems it isn’t finding any updated data, and I have double checked to ENSURE there is data to be backed up. Is there something I’m missing here?

EDIT: I should add, I’m testing on a device (Galaxy Nexus), and I’ve even tried using an exported release APK for testing purposes.

How to solve:

1) Put Log.i() into your onCreate, to see if it’s called.

2) Logcat indicates that your function didn’t write anything. Check if you have shared_prefs/SCORES file in your app’s private folder (assumes using appropriate file manager on rooted device). This is the file you’re attempting to have in backup.
Probably your preferences file is something else than this file, in such case fix your String SCORES to reflect real preferences file.

3) I tried to debug BackupAgentHelper.onCreate in my app, and it can be debugged after invoking adb shell bmgt… so it is possible to step here in debugger.

###

I had the same problem today with Android SDK 4.1. Using 2.3.3 versions, however, helped:

07-15 13:59:56.459: V/LocalTransport(61): performBackup() pkg=com........
07-15 13:59:56.469: V/LocalTransport(61): Got change set key=filehelper:../databases/database.db size=8208 key64=ZmlsZWhlbHBlcjouLi8kYXRhYmFzZXMvZXhwZW5zZXIuZGI=
07-15 13:59:56.469: V/LocalTransport(61):   data size 8208
07-15 13:59:56.469: V/LocalTransport(61): finishBackup()

###

If you do not change your preferences data it will just back up once but not subsequently.

https://developer.android.com/reference/android/app/backup/SharedPreferencesBackupHelper.html

“Whenever a backup is performed, it will back up all named shared preferences that have changed since the last backup operation.”

As other poster said make sure to have a log statement in your onCreate.

You can force a backup by:

// bmgr wipe TRANSPORT PACKAGE
bmgr wipe com.google.android.backup/.BackupTransportService com.kcoppock.sudoku

bmgr run

The default is com.google.android.backup/.BackupTransportService, but best to check for yourself with bmgr list transports.

You’ll be much happier running against the local transport, not the default Google Transport. Check the dev docs on this.

Leave a Reply

Your email address will not be published. Required fields are marked *