BackupAgent: "невозможно восстановить пакет..."

Я реализовал BackupAgent, как описано в Резервное копирование данных, зарегистрировал ключ API и объявил BackupAgent в моем манифесте. Я думаю, что резервная часть работает неплохо; Когда я запускаю adb shell bmgr run в командной строке, в LogCat появляется следующий вывод:

01-11 22:23:09.002: DEBUG/PerformBackupThread(97): starting agent for backup of BackupRequest{app=ApplicationInfo{4547c5b8 com.meins.nightclock} full=false}
01-11 22:23:09.002: DEBUG/BackupManagerService(97): awaiting agent for ApplicationInfo{4547c5b8 com.meins.nightclock}
01-11 22:23:09.013: DEBUG/BackupManagerService(97): agentConnected pkg=com.meins.nightclock agent=android.os.BinderProxy@4536a7f8
01-11 22:23:09.032: DEBUG/BackupHelperDispatcher(9122): handling existing helper 'alarms' android.app.backup.FileBackupHelper@44e197b0
01-11 22:23:09.032: DEBUG/BackupHelperDispatcher(9122): handling existing helper 'prefs' android.app.backup.SharedPreferencesBackupHelper@44e19478
01-11 22:23:09.032: VERBOSE/LocalTransport(97): performBackup() pkg=com.meins.nightclock
01-11 22:23:09.032: VERBOSE/LocalTransport(97): Got change set key=alarms:alarms size=16 key64=YWxhcm1zOmFsYXJtcw==
01-11 22:23:09.042: VERBOSE/LocalTransport(97): data size 16
01-11 22:23:09.062: VERBOSE/LocalTransport(97): Got change set key=prefs:com.meins.nightclock_preferences size=265 key64=cHJlZnM6Y29tLm1laW5zLm5pZ2h0Y2xvY2tfcHJlZmVyZW5jZXM=
01-11 22:23:09.072: VERBOSE/LocalTransport(97): data size 265
01-11 22:23:09.072: VERBOSE/LocalTransport(97): finishBackup()

С другой стороны, часть восстановления вообще не работает, метод onReceive() не вызывается. Когда я переустанавливаю свое приложение, единственным выходом, который может (?) Ссылаться на BackupAgent, является

01-11 22:14:01.042: DEBUG/vending(7426): [100] LocalAssetCache.updateOnePackage(): No local info for com.meins.nightclock

Когда я запускаю adb shell bmgr restore com.meins.nightclock, он просто устанавливает Unable to restore package com.meins.nightclock.

Я использую следующую реализацию BackupAgentHelper

package com.meins.nightclock;
import java.io.IOException;
import android.app.backup.BackupAgentHelper;
import android.app.backup.BackupDataInput;
import android.app.backup.BackupDataOutput;
import android.app.backup.FileBackupHelper;
import android.app.backup.SharedPreferencesBackupHelper;
import android.os.ParcelFileDescriptor;
import android.util.Log;
public class MyBackupAgent extends BackupAgentHelper {
 public static final Object[] DATA_LOCK = new Object[0];
 private static final String PREFS_BACKUP_KEY = "prefs";
 private static final String ALARMS_BACKUP_KEY = "alarms";
 private DataLayerAlarms d;
 @Override
 public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
 ParcelFileDescriptor newState) throws IOException {
 if (d.backup() != 0)
 return;
 synchronized (DATA_LOCK) {
 super.onBackup(oldState, data, newState);
 }
 }
 @Override
 public void onCreate() {
 SharedPreferencesBackupHelper preferencesHelper = new SharedPreferencesBackupHelper(this,
 getPackageName() + "_preferences");
 addHelper(PREFS_BACKUP_KEY, preferencesHelper);
 FileBackupHelper fileHelper = new FileBackupHelper(this, DataLayerAlarms.BACKUP_FILE);
 addHelper(ALARMS_BACKUP_KEY, fileHelper);
 d = new DataLayerAlarms(this);
 }
 @Override
 public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState)
 throws IOException {
 Log.d(toString(), "onRestore()");
 synchronized (DATA_LOCK) {
 super.onRestore(data, appVersionCode, newState);
 }
 d.restore();
 }
}

Для полноты соответствующей части манифеста:

<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true" android:backupagent="MyBackupAgent">
 <meta-data android:name="com.google.android.backup.api_key" android:value="AEdPqrEAAAAI4MsUOC-[...]">
 ...
</meta-data></application>

Кто-нибудь знает, почему BackupManager не может восстановить этот пакет?

3 ответа

Попробуйте добавить точку перед именем класса резервного копирования, как в:

android:backupAgent=".MyBackupAgent"

Или если ваш класс резервного копирования не находится в вашем корневом пакете, добавьте к нему путь:

android:backupAgent=".package.MyBackupAgent"


Эта проблема возникла, когда я изменил имя пакета, а затем появились другие проблемы. Мне потребовалось пару часов, чтобы понять.

Отключить мгновенный запуск. Это перепутало вещи для меня.

Проверьте список транспортов, убедитесь, что установлен Google:

adb shell bmgr list transports
 android/com.android.internal.backup.LocalTransport
 * com.google.android.gms/.backup.BackupTransportService

Убедитесь, что имя пакета BackupAgentHelper и имя пакета метаданных имеют одинаковое имя. Конфликты имен могут вызвать проблему.

android: backupAgent Имя класса, реализующего агент резервного копирования приложений, подкласс BackupAgent. Атрибут значение должно быть полностью квалифицированным именем класса (например, "Com.example.project.MyBackupAgent" ). Однако, как сокращение, если первым символом имени является период (например, ".MyBackupAgent" ), он добавляется к имени пакета, указанному в  элемент. По умолчанию нет. Имя должно быть указано.


Смена android:backupAgent="MyBackupAgent" на android:backupAgent=".MyBackupAgent" тоже работала для меня.

licensed under cc by-sa 3.0 with attribution.