【问题标题】:BackupAgent: "unable to restore package ..."BackupAgent:“无法恢复包...”
【发布时间】:2011-01-11 21:39:18
【问题描述】:

我已经按照Data Backup 的描述实现了 BackupAgent,注册了一个 API 密钥并在我的 Manifest 中声明了 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();
    }

}

为了完整起见,相关的 Manifest 部分:

<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-[...]" />

    ...

</application>

有谁知道,为什么 BackupManager 无法恢复这个包?

【问题讨论】:

  • 我得到了同样的结果。我已经看到它工作了,但突然之间它不再工作了。
  • 我也是。它正在工作,但突然停止工作。喜欢wtf..

标签: android android-backup-service


【解决方案1】:

尝试在备份类名称前添加一个点,如下所示:

android:backupAgent=".MyBackupAgent"

或者,如果您的备份类不在您的根包中,请添加路径:

android:backupAgent=".package.MyBackupAgent"

【讨论】:

    【解决方案2】:

    android:backupAgent="MyBackupAgent" 更改为android:backupAgent=".MyBackupAgent" 也对我有用。

    【讨论】:

      【解决方案3】:

      这个问题是我改包名的时候出现的,后来又出现了其他问题。我花了几个小时才弄明白。

      禁用即时运行。它把我的事情搞砸了。

      检查传输列表,确保已设置 Google:

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

      确保 BackupAgentHelper 包名称和元数据包名称具有相同的名称。名称冲突可能会导致问题。

      android:backupAgent 实现的类的名称 应用程序的备份代理,BackupAgent 的子类。属性 value 应该是一个完全限定的类名(例如, “com.example.project.MyBackupAgent”)。但是,作为简写,如果 名称的第一个字符是句号(例如, ".MyBackupAgent"),它被附加到指定的包名 元素。没有默认值。必须指定名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-15
        • 2018-06-26
        • 2017-04-10
        • 2018-05-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多