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

Commit b29f1455 authored by Richard Uhler's avatar Richard Uhler
Browse files

Add RollbackManagerService

This change adds RollbackManagerService as a new system service for
managing apk level rollbacks.

To work properly this requires additional selinux policy changes. Fails
gracefully in case of selinux denials, until we have a chance to sort
out the proper selinux policy.

Bug: 112431924
Bug: 116512606
Test: atest RollbackTest, with selinux enforcement off.
Test: atest CtsPermission2TestCases:PermissionPolicyTest
Change-Id: Id72aae9c4d8da9aaab3922ec9233ba335bc0198f
parent b88c7977
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -151,6 +151,7 @@ java_defaults {
        "core/java/android/content/pm/dex/IArtManager.aidl",
        "core/java/android/content/pm/dex/ISnapshotRuntimeProfileCallback.aidl",
        "core/java/android/content/pm/permission/IRuntimePermissionPresenter.aidl",
        "core/java/android/content/rollback/IRollbackManager.aidl",
        "core/java/android/database/IContentObserver.aidl",
        "core/java/android/debug/IAdbManager.aidl",
        "core/java/android/debug/IAdbTransport.aidl",
+45 −0
Original line number Diff line number Diff line
@@ -329,6 +329,11 @@ package android.content {
    method public android.os.UserHandle getUser();
    method public int getUserId();
    method public void setAutofillCompatibilityEnabled(boolean);
    field public static final java.lang.String ROLLBACK_SERVICE = "rollback";
  }

  public class Intent implements java.lang.Cloneable android.os.Parcelable {
    field public static final java.lang.String ACTION_PACKAGE_ROLLBACK_EXECUTED = "android.intent.action.PACKAGE_ROLLBACK_EXECUTED";
  }

}
@@ -351,6 +356,10 @@ package android.content.pm {
    ctor public LauncherApps(android.content.Context);
  }

  public static class PackageInstaller.SessionParams implements android.os.Parcelable {
    method public void setEnableRollback();
  }

  public abstract class PackageManager {
    method public abstract boolean arePermissionsIndividuallyControlled();
    method public abstract java.lang.String getDefaultBrowserPackageNameAsUser(int);
@@ -398,6 +407,42 @@ package android.content.res {

}

package android.content.rollback {

  public final class PackageRollbackInfo implements android.os.Parcelable {
    ctor public PackageRollbackInfo(java.lang.String, android.content.rollback.PackageRollbackInfo.PackageVersion, android.content.rollback.PackageRollbackInfo.PackageVersion);
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.content.rollback.PackageRollbackInfo> CREATOR;
    field public final android.content.rollback.PackageRollbackInfo.PackageVersion higherVersion;
    field public final android.content.rollback.PackageRollbackInfo.PackageVersion lowerVersion;
    field public final java.lang.String packageName;
  }

  public static class PackageRollbackInfo.PackageVersion {
    ctor public PackageRollbackInfo.PackageVersion(long);
    field public final long versionCode;
  }

  public final class RollbackInfo implements android.os.Parcelable {
    ctor public RollbackInfo(android.content.rollback.PackageRollbackInfo);
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.content.rollback.RollbackInfo> CREATOR;
    field public final android.content.rollback.PackageRollbackInfo targetPackage;
  }

  public final class RollbackManager {
    method public void executeRollback(android.content.rollback.RollbackInfo, android.content.IntentSender);
    method public void expireRollbackForPackage(java.lang.String);
    method public android.content.rollback.RollbackInfo getAvailableRollback(java.lang.String);
    method public java.util.List<java.lang.String> getPackagesWithAvailableRollbacks();
    method public java.util.List<android.content.rollback.RollbackInfo> getRecentlyExecutedRollbacks();
    method public void reloadPersistedData();
  }

}

package android.database.sqlite {

  public class SQLiteCompatibilityWalFlags {
+12 −0
Original line number Diff line number Diff line
@@ -49,6 +49,8 @@ import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
import android.content.pm.ShortcutManager;
import android.content.res.Resources;
import android.content.rollback.IRollbackManager;
import android.content.rollback.RollbackManager;
import android.debug.AdbManager;
import android.debug.IAdbManager;
import android.hardware.ConsumerIrManager;
@@ -1161,6 +1163,16 @@ final class SystemServiceRegistry {
                            throws ServiceNotFoundException {
                        return new RoleManager(ctx.getOuterContext());
                    }});

        registerService(Context.ROLLBACK_SERVICE, RollbackManager.class,
                new CachedServiceFetcher<RollbackManager>() {
                    @Override
                    public RollbackManager createService(ContextImpl ctx)
                            throws ServiceNotFoundException {
                        IBinder b = ServiceManager.getServiceOrThrow(Context.ROLLBACK_SERVICE);
                        return new RollbackManager(ctx.getOuterContext(),
                                IRollbackManager.Stub.asInterface(b));
                    }});
        //CHECKSTYLE:ON IndentationCheck
    }

+12 −0
Original line number Diff line number Diff line
@@ -3122,6 +3122,7 @@ public abstract class Context {
            APPWIDGET_SERVICE,
            //@hide: VOICE_INTERACTION_MANAGER_SERVICE,
            //@hide: BACKUP_SERVICE,
            ROLLBACK_SERVICE,
            DROPBOX_SERVICE,
            //@hide: DEVICE_IDLE_CONTROLLER,
            DEVICE_POLICY_SERVICE,
@@ -3992,6 +3993,17 @@ public abstract class Context {
    @SystemApi
    public static final String BACKUP_SERVICE = "backup";

    /**
     * Use with {@link #getSystemService(String)} to retrieve an
     * {@link android.content.rollback.RollbackManager} for communicating
     * with the rollback manager
     *
     * @see #getSystemService(String)
     * @hide TODO(ruhler): hidden, @TestApi until we decide on public vs. @SystemApi.
     */
    @TestApi
    public static final String ROLLBACK_SERVICE = "rollback";

    /**
     * Use with {@link #getSystemService(String)} to retrieve a
     * {@link android.os.DropBoxManager} instance for recording
+28 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
@@ -2247,6 +2248,32 @@ public class Intent implements Parcelable, Cloneable {
     */
    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
    public static final String ACTION_PACKAGE_CHANGED = "android.intent.action.PACKAGE_CHANGED";
    /**
     * Broadcast Action: Sent to the system rollback manager when a package
     * needs to have rollback enabled.
     * <p class="note">
     * This is a protected intent that can only be sent by the system.
     * </p>
     *
     * @hide This broadcast is used internally by the system.
     */
    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
    public static final String ACTION_PACKAGE_ENABLE_ROLLBACK =
            "android.intent.action.PACKAGE_ENABLE_ROLLBACK";
    /**
     * Broadcast Action: An existing version of an application package has been
     * rolled back to a previous version.
     * The data contains the name of the package.
     *
     * <p class="note">This is a protected intent that can only be sent
     * by the system.
     *
     * @hide TODO: hidden, @TestApi until we decide on public vs. @SystemApi.
     */
    @TestApi
    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
    public static final String ACTION_PACKAGE_ROLLBACK_EXECUTED =
            "android.intent.action.PACKAGE_ROLLBACK_EXECUTED";
    /**
     * @hide
     * Broadcast Action: Ask system services if there is any reason to
@@ -10343,6 +10370,7 @@ public class Intent implements Parcelable, Cloneable {
                case ACTION_MEDIA_SCANNER_SCAN_FILE:
                case ACTION_PACKAGE_NEEDS_VERIFICATION:
                case ACTION_PACKAGE_VERIFIED:
                case ACTION_PACKAGE_ENABLE_ROLLBACK:
                    // Ignore legacy actions
                    break;
                default:
Loading