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
diff --git a/core/java/android/content/rollback/RollbackInfo.java b/core/java/android/content/rollback/RollbackInfo.java
new file mode 100644
index 0000000..5fa4e57
--- /dev/null
+++ b/core/java/android/content/rollback/RollbackInfo.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.rollback;
+
+import android.annotation.TestApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Information about a set of packages that can be, or already have been
+ * rolled back together.
+ *
+ * @hide TODO: hidden, @TestApi until we decide on public vs. @SystemApi.
+ */
+@TestApi
+public final class RollbackInfo implements Parcelable {
+
+    /**
+     * The package that needs to be rolled back.
+     */
+    public final PackageRollbackInfo targetPackage;
+
+    // TODO: Add a list of additional packages rolled back due to atomic
+    // install dependencies when rollback of atomic installs is supported.
+    // TODO: Add a flag to indicate if reboot is required, when rollback of
+    // staged installs is supported.
+
+    public RollbackInfo(PackageRollbackInfo targetPackage) {
+        this.targetPackage = targetPackage;
+    }
+
+    private RollbackInfo(Parcel in) {
+        this.targetPackage = PackageRollbackInfo.CREATOR.createFromParcel(in);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        targetPackage.writeToParcel(out, flags);
+    }
+
+    public static final Parcelable.Creator<RollbackInfo> CREATOR =
+            new Parcelable.Creator<RollbackInfo>() {
+        public RollbackInfo createFromParcel(Parcel in) {
+            return new RollbackInfo(in);
+        }
+
+        public RollbackInfo[] newArray(int size) {
+            return new RollbackInfo[size];
+        }
+    };
+}