diff options
| author | 2019-02-04 09:44:26 +0000 | |
|---|---|---|
| committer | 2019-02-04 09:44:26 +0000 | |
| commit | 8b5b6ea2de04dd73d1f4280f2b486df8928a9966 (patch) | |
| tree | 0756db868561c15da1a5ae4768861c3ea255165b | |
| parent | 22a4bfe2035c0cc8c05d083b92c2dc33242ad7d9 (diff) | |
| parent | f0bdca58c58ca2437549ec170d80254cc010880a (diff) | |
Merge "Factor out common code for APK and APEX backups."
| -rw-r--r-- | services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java | 93 |
1 files changed, 60 insertions, 33 deletions
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index 4c2b3c20c008..99c14c937634 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -685,30 +685,13 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { */ private boolean enableRollback(int installFlags, File newPackageCodePath, int[] installedUsers) { - if ((installFlags & PackageManager.INSTALL_INSTANT_APP) != 0) { - Log.e(TAG, "Rollbacks not supported for instant app install"); - return false; - } - if ((installFlags & PackageManager.INSTALL_APEX) != 0) { - Log.e(TAG, "Rollbacks not supported for apex install"); - return false; - } - - // Get information about the package to be installed. - PackageParser.PackageLite newPackage = null; - try { - newPackage = PackageParser.parsePackageLite(newPackageCodePath, 0); - } catch (PackageParser.PackageParserException e) { - Log.e(TAG, "Unable to parse new package", e); - return false; - } - String packageName = newPackage.packageName; - Log.i(TAG, "Enabling rollback for install of " + packageName); + // Find the session id associated with this install. + // TODO: It would be nice if package manager or package installer told + // us the session directly, rather than have to search for it + // ourselves. + PackageInstaller.SessionInfo session = null; - // Figure out the session id associated with this install. - int parentSessionId = PackageInstaller.SessionInfo.INVALID_ID; - int childSessionId = PackageInstaller.SessionInfo.INVALID_ID; PackageInstaller installer = mContext.getPackageManager().getPackageInstaller(); for (PackageInstaller.SessionInfo info : installer.getAllSessions()) { if (info.isMultiPackage()) { @@ -716,24 +699,55 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { PackageInstaller.SessionInfo child = installer.getSessionInfo(childId); if (sessionMatchesForEnableRollback(child, installFlags, newPackageCodePath)) { // TODO: Check we only have one matching session? - parentSessionId = info.getSessionId(); - childSessionId = childId; + session = child; + break; } } - } else { - if (sessionMatchesForEnableRollback(info, installFlags, newPackageCodePath)) { - // TODO: Check we only have one matching session? - parentSessionId = info.getSessionId(); - childSessionId = parentSessionId; - } + } else if (sessionMatchesForEnableRollback(info, installFlags, newPackageCodePath)) { + // TODO: Check we only have one matching session? + session = info; + break; } } - if (parentSessionId == PackageInstaller.SessionInfo.INVALID_ID) { + if (session == null) { Log.e(TAG, "Unable to find session id for enabled rollback."); return false; } + return enableRollbackForSession(session, installedUsers); + } + + /** + * Do code and userdata backups to enable rollback of the given session. + * In case of multiPackage sessions, <code>session</code> should be one of + * the child sessions, not the parent session. + */ + private boolean enableRollbackForSession(PackageInstaller.SessionInfo session, + int[] installedUsers) { + // TODO: Don't attempt to enable rollback for split installs. + final int installFlags = session.installFlags; + if ((installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) == 0) { + Log.e(TAG, "Rollback is not enabled."); + return false; + } + if ((installFlags & PackageManager.INSTALL_INSTANT_APP) != 0) { + Log.e(TAG, "Rollbacks not supported for instant app install"); + return false; + } + + // Get information about the package to be installed. + PackageParser.PackageLite newPackage = null; + try { + newPackage = PackageParser.parsePackageLite(new File(session.resolvedBaseCodePath), 0); + } catch (PackageParser.PackageParserException e) { + Log.e(TAG, "Unable to parse new package", e); + return false; + } + + String packageName = newPackage.packageName; + Log.i(TAG, "Enabling rollback for install of " + packageName); + VersionedPackage newVersion = new VersionedPackage(packageName, newPackage.versionCode); // Get information about the currently installed package. @@ -751,14 +765,27 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { VersionedPackage installedVersion = new VersionedPackage(packageName, pkgInfo.getLongVersionCode()); - final IntArray pendingBackups = mUserdataHelper.snapshotAppData(packageName, - installedUsers); + final boolean isApex = ((installFlags & PackageManager.INSTALL_APEX) != 0); + final IntArray pendingBackups; + if (isApex) { + pendingBackups = IntArray.wrap(new int[0]); + } else { + pendingBackups = mUserdataHelper.snapshotAppData(packageName, installedUsers); + } + // TODO: Record if this is an apex or not. PackageRollbackInfo info = new PackageRollbackInfo(newVersion, installedVersion, pendingBackups, new ArrayList<>()); RollbackData data; try { + int childSessionId = session.getSessionId(); + int parentSessionId = session.getParentSessionId(); + if (parentSessionId == PackageInstaller.SessionInfo.INVALID_ID) { + parentSessionId = childSessionId; + } synchronized (mLock) { + // TODO: no need to add to mChildSessions if childSessionId is + // the same as parentSessionId. mChildSessions.put(childSessionId, parentSessionId); data = mPendingRollbacks.get(parentSessionId); if (data == null) { |