From f8cefdec4b8d94174158775e39d018af24fe5b67 Mon Sep 17 00:00:00 2001 From: Anton Philippov Date: Wed, 11 Apr 2018 14:41:58 +0100 Subject: [PATCH] Pass app version to agent in adb restore for kv. This is a temporary solution for P to unblock GTS tests. Bug: 77852250 Test: manual: 1. adb backup -f saved-wifi-api100.ab -keyvalue com.android.providers.settings 2. adb restore saved-wifi-api100.ab 3. See that SettingsBackupAgent receives appVersionCode in onRestore() Change-Id: I6092bea570e7e27cb5b72165e9284ad2befc21b6 --- .../server/backup/KeyValueAdbRestoreEngine.java | 11 +++++------ .../server/backup/restore/PerformAdbRestoreTask.java | 6 ++++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java b/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java index a2de8e7372d05..fbec5cb22af2e 100644 --- a/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java +++ b/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java @@ -64,8 +64,7 @@ public class KeyValueAdbRestoreEngine implements Runnable { try { File restoreData = prepareRestoreData(mInfo, mInFD); - // TODO: version ? - invokeAgentForAdbRestore(mAgent, mInfo, restoreData, 0); + invokeAgentForAdbRestore(mAgent, mInfo, restoreData); } catch (IOException e) { e.printStackTrace(); } @@ -83,8 +82,8 @@ public class KeyValueAdbRestoreEngine implements Runnable { return sortedDataName; } - private void invokeAgentForAdbRestore(IBackupAgent agent, FileMetadata info, File restoreData, - int versionCode) throws IOException { + private void invokeAgentForAdbRestore(IBackupAgent agent, FileMetadata info, File restoreData) + throws IOException { String pkg = info.packageName; File newStateName = new File(mDataDir, pkg + ".new"); try { @@ -95,9 +94,9 @@ public class KeyValueAdbRestoreEngine implements Runnable { if (DEBUG) { Slog.i(TAG, "Starting restore of package " + pkg + " for version code " - + versionCode); + + info.version); } - agent.doRestore(backupData, versionCode, newState, mToken, + agent.doRestore(backupData, info.version, newState, mToken, mBackupManagerService.getBackupManagerBinder()); } catch (IOException e) { Slog.e(TAG, "Exception opening file. " + e); diff --git a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java index 77163d348e1cd..0c99b4400dd6e 100644 --- a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java +++ b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java @@ -99,6 +99,7 @@ public class PerformAdbRestoreTask implements Runnable { private FullBackupObbConnection mObbConnection = null; private ParcelFileDescriptor[] mPipes = null; private byte[] mWidgetData = null; + private long mAppVersion; private long mBytes; private final BackupAgentTimeoutParameters mAgentTimeoutParameters; @@ -476,6 +477,9 @@ public class PerformAdbRestoreTask implements Runnable { if (info.path.equals(BACKUP_MANIFEST_FILENAME)) { Signature[] signatures = tarBackupReader.readAppManifestAndReturnSignatures( info); + // readAppManifestAndReturnSignatures() will have extracted the version from + // the manifest, so we save it to use in key-value restore later. + mAppVersion = info.version; PackageManagerInternal pmi = LocalServices.getService( PackageManagerInternal.class); RestorePolicy restorePolicy = tarBackupReader.chooseRestorePolicy( @@ -667,6 +671,8 @@ public class PerformAdbRestoreTask implements Runnable { Slog.d(TAG, "Restoring key-value file for " + pkg + " : " + info.path); } + // Set the version saved from manifest entry. + info.version = mAppVersion; KeyValueAdbRestoreEngine restoreEngine = new KeyValueAdbRestoreEngine( mBackupManagerService,