Android 安装后1分钟清除应用程序数据-BackupManagerService超时

Android 安装后1分钟清除应用程序数据-BackupManagerService超时,android,android-6.0-marshmallow,android-backup-service,Android,Android 6.0 Marshmallow,Android Backup Service,我刚刚将我的应用程序更新到API 23。每次我喜欢新安装的时候,我都可以在应用程序崩溃和我输入的数据消失之前使用它大约一分钟。事实如下: 我一直在使用同一个Google帐户在物理设备和模拟器上进行测试,包括调试版本和已签名的APK。(日志中“签名不匹配”的可能原因。) 尝试还原时,日志显示“签名不匹配”消息 60秒后,日志显示E/BackupManagerService:Timeout还原应用程序… 然后该应用程序被强制终止,我看到很多关于clear data和clear datareceiv

我刚刚将我的应用程序更新到API 23。每次我喜欢新安装的时候,我都可以在应用程序崩溃和我输入的数据消失之前使用它大约一分钟。事实如下:

  • 我一直在使用同一个Google帐户在物理设备和模拟器上进行测试,包括调试版本和已签名的APK。(日志中“签名不匹配”的可能原因。)
  • 尝试还原时,日志显示“签名不匹配”消息
  • 60秒后,日志显示
    E/BackupManagerService:Timeout还原应用程序…
  • 然后该应用程序被强制终止,我看到很多关于
    clear data
    clear datareceiver
    的条目,然后是
    AccountUtils:Clearing selected account for[package]
为什么会这样?是因为签名不匹配吗?为什么操作系统仅仅因为恢复失败就清除用户的数据

我的清单中的备份配置:

<application
    android:name=".MyApplication"
    android:allowBackup="true"
    android:backupAgent="MyBackupAgent"
    android:fullBackupContent="@xml/mybackupscheme"
相关LogCat(过滤提及的包,可以提供更多)

