Loading services/core/java/com/android/server/pm/PackageManagerShellCommand.java +21 −2 Original line number Diff line number Diff line Loading @@ -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()); Loading Loading @@ -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; } Loading Loading @@ -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]"); Loading @@ -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:"); Loading services/core/java/com/android/server/rollback/README.md +14 −4 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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: Loading @@ -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 ``` Loading @@ -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 Loading services/core/java/com/android/server/rollback/Rollback.java +2 −1 Original line number Diff line number Diff line Loading @@ -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()) { Loading Loading
services/core/java/com/android/server/pm/PackageManagerShellCommand.java +21 −2 Original line number Diff line number Diff line Loading @@ -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()); Loading Loading @@ -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; } Loading Loading @@ -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]"); Loading @@ -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:"); Loading
services/core/java/com/android/server/rollback/README.md +14 −4 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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: Loading @@ -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 ``` Loading @@ -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 Loading
services/core/java/com/android/server/rollback/Rollback.java +2 −1 Original line number Diff line number Diff line Loading @@ -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()) { Loading