From ddc2536d2b6f277a7828278a066be874e4f9502e Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Thu, 20 Aug 2015 12:30:50 -0700 Subject: Make sure to kill restore-at-install full-data targets after restore Specifically: correctly distinguish the "I want to restore my own data" case, in which the app is intentionally not killed, from the single-package restore at install operation. Bug 23357388 Change-Id: Ic50ac39fe942af1f6ec9e04a32d81a39b70a0b2b --- .../server/backup/BackupManagerService.java | 46 ++++++++++++++-------- 1 file changed, 30 insertions(+), 16 deletions(-) (limited to 'services/backup') diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index 8d9c965..7c74a30 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -401,21 +401,40 @@ public class BackupManagerService { public boolean isSystemRestore; public String[] filterSet; - // Restore a single package + /** + * Restore a single package; no kill after restore + */ RestoreParams(IBackupTransport _transport, String _dirName, IRestoreObserver _obs, - long _token, PackageInfo _pkg, int _pmToken) { + long _token, PackageInfo _pkg) { transport = _transport; dirName = _dirName; observer = _obs; token = _token; pkgInfo = _pkg; - pmToken = _pmToken; + pmToken = 0; isSystemRestore = false; filterSet = null; } - // Restore everything possible. This is the form that Setup Wizard or similar - // restore UXes use. + /** + * Restore at install: PM token needed, kill after restore + */ + RestoreParams(IBackupTransport _transport, String _dirName, IRestoreObserver _obs, + long _token, String _pkgName, int _pmToken) { + transport = _transport; + dirName = _dirName; + observer = _obs; + token = _token; + pkgInfo = null; + pmToken = _pmToken; + isSystemRestore = false; + filterSet = new String[] { _pkgName }; + } + + /** + * Restore everything possible. This is the form that Setup Wizard or similar + * restore UXes use. + */ RestoreParams(IBackupTransport _transport, String _dirName, IRestoreObserver _obs, long _token) { transport = _transport; @@ -428,8 +447,10 @@ public class BackupManagerService { filterSet = null; } - // Restore some set of packages. Leave this one up to the caller to specify - // whether it's to be considered a system-level restore. + /** + * Restore some set of packages. Leave this one up to the caller to specify + * whether it's to be considered a system-level restore. + */ RestoreParams(IBackupTransport _transport, String _dirName, IRestoreObserver _obs, long _token, String[] _filterSet, boolean _isSystemRestore) { transport = _transport; @@ -9136,19 +9157,13 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF // This can throw and so *must* happen before the wakelock is acquired String dirName = transport.transportDirName(); - // We can use a synthetic PackageInfo here because: - // 1. We know it's valid, since the Package Manager supplied the name - // 2. Only the packageName field will be used by the restore code - PackageInfo pkg = new PackageInfo(); - pkg.packageName = packageName; - mWakelock.acquire(); if (MORE_DEBUG) { Slog.d(TAG, "Restore at install of " + packageName); } Message msg = mBackupHandler.obtainMessage(MSG_RUN_RESTORE); msg.obj = new RestoreParams(transport, dirName, null, - restoreSet, pkg, token); + restoreSet, packageName, token); mBackupHandler.sendMessage(msg); } catch (RemoteException e) { // Binding to the transport broke; back off and proceed with the installation. @@ -9527,8 +9542,7 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF Slog.d(TAG, "restorePackage() : " + packageName); } Message msg = mBackupHandler.obtainMessage(MSG_RUN_RESTORE); - msg.obj = new RestoreParams(mRestoreTransport, dirName, - observer, token, app, 0); + msg.obj = new RestoreParams(mRestoreTransport, dirName, observer, token, app); mBackupHandler.sendMessage(msg); } finally { Binder.restoreCallingIdentity(oldId); -- cgit v1.1