Loading core/api/system-current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -3875,6 +3875,7 @@ package android.content.pm { method public void setInstallAsInstantApp(boolean); method public void setInstallAsVirtualPreload(); method public void setRequestDowngrade(boolean); method @FlaggedApi("android.content.pm.rollback_lifetime") @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public void setRollbackLifetimeMillis(long); method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setStaged(); } core/java/android/content/pm/PackageInstaller.java +38 −6 Original line number Diff line number Diff line Loading @@ -2535,6 +2535,8 @@ public class PackageInstaller { public DataLoaderParams dataLoaderParams; /** {@hide} */ public int rollbackDataPolicy = PackageManager.ROLLBACK_DATA_POLICY_RESTORE; /** @hide */ public long rollbackLifetimeMillis = 0; /** {@hide} */ public boolean forceQueryableOverride; /** {@hide} */ Loading Loading @@ -2589,6 +2591,7 @@ public class PackageInstaller { dataLoaderParams = new DataLoaderParams(dataLoaderParamsParcel); } rollbackDataPolicy = source.readInt(); rollbackLifetimeMillis = source.readLong(); requireUserAction = source.readInt(); packageSource = source.readInt(); applicationEnabledSettingPersistent = source.readBoolean(); Loading Loading @@ -2621,6 +2624,7 @@ public class PackageInstaller { ret.requiredInstalledVersionCode = requiredInstalledVersionCode; ret.dataLoaderParams = dataLoaderParams; ret.rollbackDataPolicy = rollbackDataPolicy; ret.rollbackLifetimeMillis = rollbackLifetimeMillis; ret.requireUserAction = requireUserAction; ret.packageSource = packageSource; ret.applicationEnabledSettingPersistent = applicationEnabledSettingPersistent; Loading Loading @@ -2902,12 +2906,7 @@ public class PackageInstaller { */ @SystemApi public void setEnableRollback(boolean enable) { if (enable) { installFlags |= PackageManager.INSTALL_ENABLE_ROLLBACK; } else { installFlags &= ~PackageManager.INSTALL_ENABLE_ROLLBACK; } rollbackDataPolicy = PackageManager.ROLLBACK_DATA_POLICY_RESTORE; setEnableRollback(enable, PackageManager.ROLLBACK_DATA_POLICY_RESTORE); } /** Loading @@ -2931,10 +2930,36 @@ public class PackageInstaller { installFlags |= PackageManager.INSTALL_ENABLE_ROLLBACK; } else { installFlags &= ~PackageManager.INSTALL_ENABLE_ROLLBACK; rollbackLifetimeMillis = 0; } rollbackDataPolicy = dataPolicy; } /** * If rollback enabled for this session (via {@link #setEnableRollback}, set time * after which rollback will no longer be possible * * <p>For multi-package installs, this value must be set on the parent session. * Child session rollback lifetime will be ignored. * * @param lifetimeMillis time after which rollback expires * @throws IllegalArgumentException if lifetimeMillis is negative or rollback is not * enabled via setEnableRollback. * @hide */ @SystemApi @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) @FlaggedApi(Flags.FLAG_ROLLBACK_LIFETIME) public void setRollbackLifetimeMillis(@DurationMillisLong long lifetimeMillis) { if (lifetimeMillis < 0) { throw new IllegalArgumentException("rollbackLifetimeMillis can't be negative."); } if ((installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) == 0) { throw new IllegalArgumentException( "Can't set rollbackLifetimeMillis when rollback is not enabled"); } rollbackLifetimeMillis = lifetimeMillis; } /** * @deprecated use {@link #setRequestDowngrade(boolean)}. Loading Loading @@ -3295,6 +3320,7 @@ public class PackageInstaller { pw.printPair("requiredInstalledVersionCode", requiredInstalledVersionCode); pw.printPair("dataLoaderParams", dataLoaderParams); pw.printPair("rollbackDataPolicy", rollbackDataPolicy); pw.printPair("rollbackLifetimeMillis", rollbackLifetimeMillis); pw.printPair("applicationEnabledSettingPersistent", applicationEnabledSettingPersistent); pw.printHexPair("developmentInstallFlags", developmentInstallFlags); Loading Loading @@ -3336,6 +3362,7 @@ public class PackageInstaller { dest.writeParcelable(null, flags); } dest.writeInt(rollbackDataPolicy); dest.writeLong(rollbackLifetimeMillis); dest.writeInt(requireUserAction); dest.writeInt(packageSource); dest.writeBoolean(applicationEnabledSettingPersistent); Loading Loading @@ -3529,6 +3556,9 @@ public class PackageInstaller { /** {@hide} */ public int rollbackDataPolicy; /** @hide */ public long rollbackLifetimeMillis; /** {@hide} */ public int requireUserAction; Loading Loading @@ -3596,6 +3626,7 @@ public class PackageInstaller { isCommitted = source.readBoolean(); isPreapprovalRequested = source.readBoolean(); rollbackDataPolicy = source.readInt(); rollbackLifetimeMillis = source.readLong(); createdMillis = source.readLong(); requireUserAction = source.readInt(); installerUid = source.readInt(); Loading Loading @@ -4220,6 +4251,7 @@ public class PackageInstaller { dest.writeBoolean(isCommitted); dest.writeBoolean(isPreapprovalRequested); dest.writeInt(rollbackDataPolicy); dest.writeLong(rollbackLifetimeMillis); dest.writeLong(createdMillis); dest.writeInt(requireUserAction); dest.writeInt(installerUid); Loading core/java/android/content/pm/flags.aconfig +8 −0 Original line number Diff line number Diff line Loading @@ -58,3 +58,11 @@ flag { bug: "295827951" is_fixed_read_only: true } flag { name: "rollback_lifetime" namespace: "package_manager_service" description: "Feature flag to enable custom rollback lifetime during install." bug: "299670324" is_fixed_read_only: true } No newline at end of file services/core/java/com/android/server/pm/PackageInstallerService.java +17 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ import android.content.IntentSender; import android.content.IntentSender.SendIntentException; import android.content.pm.ApplicationInfo; import android.content.pm.ArchivedPackageParcel; import android.content.pm.Flags; import android.content.pm.IPackageInstaller; import android.content.pm.IPackageInstallerCallback; import android.content.pm.IPackageInstallerSession; Loading Loading @@ -745,6 +746,22 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements params.installFlags &= ~PackageManager.INSTALL_DISABLE_VERIFICATION; } if (Flags.rollbackLifetime()) { if (params.rollbackLifetimeMillis > 0) { if ((params.installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) == 0) { throw new IllegalArgumentException( "Can't set rollbackLifetimeMillis when rollback is not enabled"); } if (mContext.checkCallingOrSelfPermission(Manifest.permission.MANAGE_ROLLBACKS) != PackageManager.PERMISSION_GRANTED) { throw new SecurityException( "Setting rollback lifetime requires the MANAGE_ROLLBACKS permission"); } } else if (params.rollbackLifetimeMillis < 0) { throw new IllegalArgumentException("rollbackLifetimeMillis can't be negative."); } } boolean isApex = (params.installFlags & PackageManager.INSTALL_APEX) != 0; if (isApex) { if (mContext.checkCallingOrSelfPermission(Manifest.permission.INSTALL_PACKAGE_UPDATES) Loading services/core/java/com/android/server/pm/PackageInstallerSession.java +1 −0 Original line number Diff line number Diff line Loading @@ -1282,6 +1282,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { info.whitelistedRestrictedPermissions = params.whitelistedRestrictedPermissions; info.autoRevokePermissionsMode = params.autoRevokePermissionsMode; info.installFlags = params.installFlags; info.rollbackLifetimeMillis = params.rollbackLifetimeMillis; info.isMultiPackage = params.isMultiPackage; info.isStaged = params.isStaged; info.rollbackDataPolicy = params.rollbackDataPolicy; Loading Loading
core/api/system-current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -3875,6 +3875,7 @@ package android.content.pm { method public void setInstallAsInstantApp(boolean); method public void setInstallAsVirtualPreload(); method public void setRequestDowngrade(boolean); method @FlaggedApi("android.content.pm.rollback_lifetime") @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public void setRollbackLifetimeMillis(long); method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setStaged(); }
core/java/android/content/pm/PackageInstaller.java +38 −6 Original line number Diff line number Diff line Loading @@ -2535,6 +2535,8 @@ public class PackageInstaller { public DataLoaderParams dataLoaderParams; /** {@hide} */ public int rollbackDataPolicy = PackageManager.ROLLBACK_DATA_POLICY_RESTORE; /** @hide */ public long rollbackLifetimeMillis = 0; /** {@hide} */ public boolean forceQueryableOverride; /** {@hide} */ Loading Loading @@ -2589,6 +2591,7 @@ public class PackageInstaller { dataLoaderParams = new DataLoaderParams(dataLoaderParamsParcel); } rollbackDataPolicy = source.readInt(); rollbackLifetimeMillis = source.readLong(); requireUserAction = source.readInt(); packageSource = source.readInt(); applicationEnabledSettingPersistent = source.readBoolean(); Loading Loading @@ -2621,6 +2624,7 @@ public class PackageInstaller { ret.requiredInstalledVersionCode = requiredInstalledVersionCode; ret.dataLoaderParams = dataLoaderParams; ret.rollbackDataPolicy = rollbackDataPolicy; ret.rollbackLifetimeMillis = rollbackLifetimeMillis; ret.requireUserAction = requireUserAction; ret.packageSource = packageSource; ret.applicationEnabledSettingPersistent = applicationEnabledSettingPersistent; Loading Loading @@ -2902,12 +2906,7 @@ public class PackageInstaller { */ @SystemApi public void setEnableRollback(boolean enable) { if (enable) { installFlags |= PackageManager.INSTALL_ENABLE_ROLLBACK; } else { installFlags &= ~PackageManager.INSTALL_ENABLE_ROLLBACK; } rollbackDataPolicy = PackageManager.ROLLBACK_DATA_POLICY_RESTORE; setEnableRollback(enable, PackageManager.ROLLBACK_DATA_POLICY_RESTORE); } /** Loading @@ -2931,10 +2930,36 @@ public class PackageInstaller { installFlags |= PackageManager.INSTALL_ENABLE_ROLLBACK; } else { installFlags &= ~PackageManager.INSTALL_ENABLE_ROLLBACK; rollbackLifetimeMillis = 0; } rollbackDataPolicy = dataPolicy; } /** * If rollback enabled for this session (via {@link #setEnableRollback}, set time * after which rollback will no longer be possible * * <p>For multi-package installs, this value must be set on the parent session. * Child session rollback lifetime will be ignored. * * @param lifetimeMillis time after which rollback expires * @throws IllegalArgumentException if lifetimeMillis is negative or rollback is not * enabled via setEnableRollback. * @hide */ @SystemApi @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) @FlaggedApi(Flags.FLAG_ROLLBACK_LIFETIME) public void setRollbackLifetimeMillis(@DurationMillisLong long lifetimeMillis) { if (lifetimeMillis < 0) { throw new IllegalArgumentException("rollbackLifetimeMillis can't be negative."); } if ((installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) == 0) { throw new IllegalArgumentException( "Can't set rollbackLifetimeMillis when rollback is not enabled"); } rollbackLifetimeMillis = lifetimeMillis; } /** * @deprecated use {@link #setRequestDowngrade(boolean)}. Loading Loading @@ -3295,6 +3320,7 @@ public class PackageInstaller { pw.printPair("requiredInstalledVersionCode", requiredInstalledVersionCode); pw.printPair("dataLoaderParams", dataLoaderParams); pw.printPair("rollbackDataPolicy", rollbackDataPolicy); pw.printPair("rollbackLifetimeMillis", rollbackLifetimeMillis); pw.printPair("applicationEnabledSettingPersistent", applicationEnabledSettingPersistent); pw.printHexPair("developmentInstallFlags", developmentInstallFlags); Loading Loading @@ -3336,6 +3362,7 @@ public class PackageInstaller { dest.writeParcelable(null, flags); } dest.writeInt(rollbackDataPolicy); dest.writeLong(rollbackLifetimeMillis); dest.writeInt(requireUserAction); dest.writeInt(packageSource); dest.writeBoolean(applicationEnabledSettingPersistent); Loading Loading @@ -3529,6 +3556,9 @@ public class PackageInstaller { /** {@hide} */ public int rollbackDataPolicy; /** @hide */ public long rollbackLifetimeMillis; /** {@hide} */ public int requireUserAction; Loading Loading @@ -3596,6 +3626,7 @@ public class PackageInstaller { isCommitted = source.readBoolean(); isPreapprovalRequested = source.readBoolean(); rollbackDataPolicy = source.readInt(); rollbackLifetimeMillis = source.readLong(); createdMillis = source.readLong(); requireUserAction = source.readInt(); installerUid = source.readInt(); Loading Loading @@ -4220,6 +4251,7 @@ public class PackageInstaller { dest.writeBoolean(isCommitted); dest.writeBoolean(isPreapprovalRequested); dest.writeInt(rollbackDataPolicy); dest.writeLong(rollbackLifetimeMillis); dest.writeLong(createdMillis); dest.writeInt(requireUserAction); dest.writeInt(installerUid); Loading
core/java/android/content/pm/flags.aconfig +8 −0 Original line number Diff line number Diff line Loading @@ -58,3 +58,11 @@ flag { bug: "295827951" is_fixed_read_only: true } flag { name: "rollback_lifetime" namespace: "package_manager_service" description: "Feature flag to enable custom rollback lifetime during install." bug: "299670324" is_fixed_read_only: true } No newline at end of file
services/core/java/com/android/server/pm/PackageInstallerService.java +17 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ import android.content.IntentSender; import android.content.IntentSender.SendIntentException; import android.content.pm.ApplicationInfo; import android.content.pm.ArchivedPackageParcel; import android.content.pm.Flags; import android.content.pm.IPackageInstaller; import android.content.pm.IPackageInstallerCallback; import android.content.pm.IPackageInstallerSession; Loading Loading @@ -745,6 +746,22 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements params.installFlags &= ~PackageManager.INSTALL_DISABLE_VERIFICATION; } if (Flags.rollbackLifetime()) { if (params.rollbackLifetimeMillis > 0) { if ((params.installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) == 0) { throw new IllegalArgumentException( "Can't set rollbackLifetimeMillis when rollback is not enabled"); } if (mContext.checkCallingOrSelfPermission(Manifest.permission.MANAGE_ROLLBACKS) != PackageManager.PERMISSION_GRANTED) { throw new SecurityException( "Setting rollback lifetime requires the MANAGE_ROLLBACKS permission"); } } else if (params.rollbackLifetimeMillis < 0) { throw new IllegalArgumentException("rollbackLifetimeMillis can't be negative."); } } boolean isApex = (params.installFlags & PackageManager.INSTALL_APEX) != 0; if (isApex) { if (mContext.checkCallingOrSelfPermission(Manifest.permission.INSTALL_PACKAGE_UPDATES) Loading
services/core/java/com/android/server/pm/PackageInstallerSession.java +1 −0 Original line number Diff line number Diff line Loading @@ -1282,6 +1282,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { info.whitelistedRestrictedPermissions = params.whitelistedRestrictedPermissions; info.autoRevokePermissionsMode = params.autoRevokePermissionsMode; info.installFlags = params.installFlags; info.rollbackLifetimeMillis = params.rollbackLifetimeMillis; info.isMultiPackage = params.isMultiPackage; info.isStaged = params.isStaged; info.rollbackDataPolicy = params.rollbackDataPolicy; Loading