Add rollback data policy (1/n)

1. Do the plumbing to pass the data policy all the way to
   SessionInfo.
2. SessionInfo#rollbackDataPolicy will be used by RollbackManager to
   determine whether to wipe user data when enabling/committing
   rollback.

Bug: 144683152
Test: atest RollbackStoreTest RollbackUnitTest AppDataRollbackHelperTest
Test: atest RollbackTest StagedRollbackTest

Change-Id: Ie1e5457d0304f9cf8fc34fce17d707be75407a2b
This commit is contained in:
JW Wang
2019-12-05 18:00:06 +08:00
parent 195a4f72c6
commit 0bb6808121
5 changed files with 80 additions and 1 deletions

View File

@@ -2042,6 +2042,7 @@ package android.content.pm {
method public boolean getInstallAsInstantApp(boolean);
method public boolean getInstallAsVirtualPreload();
method public boolean getRequestDowngrade();
method public int getRollbackDataPolicy();
method @NonNull public java.util.Set<java.lang.String> getWhitelistedRestrictedPermissions();
}
@@ -2050,6 +2051,7 @@ package android.content.pm {
method @Deprecated public void setAllowDowngrade(boolean);
method public void setDontKillApp(boolean);
method public void setEnableRollback(boolean);
method public void setEnableRollback(boolean, int);
method @RequiresPermission(android.Manifest.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS) public void setGrantedRuntimePermissions(String[]);
method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setIncrementalParams(@NonNull android.content.pm.DataLoaderParams);
method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setInstallAsApex();

View File

@@ -778,11 +778,13 @@ package android.content.pm {
}
public static class PackageInstaller.SessionInfo implements android.os.Parcelable {
method public int getRollbackDataPolicy();
method @NonNull public java.util.Set<java.lang.String> getWhitelistedRestrictedPermissions();
}
public static class PackageInstaller.SessionParams implements android.os.Parcelable {
method public void setEnableRollback(boolean);
method public void setEnableRollback(boolean, int);
method @RequiresPermission("android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS") public void setGrantedRuntimePermissions(String[]);
method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setInstallAsApex();
method public void setInstallerPackageName(@Nullable String);

View File

@@ -1465,6 +1465,8 @@ public class PackageInstaller {
/** TODO(b/146080380): add a class name to make it fully compatible with ComponentName.
* {@hide} */
public String dataLoaderPackageName;
/** {@hide} */
public int rollbackDataPolicy = PackageManager.RollbackDataPolicy.RESTORE;
/**
* Construct parameters for a new package install session.
@@ -1505,6 +1507,7 @@ public class PackageInstaller {
dataLoaderParamsParcel);
}
dataLoaderPackageName = source.readString();
rollbackDataPolicy = source.readInt();
}
/** {@hide} */
@@ -1530,6 +1533,7 @@ public class PackageInstaller {
ret.requiredInstalledVersionCode = requiredInstalledVersionCode;
ret.incrementalParams = incrementalParams;
ret.dataLoaderPackageName = dataLoaderPackageName;
ret.rollbackDataPolicy = rollbackDataPolicy;
return ret;
}
@@ -1686,12 +1690,14 @@ public class PackageInstaller {
}
/**
* Request that rollbacks be enabled or disabled for the given upgrade.
* Request that rollbacks be enabled or disabled for the given upgrade with rollback data
* policy set to RESTORE.
*
* <p>If the parent session is staged or has rollback enabled, all children sessions
* must have the same properties.
*
* @param enable set to {@code true} to enable, {@code false} to disable
* @see SessionParams#setEnableRollback(boolean, int)
* @hide
*/
@SystemApi @TestApi
@@ -1701,8 +1707,35 @@ public class PackageInstaller {
} else {
installFlags &= ~PackageManager.INSTALL_ENABLE_ROLLBACK;
}
rollbackDataPolicy = PackageManager.RollbackDataPolicy.RESTORE;
}
/**
* Request that rollbacks be enabled or disabled for the given upgrade.
*
* <p>If the parent session is staged or has rollback enabled, all children sessions
* must have the same properties.
*
* <p> For a multi-package install, this method must be called on each child session to
* specify rollback data policies explicitly. Note each child session is allowed to have
* different policies.
*
* @param enable set to {@code true} to enable, {@code false} to disable
* @param dataPolicy the rollback data policy for this session
* @hide
*/
@SystemApi @TestApi
public void setEnableRollback(boolean enable,
@PackageManager.RollbackDataPolicy int dataPolicy) {
if (enable) {
installFlags |= PackageManager.INSTALL_ENABLE_ROLLBACK;
} else {
installFlags &= ~PackageManager.INSTALL_ENABLE_ROLLBACK;
}
rollbackDataPolicy = dataPolicy;
}
/**
* @deprecated use {@link #setRequestDowngrade(boolean)}.
* {@hide}
@@ -1906,6 +1939,7 @@ public class PackageInstaller {
pw.printPair("isStaged", isStaged);
pw.printPair("requiredInstalledVersionCode", requiredInstalledVersionCode);
pw.printPair("dataLoaderPackageName", dataLoaderPackageName);
pw.printPair("rollbackDataPolicy", rollbackDataPolicy);
pw.println();
}
@@ -1941,6 +1975,7 @@ public class PackageInstaller {
dest.writeParcelable(null, flags);
}
dest.writeString(dataLoaderPackageName);
dest.writeInt(rollbackDataPolicy);
}
public static final Parcelable.Creator<SessionParams>
@@ -2077,6 +2112,9 @@ public class PackageInstaller {
/** {@hide} */
public long updatedMillis;
/** {@hide} */
public int rollbackDataPolicy;
/** {@hide} */
@UnsupportedAppUsage
public SessionInfo() {
@@ -2120,6 +2158,7 @@ public class PackageInstaller {
mStagedSessionErrorCode = source.readInt();
mStagedSessionErrorMessage = source.readString();
isCommitted = source.readBoolean();
rollbackDataPolicy = source.readInt();
}
/**
@@ -2436,6 +2475,17 @@ public class PackageInstaller {
return isStaged;
}
/**
* Return the data policy associated with the rollback for the given upgrade.
*
* @hide
*/
@SystemApi @TestApi
@PackageManager.RollbackDataPolicy
public int getRollbackDataPolicy() {
return rollbackDataPolicy;
}
/**
* Returns {@code true} if this session is an active staged session.
*
@@ -2598,6 +2648,7 @@ public class PackageInstaller {
dest.writeInt(mStagedSessionErrorCode);
dest.writeString(mStagedSessionErrorMessage);
dest.writeBoolean(isCommitted);
dest.writeInt(rollbackDataPolicy);
}
public static final Parcelable.Creator<SessionInfo>

View File

@@ -709,6 +709,29 @@ public abstract class PackageManager {
*/
public static final int COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED = 4;
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(value = {
RollbackDataPolicy.RESTORE,
RollbackDataPolicy.WIPE,
RollbackDataPolicy.RETAIN
})
public @interface RollbackDataPolicy {
/**
* User data will be backed up during install and restored during rollback.
*/
int RESTORE = 0;
/**
* User data won't be backed up during install but will be wiped out during rollback.
*/
int WIPE = 1;
/**
* User data won't be backed up during install and won't be restored during rollback.
* TODO: Not implemented yet.
*/
int RETAIN = 2;
}
/** @hide */
@IntDef(flag = true, prefix = { "INSTALL_" }, value = {
INSTALL_REPLACE_EXISTING,

View File

@@ -572,6 +572,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
info.installFlags = params.installFlags;
info.isMultiPackage = params.isMultiPackage;
info.isStaged = params.isStaged;
info.rollbackDataPolicy = params.rollbackDataPolicy;
info.parentSessionId = mParentSessionId;
info.childSessionIds = mChildSessionIds.copyKeys();
if (info.childSessionIds == null) {