Loading services/core/java/com/android/server/pm/PackageManagerShellCommand.java +21 −2 Original line number Original line Diff line number Diff line Loading @@ -3716,7 +3716,19 @@ class PackageManagerShellCommand extends ShellCommand { // remember to set it themselves. // remember to set it themselves. params.installerPackageName = "com.android.shell"; 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; break; case "--staged-ready-timeout": case "--staged-ready-timeout": params.stagedReadyTimeoutMs = Long.parseLong(getNextArgRequired()); params.stagedReadyTimeoutMs = Long.parseLong(getNextArgRequired()); Loading Loading @@ -3751,6 +3763,11 @@ class PackageManagerShellCommand extends ShellCommand { } else if (staged) { } else if (staged) { sessionParams.setStaged(); 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; 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(" [--install-reason 0/1/2/3/4] [--originating-uri URI]"); pw.println(" [--referrer URI] [--abi ABI_NAME] [--force-sdk]"); pw.println(" [--referrer URI] [--abi ABI_NAME] [--force-sdk]"); pw.println(" [--preload] [--instant] [--full] [--dont-kill]"); 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(" [--force-uuid internal|UUID] [--pkg PACKAGE] [-S BYTES]"); pw.println(" [--apex] [--non-staged] [--force-non-staged]"); pw.println(" [--apex] [--non-staged] [--force-non-staged]"); pw.println(" [--staged-ready-timeout TIMEOUT] [--ignore-dexopt-profile]"); 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(" --abi: override the default ABI of the platform"); pw.println(" --instant: cause the app to be installed as an ephemeral install app"); 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(" --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(" --install-location: force the install location:"); pw.println(" 0=auto, 1=internal only, 2=prefer external"); pw.println(" 0=auto, 1=internal only, 2=prefer external"); pw.println(" --install-reason: indicates why the app is being installed:"); 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 Original line Diff line number Diff line Loading @@ -187,13 +187,22 @@ executed. ### Installing an App with Rollback Enabled ### 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: with rollback enabled. For example: ``` ``` $ adb install --enable-rollback FooV2.apk $ 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 ### Triggering Rollback Manually If rollback is available for an application, the pm command can be used to 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 -state: committed -timestamp: 2019-04-23T14:57:35.944Z -timestamp: 2019-04-23T14:57:35.944Z -packages: -packages: com.android.tests.rollback.testapp.B 2 -> 1 com.android.tests.rollback.testapp.B 2 -> 1 [0] -causePackages: -causePackages: -committedSessionId: 1845805640 -committedSessionId: 1845805640 649899517: 649899517: Loading @@ -225,7 +234,7 @@ $ adb shell dumpsys rollback -timestamp: 2019-04-23T12:55:21.342Z -timestamp: 2019-04-23T12:55:21.342Z -stagedSessionId: 343374391 -stagedSessionId: 343374391 -packages: -packages: com.android.tests.rollback.testapex 2 -> 1 com.android.tests.rollback.testapex 2 -> 1 [0] -causePackages: -causePackages: -committedSessionId: 2096717281 -committedSessionId: 2096717281 ``` ``` Loading @@ -233,7 +242,8 @@ $ adb shell dumpsys rollback The example above shows two recently committed rollbacks. The update of 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 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 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 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 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 Original line Diff line number Diff line Loading @@ -967,7 +967,8 @@ class Rollback { for (PackageRollbackInfo pkg : info.getPackages()) { for (PackageRollbackInfo pkg : info.getPackages()) { ipw.println(pkg.getPackageName() ipw.println(pkg.getPackageName() + " " + pkg.getVersionRolledBackFrom().getLongVersionCode() + " " + pkg.getVersionRolledBackFrom().getLongVersionCode() + " -> " + pkg.getVersionRolledBackTo().getLongVersionCode()); + " -> " + pkg.getVersionRolledBackTo().getLongVersionCode() + " [" + pkg.getRollbackDataPolicy() + "]"); } } ipw.decreaseIndent(); ipw.decreaseIndent(); if (isCommitted()) { if (isCommitted()) { Loading Loading
services/core/java/com/android/server/pm/PackageManagerShellCommand.java +21 −2 Original line number Original line Diff line number Diff line Loading @@ -3716,7 +3716,19 @@ class PackageManagerShellCommand extends ShellCommand { // remember to set it themselves. // remember to set it themselves. params.installerPackageName = "com.android.shell"; 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; break; case "--staged-ready-timeout": case "--staged-ready-timeout": params.stagedReadyTimeoutMs = Long.parseLong(getNextArgRequired()); params.stagedReadyTimeoutMs = Long.parseLong(getNextArgRequired()); Loading Loading @@ -3751,6 +3763,11 @@ class PackageManagerShellCommand extends ShellCommand { } else if (staged) { } else if (staged) { sessionParams.setStaged(); 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; 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(" [--install-reason 0/1/2/3/4] [--originating-uri URI]"); pw.println(" [--referrer URI] [--abi ABI_NAME] [--force-sdk]"); pw.println(" [--referrer URI] [--abi ABI_NAME] [--force-sdk]"); pw.println(" [--preload] [--instant] [--full] [--dont-kill]"); 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(" [--force-uuid internal|UUID] [--pkg PACKAGE] [-S BYTES]"); pw.println(" [--apex] [--non-staged] [--force-non-staged]"); pw.println(" [--apex] [--non-staged] [--force-non-staged]"); pw.println(" [--staged-ready-timeout TIMEOUT] [--ignore-dexopt-profile]"); 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(" --abi: override the default ABI of the platform"); pw.println(" --instant: cause the app to be installed as an ephemeral install app"); 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(" --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(" --install-location: force the install location:"); pw.println(" 0=auto, 1=internal only, 2=prefer external"); pw.println(" 0=auto, 1=internal only, 2=prefer external"); pw.println(" --install-reason: indicates why the app is being installed:"); 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 Original line Diff line number Diff line Loading @@ -187,13 +187,22 @@ executed. ### Installing an App with Rollback Enabled ### 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: with rollback enabled. For example: ``` ``` $ adb install --enable-rollback FooV2.apk $ 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 ### Triggering Rollback Manually If rollback is available for an application, the pm command can be used to 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 -state: committed -timestamp: 2019-04-23T14:57:35.944Z -timestamp: 2019-04-23T14:57:35.944Z -packages: -packages: com.android.tests.rollback.testapp.B 2 -> 1 com.android.tests.rollback.testapp.B 2 -> 1 [0] -causePackages: -causePackages: -committedSessionId: 1845805640 -committedSessionId: 1845805640 649899517: 649899517: Loading @@ -225,7 +234,7 @@ $ adb shell dumpsys rollback -timestamp: 2019-04-23T12:55:21.342Z -timestamp: 2019-04-23T12:55:21.342Z -stagedSessionId: 343374391 -stagedSessionId: 343374391 -packages: -packages: com.android.tests.rollback.testapex 2 -> 1 com.android.tests.rollback.testapex 2 -> 1 [0] -causePackages: -causePackages: -committedSessionId: 2096717281 -committedSessionId: 2096717281 ``` ``` Loading @@ -233,7 +242,8 @@ $ adb shell dumpsys rollback The example above shows two recently committed rollbacks. The update of 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 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 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 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 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 Original line Diff line number Diff line Loading @@ -967,7 +967,8 @@ class Rollback { for (PackageRollbackInfo pkg : info.getPackages()) { for (PackageRollbackInfo pkg : info.getPackages()) { ipw.println(pkg.getPackageName() ipw.println(pkg.getPackageName() + " " + pkg.getVersionRolledBackFrom().getLongVersionCode() + " " + pkg.getVersionRolledBackFrom().getLongVersionCode() + " -> " + pkg.getVersionRolledBackTo().getLongVersionCode()); + " -> " + pkg.getVersionRolledBackTo().getLongVersionCode() + " [" + pkg.getRollbackDataPolicy() + "]"); } } ipw.decreaseIndent(); ipw.decreaseIndent(); if (isCommitted()) { if (isCommitted()) { Loading