Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b51a8072 authored by Adam Metcalf's avatar Adam Metcalf Committed by Android (Google) Code Review
Browse files

Merge "Add RollbackDataPolicy to pm install --enable-rollback command." into main

parents 3035e0bb 35769292
Loading
Loading
Loading
Loading
+21 −2
Original line number Original line Diff line number Diff line
@@ -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());
@@ -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;
    }
    }


@@ -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]");
@@ -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:");
+14 −4
Original line number Original line Diff line number Diff line
@@ -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
@@ -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:
@@ -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
```
```
@@ -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
+2 −1
Original line number Original line Diff line number Diff line
@@ -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()) {