diff options
3 files changed, 37 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 88dc60c3f70f..bdde272cc46f 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -3716,7 +3716,19 @@ class PackageManagerShellCommand extends ShellCommand { // remember to set it themselves. params.installerPackageName = "com.android.shell"; } - sessionParams.installFlags |= PackageManager.INSTALL_ENABLE_ROLLBACK; + int rollbackStrategy = PackageManager.ROLLBACK_DATA_POLICY_RESTORE; + try { + rollbackStrategy = Integer.parseInt(peekNextArg()); + if (rollbackStrategy < PackageManager.ROLLBACK_DATA_POLICY_RESTORE + || rollbackStrategy > PackageManager.ROLLBACK_DATA_POLICY_RETAIN) { + throw new IllegalArgumentException( + rollbackStrategy + " is not a valid rollback data policy."); + } + getNextArg(); // pop the argument + } catch (NumberFormatException e) { + // not followed by a number assume ROLLBACK_DATA_POLICY_RESTORE. + } + sessionParams.setEnableRollback(true, rollbackStrategy); break; case "--staged-ready-timeout": params.stagedReadyTimeoutMs = Long.parseLong(getNextArgRequired()); @@ -3751,6 +3763,11 @@ class PackageManagerShellCommand extends ShellCommand { } else if (staged) { sessionParams.setStaged(); } + if ((sessionParams.installFlags & PackageManager.INSTALL_APEX) != 0 + && (sessionParams.installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) != 0 + && sessionParams.rollbackDataPolicy == PackageManager.ROLLBACK_DATA_POLICY_WIPE) { + throw new IllegalArgumentException("Data policy 'wipe' is not supported for apex."); + } return params; } @@ -4829,7 +4846,7 @@ class PackageManagerShellCommand extends ShellCommand { pw.println(" [--install-reason 0/1/2/3/4] [--originating-uri URI]"); pw.println(" [--referrer URI] [--abi ABI_NAME] [--force-sdk]"); pw.println(" [--preload] [--instant] [--full] [--dont-kill]"); - pw.println(" [--enable-rollback]"); + pw.println(" [--enable-rollback [0/1/2]]"); pw.println(" [--force-uuid internal|UUID] [--pkg PACKAGE] [-S BYTES]"); pw.println(" [--apex] [--non-staged] [--force-non-staged]"); pw.println(" [--staged-ready-timeout TIMEOUT] [--ignore-dexopt-profile]"); @@ -4853,6 +4870,8 @@ class PackageManagerShellCommand extends ShellCommand { pw.println(" --abi: override the default ABI of the platform"); pw.println(" --instant: cause the app to be installed as an ephemeral install app"); pw.println(" --full: cause the app to be installed as a non-ephemeral full app"); + pw.println(" --enable-rollback: enable rollbacks for the upgrade."); + pw.println(" 0=restore (default), 1=wipe, 2=retain"); pw.println(" --install-location: force the install location:"); pw.println(" 0=auto, 1=internal only, 2=prefer external"); pw.println(" --install-reason: indicates why the app is being installed:"); diff --git a/services/core/java/com/android/server/rollback/README.md b/services/core/java/com/android/server/rollback/README.md index 08800dada564..f6bcbd057307 100644 --- a/services/core/java/com/android/server/rollback/README.md +++ b/services/core/java/com/android/server/rollback/README.md @@ -187,13 +187,22 @@ executed. ### Installing an App with Rollback Enabled -The `adb install` command accepts the `--enable-rollback` flag to install an app +The `adb install` command accepts the `--enable-rollback [0/1/2]` flag to install an app with rollback enabled. For example: ``` $ adb install --enable-rollback FooV2.apk ``` +The default rollback data policy is `ROLLBACK_DATA_POLICY_RESTORE` (0). To use +a different `RollbackDataPolicy`, like `ROLLBACK_DATA_POLICY_RETAIN` (1) or +`ROLLBACK_DATA_POLICY_WIPE` (2), provide the int value after +`--enable-rollback`. For example: + +``` +$ adb install --enable-rollback 1 FooV2.apk +``` + ### Triggering Rollback Manually If rollback is available for an application, the pm command can be used to @@ -217,7 +226,7 @@ $ adb shell dumpsys rollback -state: committed -timestamp: 2019-04-23T14:57:35.944Z -packages: - com.android.tests.rollback.testapp.B 2 -> 1 + com.android.tests.rollback.testapp.B 2 -> 1 [0] -causePackages: -committedSessionId: 1845805640 649899517: @@ -225,7 +234,7 @@ $ adb shell dumpsys rollback -timestamp: 2019-04-23T12:55:21.342Z -stagedSessionId: 343374391 -packages: - com.android.tests.rollback.testapex 2 -> 1 + com.android.tests.rollback.testapex 2 -> 1 [0] -causePackages: -committedSessionId: 2096717281 ``` @@ -233,7 +242,8 @@ $ adb shell dumpsys rollback The example above shows two recently committed rollbacks. The update of com.android.tests.rollback.testapp.B from version 1 to version 2 was rolled back, and the update of com.android.tests.rollback.testapex from version 1 to -version 2 was rolled back. +version 2 was rolled back. For each package the value inside '[' and ']' +indicates the `RollbackDataPolicy` for the rollback back. The state is 'available' or 'committed'. The timestamp gives the time when the rollback was first made available. If a stagedSessionId is present, then the diff --git a/services/core/java/com/android/server/rollback/Rollback.java b/services/core/java/com/android/server/rollback/Rollback.java index a580bb7c741a..d1f91c89a04e 100644 --- a/services/core/java/com/android/server/rollback/Rollback.java +++ b/services/core/java/com/android/server/rollback/Rollback.java @@ -967,7 +967,8 @@ class Rollback { for (PackageRollbackInfo pkg : info.getPackages()) { ipw.println(pkg.getPackageName() + " " + pkg.getVersionRolledBackFrom().getLongVersionCode() - + " -> " + pkg.getVersionRolledBackTo().getLongVersionCode()); + + " -> " + pkg.getVersionRolledBackTo().getLongVersionCode() + + " [" + pkg.getRollbackDataPolicy() + "]"); } ipw.decreaseIndent(); if (isCommitted()) { |