diff --git a/services/core/java/com/android/server/pm/permission/BasePermission.java b/services/core/java/com/android/server/pm/permission/BasePermission.java
index 667414e..6ffc598 100644
--- a/services/core/java/com/android/server/pm/permission/BasePermission.java
+++ b/services/core/java/com/android/server/pm/permission/BasePermission.java
@@ -16,16 +16,6 @@
 
 package com.android.server.pm.permission;
 
-import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
-import static android.content.pm.PermissionInfo.PROTECTION_DANGEROUS;
-import static android.content.pm.PermissionInfo.PROTECTION_NORMAL;
-import static android.content.pm.PermissionInfo.PROTECTION_SIGNATURE;
-import static android.content.pm.PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM;
-
-import static com.android.server.pm.Settings.ATTR_NAME;
-import static com.android.server.pm.Settings.ATTR_PACKAGE;
-import static com.android.server.pm.Settings.TAG_ITEM;
-
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -58,42 +48,38 @@
 import java.util.Set;
 
 public final class BasePermission {
-    static final String TAG = "PackageManager";
+    private static final String TAG = "PackageManager";
 
-    public static final int TYPE_NORMAL = 0;
-    public static final int TYPE_BUILTIN = 1;
+    public static final int TYPE_MANIFEST = 0;
+    public static final int TYPE_CONFIG = 1;
     public static final int TYPE_DYNAMIC = 2;
-    @IntDef(value = {
-        TYPE_NORMAL,
-        TYPE_BUILTIN,
-        TYPE_DYNAMIC,
+    @IntDef({
+            TYPE_MANIFEST,
+            TYPE_CONFIG,
+            TYPE_DYNAMIC,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface PermissionType {}
 
-    @IntDef(value = {
-        PROTECTION_DANGEROUS,
-        PROTECTION_NORMAL,
-        PROTECTION_SIGNATURE,
-        PROTECTION_SIGNATURE_OR_SYSTEM,
+    @IntDef({
+            PermissionInfo.PROTECTION_DANGEROUS,
+            PermissionInfo.PROTECTION_NORMAL,
+            PermissionInfo.PROTECTION_SIGNATURE,
+            PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface ProtectionLevel {}
 
+    private static final String ATTR_NAME = "name";
+    private static final String ATTR_PACKAGE = "package";
+    private static final String TAG_ITEM = "item";
+
     @NonNull
-    private final String mName;
-
-    private final @PermissionType int mType;
-
-    private String mPackageName;
-
-    private int mProtectionLevel;
-
-    @Nullable
     private PermissionInfo mPermissionInfo;
 
-    @Nullable
-    private PermissionInfo mPendingPermissionInfo;
+    private boolean mReconciled;
+
+    private final @PermissionType int mType;
 
     /** UID that owns the definition of this permission */
     private int mUid;
@@ -109,30 +95,31 @@
     private boolean mGidsPerUser;
 
     public BasePermission(@NonNull String name, String packageName, @PermissionType int type) {
-        mName = name;
-        mPackageName = packageName;
-        mType = type;
+        mPermissionInfo = new PermissionInfo();
+        mPermissionInfo.name = name;
+        mPermissionInfo.packageName = packageName;
         // Default to most conservative protection level.
-        mProtectionLevel = PermissionInfo.PROTECTION_SIGNATURE;
+        mPermissionInfo.protectionLevel = PermissionInfo.PROTECTION_SIGNATURE;
+        mType = type;
     }
 
     @Override
     public String toString() {
-        return "BasePermission{" + Integer.toHexString(System.identityHashCode(this)) + " " + mName
-                + "}";
+        return "BasePermission{" + Integer.toHexString(System.identityHashCode(this)) + " "
+                + mPermissionInfo.name + "}";
     }
 
     @NonNull
     public String getName() {
-        return mName;
+        return mPermissionInfo.name;
     }
 
     public int getProtectionLevel() {
-        return mProtectionLevel;
+        return mPermissionInfo.protectionLevel;
     }
 
     public String getPackageName() {
-        return mPackageName;
+        return mPermissionInfo.packageName;
     }
 
     public int getType() {
@@ -149,7 +136,16 @@
     }
 
     public void setPermissionInfo(@Nullable PermissionInfo permissionInfo) {
-        mPermissionInfo = permissionInfo;
+        if (permissionInfo != null) {
+            mPermissionInfo = permissionInfo;
+        } else {
+            final PermissionInfo newPermissionInfo = new PermissionInfo();
+            newPermissionInfo.name = mPermissionInfo.name;
+            newPermissionInfo.packageName = mPermissionInfo.packageName;
+            newPermissionInfo.protectionLevel = mPermissionInfo.protectionLevel;
+            mPermissionInfo = newPermissionInfo;
+        }
+        mReconciled = permissionInfo != null;
     }
 
     public boolean hasGids() {
@@ -172,7 +168,7 @@
 
     public int calculateFootprint(BasePermission perm) {
         if (mUid == perm.mUid) {
-            return perm.mName.length() + perm.mPermissionInfo.calculateFootprint();
+            return perm.mPermissionInfo.name.length() + perm.mPermissionInfo.calculateFootprint();
         }
         return 0;
     }
@@ -190,128 +186,143 @@
     }
 
     public boolean isNormal() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_MASK_BASE)
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE)
                 == PermissionInfo.PROTECTION_NORMAL;
     }
     public boolean isRuntime() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_MASK_BASE)
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE)
                 == PermissionInfo.PROTECTION_DANGEROUS;
     }
 
     public boolean isInstalled() {
-        return mPermissionInfo != null
-                && (mPermissionInfo.flags & PermissionInfo.FLAG_INSTALLED) != 0;
+        return (mPermissionInfo.flags & PermissionInfo.FLAG_INSTALLED) != 0;
     }
 
     public boolean isRemoved() {
-        return mPermissionInfo != null
-                && (mPermissionInfo.flags & PermissionInfo.FLAG_REMOVED) != 0;
+        return (mPermissionInfo.flags & PermissionInfo.FLAG_REMOVED) != 0;
     }
 
     public boolean isSoftRestricted() {
-        return mPermissionInfo != null
-                && (mPermissionInfo.flags & PermissionInfo.FLAG_SOFT_RESTRICTED) != 0;
+        return (mPermissionInfo.flags & PermissionInfo.FLAG_SOFT_RESTRICTED) != 0;
     }
 
     public boolean isHardRestricted() {
-        return mPermissionInfo != null
-                && (mPermissionInfo.flags & PermissionInfo.FLAG_HARD_RESTRICTED) != 0;
+        return (mPermissionInfo.flags & PermissionInfo.FLAG_HARD_RESTRICTED) != 0;
     }
 
     public boolean isHardOrSoftRestricted() {
-        return mPermissionInfo != null && (mPermissionInfo.flags
-                & (PermissionInfo.FLAG_HARD_RESTRICTED | PermissionInfo.FLAG_SOFT_RESTRICTED)) != 0;
+        return (mPermissionInfo.flags & (PermissionInfo.FLAG_HARD_RESTRICTED
+                | PermissionInfo.FLAG_SOFT_RESTRICTED)) != 0;
     }
 
     public boolean isImmutablyRestricted() {
-        return mPermissionInfo != null
-                && (mPermissionInfo.flags & PermissionInfo.FLAG_IMMUTABLY_RESTRICTED) != 0;
+        return (mPermissionInfo.flags & PermissionInfo.FLAG_IMMUTABLY_RESTRICTED) != 0;
     }
 
     public boolean isInstallerExemptIgnored() {
-        return mPermissionInfo != null
-                && (mPermissionInfo.flags & PermissionInfo.FLAG_INSTALLER_EXEMPT_IGNORED) != 0;
+        return (mPermissionInfo.flags & PermissionInfo.FLAG_INSTALLER_EXEMPT_IGNORED) != 0;
     }
 
     public boolean isSignature() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_MASK_BASE)
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE)
                 == PermissionInfo.PROTECTION_SIGNATURE;
     }
 
     public boolean isAppOp() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_APPOP) != 0;
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_APPOP) != 0;
     }