更新 我学到了一些东西

  • 首先,如果恢复操作失败,应用程序数据将被清除,应用程序将被关闭。(有关还原操作,请参见
    agentErrorCleanup
    handleTimeout()
  • 其次,
    MyBackupAgent
    中的任何方法都没有被调用(调试日志没有被写入,也没有在断点处停止)。换句话说,我似乎没有办法处理这个问题
所以如果签名不匹配,这是我们应该期待的吗?我想这不应该发生在生产中,所以也许可以


更新2:如果应用程序的备份版本大于刚安装的版本,也会发生此情况。同样,这不应该发生在生产环境中,但仍然有点难看。

问题是,如果查看BackupManagerService代码,恢复超时为60秒

如果恢复时间超过60秒,则会失败

未调用MyBackupAgent中的方法,因为它们是另一个进程的一部分。调试代码的方法是记录消息(log.v)

遇到同样的问题,尝试解压缩1MB文件时,我的恢复也超时了。我找到的解决方案是将文件解压缩移动到onRestore之外

因此,让您的onRestore尽可能精简

class BackupManagerService extends IBackupManager.Stub {
    ...


    // Timeout interval for deciding that a bind or clear-data has taken too long
    static final long TIMEOUT_INTERVAL = 10 * 1000;
    // Timeout intervals for agent backup & restore operations
    static final long TIMEOUT_BACKUP_INTERVAL = 30 * 1000;
    static final long TIMEOUT_RESTORE_INTERVAL = 60 * 1000;
public class MyBackupAgent extends BackupAgentHelper {

    @Override
    public void onCreate(){
        Log.d("MyApp.MyBakAgent", "onCreate called");

        FileBackupHelper myDb = new FileBackupHelper(this, "../databases/" + DBAdapter.DATABASE_NAME);
        addHelper(DBAdapter.DATABASE_NAME, myDb); 
    }

    @Override
    public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
         ParcelFileDescriptor newState) throws IOException {
        Log.d("MyApp.MyBacAgent", "onBackup called");
            synchronized (DBAdapter.dbBackupLockObject) {
                    super.onBackup(oldState, data, newState);
            }
    }

    @Override
    public void onRestore(BackupDataInput data, int appVersionCode,
                    ParcelFileDescriptor newState) throws IOException {
            Log.d("MyApp.MyBakAgent", "onRestore called with version " + String.valueOf(appVersionCode));
            synchronized (DBAdapter.dbBackupLockObject) {
                   try {
                       super.onRestore(data, appVersionCode, newState);
                   } catch (Exception ex){
                       ex.printStackTrace();
                   }
            }
    }
}
01-11 21:37:10.881 3588-3588/? D/RCPManagerService: App Installed with packageNAme = com.NSouth.NSouthApp
01-11 21:37:11.311 3588-3588/? D/BackupManagerService: Received broadcast Intent { act=android.intent.action.PACKAGE_ADDED dat=package:com.NSouth.NSouthApp flg=0x4000010 (has extras) }
01-11 21:37:11.311 3588-3588/? D/BackupManagerService: Now staging backup of com.NSouth.NSouthApp
01-11 21:37:11.331 3588-3588/? V/EnterpriseBillingPolicyStorage: getBillingProfileForVpnEngine - start - com.NSouth.NSouthApp
01-11 21:37:11.391 3588-3588/? D/KnoxMUMContainerPolicy: packageInstalledForExternalStorage com.NSouth.NSouthApp

. . .

01-11 21:38:10.241 3588-4061/? E/BackupManagerService: Timeout restoring application com.NSouth.NSouthApp
01-11 21:38:10.251 3588-4061/? V/ApplicationPolicy: isApplicationStateBlocked userId 0 pkgname com.NSouth.NSouthApp
01-11 21:38:10.251 3588-4061/? I/ActivityManager: Force stopping com.NSouth.NSouthApp appid=10459 user=0: clear data
01-11 21:38:10.251 3588-4061/? I/ActivityManager: Killing 19562:com.NSouth.NSouthApp/u0a459 (adj 0): stop com.NSouth.NSouthApp cause clear data
01-11 21:38:10.261 3588-4061/? W/ActivityManager: Force removing ActivityRecord{3f90827e u0 com.NSouth.NSouthApp/.Activity_Course t12626}: app died, no saved state
01-11 21:38:10.261 3588-4061/? V/ApplicationPolicy: isApplicationStateBlocked userId 0 pkgname com.NSouth.NSouthApp
01-11 21:38:10.261 3588-4061/? V/ApplicationPolicy: isApplicationStateBlocked userId 0 pkgname com.NSouth.NSouthApp
01-11 21:38:10.291 3588-4061/? I/ActivityManager:   Force finishing activity 3 ActivityRecord{3a98b6d4 u0 com.NSouth.NSouthApp/.Activity_Main t12626}
01-11 21:38:10.291 3588-4061/? V/ApplicationPolicy: isApplicationStateBlocked userId 0 pkgname com.NSouth.NSouthApp
01-11 21:38:10.311 3588-4061/? I/ActivityManager: Force stopping com.NSouth.NSouthApp appid=10459 user=0: clear data
01-11 21:38:10.311 3588-4061/? I/ActivityManager:   Force finishing activity 3 ActivityRecord{3a98b6d4 u0 com.NSouth.NSouthApp/.Activity_Main t12626 f}
01-11 21:38:10.311 3588-4061/? W/ActivityManager: Duplicate finish request for ActivityRecord{3a98b6d4 u0 com.NSouth.NSouthApp/.Activity_Main t12626 f}
01-11 21:38:10.321 3588-4061/? V/ApplicationPolicy: isApplicationStateBlocked userId 0 pkgname com.NSouth.NSouthApp
01-11 21:38:10.321 3588-4061/? V/ApplicationPolicy: isApplicationStateBlocked userId 0 pkgname com.NSouth.NSouthApp
01-11 21:38:10.461 3588-4343/? I/WindowState: WIN DEATH: Window{1847ccd8 u0 d0 com.NSouth.NSouthApp/com.NSouth.NSouthApp.Activity_Main}
01-11 21:38:10.531 3588-3784/? E/WindowState: getStack: Window{2ed8de84 u0 d0 com.NSouth.NSouthApp/com.NSouth.NSouthApp.Activity_AddCourse} couldn't find taskId=12626 Callers=com.android.server.wm.WindowState.getDisplayContent:1246 com.android.server.wm.WindowState.isDefaultDisplay:1936 com.android.server.wm.WindowState.getMultiWindowStyleLw:2520 com.android.internal.policy.impl.multiwindow.MultiPhoneWindowManager.shouldEnableLayoutInsetsBySoftInput:1601 
01-11 21:38:10.531 3588-3784/? E/WindowState: getStack: Window{2ed8de84 u0 d0 com.NSouth.NSouthApp/com.NSouth.NSouthApp.Activity_AddCourse} couldn't find taskId=12626 Callers=com.android.server.wm.WindowState.getDisplayContent:1246 com.android.server.wm.WindowState.isDefaultDisplay:1936 com.android.server.wm.WindowState.getMultiWindowStyleLw:2520 com.android.internal.policy.impl.multiwindow.MultiPhoneWindowManager.shouldEnableLayoutInsetsBySoftInput:1601 
01-11 21:38:10.711 20089-20089/? I/ClearDataReceiver: [#DCM#] Intent Data: package:com.NSouth.NSouthApp
01-11 21:38:10.781 20089-20089/? I/ClearDataReceiver: [#DCM#] Intent Data: package:com.NSouth.NSouthApp
01-11 21:38:10.821 3588-3784/? E/WindowState: getStack: Window{2ed8de84 u0 d0 com.NSouth.NSouthApp/com.NSouth.NSouthApp.Activity_AddCourse} couldn't find taskId=12626 Callers=com.android.server.wm.WindowState.getDisplayContent:1246 com.android.server.wm.WindowState.isDefaultDisplay:1936 com.android.server.wm.WindowState.getMultiWindowStyleLw:2520 com.android.internal.policy.impl.multiwindow.MultiPhoneWindowManager.shouldEnableLayoutInsetsBySoftInput:1601 
01-11 21:38:10.821 3588-3784/? E/WindowState: getStack: Window{2ed8de84 u0 d0 com.NSouth.NSouthApp/com.NSouth.NSouthApp.Activity_AddCourse} couldn't find taskId=12626 Callers=com.android.server.wm.WindowState.getDisplayContent:1246 com.android.server.wm.WindowState.isDefaultDisplay:1936 com.android.server.wm.WindowState.getMultiWindowStyleLw:2520 com.android.internal.policy.impl.multiwindow.MultiPhoneWindowManager.shouldEnableLayoutInsetsBySoftInput:1601 
01-11 21:38:11.211 20089-20089/? I/ClearDataReceiver: [#DCM#] Intent Data: package:com.NSouth.NSouthApp
01-11 21:38:11.251 16844-20183/? D/PackageBroadcastService: Received broadcast action=android.intent.action.PACKAGE_DATA_CLEARED and uri=com.NSouth.NSouthApp
01-11 21:38:11.261 16844-20183/? D/AccountUtils: Clearing selected account for com.NSouth.NSouthApp
01-11 21:38:11.291 16844-20183/? I/LocationSettingsChecker: Removing dialog suppression flag for package com.NSouth.NSouthApp
01-11 21:38:11.311 16844-17661/? I/Icing: doRemovePackageData com.NSouth.NSouthApp
class BackupManagerService extends IBackupManager.Stub {
    ...


    // Timeout interval for deciding that a bind or clear-data has taken too long
    static final long TIMEOUT_INTERVAL = 10 * 1000;
    // Timeout intervals for agent backup & restore operations
    static final long TIMEOUT_BACKUP_INTERVAL = 30 * 1000;
    static final long TIMEOUT_RESTORE_INTERVAL = 60 * 1000;