Skip to content

Commit bbff7ed

Browse files
author
Chris Tate
committed
DO NOT MERGE : Ensure that the first post-restore backup pass is correct
Some restore passes bring an ancestral dataset to the application, but others instead act to bring an app back into sync with its own most- recently-saved data. In the latter case the state file written by the app after the restore is a correct basis for generating future backup deltas, but in the former case it is not. The app should not be required to distinguish between these cases; the framework has all the information necessary to handle the saved state correctly following any flavor of restore operation. This patch makes the Backup Manager properly cause a full backup pass following an ancestral-dataset restore. After a current-set restore the saved state file is an accurate description for purposes of continued backup operations, so is preserved. (Cherrypick from master to gingerbread) Change-Id: I4bc4e8782a168ecc0795107a340bdbb35060730e
1 parent 6ec9173 commit bbff7ed

File tree

1 file changed

+29
-10
lines changed

1 file changed

+29
-10
lines changed

services/java/com/android/server/BackupManagerService.java

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -198,22 +198,26 @@ class RestoreParams {
198198
public long token;
199199
public PackageInfo pkgInfo;
200200
public int pmToken; // in post-install restore, the PM's token for this transaction
201+
public boolean needFullBackup;
201202

202203
RestoreParams(IBackupTransport _transport, IRestoreObserver _obs,
203-
long _token, PackageInfo _pkg, int _pmToken) {
204+
long _token, PackageInfo _pkg, int _pmToken, boolean _needFullBackup) {
204205
transport = _transport;
205206
observer = _obs;
206207
token = _token;
207208
pkgInfo = _pkg;
208209
pmToken = _pmToken;
210+
needFullBackup = _needFullBackup;
209211
}
210212

211-
RestoreParams(IBackupTransport _transport, IRestoreObserver _obs, long _token) {
213+
RestoreParams(IBackupTransport _transport, IRestoreObserver _obs, long _token,
214+
boolean _needFullBackup) {
212215
transport = _transport;
213216
observer = _obs;
214217
token = _token;
215218
pkgInfo = null;
216219
pmToken = 0;
220+
needFullBackup = _needFullBackup;
217221
}
218222
}
219223

@@ -323,7 +327,8 @@ public void handleMessage(Message msg) {
323327
RestoreParams params = (RestoreParams)msg.obj;
324328
Slog.d(TAG, "MSG_RUN_RESTORE observer=" + params.observer);
325329
(new PerformRestoreTask(params.transport, params.observer,
326-
params.token, params.pkgInfo, params.pmToken)).run();
330+
params.token, params.pkgInfo, params.pmToken,
331+
params.needFullBackup)).run();
327332
break;
328333
}
329334