+
     public boolean isDevelopment() {
-        return isSignature()
-                && (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0;
+        return isSignature() && (mPermissionInfo.protectionLevel
+                & PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0;
     }
+
     public boolean isInstaller() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_INSTALLER) != 0;
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_INSTALLER) != 0;
     }
+
     public boolean isInstant() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_INSTANT) != 0;
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_INSTANT) != 0;
     }
-    public boolean isOEM() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_OEM) != 0;
+
+    public boolean isOem() {
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_OEM) != 0;
     }
+
     public boolean isPre23() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_PRE23) != 0;
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_PRE23) != 0;
     }
+
     public boolean isPreInstalled() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_PREINSTALLED) != 0;
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_PREINSTALLED) != 0;
     }
+
     public boolean isPrivileged() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_PRIVILEGED) != 0;
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_PRIVILEGED) != 0;
     }
+
     public boolean isRuntimeOnly() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_RUNTIME_ONLY) != 0;
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_RUNTIME_ONLY) != 0;
     }
+
     public boolean isSetup() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_SETUP) != 0;
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_SETUP) != 0;
     }
+
     public boolean isVerifier() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_VERIFIER) != 0;
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_VERIFIER) != 0;
     }
+
     public boolean isVendorPrivileged() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_VENDOR_PRIVILEGED) != 0;