@@ -1559,6 +1564,7 @@ class PerformRestoreTask implements Runnable {
15591564
private PackageInfo mTargetPackage;
15601565
private File mStateDir;
15611566
private int mPmToken;
1567+
private boolean mNeedFullBackup;
15621568

15631569
class RestoreRequest {
15641570
public PackageInfo app;
@@ -1571,12 +1577,14 @@ class RestoreRequest {
15711577
}
15721578

15731579
PerformRestoreTask(IBackupTransport transport, IRestoreObserver observer,
1574-
long restoreSetToken, PackageInfo targetPackage, int pmToken) {
1580+
long restoreSetToken, PackageInfo targetPackage, int pmToken,
1581+
boolean needFullBackup) {
15751582
mTransport = transport;
15761583
mObserver = observer;
15771584
mToken = restoreSetToken;
15781585
mTargetPackage = targetPackage;
15791586
mPmToken = pmToken;
1587+
mNeedFullBackup = needFullBackup;
15801588

15811589
try {
15821590
mStateDir = new File(mBaseStateDir, transport.transportDirName());
@@ -1654,7 +1662,8 @@ public void run() {
16541662
// Pull the Package Manager metadata from the restore set first
16551663
pmAgent = new PackageManagerBackupAgent(
16561664
mPackageManager, agentPackages);
1657-
processOneRestore(omPackage, 0, IBackupAgent.Stub.asInterface(pmAgent.onBind()));
1665+
processOneRestore(omPackage, 0, IBackupAgent.Stub.asInterface(pmAgent.onBind()),
1666+
mNeedFullBackup);
16581667

16591668
// Verify that the backup set includes metadata. If not, we can't do
16601669
// signature/version verification etc, so we simply do not proceed with
@@ -1751,7 +1760,8 @@ public void run() {
17511760

17521761
// And then finally run the restore on this agent
17531762
try {
1754-
processOneRestore(packageInfo, metaInfo.versionCode, agent);
1763+
processOneRestore(packageInfo, metaInfo.versionCode, agent,
1764+
mNeedFullBackup);
17551765
++count;
17561766
} finally {
17571767
// unbind and tidy up even on timeout or failure, just in case
@@ -1821,7 +1831,8 @@ public void run() {
18211831
}
18221832

18231833
// Do the guts of a restore of one application, using mTransport.getRestoreData().
1824-
void processOneRestore(PackageInfo app, int appVersionCode, IBackupAgent agent) {
1834+
void processOneRestore(PackageInfo app, int appVersionCode, IBackupAgent agent,
1835+
boolean needFullBackup) {
18251836
// !!! TODO: actually run the restore through mTransport
18261837
final String packageName = app.packageName;
18271838

@@ -1900,6 +1911,14 @@ void processOneRestore(PackageInfo app, int appVersionCode, IBackupAgent agent)
19001911
try { if (newState != null) newState.close(); } catch (IOException e) {}
19011912
backupData = newState = null;
19021913
mCurrentOperations.delete(token);
1914+
1915+
// If we know a priori that we'll need to perform a full post-restore backup
1916+
// pass, clear the new state file data. This means we're discarding work that
1917+
// was just done by the app's agent, but this way the agent doesn't need to
1918+
// take any special action based on global device state.
1919+
if (needFullBackup) {
1920+
newStateName.delete();
1921+
}
19031922
}
19041923
}
19051924
}
@@ -2385,7 +2404,7 @@ public void restoreAtInstall(String packageName, int token) {
23852404
mWakelock.acquire();
23862405
Message msg = mBackupHandler.obtainMessage(MSG_RUN_RESTORE);
23872406
msg.obj = new RestoreParams(getTransport(mCurrentTransport), null,
2388-
restoreSet, pkg, token);
2407+
restoreSet, pkg, token, true);
23892408
mBackupHandler.sendMessage(msg);
23902409
} else {
23912410
// Auto-restore disabled or no way to attempt a restore; just tell the Package
@@ -2516,7 +2535,7 @@ public synchronized int restoreAll(long token, IRestoreObserver observer) {
25162535
long oldId = Binder.clearCallingIdentity();
25172536
mWakelock.acquire();
25182537
Message msg = mBackupHandler.obtainMessage(MSG_RUN_RESTORE);
2519-
msg.obj = new RestoreParams(mRestoreTransport, observer, token);
2538+
msg.obj = new RestoreParams(mRestoreTransport, observer, token, true);
25202539
mBackupHandler.sendMessage(msg);
25212540
Binder.restoreCallingIdentity(oldId);
25222541
return 0;
@@ -2581,7 +2600,7 @@ public synchronized int restorePackage(String packageName, IRestoreObserver obse
25812600
long oldId = Binder.clearCallingIdentity();
25822601
mWakelock.acquire();
25832602
Message msg = mBackupHandler.obtainMessage(MSG_RUN_RESTORE);
2584-
msg.obj = new RestoreParams(mRestoreTransport, observer, token, app, 0);
2603+
msg.obj = new RestoreParams(mRestoreTransport, observer, token, app, 0, false);
25852604
mBackupHandler.sendMessage(msg);
25862605
Binder.restoreCallingIdentity(oldId);
25872606
return 0;

0 commit comments

Comments
 (0)