-    }
-    public boolean isSystemTextClassifier() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER)
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_VENDOR_PRIVILEGED)
                 != 0;
     }
+
+    public boolean isSystemTextClassifier() {
+        return (mPermissionInfo.protectionLevel
+                & PermissionInfo.PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER) != 0;
+    }
+
     public boolean isWellbeing() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_WELLBEING) != 0;
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_WELLBEING) != 0;
     }
+
     public boolean isDocumenter() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_DOCUMENTER) != 0;
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_DOCUMENTER) != 0;
     }
+
     public boolean isConfigurator() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_CONFIGURATOR)
-            != 0;
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_CONFIGURATOR) != 0;
     }
+
     public boolean isIncidentReportApprover() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_INCIDENT_REPORT_APPROVER) != 0;
+        return (mPermissionInfo.protectionLevel
+                & PermissionInfo.PROTECTION_FLAG_INCIDENT_REPORT_APPROVER) != 0;
     }
+
     public boolean isAppPredictor() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_APP_PREDICTOR) != 0;
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_APP_PREDICTOR)
+                != 0;
     }
+
     public boolean isCompanion() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_COMPANION) != 0;
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_COMPANION) != 0;
     }
 
     public boolean isRetailDemo() {
-        return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_RETAIL_DEMO) != 0;
+        return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_RETAIL_DEMO) != 0;
     }
 
     public void transfer(@NonNull String origPackageName, @NonNull String newPackageName) {
-        if (!origPackageName.equals(mPackageName)) {
+        if (!origPackageName.equals(mPermissionInfo.packageName)) {
             return;
         }
-        mPackageName = newPackageName;
-        mPermissionInfo = null;
-        if (mPendingPermissionInfo != null) {
-            mPendingPermissionInfo.packageName = newPackageName;
-        }
+        final PermissionInfo newPermissionInfo = new PermissionInfo();
+        newPermissionInfo.name = mPermissionInfo.name;
+        newPermissionInfo.packageName = newPackageName;
+        newPermissionInfo.protectionLevel = mPermissionInfo.protectionLevel;
+        mPermissionInfo = newPermissionInfo;
+        mReconciled = false;
         mUid = 0;
         mGids = EmptyArray.INT;
         mGidsPerUser = false;
@@ -320,16 +331,16 @@
     public boolean addToTree(@ProtectionLevel int protectionLevel,
             @NonNull PermissionInfo permissionInfo, @NonNull BasePermission tree) {
         final boolean changed =
-                (mProtectionLevel != protectionLevel
-                    || mPermissionInfo == null
+                (mPermissionInfo.protectionLevel != protectionLevel
+                    || !mReconciled
                     || mUid != tree.mUid
                     || !Objects.equals(mPermissionInfo.packageName,
                             tree.mPermissionInfo.packageName)
                     || !comparePermissionInfos(mPermissionInfo, permissionInfo));
-        mProtectionLevel = protectionLevel;
         mPermissionInfo = new PermissionInfo(permissionInfo);
-        mPermissionInfo.protectionLevel = protectionLevel;
         mPermissionInfo.packageName = tree.mPermissionInfo.packageName;
+        mPermissionInfo.protectionLevel = protectionLevel;
+        mReconciled = true;
         mUid = tree.mUid;
         return changed;
     }
@@ -337,13 +348,12 @@
     public void updateDynamicPermission(Collection<BasePermission> permissionTrees) {
         if (PackageManagerService.DEBUG_SETTINGS) Log.v(TAG, "Dynamic permission: name="
                 + getName() + " pkg=" + getPackageName()
-                + " info=" + mPendingPermissionInfo);
-        if (mPendingPermissionInfo != null) {
-            final BasePermission tree = findPermissionTree(permissionTrees, mName);
-            if (tree != null && tree.mPermissionInfo != null) {
-                mPermissionInfo = new PermissionInfo(mPendingPermissionInfo);
+                + " info=" + mPermissionInfo);
+        if (mType == TYPE_DYNAMIC) {
+            final BasePermission tree = findPermissionTree(permissionTrees, mPermissionInfo.name);
+            if (tree != null) {
                 mPermissionInfo.packageName = tree.mPermissionInfo.packageName;
-                mPermissionInfo.name = mName;
+                mReconciled = true;
                 mUid = tree.mUid;
             }
         }
@@ -354,9 +364,9 @@
             @NonNull AndroidPackage pkg, Collection<BasePermission> permissionTrees,
             boolean chatty) {
         // Allow system apps to redefine non-system permissions
-        if (bp != null && !Objects.equals(bp.mPackageName, p.packageName)) {
+        if (bp != null && !Objects.equals(bp.mPermissionInfo.packageName, p.packageName)) {
             final boolean currentOwnerIsSystem;
-            if (bp.mPermissionInfo == null) {
+            if (!bp.mReconciled) {
                 currentOwnerIsSystem = false;
             } else {
                 AndroidPackage currentPackage = packageManagerInternal.getPackage(
@@ -369,34 +379,34 @@
             }
 
             if (pkg.isSystem()) {
-                if (bp.mType == BasePermission.TYPE_BUILTIN && bp.mPermissionInfo == null) {
+                if (bp.mType == BasePermission.TYPE_CONFIG && !bp.mReconciled) {
                     // It's a built-in permission and no owner, take ownership now
                     p.flags |= PermissionInfo.FLAG_INSTALLED;
                     bp.mPermissionInfo = p;
+                    bp.mReconciled = true;
                     bp.mUid = pkg.getUid();
-                    bp.mPackageName = p.packageName;
                 } else if (!currentOwnerIsSystem) {
                     String msg = "New decl " + pkg + " of permission  "
-                            + p.name + " is system; overriding " + bp.mPackageName;
+                            + p.name + " is system; overriding " + bp.mPermissionInfo.packageName;
                     PackageManagerService.reportSettingsProblem(Log.WARN, msg);
                     bp = null;
                 }
             }
         }
         if (bp == null) {
-            bp = new BasePermission(p.name, p.packageName, TYPE_NORMAL);
+            bp = new BasePermission(p.name, p.packageName, TYPE_MANIFEST);
         }
         StringBuilder r = null;
-        if (bp.mPermissionInfo == null) {
-            if (bp.mPackageName == null
-                    || bp.mPackageName.equals(p.packageName)) {
+        if (!bp.mReconciled) {
+            if (bp.mPermissionInfo.packageName == null
+                    || bp.mPermissionInfo.packageName.equals(p.packageName)) {
                 final BasePermission tree = findPermissionTree(permissionTrees, p.name);
                 if (tree == null
-                        || tree.mPackageName.equals(p.packageName)) {
+                        || tree.mPermissionInfo.packageName.equals(p.packageName)) {
                     p.flags |= PermissionInfo.FLAG_INSTALLED;
                     bp.mPermissionInfo = p;
+                    bp.mReconciled = true;
                     bp.mUid = pkg.getUid();
-                    bp.mPackageName = p.packageName;
                     if (chatty) {
                         if (r == null) {
                             r = new StringBuilder(256);
@@ -408,13 +418,13 @@
                 } else {
                     Slog.w(TAG, "Permission " + p.name + " from package "
                             + p.packageName + " ignored: base tree "
-                            + tree.mName + " is from package "
-                            + tree.mPackageName);
+                            + tree.mPermissionInfo.name + " is from package "
+                            + tree.mPermissionInfo.packageName);
                 }
             } else {
                 Slog.w(TAG, "Permission " + p.name + " from package "
                         + p.packageName + " ignored: original from "
-                        + bp.mPackageName);
+                        + bp.mPermissionInfo.packageName);
             }
         } else if (chatty) {
             if (r == null) {
@@ -425,9 +435,6 @@
             r.append("DUP:");
             r.append(p.name);
         }
-        if (bp.mPermissionInfo == p) {
-            bp.mProtectionLevel = p.protectionLevel;
-        }
         if (PackageManagerService.DEBUG_PACKAGE_SCANNING && r != null) {
             Log.d(TAG, "  Permissions: " + r);
         }
@@ -444,7 +451,7 @@
                 }
                 throw new SecurityException("Calling uid " + callingUid
                         + " is not allowed to add to permission tree "
-                        + bp.mName + " owned by uid " + bp.mUid);
+                        + bp.mPermissionInfo.name + " owned by uid " + bp.mUid);
             }
         }
         throw new SecurityException("No permission tree found for " + permName);
@@ -453,9 +460,9 @@
     private static BasePermission findPermissionTree(
             Collection<BasePermission> permissionTrees, String permName) {
         for (BasePermission bp : permissionTrees) {
-            if (permName.startsWith(bp.mName)
-                    && permName.length() > bp.mName.length()
-                    && permName.charAt(bp.mName.length()) == '.') {
+            if (permName.startsWith(bp.mPermissionInfo.name)
+                    && permName.length() > bp.mPermissionInfo.name.length()
+                    && permName.charAt(bp.mPermissionInfo.name.length()) == '.') {
                 return bp;
             }
         }
@@ -464,20 +471,20 @@
 
     @Nullable
     public String getBackgroundPermission() {
-        return mPermissionInfo != null ? mPermissionInfo.backgroundPermission : null;
+        return mPermissionInfo.backgroundPermission;
     }
 
     @Nullable
     public String getGroup() {
-        return mPermissionInfo != null ? mPermissionInfo.group : null;
+        return mPermissionInfo.group;
     }
 
     public int getProtection() {
-        return mProtectionLevel & PermissionInfo.PROTECTION_MASK_BASE;
+        return mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE;
     }
 
     public int getProtectionFlags() {
-        return mProtectionLevel & PermissionInfo.PROTECTION_MASK_FLAGS;
+        return mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_FLAGS;
     }
 
     @NonNull
@@ -495,17 +502,18 @@
             }
         } else {
             permissionInfo = new PermissionInfo();
-            permissionInfo.name = mName;
-            permissionInfo.packageName = mPackageName;
-            permissionInfo.nonLocalizedLabel = mName;
+            permissionInfo.name = mPermissionInfo.name;
+            permissionInfo.packageName = mPermissionInfo.packageName;
+            permissionInfo.nonLocalizedLabel = mPermissionInfo.name;
         }
         if (targetSdkVersion >= Build.VERSION_CODES.O) {
-            permissionInfo.protectionLevel = mProtectionLevel;
+            permissionInfo.protectionLevel = mPermissionInfo.protectionLevel;
         } else {
-            final int protection = mProtectionLevel & PermissionInfo.PROTECTION_MASK_BASE;
+            final int protection = mPermissionInfo.protectionLevel
+                    & PermissionInfo.PROTECTION_MASK_BASE;
             if (protection == PermissionInfo.PROTECTION_SIGNATURE) {
                 // Signature permission's protection flags are always reported.
-                permissionInfo.protectionLevel = mProtectionLevel;
+                permissionInfo.protectionLevel = mPermissionInfo.protectionLevel;
             } else {
                 permissionInfo.protectionLevel = protection;
             }
@@ -520,9 +528,9 @@
             return false;
         }
         final String name = parser.getAttributeValue(null, ATTR_NAME);
-        final String sourcePackage = parser.getAttributeValue(null, ATTR_PACKAGE);
+        final String packageName = parser.getAttributeValue(null, ATTR_PACKAGE);
         final String ptype = parser.getAttributeValue(null, "type");
-        if (name == null || sourcePackage == null) {
+        if (name == null || packageName == null) {
             PackageManagerService.reportSettingsProblem(Log.WARN,
                     "Error in package manager settings: permissions has" + " no name at "
                             + parser.getPositionDescription());
@@ -531,23 +539,19 @@
         final boolean dynamic = "dynamic".equals(ptype);
         BasePermission bp = out.get(name);
         // If the permission is builtin, do not clobber it.
-        if (bp == null || bp.mType != TYPE_BUILTIN) {
-            bp = new BasePermission(name.intern(), sourcePackage,
-                    dynamic ? TYPE_DYNAMIC : TYPE_NORMAL);
+        if (bp == null || bp.mType != TYPE_CONFIG) {
+            bp = new BasePermission(name.intern(), packageName,
+                    dynamic ? TYPE_DYNAMIC : TYPE_MANIFEST);
         }
-        bp.mProtectionLevel = readInt(parser, null, "protection",
+        bp.mPermissionInfo.protectionLevel = readInt(parser, null, "protection",
                 PermissionInfo.PROTECTION_NORMAL);
-        bp.mProtectionLevel = PermissionInfo.fixProtectionLevel(bp.mProtectionLevel);
+        bp.mPermissionInfo.protectionLevel = PermissionInfo.fixProtectionLevel(
+                bp.mPermissionInfo.protectionLevel);
         if (dynamic) {
-            final PermissionInfo pi = new PermissionInfo();
-            pi.packageName = sourcePackage.intern();
-            pi.name = name.intern();
-            pi.icon = readInt(parser, null, "icon", 0);
-            pi.nonLocalizedLabel = parser.getAttributeValue(null, "label");
-            pi.protectionLevel = bp.mProtectionLevel;
-            bp.mPendingPermissionInfo = pi;
+            bp.mPermissionInfo.icon = readInt(parser, null, "icon", 0);
+            bp.mPermissionInfo.nonLocalizedLabel = parser.getAttributeValue(null, "label");
         }
-        out.put(bp.mName, bp);
+        out.put(bp.mPermissionInfo.name, bp);
         return true;
     }
 
@@ -568,30 +572,23 @@
     }
 
     public void writeLPr(@NonNull XmlSerializer serializer) throws IOException {
-        if (mPackageName == null) {
+        if (mPermissionInfo.packageName == null) {
             return;
         }
         serializer.startTag(null, TAG_ITEM);
-        serializer.attribute(null, ATTR_NAME, mName);
-        serializer.attribute(null, ATTR_PACKAGE, mPackageName);
-        if (mProtectionLevel != PermissionInfo.PROTECTION_NORMAL) {
-            serializer.attribute(null, "protection", Integer.toString(mProtectionLevel));
+        serializer.attribute(null, ATTR_NAME, mPermissionInfo.name);
+        serializer.attribute(null, ATTR_PACKAGE, mPermissionInfo.packageName);
+        if (mPermissionInfo.protectionLevel != PermissionInfo.PROTECTION_NORMAL) {
+            serializer.attribute(null, "protection",
+                    Integer.toString(mPermissionInfo.protectionLevel));
         }
-        if (mType == BasePermission.TYPE_DYNAMIC) {
-            if (mPermissionInfo != null || mPendingPermissionInfo != null) {
-                serializer.attribute(null, "type", "dynamic");
-                int icon = mPermissionInfo != null ? mPermissionInfo.icon
-                        : mPendingPermissionInfo.icon;
-                CharSequence nonLocalizedLabel = mPermissionInfo != null
-                        ? mPermissionInfo.nonLocalizedLabel
-                        : mPendingPermissionInfo.nonLocalizedLabel;
-
-                if (icon != 0) {
-                    serializer.attribute(null, "icon", Integer.toString(icon));
-                }
-                if (nonLocalizedLabel != null) {
-                    serializer.attribute(null, "label", nonLocalizedLabel.toString());
-                }
+        if (mType == TYPE_DYNAMIC) {
+            serializer.attribute(null, "type", "dynamic");
+            if (mPermissionInfo.icon != 0) {
+                serializer.attribute(null, "icon", Integer.toString(mPermissionInfo.icon));
+            }
+            if (mPermissionInfo.nonLocalizedLabel != null) {
+                serializer.attribute(null, "label", mPermissionInfo.nonLocalizedLabel.toString());
             }
         }
         serializer.endTag(null, TAG_ITEM);
@@ -616,10 +613,10 @@
     public boolean dumpPermissionsLPr(@NonNull PrintWriter pw, @NonNull String packageName,
             @NonNull Set<String> permissionNames, boolean readEnforced,
             boolean printedSomething, @NonNull DumpState dumpState) {
-        if (packageName != null && !packageName.equals(mPackageName)) {
+        if (packageName != null && !packageName.equals(mPermissionInfo.packageName)) {
             return false;
         }
-        if (permissionNames != null && !permissionNames.contains(mName)) {
+        if (permissionNames != null && !permissionNames.contains(mPermissionInfo.name)) {
             return false;
         }
         if (!printedSomething) {
@@ -627,15 +624,15 @@
                 pw.println();
             pw.println("Permissions:");
         }
-        pw.print("  Permission ["); pw.print(mName); pw.print("] (");
+        pw.print("  Permission ["); pw.print(mPermissionInfo.name); pw.print("] (");
                 pw.print(Integer.toHexString(System.identityHashCode(this)));
                 pw.println("):");
-        pw.print("    sourcePackage="); pw.println(mPackageName);
+        pw.print("    sourcePackage="); pw.println(mPermissionInfo.packageName);
         pw.print("    uid="); pw.print(mUid);
         pw.print(" gids="); pw.print(Arrays.toString(computeGids(UserHandle.USER_SYSTEM)));
         pw.print(" type="); pw.print(mType);
         pw.print(" prot=");
-        pw.println(PermissionInfo.protectionToString(mProtectionLevel));
+        pw.println(PermissionInfo.protectionToString(mPermissionInfo.protectionLevel));
         if (mPermissionInfo != null) {
             pw.print("    perm="); pw.println(mPermissionInfo);
             if ((mPermissionInfo.flags & PermissionInfo.FLAG_INSTALLED) == 0
@@ -643,7 +640,8 @@
                 pw.print("    flags=0x"); pw.println(Integer.toHexString(mPermissionInfo.flags));
             }
         }
-        if (READ_EXTERNAL_STORAGE.equals(mName)) {
+        if (Objects.equals(mPermissionInfo.name,
+                android.Manifest.permission.READ_EXTERNAL_STORAGE)) {
             pw.print("    enforced=");
             pw.println(readEnforced);
         }
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index 6c01017..4d439695 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -411,7 +411,7 @@
                 final SystemConfig.PermissionEntry perm = permConfig.valueAt(i);
                 BasePermission bp = mSettings.getPermissionLocked(perm.name);
                 if (bp == null) {
-                    bp = new BasePermission(perm.name, "android", BasePermission.TYPE_BUILTIN);
+                    bp = new BasePermission(perm.name, "android", BasePermission.TYPE_CONFIG);
                     mSettings.putPermissionLocked(perm.name, bp);
                 }
                 if (perm.gids != null) {
@@ -3300,7 +3300,7 @@
                         PackageParser.SigningDetails.CertCapabilities.PERMISSION);
         final boolean isVendorPrivilegedPermission = bp.isVendorPrivileged();
         final boolean isPrivilegedPermission = bp.isPrivileged() || isVendorPrivilegedPermission;
-        final boolean isOemPermission = bp.isOEM();
+        final boolean isOemPermission = bp.isOem();
         if (!allowed && (isPrivilegedPermission || isOemPermission) && pkg.isSystem()) {
             final String permissionName = bp.getName();
             // For updated system applications, a privileged/oem permission
