Merge changes from topics "presubmit-am-3c3afa1d2a32426e9cc02b94cf882542", "presubmit-am-6f994c13a42546078af5336c840bf97f" into tm-dev

* changes:
  Revert "Revert "Remove ComputerTracker and fix consistency in PackageManagerService""
  Ignore SharedLibrariesImplTest
diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java
index 2068e6d..68cd288 100644
--- a/services/core/java/android/content/pm/PackageManagerInternal.java
+++ b/services/core/java/android/content/pm/PackageManagerInternal.java
@@ -48,7 +48,6 @@
 import com.android.server.pm.dex.DynamicCodeLogger;
 import com.android.server.pm.parsing.pkg.AndroidPackage;
 import com.android.server.pm.pkg.AndroidPackageApi;
-import com.android.server.pm.pkg.PackageState;
 import com.android.server.pm.pkg.PackageStateInternal;
 import com.android.server.pm.pkg.SharedUserApi;
 import com.android.server.pm.pkg.component.ParsedMainComponent;
@@ -690,8 +689,6 @@
     @Nullable
     public abstract PackageStateInternal getPackageStateInternal(@NonNull String packageName);
 
-    public abstract @Nullable PackageState getPackageState(@NonNull String packageName);
-
     @NonNull
     public abstract ArrayMap<String, ? extends PackageStateInternal> getPackageStates();
 
diff --git a/services/core/java/com/android/server/pm/ApkChecksums.java b/services/core/java/com/android/server/pm/ApkChecksums.java
index aa467e7..2824585 100644
--- a/services/core/java/com/android/server/pm/ApkChecksums.java
+++ b/services/core/java/com/android/server/pm/ApkChecksums.java
@@ -34,6 +34,7 @@
 import android.content.pm.ApkChecksum;
 import android.content.pm.Checksum;
 import android.content.pm.IOnChecksumsReadyListener;
+import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
 import android.content.pm.Signature;
 import android.content.pm.SigningDetails.SignatureSchemeVersion;
@@ -62,6 +63,7 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.security.VerityUtils;
+import com.android.server.LocalServices;
 import com.android.server.pm.parsing.pkg.AndroidPackage;
 
 import java.io.ByteArrayOutputStream;
diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java
index d117967..7b2dc28 100644
--- a/services/core/java/com/android/server/pm/AppsFilter.java
+++ b/services/core/java/com/android/server/pm/AppsFilter.java
@@ -52,6 +52,7 @@
 import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.function.QuadFunction;
 import com.android.server.FgThread;
+import com.android.server.LocalServices;
 import com.android.server.compat.CompatChange;
 import com.android.server.om.OverlayReferenceMapper;
 import com.android.server.pm.parsing.pkg.AndroidPackage;
@@ -486,12 +487,12 @@
     }
 
     /** Builder method for an AppsFilter */
-    public static AppsFilter create(
-            PackageManagerInternal pms, PackageManagerServiceInjector injector) {
+    public static AppsFilter create(@NonNull PackageManagerServiceInjector injector,
+            @NonNull PackageManagerInternal pmInt) {
         final boolean forceSystemAppsQueryable =
                 injector.getContext().getResources()
                         .getBoolean(R.bool.config_forceSystemPackagesQueryable);
-        final FeatureConfigImpl featureConfig = new FeatureConfigImpl(pms, injector);
+        final FeatureConfigImpl featureConfig = new FeatureConfigImpl(pmInt, injector);
         final String[] forcedQueryablePackageNames;
         if (forceSystemAppsQueryable) {
             // all system apps already queryable, no need to read and parse individual exceptions
@@ -512,7 +513,7 @@
         };
         AppsFilter appsFilter = new AppsFilter(stateProvider, featureConfig,
                 forcedQueryablePackageNames, forceSystemAppsQueryable, null,
-                injector.getBackgroundExecutor(), pms);
+                injector.getBackgroundExecutor(), pmInt);
         featureConfig.setAppsFilter(appsFilter);
         return appsFilter;
     }
diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
index ecbb4a9..9ff4aab 100644
--- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
@@ -19,6 +19,7 @@
 import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
 
 import android.annotation.IntDef;
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.job.JobInfo;
 import android.app.job.JobParameters;
@@ -269,7 +270,7 @@
             PackageManagerService pm = mInjector.getPackageManagerService();
             ArraySet<String> packagesToOptimize;
             if (packageNames == null) {
-                packagesToOptimize = mDexOptHelper.getOptimizablePackages();
+                packagesToOptimize = mDexOptHelper.getOptimizablePackages(pm.snapshotComputer());
             } else {
                 packagesToOptimize = new ArraySet<>(packageNames);
             }
@@ -334,7 +335,7 @@
             return false;
         }
 
-        ArraySet<String> pkgs = mDexOptHelper.getOptimizablePackages();
+        ArraySet<String> pkgs = mDexOptHelper.getOptimizablePackages(pm.snapshotComputer());
         if (pkgs.isEmpty()) {
             Slog.i(TAG, "No packages to optimize");
             markPostBootUpdateCompleted(params);
@@ -556,8 +557,8 @@
     }
 
     /** Gets the size of a package. */
-    private long getPackageSize(PackageManagerService pm, String pkg) {
-        PackageInfo info = pm.snapshotComputer().getPackageInfo(pkg, 0, UserHandle.USER_SYSTEM);
+    private long getPackageSize(@NonNull Computer snapshot, String pkg) {
+        PackageInfo info = snapshot.getPackageInfo(pkg, 0, UserHandle.USER_SYSTEM);
         long size = 0;
         if (info != null && info.applicationInfo != null) {
             File path = Paths.get(info.applicationInfo.sourceDir).toFile();
@@ -605,8 +606,9 @@
                 Slog.d(TAG, "Should Downgrade " + shouldDowngrade);
             }
             if (shouldDowngrade) {
+                final Computer snapshot = pm.snapshotComputer();
                 Set<String> unusedPackages =
-                        pm.getUnusedPackages(mDowngradeUnusedAppsThresholdInMillis);
+                        snapshot.getUnusedPackages(mDowngradeUnusedAppsThresholdInMillis);
                 if (DEBUG) {
                     Slog.d(TAG, "Unsused Packages " + String.join(",", unusedPackages));
                 }
@@ -618,7 +620,7 @@
                             // Should be aborted by the scheduler.
                             return abortCode;
                         }
-                        @DexOptResult int downgradeResult = downgradePackage(pm, pkg,
+                        @DexOptResult int downgradeResult = downgradePackage(snapshot, pm, pkg,
                                 /* isForPrimaryDex= */ true, isPostBootUpdate);
                         if (downgradeResult == PackageDexOptimizer.DEX_OPT_PERFORMED) {
                             updatedPackages.add(pkg);
@@ -629,7 +631,7 @@
                             return status;
                         }
                         if (supportSecondaryDex) {
-                            downgradeResult = downgradePackage(pm, pkg,
+                            downgradeResult = downgradePackage(snapshot, pm, pkg,
                                     /* isForPrimaryDex= */false, isPostBootUpdate);
                             status = convertPackageDexOptimizerStatusToInternal(downgradeResult);
                             if (status != STATUS_OK) {
@@ -696,8 +698,8 @@
      * @return PackageDexOptimizer.DEX_*
      */
     @DexOptResult
-    private int downgradePackage(PackageManagerService pm, String pkg, boolean isForPrimaryDex,
-            boolean isPostBootUpdate) {
+    private int downgradePackage(@NonNull Computer snapshot, PackageManagerService pm, String pkg,
+            boolean isForPrimaryDex, boolean isPostBootUpdate) {
         if (DEBUG) {
             Slog.d(TAG, "Downgrading " + pkg);
         }
@@ -709,15 +711,15 @@
         if (!isPostBootUpdate) {
             dexoptFlags |= DexoptOptions.DEXOPT_IDLE_BACKGROUND_JOB;
         }
-        long package_size_before = getPackageSize(pm, pkg);
+        long package_size_before = getPackageSize(snapshot, pkg);
         int result = PackageDexOptimizer.DEX_OPT_SKIPPED;
         if (isForPrimaryDex || PLATFORM_PACKAGE_NAME.equals(pkg)) {
             // This applies for system apps or if packages location is not a directory, i.e.
             // monolithic install.
-            if (!pm.canHaveOatDir(pkg)) {
+            if (!pm.canHaveOatDir(snapshot, pkg)) {
                 // For apps that don't have the oat directory, instead of downgrading,
                 // remove their compiler artifacts from dalvik cache.
-                pm.deleteOatArtifactsOfPackage(pkg);
+                pm.deleteOatArtifactsOfPackage(snapshot, pkg);
             } else {
                 result = performDexOptPrimary(pkg, reason, dexoptFlags);
             }
@@ -726,8 +728,9 @@
         }
 
         if (result == PackageDexOptimizer.DEX_OPT_PERFORMED) {
+            final Computer newSnapshot = pm.snapshotComputer();
             FrameworkStatsLog.write(FrameworkStatsLog.APP_DOWNGRADED, pkg, package_size_before,
-                    getPackageSize(pm, pkg), /*aggressive=*/ false);
+                    getPackageSize(newSnapshot, pkg), /*aggressive=*/ false);
         }
         return result;
     }
diff --git a/services/core/java/com/android/server/pm/Computer.java b/services/core/java/com/android/server/pm/Computer.java
index 6103d68..8e85301 100644
--- a/services/core/java/com/android/server/pm/Computer.java
+++ b/services/core/java/com/android/server/pm/Computer.java
@@ -58,10 +58,6 @@
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
 import java.util.List;
 import java.util.Set;
 
@@ -92,92 +88,69 @@
  * and other managers (like PermissionManager) mean deadlock is possible.  On the
  * other hand, not overriding in {@link ComputerLocked} may leave a function walking
  * unstable data.
- *
- * To coax developers to consider such issues carefully, all methods in
- * {@link Computer} must be annotated with <code>@LiveImplementation(override =
- * MANDATORY)</code> or <code>LiveImplementation(locked = NOT_ALLOWED)</code>.  A unit
- * test verifies the annotation and that the annotation corresponds to the code in
- * {@link ComputerEngine} and {@link ComputerLocked}.
  */
 @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
 public interface Computer extends PackageDataSnapshot {
 
     /**
-     * Every method must be annotated.
-     */
-    @Target({ ElementType.METHOD })
-    @Retention(RetentionPolicy.RUNTIME)
-    @interface LiveImplementation {
-        // A Computer method must be annotated with one of the following values:
-        //   MANDATORY - the method must be overridden in ComputerEngineLive.  The
-        //     format of the override is a call to the super method, wrapped in a
-        //     synchronization block.
-        //   NOT_ALLOWED - the method may not appear in the live computer.  It must
-        //     be final in the ComputerEngine.
-        int MANDATORY = 1;
-        int NOT_ALLOWED = 2;
-        int override() default MANDATORY;
-        String rationale() default "";
-    }
-
-    /**
      * Administrative statistics: record that the snapshot has been used.  Every call
      * to use() increments the usage counter.
      */
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     default void use() {
     }
     /**
      * Fetch the snapshot usage counter.
      * @return The number of times this snapshot was used.
      */
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     default int getUsed() {
         return 0;
     }
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     @NonNull List<ResolveInfo> queryIntentActivitiesInternal(Intent intent, String resolvedType,
             @PackageManager.ResolveInfoFlagsBits long flags,
             @PackageManagerInternal.PrivateResolveFlags long privateResolveFlags,
             int filterCallingUid, int userId, boolean resolveForStart, boolean allowDynamicSplits);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     @NonNull List<ResolveInfo> queryIntentActivitiesInternal(Intent intent, String resolvedType,
             long flags, int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     @NonNull List<ResolveInfo> queryIntentServicesInternal(Intent intent, String resolvedType,
             long flags, int userId, int callingUid, boolean includeInstantApps);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
     @NonNull QueryIntentActivitiesResult queryIntentActivitiesInternalBody(Intent intent,
             String resolvedType, long flags, int filterCallingUid, int userId,
             boolean resolveForStart, boolean allowDynamicSplits, String pkgName,
             String instantAppPkgName);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     ActivityInfo getActivityInfo(ComponentName component, long flags, int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
+
+    /**
+     * Important: The provided filterCallingUid is used exclusively to filter out activities
+     * that can be seen based on user state. It's typically the original caller uid prior
+     * to clearing. Because it can only be provided by trusted code, its value can be
+     * trusted and will be used as-is; unlike userId which will be validated by this method.
+     */
     ActivityInfo getActivityInfoInternal(ComponentName component, long flags,
             int filterCallingUid, int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
     AndroidPackage getPackage(String packageName);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
     AndroidPackage getPackage(int uid);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     ApplicationInfo generateApplicationInfoFromSettings(String packageName, long flags,
             int filterCallingUid, int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     ApplicationInfo getApplicationInfo(String packageName, long flags, int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
+
+    /**
+     * Important: The provided filterCallingUid is used exclusively to filter out applications
+     * that can be seen based on user state. It's typically the original caller uid prior
+     * to clearing. Because it can only be provided by trusted code, its value can be
+     * trusted and will be used as-is; unlike userId which will be validated by this method.
+     */
     ApplicationInfo getApplicationInfoInternal(String packageName, long flags,
             int filterCallingUid, int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
+
+    /**
+     * Report the 'Home' activity which is currently set as "always use this one". If non is set
+     * then reports the most likely home activity or null if there are more than one.
+     */
     ComponentName getDefaultHomeActivity(int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates, int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     CrossProfileDomainInfo getCrossProfileDomainPreferredLpr(Intent intent, String resolvedType,
             long flags, int sourceUserId, int parentUserId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     Intent getHomeIntent();
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     List<CrossProfileIntentFilter> getMatchingCrossProfileIntentFilters(Intent intent,
             String resolvedType, int userId);
 
@@ -192,15 +165,11 @@
      * @param intent
      * @return A filtered list of resolved activities.
      */
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     List<ResolveInfo> applyPostResolutionFilter(@NonNull List<ResolveInfo> resolveInfos,
             String ephemeralPkgName, boolean allowDynamicSplits, int filterCallingUid,
             boolean resolveForStart, int userId, Intent intent);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     PackageInfo generatePackageInfo(PackageStateInternal ps, long flags, int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     PackageInfo getPackageInfo(String packageName, long flags, int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     PackageInfo getPackageInfoInternal(String packageName, long versionCode, long flags,
             int filterCallingUid, int userId);
 
@@ -209,79 +178,69 @@
      * known {@link PackageState} instances without a {@link PackageState#getAndroidPackage()}
      * will not be represented.
      */
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
     String[] getAllAvailablePackageNames();
 
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     PackageStateInternal getPackageStateInternal(String packageName);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
     PackageStateInternal getPackageStateInternal(String packageName, int callingUid);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
-    @Nullable PackageState getPackageStateCopied(@NonNull String packageName);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     ParceledListSlice<PackageInfo> getInstalledPackages(long flags, int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     ResolveInfo createForwardingResolveInfoUnchecked(WatchedIntentFilter filter,
             int sourceUserId, int targetUserId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     ServiceInfo getServiceInfo(ComponentName component, long flags, int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     SharedLibraryInfo getSharedLibraryInfo(String name, long version);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
     String getInstantAppPackageName(int callingUid);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     String resolveExternalPackageName(AndroidPackage pkg);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     String resolveInternalPackageName(String packageName, long versionCode);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     String[] getPackagesForUid(int uid);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     UserInfo getProfileParent(int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     boolean canViewInstantApps(int callingUid, int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     boolean filterSharedLibPackage(@Nullable PackageStateInternal ps, int uid, int userId,
             long flags);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     boolean isCallerSameApp(String packageName, int uid);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     boolean isComponentVisibleToInstantApp(@Nullable ComponentName component);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     boolean isComponentVisibleToInstantApp(@Nullable ComponentName component,
             @PackageManager.ComponentType int type);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
-    boolean isImplicitImageCaptureIntentAndNotSetByDpcLocked(Intent intent, int userId,
+
+    /**
+     * From Android R, camera intents have to match system apps. The only exception to this is if
+     * the DPC has set the camera persistent preferred activity. This case was introduced
+     * because it is important that the DPC has the ability to set both system and non-system
+     * camera persistent preferred activities.
+     *
+     * @return {@code true} if the intent is a camera intent and the persistent preferred
+     * activity was not set by the DPC.
+     */
+    boolean isImplicitImageCaptureIntentAndNotSetByDpc(Intent intent, int userId,
             String resolvedType, long flags);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     boolean isInstantApp(String packageName, int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     boolean isInstantAppInternal(String packageName, @UserIdInt int userId, int callingUid);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     boolean isSameProfileGroup(@UserIdInt int callerUserId, @UserIdInt int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     boolean shouldFilterApplication(@Nullable PackageStateInternal ps, int callingUid,
             @Nullable ComponentName component, @PackageManager.ComponentType int componentType,
             int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     boolean shouldFilterApplication(@Nullable PackageStateInternal ps, int callingUid,
             int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     boolean shouldFilterApplication(@NonNull SharedUserSetting sus, int callingUid,
             int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     int checkUidPermission(String permName, int uid);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
     int getPackageUidInternal(String packageName, long flags, int userId, int callingUid);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     long updateFlagsForApplication(long flags, int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     long updateFlagsForComponent(long flags, int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     long updateFlagsForPackage(long flags, int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
+
+    /**
+     * Update given flags when being used to request {@link ResolveInfo}.
+     * <p>Instant apps are resolved specially, depending upon context. Minimally,
+     * {@code}flags{@code} must have the {@link PackageManager#MATCH_INSTANT}
+     * flag set. However, this flag is only honoured in three circumstances:
+     * <ul>
+     * <li>when called from a system process</li>
+     * <li>when the caller holds the permission {@code android.permission.ACCESS_INSTANT_APPS}</li>
+     * <li>when resolution occurs to start an activity with a {@code android.intent.action.VIEW}
+     * action and a {@code android.intent.category.BROWSABLE} category</li>
+     * </ul>
+     */
     long updateFlagsForResolve(long flags, int userId, int callingUid, boolean wantInstantApps,
             boolean isImplicitImageCaptureIntentAndNotSetByDpc);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     long updateFlagsForResolve(long flags, int userId, int callingUid, boolean wantInstantApps,
             boolean onlyExposedExplicitly, boolean isImplicitImageCaptureIntentAndNotSetByDpc);
 
@@ -299,117 +258,99 @@
      * @param checkShell whether to prevent shell from access if there's a debugging restriction
      * @param message the message to log on security exception
      */
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     void enforceCrossUserOrProfilePermission(int callingUid, @UserIdInt int userId,
             boolean requireFullPermission, boolean checkShell, String message);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
+
+    /**
+     * Enforces the request is from the system or an app that has INTERACT_ACROSS_USERS
+     * or INTERACT_ACROSS_USERS_FULL permissions, if the {@code userId} is not for the caller.
+     *
+     * @param checkShell whether to prevent shell from access if there's a debugging restriction
+     * @param message the message to log on security exception
+     */
     void enforceCrossUserPermission(int callingUid, @UserIdInt int userId,
             boolean requireFullPermission, boolean checkShell, String message);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     void enforceCrossUserPermission(int callingUid, @UserIdInt int userId,
             boolean requireFullPermission, boolean checkShell,
             boolean requirePermissionWhenSameUser, String message);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
     SigningDetails getSigningDetails(@NonNull String packageName);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
     SigningDetails getSigningDetails(int uid);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
     boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
     boolean filterAppAccess(String packageName, int callingUid, int userId);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
     boolean filterAppAccess(int uid, int callingUid);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
     void dump(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
     PackageManagerService.FindPreferredActivityBodyResult findPreferredActivityInternal(
             Intent intent, String resolvedType, long flags, List<ResolveInfo> query, boolean always,
             boolean removeMatches, boolean debug, int userId, boolean queryMayBeFiltered);
-    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
-    ResolveInfo findPersistentPreferredActivityLP(Intent intent, String resolvedType, long flags,
+    ResolveInfo findPersistentPreferredActivity(Intent intent, String resolvedType, long flags,
             List<ResolveInfo> query, boolean debug, int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     PreferredIntentResolver getPreferredActivities(@UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     ArrayMap<String, ? extends PackageStateInternal> getPackageStates();
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     String getRenamedPackage(@NonNull String packageName);
 
     /**
      * @return set of packages to notify
      */
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     ArraySet<String> getNotifyPackagesForReplacedReceived(@NonNull String[] packages);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @PackageManagerService.PackageStartability
     int getPackageStartability(boolean safeMode, @NonNull String packageName, int callingUid,
             @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     boolean isPackageAvailable(String packageName, @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     String[] currentToCanonicalPackageNames(@NonNull String[] names);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     String[] canonicalToCurrentPackageNames(@NonNull String[] names);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     int[] getPackageGids(@NonNull String packageName,
             @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     int getTargetSdkVersion(@NonNull String packageName);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     boolean activitySupportsIntent(@NonNull ComponentName resolveComponentName,
             @NonNull ComponentName component, @NonNull Intent intent, String resolvedType);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     ActivityInfo getReceiverInfo(@NonNull ComponentName component,
             @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     ParceledListSlice<SharedLibraryInfo> getSharedLibraries(@NonNull String packageName,
             @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     boolean canRequestPackageInstalls(@NonNull String packageName, int callingUid,
             int userId, boolean throwIfPermNotDeclared);
 
-    @Computer.LiveImplementation(override = LiveImplementation.NOT_ALLOWED)
+    /**
+     * Returns true if the system or user is explicitly preventing an otherwise valid installer to
+     * complete an install. This includes checks like unknown sources and user restrictions.
+     */
     boolean isInstallDisabledForPackage(@NonNull String packageName, int uid,
             @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     List<VersionedPackage> getPackagesUsingSharedLibrary(@NonNull SharedLibraryInfo libInfo,
             @PackageManager.PackageInfoFlagsBits long flags, int callingUid, @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     ParceledListSlice<SharedLibraryInfo> getDeclaredSharedLibraries(
             @NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags,
             @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     ProviderInfo getProviderInfo(@NonNull ComponentName component,
             @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     String[] getSystemSharedLibraryNames();
 
@@ -417,136 +358,103 @@
      * @return the state if the given package has a state and isn't filtered by visibility.
      * Provides no guarantee that the package is in any usable state.
      */
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     PackageStateInternal getPackageStateFiltered(@NonNull String packageName, int callingUid,
             @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     int checkSignatures(@NonNull String pkg1, @NonNull String pkg2);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     int checkUidSignatures(int uid1, int uid2);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     boolean hasSigningCertificate(@NonNull String packageName, @NonNull byte[] certificate,
             @PackageManager.CertificateInputType int type);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate,
             @PackageManager.CertificateInputType int type);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     List<String> getAllPackages();
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     String getNameForUid(int uid);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     String[] getNamesForUids(@NonNull int[] uids);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     int getUidForSharedUser(@NonNull String sharedUserName);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     int getFlagsForUid(int uid);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     int getPrivateFlagsForUid(int uid);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     boolean isUidPrivileged(int uid);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     String[] getAppOpPermissionPackages(@NonNull String permissionName);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     ParceledListSlice<PackageInfo> getPackagesHoldingPermissions(@NonNull String[] permissions,
             @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     List<ApplicationInfo> getInstalledApplications(
             @PackageManager.ApplicationInfoFlagsBits long flags, @UserIdInt int userId,
             int callingUid);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     ProviderInfo resolveContentProvider(@NonNull String name,
             @PackageManager.ResolveInfoFlagsBits long flags, @UserIdInt int userId, int callingUid);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     ProviderInfo getGrantImplicitAccessProviderInfo(int recipientUid,
             @NonNull String visibleAuthority);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     void querySyncProviders(boolean safeMode, @NonNull List<String> outNames,
             @NonNull List<ProviderInfo> outInfo);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     ParceledListSlice<ProviderInfo> queryContentProviders(@Nullable String processName, int uid,
             @PackageManager.ComponentInfoFlagsBits long flags, @Nullable String metaDataKey);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component, int flags);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     ParceledListSlice<InstrumentationInfo> queryInstrumentation(
             @NonNull String targetPackage, int flags);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     List<PackageStateInternal> findSharedNonSystemLibraries(
             @NonNull PackageStateInternal pkgSetting);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     boolean getApplicationHiddenSettingAsUser(@NonNull String packageName, @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     boolean isSuspendingAnyPackages(@NonNull String suspendingPackage, @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     ParceledListSlice<IntentFilter> getAllIntentFilters(@NonNull String packageName);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     boolean getBlockUninstallForUser(@NonNull String packageName, @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     SparseArray<int[]> getBroadcastAllowList(@NonNull String packageName, @UserIdInt int[] userIds,
             boolean isInstantApp);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     String getInstallerPackageName(@NonNull String packageName);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     InstallSourceInfo getInstallSourceInfo(@NonNull String packageName);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @PackageManager.EnabledState
     int getApplicationEnabledSetting(@NonNull String packageName, @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @PackageManager.EnabledState
     int getComponentEnabledSetting(@NonNull ComponentName component, int callingUid,
             @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @PackageManager.EnabledState
     int getComponentEnabledSettingInternal(@NonNull ComponentName component, int callingUid,
             @UserIdInt int userId);
@@ -557,25 +465,19 @@
      * are all effectively enabled for the given component. Or if the component cannot be found,
      * returns false.
      */
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     boolean isComponentEffectivelyEnabled(@NonNull ComponentInfo componentInfo,
             @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     KeySet getSigningKeySet(@NonNull String packageName);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     boolean isPackageSignedByKeySetExactly(@NonNull String packageName, @NonNull KeySet ks);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     int[] getVisibilityAllowList(@NonNull String packageName, @UserIdInt int userId);
 
@@ -585,49 +487,37 @@
      * package visibility filtering is enabled on it. If the UID is part of a shared user ID,
      * return {@code true} if any one application belongs to the shared user ID meets the criteria.
      */
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     boolean canQueryPackage(int callingUid, @Nullable String targetPackageName);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     int getPackageUid(@NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags,
             @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     boolean canAccessComponent(int callingUid, @NonNull ComponentName component,
             @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @PackageManager.InstallReason
     int getInstallReason(@NonNull String packageName, @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     boolean canPackageQuery(@NonNull String sourcePackageName, @NonNull String targetPackageName,
             @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType,
             @UserIdInt int sourceUserId, @UserIdInt int targetUserId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     List<ApplicationInfo> getPersistentApplications(boolean safeMode, int flags);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     SparseArray<String> getAppsWithSharedUserIds();
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     String[] getSharedUserPackagesForPackage(@NonNull String packageName, @UserIdInt int userId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     Set<String> getUnusedPackages(long downgradeTimeThresholdMillis);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     CharSequence getHarmfulAppWarning(@NonNull String packageName, @UserIdInt int userId);
 
@@ -638,55 +528,49 @@
      *
      * @return The filtered packages
      */
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     String[] filterOnlySystemPackages(@Nullable String... pkgNames);
 
     // The methods in this block should be removed once SettingBase is interface snapshotted
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     List<AndroidPackage> getPackagesForAppId(int appId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     int getUidTargetSdkVersion(int uid);
 
     /**
      * @see PackageManagerInternal#getProcessesForUid(int)
      */
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     ArrayMap<String, ProcessInfo> getProcessesForUid(int uid);
     // End block
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     boolean getBlockUninstall(@UserIdInt int userId, @NonNull String packageName);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries();
 
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     Pair<PackageStateInternal, SharedUserApi> getPackageOrSharedUser(int appId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     SharedUserApi getSharedUser(int sharedUserAppIde);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     ArraySet<PackageStateInternal> getSharedUserPackages(int sharedUserAppId);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @NonNull
     ComponentResolverApi getComponentResolver();
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     PackageStateInternal getDisabledSystemPackage(@NonNull String packageName);
 
-    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
     @Nullable
     ResolveInfo getInstantAppInstallerInfo();
+
+    @NonNull
+    WatchedArrayMap<String, Integer> getFrozenPackages();
+
+    @Nullable
+    ComponentName getInstantAppInstallerComponent();
 }
diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java
index 0c9855b..06e827a 100644
--- a/services/core/java/com/android/server/pm/ComputerEngine.java
+++ b/services/core/java/com/android/server/pm/ComputerEngine.java
@@ -466,7 +466,7 @@
 
         flags = updateFlagsForResolve(flags, userId, filterCallingUid, resolveForStart,
                 comp != null || pkgName != null /*onlyExposedExplicitly*/,
-                isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, resolvedType,
+                isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId, resolvedType,
                         flags));
         List<ResolveInfo> list = Collections.emptyList();
         boolean skipPostResolution = false;
@@ -1722,15 +1722,6 @@
         return mSettings.getPackage(packageName);
     }
 
-    @Nullable
-    public PackageState getPackageStateCopied(@NonNull String packageName) {
-        int callingUid = Binder.getCallingUid();
-        packageName = resolveInternalPackageNameInternalLocked(
-                packageName, PackageManager.VERSION_CODE_HIGHEST, callingUid);
-        PackageStateInternal pkgSetting = mSettings.getPackage(packageName);
-        return pkgSetting == null ? null : PackageStateImpl.copy(pkgSetting);
-    }
-
     public final ParceledListSlice<PackageInfo> getInstalledPackages(long flags, int userId) {
         final int callingUid = Binder.getCallingUid();
         if (getInstantAppPackageName(callingUid) != null) {
@@ -2468,7 +2459,7 @@
      * @return {@code true} if the intent is a camera intent and the persistent preferred
      * activity was not set by the DPC.
      */
-    public final boolean isImplicitImageCaptureIntentAndNotSetByDpcLocked(Intent intent,
+    public final boolean isImplicitImageCaptureIntentAndNotSetByDpc(Intent intent,
             int userId, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags) {
         return intent.isImplicitImageCaptureIntent() && !isPersistentPreferredActivitySetByDpm(
                 intent, userId, resolvedType, flags);
@@ -3228,12 +3219,12 @@
 
         flags = updateFlagsForResolve(
                 flags, userId, callingUid, false /*includeInstantApps*/,
-                isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId,
+                isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId,
                         resolvedType, flags));
         intent = PackageManagerServiceUtils.updateIntentForResolve(intent);
 
         // Try to find a matching persistent preferred activity.
-        result.mPreferredResolveInfo = findPersistentPreferredActivityLP(intent,
+        result.mPreferredResolveInfo = findPersistentPreferredActivity(intent,
                 resolvedType, flags, query, debug, userId);
 
         // If a persistent preferred activity matched, use it.
@@ -3444,7 +3435,7 @@
                 userId, queryMayBeFiltered, callingUid, isDeviceProvisioned);
     }
 
-    public final ResolveInfo findPersistentPreferredActivityLP(Intent intent,
+    public final ResolveInfo findPersistentPreferredActivity(Intent intent,
             String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
             List<ResolveInfo> query, boolean debug, int userId) {
         final int n = query.size();
@@ -5418,7 +5409,7 @@
             }
             long flags = updateFlagsForResolve(0, parent.id, callingUid,
                     false /*includeInstantApps*/,
-                    isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, parent.id,
+                    isImplicitImageCaptureIntentAndNotSetByDpc(intent, parent.id,
                             resolvedType, 0));
             flags |= PackageManager.MATCH_DEFAULT_ONLY;
             CrossProfileDomainInfo xpDomainInfo = getCrossProfileDomainPreferredLpr(
@@ -5694,4 +5685,17 @@
     public ResolveInfo getInstantAppInstallerInfo() {
         return mInstantAppInstallerInfo;
     }
+
+    @NonNull
+    @Override
+    public WatchedArrayMap<String, Integer> getFrozenPackages() {
+        return mFrozenPackages;
+    }
+
+    @Nullable
+    @Override
+    public ComponentName getInstantAppInstallerComponent() {
+        return mLocalInstantAppInstallerActivity == null
+                ? null : mLocalInstantAppInstallerActivity.getComponentName();
+    }
 }
diff --git a/services/core/java/com/android/server/pm/ComputerLocked.java b/services/core/java/com/android/server/pm/ComputerLocked.java
index 5d89c7d..af196d5 100644
--- a/services/core/java/com/android/server/pm/ComputerLocked.java
+++ b/services/core/java/com/android/server/pm/ComputerLocked.java
@@ -16,62 +16,21 @@
 
 package com.android.server.pm;
 
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.UserIdInt;
 import android.content.ComponentName;
-import android.content.Intent;
-import android.content.IntentFilter;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
-import android.content.pm.ComponentInfo;
-import android.content.pm.InstallSourceInfo;
-import android.content.pm.InstrumentationInfo;
-import android.content.pm.KeySet;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ParceledListSlice;
-import android.content.pm.ProcessInfo;
-import android.content.pm.ProviderInfo;
-import android.content.pm.ResolveInfo;
-import android.content.pm.ServiceInfo;
-import android.content.pm.SharedLibraryInfo;
-import android.content.pm.SigningDetails;
-import android.content.pm.VersionedPackage;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-import android.util.Pair;
-import android.util.SparseArray;
 
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.pm.parsing.pkg.AndroidPackage;
-import com.android.server.pm.pkg.PackageState;
-import com.android.server.pm.pkg.PackageStateInternal;
-import com.android.server.pm.pkg.SharedUserApi;
-import com.android.server.pm.resolution.ComponentResolverApi;
-import com.android.server.utils.WatchedArrayMap;
-import com.android.server.utils.WatchedLongSparseArray;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
 
 /**
  * This subclass is the external interface to the live computer.  Some internal helper
- * methods are overridden to fetch live data instead of snapshot data.  For each
- * Computer interface that is overridden in this class, the override takes the PM lock
- * and then delegates to the live computer engine.  This is required because there are
- * no locks taken in the engine itself.
+ * methods are overridden to fetch live data instead of snapshot data.
  */
 @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
 public final class ComputerLocked extends ComputerEngine {
-    private final Object mLock;
 
     ComputerLocked(PackageManagerService.Snapshot args) {
         super(args);
-        mLock = mService.mLock;
     }
 
     protected ComponentName resolveComponentName() {
@@ -83,814 +42,4 @@
     protected ApplicationInfo androidApplication() {
         return mService.getCoreAndroidApplication();
     }
-
-    public @NonNull List<ResolveInfo> queryIntentServicesInternalBody(Intent intent,
-            String resolvedType, int flags, int userId, int callingUid,
-            String instantAppPkgName) {
-        synchronized (mLock) {
-            return super.queryIntentServicesInternalBody(intent, resolvedType, flags, userId,
-                    callingUid, instantAppPkgName);
-        }
-    }
-    public @NonNull QueryIntentActivitiesResult queryIntentActivitiesInternalBody(
-            Intent intent, String resolvedType, long flags, int filterCallingUid, int userId,
-            boolean resolveForStart, boolean allowDynamicSplits, String pkgName,
-            String instantAppPkgName) {
-        synchronized (mLock) {
-            return super.queryIntentActivitiesInternalBody(intent, resolvedType, flags,
-                    filterCallingUid, userId, resolveForStart, allowDynamicSplits, pkgName,
-                    instantAppPkgName);
-        }
-    }
-    public ActivityInfo getActivityInfoInternalBody(ComponentName component, int flags,
-            int filterCallingUid, int userId) {
-        synchronized (mLock) {
-            return super.getActivityInfoInternalBody(component, flags, filterCallingUid,
-                    userId);
-        }
-    }
-    public AndroidPackage getPackage(String packageName) {
-        synchronized (mLock) {
-            return super.getPackage(packageName);
-        }
-    }
-    public AndroidPackage getPackage(int uid) {
-        synchronized (mLock) {
-            return super.getPackage(uid);
-        }
-    }
-    public ApplicationInfo getApplicationInfoInternalBody(String packageName, int flags,
-            int filterCallingUid, int userId) {
-        synchronized (mLock) {
-            return super.getApplicationInfoInternalBody(packageName, flags, filterCallingUid,
-                    userId);
-        }
-    }
-    public ArrayList<ResolveInfo> filterCandidatesWithDomainPreferredActivitiesLPrBody(
-            Intent intent, int matchFlags, List<ResolveInfo> candidates,
-            CrossProfileDomainInfo xpDomainInfo, int userId, boolean debug) {
-        synchronized (mLock) {
-            return super.filterCandidatesWithDomainPreferredActivitiesLPrBody(intent,
-                    matchFlags, candidates, xpDomainInfo, userId, debug);
-        }
-    }
-    public PackageInfo getPackageInfoInternalBody(String packageName, long versionCode,
-            int flags, int filterCallingUid, int userId) {
-        synchronized (mLock) {
-            return super.getPackageInfoInternalBody(packageName, versionCode, flags,
-                    filterCallingUid, userId);
-        }
-    }
-
-    @Override
-    public String[] getAllAvailablePackageNames() {
-        synchronized (mLock) {
-            return super.getAllAvailablePackageNames();
-        }
-    }
-
-    public PackageStateInternal getPackageStateInternal(String packageName, int callingUid) {
-        synchronized (mLock) {
-            return super.getPackageStateInternal(packageName, callingUid);
-        }
-    }
-
-    @Nullable
-    public PackageState getPackageStateCopied(@NonNull String packageName) {
-        synchronized (mLock) {
-            return super.getPackageStateCopied(packageName);
-        }
-    }
-
-    public ParceledListSlice<PackageInfo> getInstalledPackagesBody(int flags, int userId,
-            int callingUid) {
-        synchronized (mLock) {
-            return super.getInstalledPackagesBody(flags, userId, callingUid);
-        }
-    }
-    public ServiceInfo getServiceInfoBody(ComponentName component, int flags, int userId,
-            int callingUid) {
-        synchronized (mLock) {
-            return super.getServiceInfoBody(component, flags, userId, callingUid);
-        }
-    }
-    public String getInstantAppPackageName(int callingUid) {
-        synchronized (mLock) {
-            return super.getInstantAppPackageName(callingUid);
-        }
-    }
-    public String[] getPackagesForUidInternalBody(int callingUid, int userId, int appId,
-            boolean isCallerInstantApp) {
-        synchronized (mLock) {
-            return super.getPackagesForUidInternalBody(callingUid, userId, appId,
-                    isCallerInstantApp);
-        }
-    }
-    public boolean isInstantAppInternalBody(String packageName, @UserIdInt int userId,
-            int callingUid) {
-        synchronized (mLock) {
-            return super.isInstantAppInternalBody(packageName, userId, callingUid);
-        }
-    }
-    public boolean isInstantAppResolutionAllowedBody(Intent intent,
-            List<ResolveInfo> resolvedActivities, int userId, boolean skipPackageCheck,
-            int flags) {
-        synchronized (mLock) {
-            return super.isInstantAppResolutionAllowedBody(intent, resolvedActivities, userId,
-                    skipPackageCheck, flags);
-        }
-    }
-    public int getPackageUidInternal(String packageName, int flags, int userId,
-            int callingUid) {
-        synchronized (mLock) {
-            return super.getPackageUidInternal(packageName, flags, userId, callingUid);
-        }
-    }
-    public SigningDetails getSigningDetails(@NonNull String packageName) {
-        synchronized (mLock) {
-            return super.getSigningDetails(packageName);
-        }
-    }
-    public SigningDetails getSigningDetails(int uid) {
-        synchronized (mLock) {
-            return super.getSigningDetails(uid);
-        }
-    }
-    public boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) {
-        synchronized (mLock) {
-            return super.filterAppAccess(pkg, callingUid, userId);
-        }
-    }
-    public boolean filterAppAccess(String packageName, int callingUid, int userId) {
-        synchronized (mLock) {
-            return super.filterAppAccess(packageName, callingUid, userId);
-        }
-    }
-    public boolean filterAppAccess(int uid, int callingUid) {
-        synchronized (mLock) {
-            return super.filterAppAccess(uid, callingUid);
-        }
-    }
-    public void dump(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState) {
-        synchronized (mLock) {
-            super.dump(type, fd, pw, dumpState);
-        }
-    }
-    public PackageManagerService.FindPreferredActivityBodyResult findPreferredActivityBody(
-            Intent intent, String resolvedType, int flags, List<ResolveInfo> query, boolean always,
-            boolean removeMatches, boolean debug, int userId, boolean queryMayBeFiltered,
-            int callingUid, boolean isDeviceProvisioned) {
-        synchronized (mLock) {
-            return super.findPreferredActivityBody(intent, resolvedType, flags, query, always,
-                    removeMatches, debug, userId, queryMayBeFiltered, callingUid,
-                    isDeviceProvisioned);
-        }
-    }
-
-    @Override
-    public PreferredIntentResolver getPreferredActivities(int userId) {
-        synchronized (mLock) {
-            return super.getPreferredActivities(userId);
-        }
-    }
-
-    @NonNull
-    @Override
-    public ArrayMap<String, ? extends PackageStateInternal> getPackageStates() {
-        synchronized (mLock) {
-            return super.getPackageStates();
-        }
-    }
-
-    @Nullable
-    @Override
-    public String getRenamedPackage(@NonNull String packageName) {
-        synchronized (mLock) {
-            return super.getRenamedPackage(packageName);
-        }
-    }
-
-    @NonNull
-    @Override
-    public ArraySet<String> getNotifyPackagesForReplacedReceived(@NonNull String[] packages) {
-        synchronized (mLock) {
-            return super.getNotifyPackagesForReplacedReceived(packages);
-        }
-    }
-
-    @Override
-    public int getPackageStartability(boolean safeMode, @NonNull String packageName, int callingUid,
-            @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.getPackageStartability(safeMode, packageName, callingUid, userId);
-        }
-    }
-
-    @Override
-    public boolean isPackageAvailable(String packageName, @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.isPackageAvailable(packageName, userId);
-        }
-    }
-
-    @Override
-    public String[] currentToCanonicalPackageNames(String[] names) {
-        synchronized (mLock) {
-            return super.currentToCanonicalPackageNames(names);
-        }
-    }
-
-    @Override
-    public String[] canonicalToCurrentPackageNames(String[] names) {
-        synchronized (mLock) {
-            return super.canonicalToCurrentPackageNames(names);
-        }
-    }
-
-    @Override
-    public int[] getPackageGids(@NonNull String packageName,
-            @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.getPackageGids(packageName, flags, userId);
-        }
-    }
-
-    @Override
-    public int getTargetSdkVersion(@NonNull String packageName) {
-        synchronized (mLock) {
-            return super.getTargetSdkVersion(packageName);
-        }
-    }
-
-    @Override
-    public boolean activitySupportsIntent(@NonNull ComponentName resolveComponentName,
-            @NonNull ComponentName component, @NonNull Intent intent, String resolvedType) {
-        synchronized (mLock) {
-            return super.activitySupportsIntent(resolveComponentName, component, intent,
-                    resolvedType);
-        }
-    }
-
-    @Nullable
-    @Override
-    public ActivityInfo getReceiverInfo(@NonNull ComponentName component,
-            @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.getReceiverInfo(component, flags, userId);
-        }
-    }
-
-    @Nullable
-    @Override
-    public ParceledListSlice<SharedLibraryInfo> getSharedLibraries(@NonNull String packageName,
-            @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.getSharedLibraries(packageName, flags, userId);
-        }
-    }
-
-    @Override
-    public boolean canRequestPackageInstalls(@NonNull String packageName, int callingUid,
-            @UserIdInt int userId, boolean throwIfPermNotDeclared) {
-        synchronized (mLock) {
-            return super.canRequestPackageInstalls(packageName, callingUid, userId,
-                    throwIfPermNotDeclared);
-        }
-    }
-
-    @Override
-    public List<VersionedPackage> getPackagesUsingSharedLibrary(@NonNull SharedLibraryInfo libInfo,
-            @PackageManager.PackageInfoFlagsBits long flags, int callingUid,
-            @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.getPackagesUsingSharedLibrary(libInfo, flags, callingUid, userId);
-        }
-    }
-
-    @Nullable
-    @Override
-    public ParceledListSlice<SharedLibraryInfo> getDeclaredSharedLibraries(
-            @NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags,
-            @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.getDeclaredSharedLibraries(packageName, flags, userId);
-        }
-    }
-
-    @Nullable
-    @Override
-    public ProviderInfo getProviderInfo(@NonNull ComponentName component,
-            @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.getProviderInfo(component, flags, userId);
-        }
-    }
-
-    @Nullable
-    @Override
-    public String[] getSystemSharedLibraryNames() {
-        synchronized (mLock) {
-            return super.getSystemSharedLibraryNames();
-        }
-    }
-
-    @Override
-    public int checkSignatures(@NonNull String pkg1,
-            @NonNull String pkg2) {
-        synchronized (mLock) {
-            return super.checkSignatures(pkg1, pkg2);
-        }
-    }
-
-    @Override
-    public int checkUidSignatures(int uid1, int uid2) {
-        synchronized (mLock) {
-            return super.checkUidSignatures(uid1, uid2);
-        }
-    }
-
-    @Override
-    public boolean hasSigningCertificate(@NonNull String packageName, @NonNull byte[] certificate,
-            int type) {
-        synchronized (mLock) {
-            return super.hasSigningCertificate(packageName, certificate, type);
-        }
-    }
-
-    @Override
-    public boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate, int type) {
-        synchronized (mLock) {
-            return super.hasUidSigningCertificate(uid, certificate, type);
-        }
-    }
-
-    @Override
-    public List<String> getAllPackages() {
-        synchronized (mLock) {
-            return super.getAllPackages();
-        }
-    }
-
-    @Nullable
-    @Override
-    public String getNameForUid(int uid) {
-        synchronized (mLock) {
-            return super.getNameForUid(uid);
-        }
-    }
-
-    @Nullable
-    @Override
-    public String[] getNamesForUids(int[] uids) {
-        synchronized (mLock) {
-            return super.getNamesForUids(uids);
-        }
-    }
-
-    @Override
-    public int getUidForSharedUser(@NonNull String sharedUserName) {
-        synchronized (mLock) {
-            return super.getUidForSharedUser(sharedUserName);
-        }
-    }
-
-    @Override
-    public int getFlagsForUid(int uid) {
-        synchronized (mLock) {
-            return super.getFlagsForUid(uid);
-        }
-    }
-
-    @Override
-    public int getPrivateFlagsForUid(int uid) {
-        synchronized (mLock) {
-            return super.getPrivateFlagsForUid(uid);
-        }
-    }
-
-    @Override
-    public boolean isUidPrivileged(int uid) {
-        synchronized (mLock) {
-            return super.isUidPrivileged(uid);
-        }
-    }
-
-    @NonNull
-    @Override
-    public String[] getAppOpPermissionPackages(@NonNull String permissionName) {
-        synchronized (mLock) {
-            return super.getAppOpPermissionPackages(permissionName);
-        }
-    }
-
-    @NonNull
-    @Override
-    public ParceledListSlice<PackageInfo> getPackagesHoldingPermissions(
-            @NonNull String[] permissions, @PackageManager.PackageInfoFlagsBits long flags,
-            @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.getPackagesHoldingPermissions(permissions, flags, userId);
-        }
-    }
-
-    @NonNull
-    @Override
-    public List<ApplicationInfo> getInstalledApplications(
-            @PackageManager.ApplicationInfoFlagsBits long flags, @UserIdInt int userId,
-            int callingUid) {
-        synchronized (mLock) {
-            return super.getInstalledApplications(flags, userId, callingUid);
-        }
-    }
-
-    @Nullable
-    @Override
-    public ProviderInfo resolveContentProvider(@NonNull String name,
-            @PackageManager.ResolveInfoFlagsBits long flags, @UserIdInt int userId,
-            int callingUid) {
-        synchronized (mLock) {
-            return super.resolveContentProvider(name, flags, userId, callingUid);
-        }
-    }
-
-    @Nullable
-    @Override
-    public ProviderInfo getGrantImplicitAccessProviderInfo(int recipientUid,
-            @NonNull String visibleAuthority) {
-        synchronized (mLock) {
-            return super.getGrantImplicitAccessProviderInfo(recipientUid, visibleAuthority);
-        }
-    }
-
-    @Override
-    public void querySyncProviders(boolean safeMode, @NonNull List<String> outNames,
-            @NonNull List<ProviderInfo> outInfo) {
-        synchronized (mLock) {
-            super.querySyncProviders(safeMode, outNames, outInfo);
-        }
-    }
-
-    @NonNull
-    @Override
-    public ParceledListSlice<ProviderInfo> queryContentProviders(@Nullable String processName,
-            int uid, @PackageManager.ComponentInfoFlagsBits long flags,
-            @Nullable String metaDataKey) {
-        synchronized (mLock) {
-            return super.queryContentProviders(processName, uid, flags, metaDataKey);
-        }
-    }
-
-    @Nullable
-    @Override
-    public InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component, int flags) {
-        synchronized (mLock) {
-            return super.getInstrumentationInfo(component, flags);
-        }
-    }
-
-    @NonNull
-    @Override
-    public ParceledListSlice<InstrumentationInfo> queryInstrumentation(
-            @NonNull String targetPackage, int flags) {
-        synchronized (mLock) {
-            return super.queryInstrumentation(targetPackage, flags);
-        }
-    }
-
-    @NonNull
-    @Override
-    public List<PackageStateInternal> findSharedNonSystemLibraries(
-            @NonNull PackageStateInternal pkgSetting) {
-        synchronized (mLock) {
-            return super.findSharedNonSystemLibraries(pkgSetting);
-        }
-    }
-
-    @Override
-    public boolean getApplicationHiddenSettingAsUser(@NonNull String packageName,
-            @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.getApplicationHiddenSettingAsUser(packageName, userId);
-        }
-    }
-
-    @Override
-    public boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.isPackageSuspendedForUser(packageName, userId);
-        }
-    }
-
-    @Override
-    public boolean isSuspendingAnyPackages(@NonNull String suspendingPackage,
-            @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.isSuspendingAnyPackages(suspendingPackage, userId);
-        }
-    }
-
-    @NonNull
-    @Override
-    public ParceledListSlice<IntentFilter> getAllIntentFilters(@NonNull String packageName) {
-        synchronized (mLock) {
-            return super.getAllIntentFilters(packageName);
-        }
-    }
-
-    @Override
-    public boolean getBlockUninstallForUser(@NonNull String packageName, @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.getBlockUninstallForUser(packageName, userId);
-        }
-    }
-
-    @Nullable
-    @Override
-    public SparseArray<int[]> getBroadcastAllowList(@NonNull String packageName,
-            @UserIdInt int[] userIds, boolean isInstantApp) {
-        synchronized (mLock) {
-            return super.getBroadcastAllowList(packageName, userIds, isInstantApp);
-        }
-    }
-
-    @Nullable
-    @Override
-    public String getInstallerPackageName(@NonNull String packageName) {
-        synchronized (mLock) {
-            return super.getInstallerPackageName(packageName);
-        }
-    }
-
-    @Nullable
-    @Override
-    public InstallSourceInfo getInstallSourceInfo(@NonNull String packageName) {
-        synchronized (mLock) {
-            return super.getInstallSourceInfo(packageName);
-        }
-    }
-
-    @Override
-    public int getApplicationEnabledSetting(@NonNull String packageName, @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.getApplicationEnabledSetting(packageName, userId);
-        }
-    }
-
-    @Override
-    public int getComponentEnabledSetting(@NonNull ComponentName component, int callingUid,
-            @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.getComponentEnabledSetting(component, callingUid, userId);
-        }
-    }
-
-    @Override
-    public int getComponentEnabledSettingInternal(@NonNull ComponentName component, int callingUid,
-            @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.getComponentEnabledSettingInternal(component, callingUid, userId);
-        }
-    }
-
-    @Override
-    public boolean isComponentEffectivelyEnabled(@NonNull ComponentInfo componentInfo,
-            @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.isComponentEffectivelyEnabled(componentInfo, userId);
-        }
-    }
-
-    @Nullable
-    @Override
-    public KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias) {
-        synchronized (mLock) {
-            return super.getKeySetByAlias(packageName, alias);
-        }
-    }
-
-    @Nullable
-    @Override
-    public KeySet getSigningKeySet(@NonNull String packageName) {
-        synchronized (mLock) {
-            return super.getSigningKeySet(packageName);
-        }
-    }
-
-    @Override
-    public boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks) {
-        synchronized (mLock) {
-            return super.isPackageSignedByKeySet(packageName, ks);
-        }
-    }
-
-    @Override
-    public boolean isPackageSignedByKeySetExactly(@NonNull String packageName, @NonNull KeySet ks) {
-        synchronized (mLock) {
-            return super.isPackageSignedByKeySetExactly(packageName, ks);
-        }
-    }
-
-    @Nullable
-    @Override
-    public int[] getVisibilityAllowList(@NonNull String packageName, @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.getVisibilityAllowList(packageName, userId);
-        }
-    }
-
-    @Override
-    public boolean canQueryPackage(int callingUid, @Nullable String targetPackageName) {
-        synchronized (mLock) {
-            return super.canQueryPackage(callingUid, targetPackageName);
-        }
-    }
-
-    @Override
-    public int getPackageUid(@NonNull String packageName,
-            @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.getPackageUid(packageName, flags, userId);
-        }
-    }
-
-    @Override
-    public boolean canAccessComponent(int callingUid, @NonNull ComponentName component,
-            @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.canAccessComponent(callingUid, component, userId);
-        }
-    }
-
-    @Override
-    public boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid) {
-        synchronized (mLock) {
-            return super.isCallerInstallerOfRecord(pkg, callingUid);
-        }
-    }
-
-    @Override
-    public int getInstallReason(@NonNull String packageName, @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.getInstallReason(packageName, userId);
-        }
-    }
-
-    @Override
-    public boolean canPackageQuery(@NonNull String sourcePackageName,
-            @NonNull String targetPackageName, @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.canPackageQuery(sourcePackageName, targetPackageName, userId);
-        }
-    }
-
-    @Override
-    public boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType,
-            @UserIdInt int sourceUserId, @UserIdInt int targetUserId) {
-        synchronized (mLock) {
-            return super.canForwardTo(intent, resolvedType, sourceUserId, targetUserId);
-        }
-    }
-
-    @NonNull
-    @Override
-    public List<ApplicationInfo> getPersistentApplications(boolean safeMode, int flags) {
-        synchronized (mLock) {
-            return super.getPersistentApplications(safeMode, flags);
-        }
-    }
-
-    @NonNull
-    @Override
-    public SparseArray<String> getAppsWithSharedUserIds() {
-        synchronized (mLock) {
-            return super.getAppsWithSharedUserIds();
-        }
-    }
-
-    @NonNull
-    @Override
-    public String[] getSharedUserPackagesForPackage(@NonNull String packageName,
-            @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.getSharedUserPackagesForPackage(packageName, userId);
-        }
-    }
-
-    @NonNull
-    @Override
-    public Set<String> getUnusedPackages(long downgradeTimeThresholdMillis) {
-        synchronized (mLock) {
-            return super.getUnusedPackages(downgradeTimeThresholdMillis);
-        }
-    }
-
-    @Nullable
-    @Override
-    public CharSequence getHarmfulAppWarning(@NonNull String packageName, @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.getHarmfulAppWarning(packageName, userId);
-        }
-    }
-
-    @NonNull
-    @Override
-    public String[] filterOnlySystemPackages(@Nullable String... pkgNames) {
-        synchronized (mLock) {
-            return super.filterOnlySystemPackages(pkgNames);
-        }
-    }
-
-    @NonNull
-    @Override
-    public List<AndroidPackage> getPackagesForAppId(int appId) {
-        synchronized (mLock) {
-            return super.getPackagesForAppId(appId);
-        }
-    }
-
-    @Override
-    public int getUidTargetSdkVersion(int uid) {
-        synchronized (mLock) {
-            return super.getUidTargetSdkVersion(uid);
-        }
-    }
-
-    @Nullable
-    @Override
-    public ArrayMap<String, ProcessInfo> getProcessesForUid(int uid) {
-        synchronized (mLock) {
-            return super.getProcessesForUid(uid);
-        }
-    }
-
-    @Override
-    public PackageStateInternal getPackageStateFiltered(@NonNull String packageName, int callingUid,
-            @UserIdInt int userId) {
-        synchronized (mLock) {
-            return super.getPackageStateFiltered(packageName, callingUid, userId);
-        }
-    }
-
-    @Override
-    public boolean getBlockUninstall(@UserIdInt int userId, @NonNull String packageName) {
-        synchronized (mLock) {
-            return super.getBlockUninstall(userId, packageName);
-        }
-    }
-
-    @NonNull
-    @Override
-    public WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries() {
-        synchronized (mLock) {
-            return super.getSharedLibraries();
-        }
-    }
-
-    @Nullable
-    @Override
-    public Pair<PackageStateInternal, SharedUserApi> getPackageOrSharedUser(int appId) {
-        synchronized (mLock) {
-            return super.getPackageOrSharedUser(appId);
-        }
-    }
-
-    @Nullable
-    @Override
-    public SharedUserApi getSharedUser(int sharedUserAppId) {
-        synchronized (mLock) {
-            return super.getSharedUser(sharedUserAppId);
-        }
-    }
-
-    @NonNull
-    @Override
-    public ArraySet<PackageStateInternal> getSharedUserPackages(int sharedUserAppId) {
-        synchronized (mLock) {
-            return super.getSharedUserPackages(sharedUserAppId);
-        }
-    }
-
-    @NonNull
-    @Override
-    public ComponentResolverApi getComponentResolver() {
-        synchronized (mLock) {
-            return super.getComponentResolver();
-        }
-    }
-
-    @Nullable
-    @Override
-    public PackageStateInternal getDisabledSystemPackage(@NonNull String packageName) {
-        synchronized (mLock) {
-            return super.getDisabledSystemPackage(packageName);
-        }
-    }
-
-    @Nullable
-    @Override
-    public ResolveInfo getInstantAppInstallerInfo() {
-        synchronized (mLock) {
-            return super.getInstantAppInstallerInfo();
-        }
-    }
 }
diff --git a/services/core/java/com/android/server/pm/ComputerTracker.java b/services/core/java/com/android/server/pm/ComputerTracker.java
deleted file mode 100644
index 216ad71..0000000
--- a/services/core/java/com/android/server/pm/ComputerTracker.java
+++ /dev/null
@@ -1,1327 +0,0 @@
-/*
- * Copyright (C) 2021 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 com.android.server.pm;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.UserIdInt;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.ComponentInfo;
-import android.content.pm.InstallSourceInfo;
-import android.content.pm.InstrumentationInfo;
-import android.content.pm.KeySet;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManagerInternal;
-import android.content.pm.ParceledListSlice;
-import android.content.pm.ProcessInfo;
-import android.content.pm.ProviderInfo;
-import android.content.pm.ResolveInfo;
-import android.content.pm.ServiceInfo;
-import android.content.pm.SharedLibraryInfo;
-import android.content.pm.SigningDetails;
-import android.content.pm.UserInfo;
-import android.content.pm.VersionedPackage;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-import android.util.Pair;
-import android.util.SparseArray;
-
-import com.android.server.pm.parsing.pkg.AndroidPackage;
-import com.android.server.pm.pkg.PackageState;
-import com.android.server.pm.pkg.PackageStateInternal;
-import com.android.server.pm.pkg.SharedUserApi;
-import com.android.server.pm.resolution.ComponentResolverApi;
-import com.android.server.utils.WatchedArrayMap;
-import com.android.server.utils.WatchedLongSparseArray;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * This subclass delegates to methods in a Computer after reference-counting the computer.
- */
-public final class ComputerTracker implements Computer {
-
-    // The number of times a thread reused a computer in its stack instead of fetching
-    // a snapshot computer.
-    private final AtomicInteger mReusedSnapshot = new AtomicInteger(0);
-
-    private final PackageManagerService mService;
-    ComputerTracker(PackageManagerService s) {
-        mService = s;
-    }
-
-    private ThreadComputer snapshot() {
-        ThreadComputer current = PackageManagerService.sThreadComputer.get();
-        if (current.mRefCount > 0) {
-            current.acquire();
-            mReusedSnapshot.incrementAndGet();
-        } else {
-            current.acquire(mService.snapshotComputer());
-        }
-        return current;
-    }
-
-    public @NonNull List<ResolveInfo> queryIntentActivitiesInternal(Intent intent,
-            String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
-            @PackageManagerInternal.PrivateResolveFlags long privateResolveFlags,
-            int filterCallingUid, int userId, boolean resolveForStart,
-            boolean allowDynamicSplits) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.queryIntentActivitiesInternal(intent, resolvedType, flags,
-                    privateResolveFlags, filterCallingUid, userId, resolveForStart,
-                    allowDynamicSplits);
-        } finally {
-            current.release();
-        }
-    }
-    public @NonNull List<ResolveInfo> queryIntentActivitiesInternal(Intent intent,
-            String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.queryIntentActivitiesInternal(intent, resolvedType, flags,
-                    userId);
-        } finally {
-            current.release();
-        }
-    }
-    public @NonNull List<ResolveInfo> queryIntentServicesInternal(Intent intent,
-            String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId,
-            int callingUid, boolean includeInstantApps) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.queryIntentServicesInternal(intent, resolvedType, flags,
-                    userId, callingUid, includeInstantApps);
-        } finally {
-            current.release();
-        }
-    }
-    public @NonNull QueryIntentActivitiesResult queryIntentActivitiesInternalBody(
-            Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
-            int filterCallingUid, int userId, boolean resolveForStart, boolean allowDynamicSplits,
-            String pkgName, String instantAppPkgName) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.queryIntentActivitiesInternalBody(intent, resolvedType,
-                    flags, filterCallingUid, userId, resolveForStart, allowDynamicSplits,
-                    pkgName, instantAppPkgName);
-        } finally {
-            current.release();
-        }
-    }
-    public ActivityInfo getActivityInfo(ComponentName component,
-            @PackageManager.ComponentInfoFlagsBits long flags, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getActivityInfo(component, flags, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public ActivityInfo getActivityInfoInternal(ComponentName component,
-            @PackageManager.ComponentInfoFlagsBits long flags,
-            int filterCallingUid, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getActivityInfoInternal(component, flags, filterCallingUid,
-                    userId);
-        } finally {
-            current.release();
-        }
-    }
-    public AndroidPackage getPackage(String packageName) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getPackage(packageName);
-        } finally {
-            current.release();
-        }
-    }
-    public AndroidPackage getPackage(int uid) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getPackage(uid);
-        } finally {
-            current.release();
-        }
-    }
-    public ApplicationInfo generateApplicationInfoFromSettings(String packageName,
-            long flags, int filterCallingUid, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.generateApplicationInfoFromSettings(packageName, flags,
-                    filterCallingUid, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public ApplicationInfo getApplicationInfo(String packageName,
-            @PackageManager.ApplicationInfoFlagsBits long flags, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getApplicationInfo(packageName, flags, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public ApplicationInfo getApplicationInfoInternal(String packageName,
-            @PackageManager.ApplicationInfoFlagsBits long flags, int filterCallingUid, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getApplicationInfoInternal(packageName, flags,
-                    filterCallingUid, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public ComponentName getDefaultHomeActivity(int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getDefaultHomeActivity(userId);
-        } finally {
-            current.release();
-        }
-    }
-    public ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates,
-            int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getHomeActivitiesAsUser(allHomeCandidates, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public CrossProfileDomainInfo getCrossProfileDomainPreferredLpr(Intent intent,
-            String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int sourceUserId,
-            int parentUserId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getCrossProfileDomainPreferredLpr(intent, resolvedType,
-                    flags, sourceUserId, parentUserId);
-        } finally {
-            current.release();
-        }
-    }
-    public Intent getHomeIntent() {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getHomeIntent();
-        } finally {
-            current.release();
-        }
-    }
-    public List<CrossProfileIntentFilter> getMatchingCrossProfileIntentFilters(
-            Intent intent, String resolvedType, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getMatchingCrossProfileIntentFilters(intent, resolvedType,
-                    userId);
-        } finally {
-            current.release();
-        }
-    }
-    public List<ResolveInfo> applyPostResolutionFilter(
-            @NonNull List<ResolveInfo> resolveInfos,
-            String ephemeralPkgName, boolean allowDynamicSplits, int filterCallingUid,
-            boolean resolveForStart, int userId, Intent intent) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.applyPostResolutionFilter(resolveInfos, ephemeralPkgName,
-                    allowDynamicSplits, filterCallingUid, resolveForStart, userId, intent);
-        } finally {
-            current.release();
-        }
-    }
-    public PackageInfo generatePackageInfo(PackageStateInternal ps,
-            @PackageManager.PackageInfoFlagsBits long flags, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.generatePackageInfo(ps, flags, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public PackageInfo getPackageInfo(String packageName,
-            @PackageManager.PackageInfoFlagsBits long flags, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getPackageInfo(packageName, flags, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public PackageInfo getPackageInfoInternal(String packageName, long versionCode,
-            long flags, int filterCallingUid, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getPackageInfoInternal(packageName, versionCode, flags,
-                    filterCallingUid, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public PackageStateInternal getPackageStateInternal(String packageName) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getPackageStateInternal(packageName);
-        } finally {
-            current.release();
-        }
-    }
-    public PackageStateInternal getPackageStateInternal(String packageName, int callingUid) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getPackageStateInternal(packageName, callingUid);
-        } finally {
-            current.release();
-        }
-    }
-
-    @Nullable
-    public PackageState getPackageStateCopied(@NonNull String packageName) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getPackageStateCopied(packageName);
-        } finally {
-            current.release();
-        }
-    }
-
-    public ParceledListSlice<PackageInfo> getInstalledPackages(long flags, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getInstalledPackages(flags, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public ResolveInfo createForwardingResolveInfoUnchecked(WatchedIntentFilter filter,
-            int sourceUserId, int targetUserId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.createForwardingResolveInfoUnchecked(filter, sourceUserId,
-                    targetUserId);
-        } finally {
-            current.release();
-        }
-    }
-    public ServiceInfo getServiceInfo(ComponentName component,
-            @PackageManager.ComponentInfoFlagsBits long flags, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getServiceInfo(component, flags, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public SharedLibraryInfo getSharedLibraryInfo(String name, long version) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getSharedLibraryInfo(name, version);
-        } finally {
-            current.release();
-        }
-    }
-    public SigningDetails getSigningDetails(@NonNull String packageName) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getSigningDetails(packageName);
-        } finally {
-            current.release();
-        }
-    }
-    public SigningDetails getSigningDetails(int uid) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getSigningDetails(uid);
-        } finally {
-            current.release();
-        }
-    }
-    public String getInstantAppPackageName(int callingUid) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getInstantAppPackageName(callingUid);
-        } finally {
-            current.release();
-        }
-    }
-    public String resolveExternalPackageName(AndroidPackage pkg) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.resolveExternalPackageName(pkg);
-        } finally {
-            current.release();
-        }
-    }
-    public String resolveInternalPackageName(String packageName, long versionCode) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.resolveInternalPackageName(packageName, versionCode);
-        } finally {
-            current.release();
-        }
-    }
-    public String[] getPackagesForUid(int uid) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getPackagesForUid(uid);
-        } finally {
-            current.release();
-        }
-    }
-    public UserInfo getProfileParent(int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getProfileParent(userId);
-        } finally {
-            current.release();
-        }
-    }
-    public boolean canViewInstantApps(int callingUid, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.canViewInstantApps(callingUid, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.filterAppAccess(pkg, callingUid, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public boolean filterAppAccess(String packageName, int callingUid, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.filterAppAccess(packageName, callingUid, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public boolean filterAppAccess(int uid, int callingUid) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.filterAppAccess(uid, callingUid);
-        } finally {
-            current.release();
-        }
-    }
-    public boolean filterSharedLibPackage(@Nullable PackageStateInternal ps, int uid,
-            int userId, @PackageManager.ComponentInfoFlagsBits long flags) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.filterSharedLibPackage(ps, uid, userId, flags);
-        } finally {
-            current.release();
-        }
-    }
-    public boolean isCallerSameApp(String packageName, int uid) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.isCallerSameApp(packageName, uid);
-        } finally {
-            current.release();
-        }
-    }
-    public boolean isComponentVisibleToInstantApp(@Nullable ComponentName component) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.isComponentVisibleToInstantApp(component);
-        } finally {
-            current.release();
-        }
-    }
-    public boolean isComponentVisibleToInstantApp(@Nullable ComponentName component,
-            @PackageManager.ComponentType int type) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.isComponentVisibleToInstantApp(component, type);
-        } finally {
-            current.release();
-        }
-    }
-    public boolean isImplicitImageCaptureIntentAndNotSetByDpcLocked(Intent intent,
-            int userId, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent,
-                    userId, resolvedType, flags);
-        } finally {
-            current.release();
-        }
-    }
-    public boolean isInstantApp(String packageName, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.isInstantApp(packageName, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public boolean isInstantAppInternal(String packageName, @UserIdInt int userId,
-            int callingUid) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.isInstantAppInternal(packageName, userId, callingUid);
-        } finally {
-            current.release();
-        }
-    }
-    public boolean isSameProfileGroup(@UserIdInt int callerUserId,
-            @UserIdInt int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.isSameProfileGroup(callerUserId, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public boolean shouldFilterApplication(@NonNull SharedUserSetting sus,
-            int callingUid, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.shouldFilterApplication(sus, callingUid, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public boolean shouldFilterApplication(@Nullable PackageStateInternal ps,
-            int callingUid, @Nullable ComponentName component,
-            @PackageManager.ComponentType int componentType, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.shouldFilterApplication(ps, callingUid, component,
-                    componentType, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public boolean shouldFilterApplication(@Nullable PackageStateInternal ps,
-            int callingUid, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.shouldFilterApplication(ps, callingUid, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public int checkUidPermission(String permName, int uid) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.checkUidPermission(permName, uid);
-        } finally {
-            current.release();
-        }
-    }
-    public int getPackageUidInternal(String packageName,
-            @PackageManager.PackageInfoFlagsBits long flags, int userId, int callingUid) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.getPackageUidInternal(packageName, flags, userId,
-                    callingUid);
-        } finally {
-            current.release();
-        }
-    }
-    public long updateFlagsForApplication(long flags, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.updateFlagsForApplication(flags, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public long updateFlagsForComponent(long flags, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.updateFlagsForComponent(flags, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public long updateFlagsForPackage(long flags, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.updateFlagsForPackage(flags, userId);
-        } finally {
-            current.release();
-        }
-    }
-    public long updateFlagsForResolve(long flags, int userId, int callingUid,
-            boolean wantInstantApps, boolean isImplicitImageCaptureIntentAndNotSetByDpc) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.updateFlagsForResolve(flags, userId, callingUid,
-                    wantInstantApps, isImplicitImageCaptureIntentAndNotSetByDpc);
-        } finally {
-            current.release();
-        }
-    }
-    public long updateFlagsForResolve(long flags, int userId, int callingUid,
-            boolean wantInstantApps, boolean onlyExposedExplicitly,
-            boolean isImplicitImageCaptureIntentAndNotSetByDpc) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.updateFlagsForResolve(flags, userId, callingUid,
-                    wantInstantApps, onlyExposedExplicitly,
-                    isImplicitImageCaptureIntentAndNotSetByDpc);
-        } finally {
-            current.release();
-        }
-    }
-    public void dump(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState) {
-        ThreadComputer current = snapshot();
-        try {
-            current.mComputer.dump(type, fd, pw, dumpState);
-        } finally {
-            current.release();
-        }
-    }
-    public void enforceCrossUserOrProfilePermission(int callingUid, @UserIdInt int userId,
-            boolean requireFullPermission, boolean checkShell, String message) {
-        ThreadComputer current = snapshot();
-        try {
-            current.mComputer.enforceCrossUserOrProfilePermission(callingUid, userId,
-                    requireFullPermission, checkShell, message);
-        } finally {
-            current.release();
-        }
-    }
-    public void enforceCrossUserPermission(int callingUid, @UserIdInt int userId,
-            boolean requireFullPermission, boolean checkShell, String message) {
-        ThreadComputer current = snapshot();
-        try {
-            current.mComputer.enforceCrossUserPermission(callingUid, userId,
-                    requireFullPermission, checkShell, message);
-        } finally {
-            current.release();
-        }
-    }
-    public void enforceCrossUserPermission(int callingUid, @UserIdInt int userId,
-            boolean requireFullPermission, boolean checkShell,
-            boolean requirePermissionWhenSameUser, String message) {
-        ThreadComputer current = snapshot();
-        try {
-            current.mComputer.enforceCrossUserPermission(callingUid, userId,
-                    requireFullPermission, checkShell, requirePermissionWhenSameUser, message);
-        } finally {
-            current.release();
-        }
-    }
-    public PackageManagerService.FindPreferredActivityBodyResult findPreferredActivityInternal(
-            Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
-            List<ResolveInfo> query, boolean always, boolean removeMatches, boolean debug,
-            int userId, boolean queryMayBeFiltered) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.findPreferredActivityInternal(intent, resolvedType, flags,
-                    query, always, removeMatches, debug, userId, queryMayBeFiltered);
-        } finally {
-            current.release();
-        }
-    }
-    public ResolveInfo findPersistentPreferredActivityLP(Intent intent,
-            String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
-            List<ResolveInfo> query, boolean debug, int userId) {
-        ThreadComputer current = snapshot();
-        try {
-            return current.mComputer.findPersistentPreferredActivityLP(intent, resolvedType,
-                    flags, query, debug, userId);
-        } finally {
-            current.release();
-        }
-    }
-
-    @Override
-    public String[] getAllAvailablePackageNames() {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getAllAvailablePackageNames();
-        }
-    }
-
-    @Override
-    public PreferredIntentResolver getPreferredActivities(int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getPreferredActivities(userId);
-        }
-    }
-
-    @NonNull
-    @Override
-    public ArrayMap<String, ? extends PackageStateInternal> getPackageStates() {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getPackageStates();
-        }
-    }
-
-    @Nullable
-    @Override
-    public String getRenamedPackage(@NonNull String packageName) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getRenamedPackage(packageName);
-        }
-    }
-
-    @NonNull
-    @Override
-    public ArraySet<String> getNotifyPackagesForReplacedReceived(@NonNull String[] packages) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getNotifyPackagesForReplacedReceived(packages);
-        }
-    }
-
-    @Override
-    public int getPackageStartability(boolean safeMode, @NonNull String packageName, int callingUid,
-            @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getPackageStartability(safeMode, packageName, callingUid,
-                    userId);
-        }
-    }
-
-    @Override
-    public boolean isPackageAvailable(String packageName, @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.isPackageAvailable(packageName, userId);
-        }
-    }
-
-    @Override
-    public String[] currentToCanonicalPackageNames(String[] names) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.currentToCanonicalPackageNames(names);
-        }
-    }
-
-    @Override
-    public String[] canonicalToCurrentPackageNames(String[] names) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.canonicalToCurrentPackageNames(names);
-        }
-    }
-
-    @Override
-    public int[] getPackageGids(@NonNull String packageName,
-            @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getPackageGids(packageName, flags, userId);
-        }
-    }
-
-    @Override
-    public int getTargetSdkVersion(@NonNull String packageName) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getTargetSdkVersion(packageName);
-        }
-    }
-
-    @Override
-    public boolean activitySupportsIntent(@NonNull ComponentName resolveComponentName,
-            @NonNull ComponentName component, @NonNull Intent intent, String resolvedType) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.activitySupportsIntent(resolveComponentName, component, intent,
-                    resolvedType);
-        }
-    }
-
-    @Nullable
-    @Override
-    public ActivityInfo getReceiverInfo(@NonNull ComponentName component,
-            @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getReceiverInfo(component, flags, userId);
-        }
-    }
-
-    @Nullable
-    @Override
-    public ParceledListSlice<SharedLibraryInfo> getSharedLibraries(@NonNull String packageName,
-            @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getSharedLibraries(packageName, flags, userId);
-        }
-    }
-
-    @Override
-    public boolean canRequestPackageInstalls(@NonNull String packageName, int callingUid,
-            @UserIdInt int userId, boolean throwIfPermNotDeclared) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.canRequestPackageInstalls(packageName, callingUid, userId,
-                    throwIfPermNotDeclared);
-        }
-    }
-
-    @Override
-    public boolean isInstallDisabledForPackage(@NonNull String packageName, int uid,
-            @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.isInstallDisabledForPackage(packageName, uid, userId);
-        }
-    }
-
-    @Override
-    public List<VersionedPackage> getPackagesUsingSharedLibrary(@NonNull SharedLibraryInfo libInfo,
-            @PackageManager.PackageInfoFlagsBits long flags, int callingUid,
-            @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getPackagesUsingSharedLibrary(libInfo, flags, callingUid,
-                    userId);
-        }
-    }
-
-    @Nullable
-    @Override
-    public ParceledListSlice<SharedLibraryInfo> getDeclaredSharedLibraries(
-            @NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags,
-            @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getDeclaredSharedLibraries(packageName, flags, userId);
-        }
-    }
-
-    @Nullable
-    @Override
-    public ProviderInfo getProviderInfo(@NonNull ComponentName component,
-            @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getProviderInfo(component, flags, userId);
-        }
-    }
-
-    @Nullable
-    @Override
-    public String[] getSystemSharedLibraryNames() {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getSystemSharedLibraryNames();
-        }
-    }
-
-    @Override
-    public int checkSignatures(@NonNull String pkg1,
-            @NonNull String pkg2) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.checkSignatures(pkg1, pkg2);
-        }
-    }
-
-    @Override
-    public int checkUidSignatures(int uid1, int uid2) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.checkUidSignatures(uid1, uid2);
-        }
-    }
-
-    @Override
-    public boolean hasSigningCertificate(@NonNull String packageName, @NonNull byte[] certificate,
-            int type) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.hasSigningCertificate(packageName, certificate, type);
-        }
-    }
-
-    @Override
-    public boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate, int type) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.hasUidSigningCertificate(uid, certificate, type);
-        }
-    }
-
-    @Override
-    public List<String> getAllPackages() {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getAllPackages();
-        }
-    }
-
-    @Nullable
-    @Override
-    public String getNameForUid(int uid) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getNameForUid(uid);
-        }
-    }
-
-    @Nullable
-    @Override
-    public String[] getNamesForUids(int[] uids) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getNamesForUids(uids);
-        }
-    }
-
-    @Override
-    public int getUidForSharedUser(@NonNull String sharedUserName) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getUidForSharedUser(sharedUserName);
-        }
-    }
-
-    @Override
-    public int getFlagsForUid(int uid) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getFlagsForUid(uid);
-        }
-    }
-
-    @Override
-    public int getPrivateFlagsForUid(int uid) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getPrivateFlagsForUid(uid);
-        }
-    }
-
-    @Override
-    public boolean isUidPrivileged(int uid) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.isUidPrivileged(uid);
-        }
-    }
-
-    @NonNull
-    @Override
-    public String[] getAppOpPermissionPackages(@NonNull String permissionName) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getAppOpPermissionPackages(permissionName);
-        }
-    }
-
-    @NonNull
-    @Override
-    public ParceledListSlice<PackageInfo> getPackagesHoldingPermissions(
-            @NonNull String[] permissions, @PackageManager.PackageInfoFlagsBits long flags,
-            @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getPackagesHoldingPermissions(permissions, flags, userId);
-        }
-    }
-
-    @NonNull
-    @Override
-    public List<ApplicationInfo> getInstalledApplications(
-            @PackageManager.ApplicationInfoFlagsBits long flags, @UserIdInt int userId,
-            int callingUid) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getInstalledApplications(flags, userId, callingUid);
-        }
-    }
-
-    @Nullable
-    @Override
-    public ProviderInfo resolveContentProvider(@NonNull String name,
-            @PackageManager.ResolveInfoFlagsBits long flags, @UserIdInt int userId,
-            int callingUid) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.resolveContentProvider(name, flags, userId, callingUid);
-        }
-    }
-
-    @Nullable
-    @Override
-    public ProviderInfo getGrantImplicitAccessProviderInfo(int recipientUid,
-            @NonNull String visibleAuthority) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getGrantImplicitAccessProviderInfo(recipientUid,
-                    visibleAuthority);
-        }
-    }
-
-    @Override
-    public void querySyncProviders(boolean safeMode, @NonNull List<String> outNames,
-            @NonNull List<ProviderInfo> outInfo) {
-        try (ThreadComputer current = snapshot()) {
-            current.mComputer.querySyncProviders(safeMode, outNames, outInfo);
-        }
-    }
-
-    @NonNull
-    @Override
-    public ParceledListSlice<ProviderInfo> queryContentProviders(@Nullable String processName,
-            int uid, @PackageManager.ComponentInfoFlagsBits long flags,
-            @Nullable String metaDataKey) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.queryContentProviders(processName, uid, flags, metaDataKey);
-        }
-    }
-
-    @Nullable
-    @Override
-    public InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component, int flags) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getInstrumentationInfo(component, flags);
-        }
-    }
-
-    @NonNull
-    @Override
-    public ParceledListSlice<InstrumentationInfo> queryInstrumentation(
-            @NonNull String targetPackage, int flags) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.queryInstrumentation(targetPackage, flags);
-        }
-    }
-
-    @NonNull
-    @Override
-    public List<PackageStateInternal> findSharedNonSystemLibraries(
-            @NonNull PackageStateInternal pkgSetting) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.findSharedNonSystemLibraries(pkgSetting);
-        }
-    }
-
-    @Override
-    public boolean getApplicationHiddenSettingAsUser(@NonNull String packageName,
-            @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getApplicationHiddenSettingAsUser(packageName, userId);
-        }
-    }
-
-    @Override
-    public boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.isPackageSuspendedForUser(packageName, userId);
-        }
-    }
-
-    @Override
-    public boolean isSuspendingAnyPackages(@NonNull String suspendingPackage,
-            @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.isSuspendingAnyPackages(suspendingPackage, userId);
-        }
-    }
-
-    @NonNull
-    @Override
-    public ParceledListSlice<IntentFilter> getAllIntentFilters(@NonNull String packageName) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getAllIntentFilters(packageName);
-        }
-    }
-
-    @Override
-    public boolean getBlockUninstallForUser(@NonNull String packageName, @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getBlockUninstallForUser(packageName, userId);
-        }
-    }
-
-    @Nullable
-    @Override
-    public SparseArray<int[]> getBroadcastAllowList(@NonNull String packageName,
-            @UserIdInt int[] userIds, boolean isInstantApp) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getBroadcastAllowList(packageName, userIds, isInstantApp);
-        }
-    }
-
-    @Nullable
-    @Override
-    public String getInstallerPackageName(@NonNull String packageName) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getInstallerPackageName(packageName);
-        }
-    }
-
-    @Nullable
-    @Override
-    public InstallSourceInfo getInstallSourceInfo(@NonNull String packageName) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getInstallSourceInfo(packageName);
-        }
-    }
-
-    @Override
-    public int getApplicationEnabledSetting(@NonNull String packageName, @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getApplicationEnabledSetting(packageName, userId);
-        }
-    }
-
-    @Override
-    public int getComponentEnabledSetting(@NonNull ComponentName component, int callingUid,
-            @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getComponentEnabledSetting(component, callingUid, userId);
-        }
-    }
-
-    @Override
-    public int getComponentEnabledSettingInternal(@NonNull ComponentName component, int callingUid,
-            @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getComponentEnabledSettingInternal(
-                    component, callingUid, userId);
-        }
-    }
-
-    @Override
-    public boolean isComponentEffectivelyEnabled(@NonNull ComponentInfo componentInfo,
-            @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.isComponentEffectivelyEnabled(componentInfo, userId);
-        }
-    }
-
-    @Nullable
-    @Override
-    public KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getKeySetByAlias(packageName, alias);
-        }
-    }
-
-    @Nullable
-    @Override
-    public KeySet getSigningKeySet(@NonNull String packageName) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getSigningKeySet(packageName);
-        }
-    }
-
-    @Override
-    public boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.isPackageSignedByKeySet(packageName, ks);
-        }
-    }
-
-    @Override
-    public boolean isPackageSignedByKeySetExactly(@NonNull String packageName, @NonNull KeySet ks) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.isPackageSignedByKeySetExactly(packageName, ks);
-        }
-    }
-
-    @Nullable
-    @Override
-    public int[] getVisibilityAllowList(@NonNull String packageName, @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getVisibilityAllowList(packageName, userId);
-        }
-    }
-
-    @Override
-    public boolean canQueryPackage(int callingUid, @Nullable String targetPackageName) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.canQueryPackage(callingUid, targetPackageName);
-        }
-    }
-
-    @Override
-    public int getPackageUid(@NonNull String packageName,
-            @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getPackageUid(packageName, flags, userId);
-        }
-    }
-
-    @Override
-    public boolean canAccessComponent(int callingUid, @NonNull ComponentName component,
-            @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.canAccessComponent(callingUid, component, userId);
-        }
-    }
-
-    @Override
-    public boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.isCallerInstallerOfRecord(pkg, callingUid);
-        }
-    }
-
-    @Override
-    public int getInstallReason(@NonNull String packageName, @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getInstallReason(packageName, userId);
-        }
-    }
-
-    @Override
-    public boolean canPackageQuery(@NonNull String sourcePackageName,
-            @NonNull String targetPackageName, @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.canPackageQuery(sourcePackageName, targetPackageName, userId);
-        }
-    }
-
-    @Override
-    public boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType,
-            @UserIdInt int sourceUserId, @UserIdInt int targetUserId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.canForwardTo(intent, resolvedType, sourceUserId, targetUserId);
-        }
-    }
-
-    @NonNull
-    @Override
-    public List<ApplicationInfo> getPersistentApplications(boolean safeMode, int flags) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getPersistentApplications(safeMode, flags);
-        }
-    }
-
-    @NonNull
-    @Override
-    public SparseArray<String> getAppsWithSharedUserIds() {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getAppsWithSharedUserIds();
-        }
-    }
-
-    @NonNull
-    @Override
-    public String[] getSharedUserPackagesForPackage(@NonNull String packageName,
-            @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getSharedUserPackagesForPackage(packageName, userId);
-        }
-    }
-
-    @NonNull
-    @Override
-    public Set<String> getUnusedPackages(long downgradeTimeThresholdMillis) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getUnusedPackages(downgradeTimeThresholdMillis);
-        }
-    }
-
-    @Nullable
-    @Override
-    public CharSequence getHarmfulAppWarning(@NonNull String packageName, @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getHarmfulAppWarning(packageName, userId);
-        }
-    }
-
-    @NonNull
-    @Override
-    public String[] filterOnlySystemPackages(@Nullable String... pkgNames) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.filterOnlySystemPackages(pkgNames);
-        }
-    }
-
-    @NonNull
-    @Override
-    public List<AndroidPackage> getPackagesForAppId(int appId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getPackagesForAppId(appId);
-        }
-    }
-
-    @Override
-    public int getUidTargetSdkVersion(int uid) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getUidTargetSdkVersion(uid);
-        }
-    }
-
-    @Nullable
-    @Override
-    public ArrayMap<String, ProcessInfo> getProcessesForUid(int uid) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getProcessesForUid(uid);
-        }
-    }
-
-    @Override
-    public PackageStateInternal getPackageStateFiltered(@NonNull String packageName, int callingUid,
-            @UserIdInt int userId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getPackageStateFiltered(packageName, callingUid, userId);
-        }
-    }
-
-    @Override
-    public boolean getBlockUninstall(@UserIdInt int userId, @NonNull String packageName) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getBlockUninstall(userId, packageName);
-        }
-    }
-
-    @NonNull
-    @Override
-    public WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries() {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getSharedLibraries();
-        }
-    }
-
-    @Nullable
-    @Override
-    public Pair<PackageStateInternal, SharedUserApi> getPackageOrSharedUser(int appId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getPackageOrSharedUser(appId);
-        }
-    }
-
-    @Nullable
-    @Override
-    public SharedUserApi getSharedUser(int sharedUserAppId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getSharedUser(sharedUserAppId);
-        }
-    }
-
-    @NonNull
-    @Override
-    public ArraySet<PackageStateInternal> getSharedUserPackages(int sharedUserAppId) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getSharedUserPackages(sharedUserAppId);
-        }
-    }
-
-    @NonNull
-    @Override
-    public ComponentResolverApi getComponentResolver() {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getComponentResolver();
-        }
-    }
-
-    @Nullable
-    @Override
-    public PackageStateInternal getDisabledSystemPackage(@NonNull String packageName) {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getDisabledSystemPackage(packageName);
-        }
-    }
-
-    @Nullable
-    @Override
-    public ResolveInfo getInstantAppInstallerInfo() {
-        try (ThreadComputer current = snapshot()) {
-            return current.mComputer.getInstantAppInstallerInfo();
-        }
-    }
-}
diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java
index 664c7bb..0e1c1ad 100644
--- a/services/core/java/com/android/server/pm/DeletePackageHelper.java
+++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java
@@ -147,6 +147,7 @@
         final SparseArray<TempUserState> priorUserStates;
         /** enabled state of the uninstalled application */
         synchronized (mPm.mLock) {
+            final Computer computer = mPm.snapshotComputer();
             uninstalledPs = mPm.mSettings.getPackageLPr(packageName);
             if (uninstalledPs == null) {
                 Slog.w(TAG, "Not removing non-existent package " + packageName);
@@ -170,10 +171,10 @@
             if (pkg != null) {
                 SharedLibraryInfo libraryInfo = null;
                 if (pkg.getStaticSharedLibName() != null) {
-                    libraryInfo = mPm.getSharedLibraryInfo(pkg.getStaticSharedLibName(),
+                    libraryInfo = computer.getSharedLibraryInfo(pkg.getStaticSharedLibName(),
                             pkg.getStaticSharedLibVersion());
                 } else if (pkg.getSdkLibName() != null) {
-                    libraryInfo = mPm.getSharedLibraryInfo(pkg.getSdkLibName(),
+                    libraryInfo = computer.getSharedLibraryInfo(pkg.getSdkLibName(),
                             pkg.getSdkLibVersionMajor());
                 }
 
@@ -183,7 +184,7 @@
                             continue;
                         }
                         List<VersionedPackage> libClientPackages =
-                                mPm.getPackagesUsingSharedLibrary(libraryInfo,
+                                computer.getPackagesUsingSharedLibrary(libraryInfo,
                                         MATCH_KNOWN_PACKAGES, Process.SYSTEM_UID, currUserId);
                         if (!ArrayUtils.isEmpty(libClientPackages)) {
                             Slog.w(TAG, "Not removing package " + pkg.getManifestPackageName()
@@ -454,11 +455,11 @@
         if (affectedUserIds == null) {
             affectedUserIds = mPm.resolveUserIds(userId);
         }
+        final Computer snapshot = mPm.snapshotComputer();
         for (final int affectedUserId : affectedUserIds) {
             if (hadSuspendAppsPermission.get(affectedUserId)) {
-                mPm.unsuspendForSuspendingPackage(mPm.snapshotComputer(), packageName,
-                        affectedUserId);
-                mPm.removeAllDistractingPackageRestrictions(affectedUserId);
+                mPm.unsuspendForSuspendingPackage(snapshot, packageName, affectedUserId);
+                mPm.removeAllDistractingPackageRestrictions(snapshot, affectedUserId);
             }
         }
 
@@ -621,7 +622,8 @@
         final int callingUid = Binder.getCallingUid();
         mPm.mContext.enforceCallingOrSelfPermission(
                 android.Manifest.permission.DELETE_PACKAGES, null);
-        final boolean canViewInstantApps = mPm.canViewInstantApps(callingUid, userId);
+        final Computer snapshot = mPm.snapshotComputer();
+        final boolean canViewInstantApps = snapshot.canViewInstantApps(callingUid, userId);
         Preconditions.checkNotNull(versionedPackage);
         Preconditions.checkNotNull(observer);
         Preconditions.checkArgumentInRange(versionedPackage.getLongVersionCode(),
@@ -644,12 +646,13 @@
         }
 
         // Normalize package name to handle renamed packages and static libs
-        final String internalPackageName = mPm.resolveInternalPackageName(packageName, versionCode);
+        final String internalPackageName =
+                snapshot.resolveInternalPackageName(packageName, versionCode);
 
         final int uid = Binder.getCallingUid();
-        if (!isOrphaned(internalPackageName)
+        if (!isOrphaned(snapshot, internalPackageName)
                 && !allowSilentUninstall
-                && !isCallerAllowedToSilentlyUninstall(uid, internalPackageName)) {
+                && !isCallerAllowedToSilentlyUninstall(snapshot, uid, internalPackageName)) {
             mPm.mHandler.post(() -> {
                 try {
                     final Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE);
@@ -680,8 +683,7 @@
             return;
         }
 
-        if (!deleteAllUsers && mPm.mIPackageManager
-                .getBlockUninstallForUser(internalPackageName, userId)) {
+        if (!deleteAllUsers && snapshot.getBlockUninstallForUser(internalPackageName, userId)) {
             mPm.mHandler.post(() -> {
                 try {
                     observer.onPackageDeleted(packageName,
@@ -756,44 +758,45 @@
         });
     }
 
-    private boolean isOrphaned(String packageName) {
-        final PackageStateInternal packageState = mPm.getPackageStateInternal(packageName);
+    private boolean isOrphaned(@NonNull Computer snapshot, String packageName) {
+        final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
         return packageState != null && packageState.getInstallSource().isOrphaned;
     }
 
-    private boolean isCallerAllowedToSilentlyUninstall(int callingUid, String pkgName) {
+    private boolean isCallerAllowedToSilentlyUninstall(@NonNull Computer snapshot, int callingUid,
+            String pkgName) {
         if (callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID
                 || UserHandle.getAppId(callingUid) == Process.SYSTEM_UID) {
             return true;
         }
         final int callingUserId = UserHandle.getUserId(callingUid);
         // If the caller installed the pkgName, then allow it to silently uninstall.
-        if (callingUid == mPm.mIPackageManager.getPackageUid(
-                mPm.mIPackageManager.getInstallerPackageName(pkgName), 0, callingUserId)) {
+        if (callingUid == snapshot.getPackageUid(snapshot.getInstallerPackageName(pkgName), 0,
+                callingUserId)) {
             return true;
         }
 
         // Allow package verifier to silently uninstall.
-        if (mPm.mRequiredVerifierPackage != null && callingUid == mPm.mIPackageManager
+        if (mPm.mRequiredVerifierPackage != null && callingUid == snapshot
                 .getPackageUid(mPm.mRequiredVerifierPackage, 0, callingUserId)) {
             return true;
         }
 
         // Allow package uninstaller to silently uninstall.
-        if (mPm.mRequiredUninstallerPackage != null && callingUid == mPm.mIPackageManager
+        if (mPm.mRequiredUninstallerPackage != null && callingUid == snapshot
                 .getPackageUid(mPm.mRequiredUninstallerPackage, 0, callingUserId)) {
             return true;
         }
 
         // Allow storage manager to silently uninstall.
-        if (mPm.mStorageManagerPackage != null && callingUid == mPm.mIPackageManager.getPackageUid(
+        if (mPm.mStorageManagerPackage != null && callingUid == snapshot.getPackageUid(
                 mPm.mStorageManagerPackage, 0, callingUserId)) {
             return true;
         }
 
         // Allow caller having MANAGE_PROFILE_AND_DEVICE_OWNERS permission to silently
         // uninstall for device owner provisioning.
-        return mPm.mIPackageManager.checkUidPermission(MANAGE_PROFILE_AND_DEVICE_OWNERS, callingUid)
+        return snapshot.checkUidPermission(MANAGE_PROFILE_AND_DEVICE_OWNERS, callingUid)
                 == PERMISSION_GRANTED;
     }
 
@@ -899,8 +902,8 @@
         int installedForUsersCount = 0;
         synchronized (mPm.mLock) {
             // Normalize package name to handle renamed packages and static libs
-            final String internalPkgName = mPm.resolveInternalPackageName(packageName,
-                    versionCode);
+            final String internalPkgName = mPm.snapshotComputer()
+                    .resolveInternalPackageName(packageName, versionCode);
             final PackageSetting ps = mPm.mSettings.getPackageLPr(internalPkgName);
             if (ps != null) {
                 int[] installedUsers = ps.queryInstalledUsers(mUserManagerInternal.getUserIds(),
diff --git a/services/core/java/com/android/server/pm/DexOptHelper.java b/services/core/java/com/android/server/pm/DexOptHelper.java
index 74ea7cc..50b2e23 100644
--- a/services/core/java/com/android/server/pm/DexOptHelper.java
+++ b/services/core/java/com/android/server/pm/DexOptHelper.java
@@ -266,8 +266,9 @@
             return;
         }
 
+        final Computer snapshot = mPm.snapshotComputer();
         List<PackageStateInternal> pkgSettings =
-                getPackagesForDexopt(mPm.getPackageStates().values(), mPm);
+                getPackagesForDexopt(snapshot.getPackageStates().values(), mPm);
 
         List<AndroidPackage> pkgs = new ArrayList<>(pkgSettings.size());
         for (int index = 0; index < pkgSettings.size(); index++) {
@@ -282,17 +283,19 @@
         final int elapsedTimeSeconds =
                 (int) TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime);
 
+        final Computer newSnapshot = mPm.snapshotComputer();
+
         MetricsLogger.histogram(mPm.mContext, "opt_dialog_num_dexopted", stats[0]);
         MetricsLogger.histogram(mPm.mContext, "opt_dialog_num_skipped", stats[1]);
         MetricsLogger.histogram(mPm.mContext, "opt_dialog_num_failed", stats[2]);
-        MetricsLogger.histogram(
-                mPm.mContext, "opt_dialog_num_total", getOptimizablePackages().size());
+        MetricsLogger.histogram(mPm.mContext, "opt_dialog_num_total",
+                getOptimizablePackages(newSnapshot).size());
         MetricsLogger.histogram(mPm.mContext, "opt_dialog_time_s", elapsedTimeSeconds);
     }
 
-    public ArraySet<String> getOptimizablePackages() {
+    public ArraySet<String> getOptimizablePackages(@NonNull Computer snapshot) {
         ArraySet<String> pkgs = new ArraySet<>();
-        mPm.forEachPackageState(packageState -> {
+        mPm.forEachPackageState(snapshot, packageState -> {
             final AndroidPackage pkg = packageState.getPkg();
             if (pkg != null && mPm.mPackageDexOptimizer.canOptimizePackage(pkg)) {
                 pkgs.add(packageState.getPackageName());
@@ -302,10 +305,10 @@
     }
 
     /*package*/ boolean performDexOpt(DexoptOptions options) {
-        if (mPm.getInstantAppPackageName(Binder.getCallingUid()) != null) {
+        final Computer snapshot = mPm.snapshotComputer();
+        if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
             return false;
-        } else if (mPm.mIPackageManager.isInstantApp(options.getPackageName(),
-                UserHandle.getCallingUserId())) {
+        } else if (snapshot.isInstantApp(options.getPackageName(), UserHandle.getCallingUserId())) {
             return false;
         }
 
@@ -417,10 +420,10 @@
                 mPm.getDexManager().getPackageUseInfoOrDefault(p.getPackageName()), options);
     }
 
-    public void forceDexOpt(String packageName) {
+    public void forceDexOpt(@NonNull Computer snapshot, String packageName) {
         PackageManagerServiceUtils.enforceSystemOrRoot("forceDexOpt");
 
-        final PackageStateInternal packageState = mPm.getPackageStateInternal(packageName);
+        final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
         final AndroidPackage pkg = packageState == null ? null : packageState.getPkg();
         if (packageState == null || pkg == null) {
             throw new IllegalArgumentException("Unknown package: " + packageName);
@@ -485,19 +488,21 @@
 
         ArrayList<PackageStateInternal> sortTemp = new ArrayList<>(remainingPkgSettings.size());
 
+        final Computer snapshot = packageManagerService.snapshotComputer();
+
         // Give priority to core apps.
-        applyPackageFilter(pkgSetting -> pkgSetting.getPkg().isCoreApp(), result,
+        applyPackageFilter(snapshot, pkgSetting -> pkgSetting.getPkg().isCoreApp(), result,
                 remainingPkgSettings, sortTemp, packageManagerService);
 
         // Give priority to system apps that listen for pre boot complete.
         Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED);
         final ArraySet<String> pkgNames = getPackageNamesForIntent(intent, UserHandle.USER_SYSTEM);
-        applyPackageFilter(pkgSetting -> pkgNames.contains(pkgSetting.getPackageName()), result,
+        applyPackageFilter(snapshot, pkgSetting -> pkgNames.contains(pkgSetting.getPackageName()), result,
                 remainingPkgSettings, sortTemp, packageManagerService);
 
         // Give priority to apps used by other apps.
         DexManager dexManager = packageManagerService.getDexManager();
-        applyPackageFilter(pkgSetting ->
+        applyPackageFilter(snapshot, pkgSetting ->
                         dexManager.getPackageUseInfoOrDefault(pkgSetting.getPackageName())
                                 .isAnyCodePathUsedByOtherApps(),
                 result, remainingPkgSettings, sortTemp, packageManagerService);
@@ -535,7 +540,7 @@
             // No historical info. Take all.
             remainingPredicate = pkgSetting -> true;
         }
-        applyPackageFilter(remainingPredicate, result, remainingPkgSettings, sortTemp,
+        applyPackageFilter(snapshot, remainingPredicate, result, remainingPkgSettings, sortTemp,
                 packageManagerService);
 
         if (debug) {
@@ -550,7 +555,7 @@
     // package will be removed from {@code packages} and added to {@code result} with its
     // dependencies. If usage data is available, the positive packages will be sorted by usage
     // data (with {@code sortTemp} as temporary storage).
-    private static void applyPackageFilter(
+    private static void applyPackageFilter(@NonNull Computer snapshot,
             Predicate<PackageStateInternal> filter,
             Collection<PackageStateInternal> result,
             Collection<PackageStateInternal> packages,
@@ -568,8 +573,7 @@
         for (PackageStateInternal pkgSetting : sortTemp) {
             result.add(pkgSetting);
 
-            List<PackageStateInternal> deps =
-                    packageManagerService.findSharedNonSystemLibraries(pkgSetting);
+            List<PackageStateInternal> deps = snapshot.findSharedNonSystemLibraries(pkgSetting);
             if (!deps.isEmpty()) {
                 deps.removeAll(result);
                 result.addAll(deps);
diff --git a/services/core/java/com/android/server/pm/DomainVerificationConnection.java b/services/core/java/com/android/server/pm/DomainVerificationConnection.java
index db8c6dc..20e4dd8 100644
--- a/services/core/java/com/android/server/pm/DomainVerificationConnection.java
+++ b/services/core/java/com/android/server/pm/DomainVerificationConnection.java
@@ -21,7 +21,6 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.UserIdInt;
-import android.content.pm.PackageManagerInternal;
 import android.os.Binder;
 import android.os.Message;
 import android.os.UserHandle;
@@ -35,13 +34,10 @@
 public final class DomainVerificationConnection implements DomainVerificationService.Connection,
         DomainVerificationProxyV1.Connection, DomainVerificationProxyV2.Connection {
     final PackageManagerService mPm;
-    final PackageManagerInternal mPmInternal;
     final UserManagerInternal mUmInternal;
 
-    // TODO(b/198166813): remove PMS dependency
     DomainVerificationConnection(PackageManagerService pm) {
         mPm = pm;
-        mPmInternal = mPm.mInjector.getLocalService(PackageManagerInternal.class);
         mUmInternal = mPm.mInjector.getLocalService(UserManagerInternal.class);
     }
 
@@ -82,18 +78,18 @@
     @Override
     public boolean isCallerPackage(int callingUid, @NonNull String packageName) {
         final int callingUserId = UserHandle.getUserId(callingUid);
-        return callingUid == mPmInternal.getPackageUid(packageName, 0, callingUserId);
+        return callingUid == mPm.snapshotComputer().getPackageUid(packageName, 0, callingUserId);
     }
 
     @Nullable
     @Override
     public AndroidPackage getPackage(@NonNull String packageName) {
-        return mPmInternal.getPackage(packageName);
+        return mPm.snapshotComputer().getPackage(packageName);
     }
 
     @Override
     public boolean filterAppAccess(String packageName, int callingUid, int userId) {
-        return mPmInternal.filterAppAccess(packageName, callingUid, userId);
+        return mPm.snapshotComputer().filterAppAccess(packageName, callingUid, userId);
     }
 
     @Override
@@ -108,6 +104,6 @@
 
     @NonNull
     public Computer snapshot() {
-        return (Computer) mPmInternal.snapshot();
+        return mPm.snapshotComputer();
     }
 }
diff --git a/services/core/java/com/android/server/pm/DumpHelper.java b/services/core/java/com/android/server/pm/DumpHelper.java
index 05ef3c4..f83ef5a 100644
--- a/services/core/java/com/android/server/pm/DumpHelper.java
+++ b/services/core/java/com/android/server/pm/DumpHelper.java
@@ -55,6 +55,7 @@
 
     @NeverCompile // Avoid size overhead of debugging code.
     public void doDump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        final Computer snapshot = mPm.snapshotComputer();
         DumpState dumpState = new DumpState();
         ArraySet<String> permissionNames = null;
 
@@ -121,7 +122,7 @@
                 }
 
                 // Normalize package name to handle renamed packages and static libs
-                pkg = mPm.resolveInternalPackageName(pkg, PackageManager.VERSION_CODE_HIGHEST);
+                pkg = snapshot.resolveInternalPackageName(pkg, PackageManager.VERSION_CODE_HIGHEST);
 
                 pw.println(mPm.checkPermission(perm, pkg, user));
                 return;
@@ -243,7 +244,7 @@
 
         // Return if the package doesn't exist.
         if (packageName != null
-                && mPm.getPackageStateInternal(packageName) == null
+                && snapshot.getPackageStateInternal(packageName) == null
                 && !mPm.mApexManager.isApexPackage(packageName)) {
             pw.println("Unable to find package: " + packageName);
             return;
@@ -257,7 +258,7 @@
         if (!checkin
                 && dumpState.isDumping(DumpState.DUMP_VERSION)
                 && packageName == null) {
-            mPm.dumpComputer(DumpState.DUMP_VERSION, fd, pw, dumpState);
+            snapshot.dump(DumpState.DUMP_VERSION, fd, pw, dumpState);
         }
 
         if (!checkin
@@ -273,7 +274,7 @@
                 final String knownPackage = PackageManagerInternal.knownPackageToString(i);
                 ipw.print(knownPackage);
                 ipw.println(":");
-                final String[] pkgNames = mPm.getKnownPackageNamesInternal(i,
+                final String[] pkgNames = mPm.getKnownPackageNamesInternal(snapshot, i,
                         UserHandle.USER_SYSTEM);
                 ipw.increaseIndent();
                 if (ArrayUtils.isEmpty(pkgNames)) {
@@ -288,8 +289,6 @@
             ipw.decreaseIndent();
         }
 
-        final Computer snapshot = mPm.snapshotComputer();
-
         if (dumpState.isDumping(DumpState.DUMP_VERIFIERS)
                 && packageName == null) {
             final String requiredVerifierPackage = mPm.mRequiredVerifierPackage;
@@ -343,7 +342,7 @@
 
         if (dumpState.isDumping(DumpState.DUMP_LIBS)
                 && packageName == null) {
-            mPm.dumpComputer(DumpState.DUMP_LIBS, fd, pw, dumpState);
+            snapshot.dump(DumpState.DUMP_LIBS, fd, pw, dumpState);
         }
 
         if (dumpState.isDumping(DumpState.DUMP_FEATURES)
@@ -389,17 +388,17 @@
         }
 
         if (!checkin && dumpState.isDumping(DumpState.DUMP_PREFERRED)) {
-            mPm.dumpComputer(DumpState.DUMP_PREFERRED, fd, pw, dumpState);
+            snapshot.dump(DumpState.DUMP_PREFERRED, fd, pw, dumpState);
         }
 
         if (!checkin
                 && dumpState.isDumping(DumpState.DUMP_PREFERRED_XML)
                 && packageName == null) {
-            mPm.dumpComputer(DumpState.DUMP_PREFERRED_XML, fd, pw, dumpState);
+            snapshot.dump(DumpState.DUMP_PREFERRED_XML, fd, pw, dumpState);
         }
 
         if (!checkin && dumpState.isDumping(DumpState.DUMP_DOMAIN_PREFERRED)) {
-            mPm.dumpComputer(DumpState.DUMP_DOMAIN_PREFERRED, fd, pw, dumpState);
+            snapshot.dump(DumpState.DUMP_DOMAIN_PREFERRED, fd, pw, dumpState);
         }
 
         if (!checkin && dumpState.isDumping(DumpState.DUMP_PERMISSIONS)) {
@@ -429,7 +428,7 @@
 
         if (!checkin
                 && dumpState.isDumping(DumpState.DUMP_QUERIES)) {
-            mPm.dumpComputer(DumpState.DUMP_QUERIES, fd, pw, dumpState);
+            snapshot.dump(DumpState.DUMP_QUERIES, fd, pw, dumpState);
         }
 
         if (dumpState.isDumping(DumpState.DUMP_SHARED_USERS)) {
@@ -529,12 +528,12 @@
 
         if (!checkin
                 && dumpState.isDumping(DumpState.DUMP_DEXOPT)) {
-            mPm.dumpComputer(DumpState.DUMP_DEXOPT, fd, pw, dumpState);
+            snapshot.dump(DumpState.DUMP_DEXOPT, fd, pw, dumpState);
         }
 
         if (!checkin
                 && dumpState.isDumping(DumpState.DUMP_COMPILER_STATS)) {
-            mPm.dumpComputer(DumpState.DUMP_COMPILER_STATS, fd, pw, dumpState);
+            snapshot.dump(DumpState.DUMP_COMPILER_STATS, fd, pw, dumpState);
         }
 
         if (dumpState.isDumping(DumpState.DUMP_MESSAGES)
@@ -581,7 +580,7 @@
             pw.println("    Known digesters list flag: "
                     + PackageManagerService.getKnownDigestersList());
 
-            PerUidReadTimeouts[] items = mPm.getPerUidReadTimeouts();
+            PerUidReadTimeouts[] items = mPm.getPerUidReadTimeouts(snapshot);
             pw.println("    Timeouts (" + items.length + "):");
             for (PerUidReadTimeouts item : items) {
                 pw.print("        (");
diff --git a/services/core/java/com/android/server/pm/IPackageManagerBase.java b/services/core/java/com/android/server/pm/IPackageManagerBase.java
new file mode 100644
index 0000000..e1aee6d
--- /dev/null
+++ b/services/core/java/com/android/server/pm/IPackageManagerBase.java
@@ -0,0 +1,1189 @@
+/*
+ * Copyright (C) 2022 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 com.android.server.pm;
+
+
+import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
+import android.annotation.UserIdInt;
+import android.app.role.RoleManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageDeleteObserver;
+import android.content.pm.IPackageDeleteObserver2;
+import android.content.pm.IPackageInstaller;
+import android.content.pm.IPackageManager;
+import android.content.pm.IPackageStatsObserver;
+import android.content.pm.InstallSourceInfo;
+import android.content.pm.InstrumentationInfo;
+import android.content.pm.IntentFilterVerificationInfo;
+import android.content.pm.KeySet;
+import android.content.pm.ModuleInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ParceledListSlice;
+import android.content.pm.PermissionGroupInfo;
+import android.content.pm.PermissionInfo;
+import android.content.pm.ProviderInfo;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.content.pm.SharedLibraryInfo;
+import android.content.pm.VersionedPackage;
+import android.content.pm.dex.IArtManager;
+import android.os.Binder;
+import android.os.Process;
+import android.os.RemoteException;
+import android.os.Trace;
+import android.os.UserHandle;
+import android.permission.PermissionManager;
+
+import com.android.internal.R;
+import com.android.internal.content.InstallLocationUtils;
+import com.android.internal.util.CollectionUtils;
+import com.android.server.pm.pkg.PackageStateInternal;
+import com.android.server.pm.verify.domain.DomainVerificationManagerInternal;
+import com.android.server.pm.verify.domain.proxy.DomainVerificationProxyV1;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Contains all simply proxy methods which need a snapshot instance and just calls a method on it,
+ * with no additional logic. Separated with all methods marked final and deprecated to prevent their
+ * use from other methods which may need a snapshot for non-trivial reasons.
+ */
+public abstract class IPackageManagerBase extends IPackageManager.Stub {
+
+    @NonNull
+    private final PackageManagerService mService;
+
+    @NonNull
+    private final Context mContext;
+
+    @NonNull private final DexOptHelper mDexOptHelper;
+    @NonNull private final ModuleInfoProvider mModuleInfoProvider;
+    @NonNull private final PreferredActivityHelper mPreferredActivityHelper;
+    @NonNull private final ResolveIntentHelper mResolveIntentHelper;
+
+    @NonNull
+    private final DomainVerificationManagerInternal mDomainVerificationManager;
+
+    @NonNull
+    private final DomainVerificationConnection mDomainVerificationConnection;
+
+    @NonNull
+    private final PackageInstallerService mInstallerService;
+
+    @NonNull
+    private final PackageProperty mPackageProperty;
+
+    @NonNull
+    private final ComponentName mResolveComponentName;
+
+    @Nullable
+    private final ComponentName mInstantAppResolverSettingsComponent;
+
+    @NonNull
+    private final String mRequiredSupplementalProcessPackage;
+
+    @Nullable
+    private final String mServicesExtensionPackageName;
+
+    @Nullable
+    private final String mSharedSystemSharedLibraryPackageName;
+
+    public IPackageManagerBase(@NonNull PackageManagerService service, @NonNull Context context,
+            @NonNull DexOptHelper dexOptHelper, @NonNull ModuleInfoProvider moduleInfoProvider,
+            @NonNull PreferredActivityHelper preferredActivityHelper,
+            @NonNull ResolveIntentHelper resolveIntentHelper,
+            @NonNull DomainVerificationManagerInternal domainVerificationManager,
+            @NonNull DomainVerificationConnection domainVerificationConnection,
+            @NonNull PackageInstallerService installerService,
+            @NonNull PackageProperty packageProperty, @NonNull ComponentName resolveComponentName,
+            @Nullable ComponentName instantAppResolverSettingsComponent,
+            @NonNull String requiredSupplementalProcessPackage,
+            @Nullable String servicesExtensionPackageName,
+            @Nullable String sharedSystemSharedLibraryPackageName) {
+        mService = service;
+        mContext = context;
+        mDexOptHelper = dexOptHelper;
+        mModuleInfoProvider = moduleInfoProvider;
+        mPreferredActivityHelper = preferredActivityHelper;
+        mResolveIntentHelper = resolveIntentHelper;
+        mDomainVerificationManager = domainVerificationManager;
+        mDomainVerificationConnection = domainVerificationConnection;
+        mInstallerService = installerService;
+        mPackageProperty = packageProperty;
+        mResolveComponentName = resolveComponentName;
+        mInstantAppResolverSettingsComponent = instantAppResolverSettingsComponent;
+        mRequiredSupplementalProcessPackage = requiredSupplementalProcessPackage;
+        mServicesExtensionPackageName = servicesExtensionPackageName;
+        mSharedSystemSharedLibraryPackageName = sharedSystemSharedLibraryPackageName;
+    }
+
+    protected Computer snapshot() {
+        return mService.snapshotComputer();
+    }
+
+    @Override
+    @Deprecated
+    public final boolean activitySupportsIntent(ComponentName component, Intent intent,
+            String resolvedType) {
+        return snapshot().activitySupportsIntent(mResolveComponentName, component, intent,
+                resolvedType);
+    }
+
+    @Override
+    @Deprecated
+    public final void addCrossProfileIntentFilter(IntentFilter intentFilter, String ownerPackage,
+            int sourceUserId, int targetUserId, int flags) {
+        mService.addCrossProfileIntentFilter(snapshot(),
+                new WatchedIntentFilter(intentFilter), ownerPackage, sourceUserId, targetUserId,
+                flags);
+    }
+
+    // NOTE: Can't remove due to unsupported app usage
+    @Override
+    @Deprecated
+    public final boolean addPermission(PermissionInfo info) {
+        // Because this is accessed via the package manager service AIDL,
+        // go through the permission manager service AIDL
+        return mContext.getSystemService(PermissionManager.class).addPermission(info, false);
+    }
+
+    // NOTE: Can't remove due to unsupported app usage
+    @Override
+    @Deprecated
+    public final boolean addPermissionAsync(PermissionInfo info) {
+        // Because this is accessed via the package manager service AIDL,
+        // go through the permission manager service AIDL
+        return mContext.getSystemService(PermissionManager.class).addPermission(info, true);
+    }
+
+    @Override
+    @Deprecated
+    public final void addPersistentPreferredActivity(IntentFilter filter, ComponentName activity,
+            int userId) {
+        mPreferredActivityHelper.addPersistentPreferredActivity(new WatchedIntentFilter(filter),
+                activity, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final void addPreferredActivity(IntentFilter filter, int match,
+            ComponentName[] set, ComponentName activity, int userId, boolean removeExisting) {
+        mPreferredActivityHelper.addPreferredActivity(snapshot(),
+                new WatchedIntentFilter(filter), match, set, activity, true, userId,
+                "Adding preferred", removeExisting);
+    }
+
+    /*
+     * Returns if intent can be forwarded from the sourceUserId to the targetUserId
+     */
+    @Override
+    @Deprecated
+    public final boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType,
+            @UserIdInt int sourceUserId, @UserIdInt int targetUserId) {
+        return snapshot().canForwardTo(intent, resolvedType, sourceUserId, targetUserId);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean canRequestPackageInstalls(String packageName, int userId) {
+        return snapshot().canRequestPackageInstalls(packageName, Binder.getCallingUid(), userId,
+                true /* throwIfPermNotDeclared*/);
+    }
+
+    @Override
+    @Deprecated
+    public final String[] canonicalToCurrentPackageNames(String[] names) {
+        return snapshot().canonicalToCurrentPackageNames(names);
+    }
+
+    // NOTE: Can't remove due to unsupported app usage
+    @Override
+    @Deprecated
+    public final int checkPermission(String permName, String pkgName, int userId) {
+        return mService.checkPermission(permName, pkgName, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final int checkSignatures(@NonNull String pkg1, @NonNull String pkg2) {
+        return snapshot().checkSignatures(pkg1, pkg2);
+    }
+
+    @Override
+    @Deprecated
+    public final int checkUidPermission(String permName, int uid) {
+        return snapshot().checkUidPermission(permName, uid);
+    }
+
+    @Override
+    @Deprecated
+    public final int checkUidSignatures(int uid1, int uid2) {
+        return snapshot().checkUidSignatures(uid1, uid2);
+    }
+
+    @Override
+    @Deprecated
+    public final void clearPackagePersistentPreferredActivities(String packageName, int userId) {
+        mPreferredActivityHelper.clearPackagePersistentPreferredActivities(packageName, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final void clearPackagePreferredActivities(String packageName) {
+        mPreferredActivityHelper.clearPackagePreferredActivities(snapshot(),
+                packageName);
+    }
+
+    @Override
+    @Deprecated
+    public final String[] currentToCanonicalPackageNames(String[] names) {
+        return snapshot().currentToCanonicalPackageNames(names);
+    }
+
+    @Override
+    @Deprecated
+    public final void deleteExistingPackageAsUser(VersionedPackage versionedPackage,
+            final IPackageDeleteObserver2 observer, final int userId) {
+        mService.deleteExistingPackageAsUser(versionedPackage, observer, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final void deletePackageAsUser(String packageName, int versionCode,
+            IPackageDeleteObserver observer, int userId, int flags) {
+        deletePackageVersioned(new VersionedPackage(packageName, versionCode),
+                new PackageManager.LegacyPackageDeleteObserver(observer).getBinder(), userId,
+                flags);
+    }
+
+    @Override
+    @Deprecated
+    public final void deletePackageVersioned(VersionedPackage versionedPackage,
+            final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags) {
+        mService.deletePackageVersioned(versionedPackage, observer, userId, deleteFlags);
+    }
+
+    @Override
+    @Deprecated
+    public final ResolveInfo findPersistentPreferredActivity(Intent intent, int userId) {
+        return mPreferredActivityHelper.findPersistentPreferredActivity(snapshot(), intent, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final void forceDexOpt(String packageName) {
+        mDexOptHelper.forceDexOpt(snapshot(), packageName);
+    }
+
+    @Override
+    @Deprecated
+    public final ActivityInfo getActivityInfo(ComponentName component,
+            @PackageManager.ComponentInfoFlagsBits long flags, int userId) {
+        return snapshot().getActivityInfo(component, flags, userId);
+    }
+
+    @NonNull
+    @Override
+    @Deprecated
+    public final ParceledListSlice<IntentFilter> getAllIntentFilters(@NonNull String packageName) {
+        return snapshot().getAllIntentFilters(packageName);
+    }
+
+    @Override
+    @Deprecated
+    public final List<String> getAllPackages() {
+        return snapshot().getAllPackages();
+    }
+
+    // NOTE: Can't remove due to unsupported app usage
+    @NonNull
+    @Override
+    @Deprecated
+    public final String[] getAppOpPermissionPackages(@NonNull String permissionName) {
+        return snapshot().getAppOpPermissionPackages(permissionName);
+    }
+
+    @Override
+    @Deprecated
+    public final String getAppPredictionServicePackageName() {
+        return mService.mAppPredictionServicePackage;
+    }
+
+    @PackageManager.EnabledState
+    @Override
+    @Deprecated
+    public final int getApplicationEnabledSetting(@NonNull String packageName,
+            @UserIdInt int userId) {
+        return snapshot().getApplicationEnabledSetting(packageName, userId);
+    }
+
+    /**
+     * Returns true if application is not found or there was an error. Otherwise it returns the
+     * hidden state of the package for the given user.
+     */
+    @Override
+    @Deprecated
+    public final boolean getApplicationHiddenSettingAsUser(@NonNull String packageName,
+            @UserIdInt int userId) {
+        return snapshot().getApplicationHiddenSettingAsUser(packageName, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final ApplicationInfo getApplicationInfo(String packageName,
+            @PackageManager.ApplicationInfoFlagsBits long flags, int userId) {
+        return snapshot().getApplicationInfo(packageName, flags, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final IArtManager getArtManager() {
+        return mService.mArtManagerService;
+    }
+
+    @Override
+    @Deprecated
+    public final @Nullable
+    String getAttentionServicePackageName() {
+        return mService.ensureSystemPackageName(snapshot(),
+                mService.getPackageFromComponentString(R.string.config_defaultAttentionService));
+    }
+
+    @Override
+    @Deprecated
+    public final boolean getBlockUninstallForUser(@NonNull String packageName,
+            @UserIdInt int userId) {
+        return snapshot().getBlockUninstallForUser(packageName, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final int getComponentEnabledSetting(@NonNull ComponentName component, int userId) {
+        return snapshot().getComponentEnabledSetting(component, Binder.getCallingUid(), userId);
+    }
+
+    @Override
+    @Deprecated
+    public final String getContentCaptureServicePackageName() {
+        return mService.ensureSystemPackageName(snapshot(),
+                mService.getPackageFromComponentString(
+                        R.string.config_defaultContentCaptureService));
+    }
+
+    @Nullable
+    @Override
+    @Deprecated
+    public final ParceledListSlice<SharedLibraryInfo> getDeclaredSharedLibraries(
+            @NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags,
+            @NonNull int userId) {
+        return snapshot().getDeclaredSharedLibraries(packageName, flags, userId);
+    }
+
+    /**
+     * Non-Binder method, support for the backup/restore mechanism: write the default browser (etc)
+     * settings in its canonical XML format.  Returns the default browser XML representation as a
+     * byte array, or null if there is none.
+     */
+    @Override
+    @Deprecated
+    public final byte[] getDefaultAppsBackup(int userId) {
+        return mPreferredActivityHelper.getDefaultAppsBackup(userId);
+    }
+
+    @Override
+    @Deprecated
+    public final String getDefaultTextClassifierPackageName() {
+        return mService.mDefaultTextClassifierPackage;
+    }
+
+    @Override
+    @Deprecated
+    public final int getFlagsForUid(int uid) {
+        return snapshot().getFlagsForUid(uid);
+    }
+
+    @Nullable
+    @Override
+    @Deprecated
+    public final CharSequence getHarmfulAppWarning(@NonNull String packageName,
+            @UserIdInt int userId) {
+        return snapshot().getHarmfulAppWarning(packageName, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final ComponentName getHomeActivities(List<ResolveInfo> allHomeCandidates) {
+        final Computer snapshot = snapshot();
+        if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
+            return null;
+        }
+        return snapshot.getHomeActivitiesAsUser(allHomeCandidates,
+                UserHandle.getCallingUserId());
+    }
+
+    @Deprecated
+    public final String getIncidentReportApproverPackageName() {
+        return mService.mIncidentReportApproverPackage;
+    }
+
+    @Override
+    @Deprecated
+    public final int getInstallLocation() {
+        // allow instant app access
+        return android.provider.Settings.Global.getInt(mContext.getContentResolver(),
+                android.provider.Settings.Global.DEFAULT_INSTALL_LOCATION,
+                InstallLocationUtils.APP_INSTALL_AUTO);
+    }
+
+    @PackageManager.InstallReason
+    @Override
+    @Deprecated
+    public final int getInstallReason(@NonNull String packageName, @UserIdInt int userId) {
+        return snapshot().getInstallReason(packageName, userId);
+    }
+
+    @Override
+    @Nullable
+    @Deprecated
+    public final InstallSourceInfo getInstallSourceInfo(@NonNull String packageName) {
+        return snapshot().getInstallSourceInfo(packageName);
+    }
+
+    @Override
+    @Deprecated
+    public final ParceledListSlice<ApplicationInfo> getInstalledApplications(
+            @PackageManager.ApplicationInfoFlagsBits long flags, int userId) {
+        final int callingUid = Binder.getCallingUid();
+        return new ParceledListSlice<>(
+                snapshot().getInstalledApplications(flags, userId, callingUid));
+    }
+
+    @Override
+    @Deprecated
+    public final List<ModuleInfo> getInstalledModules(int flags) {
+        return mModuleInfoProvider.getInstalledModules(flags);
+    }
+
+    @Override
+    @Deprecated
+    public final ParceledListSlice<PackageInfo> getInstalledPackages(
+            @PackageManager.PackageInfoFlagsBits long flags, int userId) {
+        return snapshot().getInstalledPackages(flags, userId);
+    }
+
+    @Nullable
+    @Override
+    @Deprecated
+    public final String getInstallerPackageName(@NonNull String packageName) {
+        return snapshot().getInstallerPackageName(packageName);
+    }
+
+    @Override
+    @Deprecated
+    public final ComponentName getInstantAppInstallerComponent() {
+        final Computer snapshot = snapshot();
+        if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
+            return null;
+        }
+        return snapshot.getInstantAppInstallerComponent();
+    }
+
+    @Override
+    @Deprecated
+    public final @Nullable
+    ComponentName getInstantAppResolverComponent() {
+        final Computer snapshot = snapshot();
+        if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
+            return null;
+        }
+        return mService.getInstantAppResolver(snapshot);
+    }
+
+    @Override
+    @Deprecated
+    public final ComponentName getInstantAppResolverSettingsComponent() {
+        return mInstantAppResolverSettingsComponent;
+    }
+
+    @Nullable
+    @Override
+    @Deprecated
+    public final InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component,
+            int flags) {
+        return snapshot().getInstrumentationInfo(component, flags);
+    }
+
+    @Override
+    @Deprecated
+    public final @NonNull
+    ParceledListSlice<IntentFilterVerificationInfo>
+    getIntentFilterVerifications(String packageName) {
+        return ParceledListSlice.emptyList();
+    }
+
+    @Override
+    @Deprecated
+    public final int getIntentVerificationStatus(String packageName, int userId) {
+        return mDomainVerificationManager.getLegacyState(packageName, userId);
+    }
+
+    @Nullable
+    @Override
+    @Deprecated
+    public final KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias) {
+        return snapshot().getKeySetByAlias(packageName, alias);
+    }
+
+    @Override
+    @Deprecated
+    public final ModuleInfo getModuleInfo(String packageName,
+            @PackageManager.ModuleInfoFlags int flags) {
+        return mModuleInfoProvider.getModuleInfo(packageName, flags);
+    }
+
+    @Nullable
+    @Override
+    @Deprecated
+    public final String getNameForUid(int uid) {
+        return snapshot().getNameForUid(uid);
+    }
+
+    @Nullable
+    @Override
+    @Deprecated
+    public final String[] getNamesForUids(@NonNull int[] uids) {
+        return snapshot().getNamesForUids(uids);
+    }
+
+    @Override
+    @Deprecated
+    public final int[] getPackageGids(String packageName,
+            @PackageManager.PackageInfoFlagsBits long flags, int userId) {
+        return snapshot().getPackageGids(packageName, flags, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final PackageInfo getPackageInfo(String packageName,
+            @PackageManager.PackageInfoFlagsBits long flags, int userId) {
+        return snapshot().getPackageInfo(packageName, flags, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final PackageInfo getPackageInfoVersioned(VersionedPackage versionedPackage,
+            @PackageManager.PackageInfoFlagsBits long flags, int userId) {
+        return snapshot().getPackageInfoInternal(versionedPackage.getPackageName(),
+                versionedPackage.getLongVersionCode(), flags, Binder.getCallingUid(), userId);
+    }
+
+    @Override
+    @Deprecated
+    public final IPackageInstaller getPackageInstaller() {
+        // Return installer service for internal calls.
+        if (PackageManagerServiceUtils.isSystemOrRoot()) {
+            return mInstallerService;
+        }
+        final Computer snapshot = snapshot();
+        // Return null for InstantApps.
+        if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
+            return null;
+        }
+        return mInstallerService;
+    }
+
+    @Override
+    @Deprecated
+    public final void getPackageSizeInfo(final String packageName, int userId,
+            final IPackageStatsObserver observer) {
+        throw new UnsupportedOperationException(
+                "Shame on you for calling the hidden API getPackageSizeInfo(). Shame!");
+    }
+
+    @Override
+    @Deprecated
+    public final int getPackageUid(@NonNull String packageName,
+            @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) {
+        return snapshot().getPackageUid(packageName, flags, userId);
+    }
+
+    /**
+     * <em>IMPORTANT:</em> Not all packages returned by this method may be known
+     * to the system. There are two conditions in which this may occur:
+     * <ol>
+     *   <li>The package is on adoptable storage and the device has been removed</li>
+     *   <li>The package is being removed and the internal structures are partially updated</li>
+     * </ol>
+     * The second is an artifact of the current data structures and should be fixed. See
+     * b/111075456 for one such instance.
+     * This binder API is cached.  If the algorithm in this method changes,
+     * or if the underlying objecs (as returned by getSettingLPr()) change
+     * then the logic that invalidates the cache must be revisited.  See
+     * calls to invalidateGetPackagesForUidCache() to locate the points at
+     * which the cache is invalidated.
+     */
+    @Override
+    @Deprecated
+    public final String[] getPackagesForUid(int uid) {
+        final int callingUid = Binder.getCallingUid();
+        final int userId = UserHandle.getUserId(uid);
+        snapshot().enforceCrossUserOrProfilePermission(callingUid, userId,
+                /* requireFullPermission */ false,
+                /* checkShell */ false, "getPackagesForUid");
+        return snapshot().getPackagesForUid(uid);
+    }
+
+    @Override
+    @Deprecated
+    public final ParceledListSlice<PackageInfo> getPackagesHoldingPermissions(
+            @NonNull String[] permissions, @PackageManager.PackageInfoFlagsBits long flags,
+            @UserIdInt int userId) {
+        return snapshot().getPackagesHoldingPermissions(permissions, flags, userId);
+    }
+
+    // NOTE: Can't remove due to unsupported app usage
+    @Override
+    @Deprecated
+    public final PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags) {
+        return mService.getPermissionGroupInfo(groupName, flags);
+    }
+
+    @Override
+    @Deprecated
+    public final @NonNull
+    ParceledListSlice<ApplicationInfo> getPersistentApplications(int flags) {
+        final Computer snapshot = snapshot();
+        if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
+            return ParceledListSlice.emptyList();
+        }
+        return new ParceledListSlice<>(snapshot.getPersistentApplications(isSafeMode(), flags));
+    }
+
+    @Override
+    @Deprecated
+    public final int getPreferredActivities(List<IntentFilter> outFilters,
+            List<ComponentName> outActivities, String packageName) {
+        return mPreferredActivityHelper.getPreferredActivities(snapshot(), outFilters,
+                outActivities, packageName);
+    }
+
+    /**
+     * Non-Binder method, support for the backup/restore mechanism: write the full set of preferred
+     * activities in its canonical XML format.  Returns the XML output as a byte array, or null if
+     * there is none.
+     */
+    @Override
+    @Deprecated
+    public final byte[] getPreferredActivityBackup(int userId) {
+        return mPreferredActivityHelper.getPreferredActivityBackup(userId);
+    }
+
+    @Override
+    @Deprecated
+    public final int getPrivateFlagsForUid(int uid) {
+        return snapshot().getPrivateFlagsForUid(uid);
+    }
+
+    @Override
+    @Deprecated
+    public final PackageManager.Property getProperty(String propertyName, String packageName,
+            String className) {
+        Objects.requireNonNull(propertyName);
+        Objects.requireNonNull(packageName);
+        PackageStateInternal packageState = snapshot().getPackageStateFiltered(packageName,
+                Binder.getCallingUid(), UserHandle.getCallingUserId());
+        if (packageState == null) {
+            return null;
+        }
+        return mPackageProperty.getProperty(propertyName, packageName, className);
+    }
+
+    @Nullable
+    @Override
+    @Deprecated
+    public final ProviderInfo getProviderInfo(@NonNull ComponentName component,
+            @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) {
+        return snapshot().getProviderInfo(component, flags, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final ActivityInfo getReceiverInfo(ComponentName component,
+            @PackageManager.ComponentInfoFlagsBits long flags, int userId) {
+        return snapshot().getReceiverInfo(component, flags, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final @Nullable
+    String getRotationResolverPackageName() {
+        return mService.ensureSystemPackageName(snapshot(),
+                mService.getPackageFromComponentString(
+                        R.string.config_defaultRotationResolverService));
+    }
+
+    @Nullable
+    @Override
+    @Deprecated
+    public final ServiceInfo getServiceInfo(@NonNull ComponentName component,
+            @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) {
+        return snapshot().getServiceInfo(component, flags, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final @NonNull
+    String getServicesSystemSharedLibraryPackageName() {
+        return mServicesExtensionPackageName;
+    }
+
+    @Override
+    @Deprecated
+    public final String getSetupWizardPackageName() {
+        if (Binder.getCallingUid() != Process.SYSTEM_UID) {
+            throw new SecurityException("Non-system caller");
+        }
+        return mService.mSetupWizardPackage;
+    }
+
+    @Override
+    @Deprecated
+    public final ParceledListSlice<SharedLibraryInfo> getSharedLibraries(String packageName,
+            @PackageManager.PackageInfoFlagsBits long flags, int userId) {
+        return snapshot().getSharedLibraries(packageName, flags, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final @NonNull
+    String getSharedSystemSharedLibraryPackageName() {
+        return mSharedSystemSharedLibraryPackageName;
+    }
+
+    @Nullable
+    @Override
+    @Deprecated
+    public final KeySet getSigningKeySet(@NonNull String packageName) {
+        return snapshot().getSigningKeySet(packageName);
+    }
+
+    @Override
+    @Deprecated
+    public final String getSdkSandboxPackageName() {
+        return mService.getSdkSandboxPackageName();
+    }
+
+    @Override
+    @Deprecated
+    public final String getSystemCaptionsServicePackageName() {
+        return mService.ensureSystemPackageName(snapshot(),
+                mService.getPackageFromComponentString(
+                        R.string.config_defaultSystemCaptionsService));
+    }
+
+    @Nullable
+    @Override
+    @Deprecated
+    public final String[] getSystemSharedLibraryNames() {
+        return snapshot().getSystemSharedLibraryNames();
+    }
+
+    @Override
+    @Deprecated
+    public final String getSystemTextClassifierPackageName() {
+        return mService.mSystemTextClassifierPackageName;
+    }
+
+    @Override
+    @Deprecated
+    public final int getTargetSdkVersion(@NonNull String packageName) {
+        return snapshot().getTargetSdkVersion(packageName);
+    }
+
+    @Override
+    @Deprecated
+    public final int getUidForSharedUser(@NonNull String sharedUserName) {
+        return snapshot().getUidForSharedUser(sharedUserName);
+    }
+
+    @SuppressLint("MissingPermission")
+    @Override
+    @Deprecated
+    public final String getWellbeingPackageName() {
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            return CollectionUtils.firstOrNull(
+                    mContext.getSystemService(RoleManager.class).getRoleHolders(
+                            RoleManager.ROLE_SYSTEM_WELLBEING));
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
+    // NOTE: Can't remove due to unsupported app usage
+    @SuppressLint("MissingPermission")
+    @Override
+    @Deprecated
+    public final void grantRuntimePermission(String packageName, String permName,
+            final int userId) {
+        // Because this is accessed via the package manager service AIDL,
+        // go through the permission manager service AIDL
+        mContext.getSystemService(PermissionManager.class)
+                .grantRuntimePermission(packageName, permName, UserHandle.of(userId));
+    }
+
+    @Override
+    @Deprecated
+    public final boolean hasSigningCertificate(@NonNull String packageName,
+            @NonNull byte[] certificate,
+            @PackageManager.CertificateInputType int type) {
+        return snapshot().hasSigningCertificate(packageName, certificate, type);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean hasSystemFeature(String name, int version) {
+        return mService.hasSystemFeature(name, version);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean hasSystemUidErrors() {
+        // allow instant applications
+        return false;
+    }
+
+    @Override
+    @Deprecated
+    public final boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate,
+            @PackageManager.CertificateInputType int type) {
+        return snapshot().hasUidSigningCertificate(uid, certificate, type);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isDeviceUpgrading() {
+        return mService.isDeviceUpgrading();
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isFirstBoot() {
+        return mService.isFirstBoot();
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isInstantApp(String packageName, int userId) {
+        return snapshot().isInstantApp(packageName, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isOnlyCoreApps() {
+        return mService.isOnlyCoreApps();
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isPackageAvailable(String packageName, int userId) {
+        return snapshot().isPackageAvailable(packageName, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isPackageDeviceAdminOnAnyUser(String packageName) {
+        return mService.isPackageDeviceAdminOnAnyUser(snapshot(),
+                packageName);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks) {
+        return snapshot().isPackageSignedByKeySet(packageName, ks);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isPackageSignedByKeySetExactly(@NonNull String packageName,
+            @NonNull KeySet ks) {
+        return snapshot().isPackageSignedByKeySetExactly(packageName, ks);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isPackageSuspendedForUser(@NonNull String packageName,
+            @UserIdInt int userId) {
+        return snapshot().isPackageSuspendedForUser(packageName, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isSafeMode() {
+        // allow instant applications
+        return mService.getSafeMode();
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isStorageLow() {
+        return mService.isStorageLow();
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isUidPrivileged(int uid) {
+        return snapshot().isUidPrivileged(uid);
+    }
+
+    /**
+     * Ask the package manager to perform a dex-opt with the given compiler filter.
+     * <p>
+     * Note: exposed only for the shell command to allow moving packages explicitly to a definite
+     * state.
+     */
+    @Override
+    @Deprecated
+    public final boolean performDexOptMode(String packageName,
+            boolean checkProfiles, String targetCompilerFilter, boolean force,
+            boolean bootComplete, String splitName) {
+        return mDexOptHelper.performDexOptMode(packageName, checkProfiles, targetCompilerFilter,
+                force, bootComplete, splitName);
+    }
+
+    /**
+     * Ask the package manager to perform a dex-opt with the given compiler filter on the secondary
+     * dex files belonging to the given package.
+     * <p>
+     * Note: exposed only for the shell command to allow moving packages explicitly to a definite
+     * state.
+     */
+    @Override
+    @Deprecated
+    public final boolean performDexOptSecondary(String packageName, String compilerFilter,
+            boolean force) {
+        return mDexOptHelper.performDexOptSecondary(packageName, compilerFilter, force);
+    }
+
+    @Override
+    @Deprecated
+    public final @NonNull
+    ParceledListSlice<ResolveInfo> queryIntentActivities(Intent intent,
+            String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
+        try {
+            Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "queryIntentActivities");
+
+            return new ParceledListSlice<>(snapshot().queryIntentActivitiesInternal(intent,
+                    resolvedType, flags, userId));
+        } finally {
+            Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
+        }
+    }
+
+    @NonNull
+    @Override
+    @Deprecated
+    public final ParceledListSlice<ProviderInfo> queryContentProviders(@Nullable String processName,
+            int uid, @PackageManager.ComponentInfoFlagsBits long flags,
+            @Nullable String metaDataKey) {
+        return snapshot().queryContentProviders(processName, uid, flags, metaDataKey);
+    }
+
+    @NonNull
+    @Override
+    @Deprecated
+    public final ParceledListSlice<InstrumentationInfo> queryInstrumentation(
+            @NonNull String targetPackage, int flags) {
+        return snapshot().queryInstrumentation(targetPackage, flags);
+    }
+
+    @Override
+    @Deprecated
+    public final @NonNull
+    ParceledListSlice<ResolveInfo> queryIntentActivityOptions(
+            ComponentName caller, Intent[] specifics, String[] specificTypes, Intent intent,
+            String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
+        return new ParceledListSlice<>(mResolveIntentHelper.queryIntentActivityOptionsInternal(
+                snapshot(), caller, specifics, specificTypes, intent, resolvedType, flags,
+                userId));
+    }
+
+    @Override
+    @Deprecated
+    public final @NonNull
+    ParceledListSlice<ResolveInfo> queryIntentContentProviders(Intent intent,
+            String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
+        return new ParceledListSlice<>(mResolveIntentHelper.queryIntentContentProvidersInternal(
+                snapshot(), intent, resolvedType, flags, userId));
+    }
+
+    @Override
+    @Deprecated
+    public final @NonNull
+    ParceledListSlice<ResolveInfo> queryIntentReceivers(Intent intent,
+            String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
+        return new ParceledListSlice<>(mResolveIntentHelper.queryIntentReceiversInternal(
+                snapshot(), intent, resolvedType, flags, userId, Binder.getCallingUid()));
+    }
+
+    @Override
+    @Deprecated
+    public final @NonNull
+    ParceledListSlice<ResolveInfo> queryIntentServices(Intent intent,
+            String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
+        final int callingUid = Binder.getCallingUid();
+        return new ParceledListSlice<>(snapshot().queryIntentServicesInternal(
+                intent, resolvedType, flags, userId, callingUid, false /*includeInstantApps*/));
+    }
+
+    @Override
+    @Deprecated
+    public final void querySyncProviders(List<String> outNames, List<ProviderInfo> outInfo) {
+        snapshot().querySyncProviders(isSafeMode(), outNames, outInfo);
+    }
+
+    @Override
+    @Deprecated
+    public final void removePermission(String permName) {
+        // Because this is accessed via the package manager service AIDL,
+        // go through the permission manager service AIDL
+        mContext.getSystemService(PermissionManager.class).removePermission(permName);
+    }
+
+    @Override
+    @Deprecated
+    public final void replacePreferredActivity(IntentFilter filter, int match,
+            ComponentName[] set, ComponentName activity, int userId) {
+        mPreferredActivityHelper.replacePreferredActivity(snapshot(),
+                new WatchedIntentFilter(filter), match, set, activity, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final ProviderInfo resolveContentProvider(String name,
+            @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
+        return snapshot().resolveContentProvider(name, flags, userId, Binder.getCallingUid());
+    }
+
+    @Override
+    @Deprecated
+    public final void resetApplicationPreferences(int userId) {
+        mPreferredActivityHelper.resetApplicationPreferences(userId);
+    }
+
+    @Override
+    @Deprecated
+    public final ResolveInfo resolveIntent(Intent intent, String resolvedType,
+            @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
+        return mResolveIntentHelper.resolveIntentInternal(snapshot(), intent,
+                resolvedType, flags, 0 /*privateResolveFlags*/, userId, false,
+                Binder.getCallingUid());
+    }
+
+    @Override
+    @Deprecated
+    public final ResolveInfo resolveService(Intent intent, String resolvedType,
+            @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
+        final int callingUid = Binder.getCallingUid();
+        return mResolveIntentHelper.resolveServiceInternal(snapshot(), intent,
+                resolvedType, flags, userId, callingUid);
+    }
+
+    @Override
+    @Deprecated
+    public final void restoreDefaultApps(byte[] backup, int userId) {
+        mPreferredActivityHelper.restoreDefaultApps(backup, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final void restorePreferredActivities(byte[] backup, int userId) {
+        mPreferredActivityHelper.restorePreferredActivities(backup, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final void setHomeActivity(ComponentName comp, int userId) {
+        mPreferredActivityHelper.setHomeActivity(snapshot(), comp, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final void setLastChosenActivity(Intent intent, String resolvedType, int flags,
+            IntentFilter filter, int match, ComponentName activity) {
+        mPreferredActivityHelper.setLastChosenActivity(snapshot(), intent, resolvedType,
+                flags, new WatchedIntentFilter(filter), match, activity);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean updateIntentVerificationStatus(String packageName, int status,
+            int userId) {
+        return mDomainVerificationManager.setLegacyUserState(packageName, userId, status);
+    }
+
+    @Override
+    @Deprecated
+    public final void verifyIntentFilter(int id, int verificationCode, List<String> failedDomains) {
+        DomainVerificationProxyV1.queueLegacyVerifyResult(mContext, mDomainVerificationConnection,
+                id, verificationCode, failedDomains, Binder.getCallingUid());
+    }
+
+    @Override
+    @Deprecated
+    public final boolean canPackageQuery(@NonNull String sourcePackageName,
+            @NonNull String targetPackageName, @UserIdInt int userId) {
+        return snapshot().canPackageQuery(sourcePackageName, targetPackageName, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final void deletePreloadsFileCache() throws RemoteException {
+        mService.deletePreloadsFileCache();
+    }
+
+    @Override
+    @Deprecated
+    public final void setSystemAppHiddenUntilInstalled(String packageName, boolean hidden)
+            throws RemoteException {
+        mService.setSystemAppHiddenUntilInstalled(snapshot(), packageName, hidden);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean setSystemAppInstallState(String packageName,
+            boolean installed, int userId) throws RemoteException {
+        return mService.setSystemAppInstallState(snapshot(), packageName, installed, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final void finishPackageInstall(int token, boolean didLaunch) throws RemoteException {
+        mService.finishPackageInstall(token, didLaunch);
+    }
+}
diff --git a/services/core/java/com/android/server/pm/IncrementalProgressListener.java b/services/core/java/com/android/server/pm/IncrementalProgressListener.java
index fa11924..703bbda 100644
--- a/services/core/java/com/android/server/pm/IncrementalProgressListener.java
+++ b/services/core/java/com/android/server/pm/IncrementalProgressListener.java
@@ -33,7 +33,8 @@
 
     @Override
     public void onPackageLoadingProgressChanged(float progress) {
-        PackageStateInternal packageState = mPm.getPackageStateInternal(mPackageName);
+        PackageStateInternal packageState = mPm.snapshotComputer()
+                .getPackageStateInternal(mPackageName);
         if (packageState == null) {
             return;
         }
diff --git a/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java b/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java
index 8d77624..91750de 100644
--- a/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java
@@ -171,7 +171,7 @@
             }
         }
         OverlayConfig overlayConfig = OverlayConfig.initializeSystemInstance(
-                consumer -> mPm.forEachPackage(
+                consumer -> mPm.forEachPackage(mPm.snapshotComputer(),
                         pkg -> consumer.accept(pkg, pkg.isSystem(),
                           apkInApexPreInstalledPaths.get(pkg.getPackageName()))));
         // Prune any system packages that no longer exist.
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index 8667ffd..b39b24f 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -527,8 +527,10 @@
                     + android.Manifest.permission.INSTALL_PACKAGES + ".");
         }
         PackageSetting pkgSetting;
-        mPm.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
-                true /* checkShell */, "installExistingPackage for user " + userId);
+        final Computer preLockSnapshot = mPm.snapshotComputer();
+        preLockSnapshot.enforceCrossUserPermission(callingUid, userId,
+                true /* requireFullPermission */, true /* checkShell */,
+                "installExistingPackage for user " + userId);
         if (mPm.isUserRestricted(userId, UserManager.DISALLOW_INSTALL_APPS)) {
             return PackageManager.INSTALL_FAILED_USER_RESTRICTED;
         }
@@ -543,11 +545,12 @@
 
             // writer
             synchronized (mPm.mLock) {
+                final Computer snapshot = mPm.snapshotComputer();
                 pkgSetting = mPm.mSettings.getPackageLPr(packageName);
                 if (pkgSetting == null) {
                     return PackageManager.INSTALL_FAILED_INVALID_URI;
                 }
-                if (!mPm.canViewInstantApps(callingUid, UserHandle.getUserId(callingUid))) {
+                if (!snapshot.canViewInstantApps(callingUid, UserHandle.getUserId(callingUid))) {
                     // only allow the existing package to be used if it's installed as a full
                     // application for at least one user
                     boolean installAllowed = false;
@@ -597,7 +600,8 @@
                         mAppDataHelper.prepareAppDataAfterInstallLIF(pkgSetting.getPkg());
                     }
                 }
-                mPm.sendPackageAddedForUser(packageName, pkgSetting, userId, DataLoaderType.NONE);
+                mPm.sendPackageAddedForUser(mPm.snapshotComputer(), packageName, pkgSetting, userId,
+                        DataLoaderType.NONE);
                 synchronized (mPm.mLock) {
                     mPm.updateSequenceNumberLP(pkgSetting, new int[]{ userId });
                 }
@@ -1902,8 +1906,8 @@
                 AndroidPackage oldPackage = mPm.mPackages.get(packageName);
 
                 // Set the update and install times
-                PackageStateInternal deletedPkgSetting = mPm.getPackageStateInternal(
-                        oldPackage.getPackageName());
+                PackageStateInternal deletedPkgSetting = mPm.snapshotComputer()
+                        .getPackageStateInternal(oldPackage.getPackageName());
                 reconciledPkg.mPkgSetting
                         .setFirstInstallTimeFromReplaced(deletedPkgSetting, request.mAllUsers)
                         .setLastUpdateTime(System.currentTimeMillis());
@@ -2571,9 +2575,10 @@
             size = i;
             mPm.mPendingBroadcasts.clear();
         }
+        final Computer snapshot = mPm.snapshotComputer();
         // Send broadcasts
         for (int i = 0; i < size; i++) {
-            mPm.sendPackageChangedBroadcast(packages[i], true /* dontKillApp */,
+            mPm.sendPackageChangedBroadcast(snapshot, packages[i], true /* dontKillApp */,
                     components[i], uids[i], null /* reason */);
         }
         Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
@@ -2592,7 +2597,7 @@
         final boolean update = res.mRemovedInfo != null && res.mRemovedInfo.mRemovedPackage != null;
         final String packageName = res.mName;
         final PackageStateInternal pkgSetting =
-                succeeded ? mPm.getPackageStateInternal(packageName) : null;
+                succeeded ? mPm.snapshotComputer().getPackageStateInternal(packageName) : null;
         final boolean removedBeforeUpdate = (pkgSetting == null)
                 || (pkgSetting.isSystem() && !pkgSetting.getPath().getPath().equals(
                 res.mPkg.getPath()));
@@ -2690,9 +2695,9 @@
                 // sendPackageAddedForNewUsers also deals with system apps
                 int appId = UserHandle.getAppId(res.mUid);
                 boolean isSystem = res.mPkg.isSystem();
-                mPm.sendPackageAddedForNewUsers(packageName, isSystem || virtualPreload,
-                        virtualPreload /*startReceiver*/, appId, firstUserIds, firstInstantUserIds,
-                        dataLoaderType);
+                mPm.sendPackageAddedForNewUsers(mPm.snapshotComputer(), packageName,
+                        isSystem || virtualPreload, virtualPreload /*startReceiver*/, appId,
+                        firstUserIds, firstInstantUserIds, dataLoaderType);
 
                 // Send added for users that don't see the package for the first time
                 Bundle extras = new Bundle();
@@ -2705,7 +2710,8 @@
                 final SparseArray<int[]> newBroadcastAllowList;
                 synchronized (mPm.mLock) {
                     newBroadcastAllowList = mPm.mAppsFilter.getVisibilityAllowList(
-                            mPm.getPackageStateInternal(packageName, Process.SYSTEM_UID),
+                            mPm.snapshotComputer()
+                                    .getPackageStateInternal(packageName, Process.SYSTEM_UID),
                             updateUserIds, mPm.mSettings.getPackagesLocked());
                 }
                 mPm.sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, packageName,
@@ -2807,11 +2813,12 @@
                 }
             } else if (!ArrayUtils.isEmpty(res.mLibraryConsumers)) { // if static shared lib
                 // No need to kill consumers if it's installation of new version static shared lib.
+                final Computer snapshot = mPm.snapshotComputer();
                 final boolean dontKillApp = !update && res.mPkg.getStaticSharedLibName() != null;
                 for (int i = 0; i < res.mLibraryConsumers.size(); i++) {
                     AndroidPackage pkg = res.mLibraryConsumers.get(i);
                     // send broadcast that all consumers of the static shared library have changed
-                    mPm.sendPackageChangedBroadcast(pkg.getPackageName(), dontKillApp,
+                    mPm.sendPackageChangedBroadcast(snapshot, pkg.getPackageName(), dontKillApp,
                             new ArrayList<>(Collections.singletonList(pkg.getPackageName())),
                             pkg.getUid(), null);
                 }
diff --git a/services/core/java/com/android/server/pm/ModuleInfoProvider.java b/services/core/java/com/android/server/pm/ModuleInfoProvider.java
index 0ffc1ed..230f555 100644
--- a/services/core/java/com/android/server/pm/ModuleInfoProvider.java
+++ b/services/core/java/com/android/server/pm/ModuleInfoProvider.java
@@ -16,6 +16,7 @@
 
 package com.android.server.pm;
 
+import android.annotation.NonNull;
 import android.content.Context;
 import android.content.pm.IPackageManager;
 import android.content.pm.ModuleInfo;
@@ -25,6 +26,7 @@
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
 import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.os.UserHandle;
 import android.text.TextUtils;
 import android.util.ArrayMap;
@@ -58,7 +60,7 @@
     private static final String MODULE_METADATA_KEY = "android.content.pm.MODULE_METADATA";
 
     private final Context mContext;
-    private final IPackageManager mPackageManager;
+    private IPackageManager mPackageManager;
     private final ApexManager mApexManager;
     private final Map<String, ModuleInfo> mModuleInfo;
 
@@ -66,9 +68,8 @@
     private volatile boolean mMetadataLoaded;
     private volatile String mPackageName;
 
-    ModuleInfoProvider(Context context, IPackageManager packageManager) {
+    ModuleInfoProvider(Context context) {
         mContext = context;
-        mPackageManager = packageManager;
         mApexManager = ApexManager.getInstance();
         mModuleInfo = new ArrayMap<>();
     }
@@ -77,12 +78,20 @@
     public ModuleInfoProvider(
             XmlResourceParser metadata, Resources resources, ApexManager apexManager) {
         mContext = null;
-        mPackageManager = null;
         mApexManager = apexManager;
         mModuleInfo = new ArrayMap<>();
         loadModuleMetadata(metadata, resources);
     }
 
+    @NonNull
+    private IPackageManager getPackageManager() {
+        if (mPackageManager == null) {
+            mPackageManager = IPackageManager.Stub.asInterface(
+                    ServiceManager.getService("package"));
+        }
+        return mPackageManager;
+    }
+
     /** Called by the {@code PackageManager} when it has completed its boot sequence */
     public void systemReady() {
         mPackageName = mContext.getResources().getString(
@@ -95,7 +104,7 @@
         final Resources packageResources;
         final PackageInfo pi;
         try {
-            pi = mPackageManager.getPackageInfo(mPackageName,
+            pi =  getPackageManager().getPackageInfo(mPackageName,
                 PackageManager.GET_META_DATA, UserHandle.USER_SYSTEM);
 
             Context packageContext = mContext.createPackageContext(mPackageName, 0);
@@ -183,7 +192,7 @@
 
         List<PackageInfo> allPackages;
         try {
-            allPackages = mPackageManager.getInstalledPackages(
+            allPackages =  getPackageManager().getInstalledPackages(
                     flags | PackageManager.MATCH_APEX, UserHandle.getCallingUserId()).getList();
         } catch (RemoteException e) {
             Slog.w(TAG, "Unable to retrieve all package names", e);
diff --git a/services/core/java/com/android/server/pm/MovePackageHelper.java b/services/core/java/com/android/server/pm/MovePackageHelper.java
index 5fc90b1..c5ca06c 100644
--- a/services/core/java/com/android/server/pm/MovePackageHelper.java
+++ b/services/core/java/com/android/server/pm/MovePackageHelper.java
@@ -57,6 +57,8 @@
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.server.pm.parsing.pkg.AndroidPackage;
 import com.android.server.pm.parsing.pkg.AndroidPackageUtils;
+import com.android.server.pm.pkg.PackageStateInternal;
+import com.android.server.pm.pkg.PackageStateUtils;
 
 import java.io.File;
 import java.util.Objects;
@@ -77,81 +79,74 @@
         final StorageManager storage = mPm.mInjector.getSystemService(StorageManager.class);
         final PackageManager pm = mPm.mContext.getPackageManager();
 
-        final String currentVolumeUuid;
-        final File codeFile;
-        final InstallSource installSource;
-        final String packageAbiOverride;
-        final int appId;
-        final String seinfo;
-        final String label;
-        final int targetSdkVersion;
-        final PackageFreezer freezer;
-        final int[] installedUserIds;
-        final boolean isCurrentLocationExternal;
+        Computer snapshot = mPm.snapshotComputer();
+        final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
+        if (packageState == null
+                || packageState.getPkg() == null
+                || snapshot.shouldFilterApplication(packageState, callingUid, user.getIdentifier())) {
+            throw new PackageManagerException(MOVE_FAILED_DOESNT_EXIST, "Missing package");
+        }
+        final AndroidPackage pkg = packageState.getPkg();
+        if (pkg.isSystem()) {
+            throw new PackageManagerException(MOVE_FAILED_SYSTEM_PACKAGE,
+                    "Cannot move system application");
+        }
+
+        final boolean isInternalStorage = VolumeInfo.ID_PRIVATE_INTERNAL.equals(volumeUuid);
+        final boolean allow3rdPartyOnInternal = mPm.mContext.getResources().getBoolean(
+                com.android.internal.R.bool.config_allow3rdPartyAppOnInternal);
+        if (isInternalStorage && !allow3rdPartyOnInternal) {
+            throw new PackageManagerException(MOVE_FAILED_3RD_PARTY_NOT_ALLOWED_ON_INTERNAL,
+                    "3rd party apps are not allowed on internal storage");
+        }
+
+
+        final String currentVolumeUuid = packageState.getVolumeUuid();
+
+        final File probe = new File(pkg.getPath());
+        final File probeOat = new File(probe, "oat");
+        if (!probe.isDirectory() || !probeOat.isDirectory()) {
+            throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR,
+                    "Move only supported for modern cluster style installs");
+        }
+
+        if (Objects.equals(currentVolumeUuid, volumeUuid)) {
+            throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR,
+                    "Package already moved to " + volumeUuid);
+        }
+        if (!pkg.isExternalStorage()
+                && mPm.isPackageDeviceAdminOnAnyUser(snapshot, packageName)) {
+            throw new PackageManagerException(MOVE_FAILED_DEVICE_ADMIN,
+                    "Device admin cannot be moved");
+        }
+
+        if (snapshot.getFrozenPackages().containsKey(packageName)) {
+            throw new PackageManagerException(MOVE_FAILED_OPERATION_PENDING,
+                    "Failed to move already frozen package");
+        }
+
+        final boolean isCurrentLocationExternal = pkg.isExternalStorage();
+        final File codeFile = new File(pkg.getPath());
+        final InstallSource installSource = packageState.getInstallSource();
+        final String packageAbiOverride = packageState.getCpuAbiOverride();
+        final int appId = UserHandle.getAppId(pkg.getUid());
+        final String seinfo = AndroidPackageUtils.getSeInfo(pkg, packageState);
+        final String label = String.valueOf(pm.getApplicationLabel(
+                AndroidPackageUtils.generateAppInfoWithoutState(pkg)));
+        final int targetSdkVersion = pkg.getTargetSdkVersion();
+        final int[] installedUserIds = PackageStateUtils.queryInstalledUsers(packageState,
+                mPm.mUserManager.getUserIds(), true);
         final String fromCodePath;
+        if (codeFile.getParentFile().getName().startsWith(
+                PackageManagerService.RANDOM_DIR_PREFIX)) {
+            fromCodePath = codeFile.getParentFile().getAbsolutePath();
+        } else {
+            fromCodePath = codeFile.getAbsolutePath();
+        }
 
-        // reader
+        final PackageFreezer freezer;
         synchronized (mPm.mLock) {
-            final AndroidPackage pkg = mPm.mPackages.get(packageName);
-            final PackageSetting ps = mPm.mSettings.getPackageLPr(packageName);
-            if (pkg == null
-                    || ps == null
-                    || mPm.shouldFilterApplication(ps, callingUid, user.getIdentifier())) {
-                throw new PackageManagerException(MOVE_FAILED_DOESNT_EXIST, "Missing package");
-            }
-            if (pkg.isSystem()) {
-                throw new PackageManagerException(MOVE_FAILED_SYSTEM_PACKAGE,
-                        "Cannot move system application");
-            }
-
-            final boolean isInternalStorage = VolumeInfo.ID_PRIVATE_INTERNAL.equals(volumeUuid);
-            final boolean allow3rdPartyOnInternal = mPm.mContext.getResources().getBoolean(
-                    com.android.internal.R.bool.config_allow3rdPartyAppOnInternal);
-            if (isInternalStorage && !allow3rdPartyOnInternal) {
-                throw new PackageManagerException(MOVE_FAILED_3RD_PARTY_NOT_ALLOWED_ON_INTERNAL,
-                        "3rd party apps are not allowed on internal storage");
-            }
-
-            currentVolumeUuid = ps.getVolumeUuid();
-
-            final File probe = new File(pkg.getPath());
-            final File probeOat = new File(probe, "oat");
-            if (!probe.isDirectory() || !probeOat.isDirectory()) {
-                throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR,
-                        "Move only supported for modern cluster style installs");
-            }
-
-            if (Objects.equals(currentVolumeUuid, volumeUuid)) {
-                throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR,
-                        "Package already moved to " + volumeUuid);
-            }
-            if (!pkg.isExternalStorage() && mPm.isPackageDeviceAdminOnAnyUser(packageName)) {
-                throw new PackageManagerException(MOVE_FAILED_DEVICE_ADMIN,
-                        "Device admin cannot be moved");
-            }
-
-            if (mPm.mFrozenPackages.containsKey(packageName)) {
-                throw new PackageManagerException(MOVE_FAILED_OPERATION_PENDING,
-                        "Failed to move already frozen package");
-            }
-
-            isCurrentLocationExternal = pkg.isExternalStorage();
-            codeFile = new File(pkg.getPath());
-            installSource = ps.getInstallSource();
-            packageAbiOverride = ps.getCpuAbiOverride();
-            appId = UserHandle.getAppId(pkg.getUid());
-            seinfo = AndroidPackageUtils.getSeInfo(pkg, ps);
-            label = String.valueOf(pm.getApplicationLabel(
-                    AndroidPackageUtils.generateAppInfoWithoutState(pkg)));
-            targetSdkVersion = pkg.getTargetSdkVersion();
             freezer = mPm.freezePackage(packageName, "movePackageInternal");
-            installedUserIds = ps.queryInstalledUsers(mPm.mUserManager.getUserIds(), true);
-            if (codeFile.getParentFile().getName().startsWith(
-                    PackageManagerService.RANDOM_DIR_PREFIX)) {
-                fromCodePath = codeFile.getParentFile().getAbsolutePath();
-            } else {
-                fromCodePath = codeFile.getAbsolutePath();
-            }
         }
 
         final Bundle extras = new Bundle();
diff --git a/services/core/java/com/android/server/pm/OtaDexoptService.java b/services/core/java/com/android/server/pm/OtaDexoptService.java
index bd00914..cc4a760 100644
--- a/services/core/java/com/android/server/pm/OtaDexoptService.java
+++ b/services/core/java/com/android/server/pm/OtaDexoptService.java
@@ -131,8 +131,9 @@
         Predicate<PackageStateInternal> isPlatformPackage = pkgSetting ->
                 PLATFORM_PACKAGE_NAME.equals(pkgSetting.getPkg().getPackageName());
         // Important: the packages we need to run with ab-ota compiler-reason.
+        final Computer snapshot = mPackageManagerService.snapshotComputer();
         final Collection<? extends PackageStateInternal> allPackageStates =
-                mPackageManagerService.getPackageStates().values();
+                snapshot.getPackageStates().values();
         important = DexOptHelper.getPackagesForDexopt(allPackageStates,mPackageManagerService,
                 DEBUG_DEXOPT);
         // Remove Platform Package from A/B OTA b/160735835.
@@ -165,7 +166,7 @@
             Log.i(TAG, "Low on space, deleting oat files in an attempt to free up space: "
                     + DexOptHelper.packagesToString(others));
             for (PackageStateInternal pkg : others) {
-                mPackageManagerService.deleteOatArtifactsOfPackage(pkg.getPackageName());
+                mPackageManagerService.deleteOatArtifactsOfPackage(snapshot, pkg.getPackageName());
             }
         }
         long spaceAvailableNow = getAvailableSpace();
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 6613f01..4e702e2 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -597,8 +597,8 @@
             String installerAttributionTag, int userId)
             throws IOException {
         final int callingUid = Binder.getCallingUid();
-        mPm.enforceCrossUserPermission(
-                callingUid, userId, true, true, "createSession");
+        final Computer snapshot = mPm.snapshotComputer();
+        snapshot.enforceCrossUserPermission(callingUid, userId, true, true, "createSession");
 
         if (mPm.isUserRestricted(userId, UserManager.DISALLOW_INSTALL_APPS)) {
             throw new SecurityException("User restriction prevents installing");
@@ -663,7 +663,7 @@
             params.installFlags &= ~PackageManager.INSTALL_ALL_USERS;
             params.installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
             if ((params.installFlags & PackageManager.INSTALL_VIRTUAL_PRELOAD) != 0
-                    && !mPm.isCallerVerifier(callingUid)) {
+                    && !mPm.isCallerVerifier(snapshot, callingUid)) {
                 params.installFlags &= ~PackageManager.INSTALL_VIRTUAL_PRELOAD;
             }
             if (mContext.checkCallingOrSelfPermission(
@@ -676,7 +676,7 @@
         String originatingPackageName = null;
         if (params.originatingUid != SessionParams.UID_UNKNOWN
                 && params.originatingUid != callingUid) {
-            String[] packages = mPm.mIPackageManager.getPackagesForUid(params.originatingUid);
+            String[] packages = snapshot.getPackagesForUid(params.originatingUid);
             if (packages != null && packages.length > 0) {
                 // Choose an arbitrary representative package in the case of a shared UID.
                 originatingPackageName = packages[0];
@@ -727,7 +727,7 @@
 
         if ((params.installFlags & PackageManager.INSTALL_INSTANT_APP) != 0
                 && !isCalledBySystemOrShell(callingUid)
-                && (mPm.mIPackageManager.getFlagsForUid(callingUid) & ApplicationInfo.FLAG_SYSTEM)
+                && (snapshot.getFlagsForUid(callingUid) & ApplicationInfo.FLAG_SYSTEM)
                 == 0) {
             throw new SecurityException(
                     "Only system apps could use the PackageManager.INSTALL_INSTANT_APP flag.");
@@ -1038,11 +1038,12 @@
         return "smdl" + sessionId + ".tmp";
     }
 
-    private boolean shouldFilterSession(int uid, SessionInfo info) {
+    private boolean shouldFilterSession(@NonNull Computer snapshot, int uid, SessionInfo info) {
         if (info == null) {
             return false;
         }
-        return uid != info.getInstallerUid() && !mPm.canQueryPackage(uid, info.getAppPackageName());
+        return uid != info.getInstallerUid()
+                && !snapshot.canQueryPackage(uid, info.getAppPackageName());
     }
 
     @Override
@@ -1055,7 +1056,7 @@
                     ? session.generateInfoForCaller(true /* includeIcon */, callingUid)
                     : null;
         }
-        return shouldFilterSession(callingUid, result) ? null : result;
+        return shouldFilterSession(mPm.snapshotComputer(), callingUid, result) ? null : result;
     }
 
     @Override
@@ -1070,15 +1071,16 @@
                 }
             }
         }
-        result.removeIf(info -> shouldFilterSession(callingUid, info));
+        final Computer snapshot = mPm.snapshotComputer();
+        result.removeIf(info -> shouldFilterSession(snapshot, callingUid, info));
         return new ParceledListSlice<>(result);
     }
 
     @Override
     public ParceledListSlice<SessionInfo> getAllSessions(int userId) {
         final int callingUid = Binder.getCallingUid();
-        mPm.enforceCrossUserPermission(
-                callingUid, userId, true, false, "getAllSessions");
+        final Computer snapshot = mPm.snapshotComputer();
+        snapshot.enforceCrossUserPermission(callingUid, userId, true, false, "getAllSessions");
 
         final List<SessionInfo> result = new ArrayList<>();
         synchronized (mSessions) {
@@ -1090,15 +1092,16 @@
                 }
             }
         }
-        result.removeIf(info -> shouldFilterSession(callingUid, info));
+        result.removeIf(info -> shouldFilterSession(snapshot, callingUid, info));
         return new ParceledListSlice<>(result);
     }
 
     @Override
     public ParceledListSlice<SessionInfo> getMySessions(String installerPackageName, int userId) {
-        mPm.enforceCrossUserPermission(
-                Binder.getCallingUid(), userId, true, false, "getMySessions");
-        mAppOps.checkPackage(Binder.getCallingUid(), installerPackageName);
+        final Computer snapshot = mPm.snapshotComputer();
+        final int callingUid = Binder.getCallingUid();
+        snapshot.enforceCrossUserPermission(callingUid, userId, true, false, "getMySessions");
+        mAppOps.checkPackage(callingUid, installerPackageName);
 
         final List<SessionInfo> result = new ArrayList<>();
         synchronized (mSessions) {
@@ -1120,8 +1123,9 @@
     @Override
     public void uninstall(VersionedPackage versionedPackage, String callerPackageName, int flags,
                 IntentSender statusReceiver, int userId) {
+        final Computer snapshot = mPm.snapshotComputer();
         final int callingUid = Binder.getCallingUid();
-        mPm.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall");
+        snapshot.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall");
         if ((callingUid != Process.SHELL_UID) && (callingUid != Process.ROOT_UID)) {
             mAppOps.checkPackage(callingUid, callerPackageName);
         }
@@ -1154,8 +1158,7 @@
                     .setAdmin(callerPackageName)
                     .write();
         } else {
-            ApplicationInfo appInfo = mPm.mIPackageManager
-                    .getApplicationInfo(callerPackageName, 0, userId);
+            ApplicationInfo appInfo = snapshot.getApplicationInfo(callerPackageName, 0, userId);
             if (appInfo.targetSdkVersion >= Build.VERSION_CODES.P) {
                 mContext.enforceCallingOrSelfPermission(Manifest.permission.REQUEST_DELETE_PACKAGES,
                         null);
@@ -1174,7 +1177,8 @@
             String callerPackageName, IntentSender statusReceiver, int userId) {
         final int callingUid = Binder.getCallingUid();
         mContext.enforceCallingOrSelfPermission(Manifest.permission.DELETE_PACKAGES, null);
-        mPm.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall");
+        final Computer snapshot = mPm.snapshotComputer();
+        snapshot.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall");
         if ((callingUid != Process.SHELL_UID) && (callingUid != Process.ROOT_UID)) {
             mAppOps.checkPackage(callingUid, callerPackageName);
         }
@@ -1206,8 +1210,9 @@
 
     @Override
     public void registerCallback(IPackageInstallerCallback callback, int userId) {
-        mPm.enforceCrossUserPermission(
-                Binder.getCallingUid(), userId, true, false, "registerCallback");
+        final Computer snapshot = mPm.snapshotComputer();
+        snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false,
+                "registerCallback");
         registerCallback(callback, eventUserId -> userId == eventUserId);
     }
 
@@ -1295,13 +1300,13 @@
         }
     }
 
-    private boolean shouldFilterSession(int uid, int sessionId) {
+    private boolean shouldFilterSession(@NonNull Computer snapshot, int uid, int sessionId) {
         final PackageInstallerSession session = getSession(sessionId);
         if (session == null) {
             return false;
         }
         return uid != session.getInstallerUid()
-                && !mPm.canQueryPackage(uid, session.getPackageName());
+                && !snapshot.canQueryPackage(uid, session.getPackageName());
     }
 
     static class PackageDeleteObserverAdapter extends PackageDeleteObserver {
@@ -1454,11 +1459,12 @@
             final int sessionId = msg.arg1;
             final int userId = msg.arg2;
             final int n = mCallbacks.beginBroadcast();
+            final Computer snapshot = mPm.snapshotComputer();
             for (int i = 0; i < n; i++) {
                 final IPackageInstallerCallback callback = mCallbacks.getBroadcastItem(i);
                 final BroadcastCookie cookie = (BroadcastCookie) mCallbacks.getBroadcastCookie(i);
                 if (cookie.userCheck.test(userId)
-                        && !shouldFilterSession(cookie.callingUid, sessionId)) {
+                        && !shouldFilterSession(snapshot, cookie.callingUid, sessionId)) {
                     try {
                         invokeCallback(callback, msg);
                     } catch (RemoteException ignored) {
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index bcda046..68be64f 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -860,7 +860,8 @@
             return USER_ACTION_NOT_NEEDED;
         }
 
-        if (mPm.isInstallDisabledForPackage(getInstallerPackageName(), mInstallerUid, userId)) {
+        if (snapshot.isInstallDisabledForPackage(getInstallerPackageName(), mInstallerUid,
+                userId)) {
             // show the installer to account for device poslicy or unknown sources use cases
             return USER_ACTION_REQUIRED;
         }
@@ -3755,7 +3756,8 @@
         };
 
         if (!manualStartAndDestroy) {
-            final PerUidReadTimeouts[] perUidReadTimeouts = mPm.getPerUidReadTimeouts();
+            final PerUidReadTimeouts[] perUidReadTimeouts =
+                    mPm.getPerUidReadTimeouts(mPm.snapshotComputer());
 
             final StorageHealthCheckParams healthCheckParams = new StorageHealthCheckParams();
             healthCheckParams.blockedTimeoutMs = INCREMENTAL_STORAGE_BLOCKED_TIMEOUT_MS;
diff --git a/services/core/java/com/android/server/pm/PackageManagerInternalBase.java b/services/core/java/com/android/server/pm/PackageManagerInternalBase.java
new file mode 100644
index 0000000..2b73375
--- /dev/null
+++ b/services/core/java/com/android/server/pm/PackageManagerInternalBase.java
@@ -0,0 +1,751 @@
+/*
+ * Copyright (C) 2022 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 com.android.server.pm;
+
+import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
+import static android.content.pm.PackageManager.RESTRICTION_NONE;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.UserIdInt;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.AuxiliaryResolveInfo;
+import android.content.pm.Checksum;
+import android.content.pm.IOnChecksumsReadyListener;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManagerInternal;
+import android.content.pm.ProcessInfo;
+import android.content.pm.ProviderInfo;
+import android.content.pm.ResolveInfo;
+import android.content.pm.SuspendDialogInfo;
+import android.os.Binder;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Process;
+import android.os.storage.StorageManager;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.SparseArray;
+
+import com.android.server.pm.dex.DexManager;
+import com.android.server.pm.dex.DynamicCodeLogger;
+import com.android.server.pm.parsing.pkg.AndroidPackage;
+import com.android.server.pm.permission.PermissionManagerServiceInternal;
+import com.android.server.pm.pkg.AndroidPackageApi;
+import com.android.server.pm.pkg.PackageStateInternal;
+import com.android.server.pm.pkg.PackageStateUtils;
+import com.android.server.pm.pkg.SharedUserApi;
+import com.android.server.pm.pkg.component.ParsedMainComponent;
+import com.android.server.pm.pkg.mutate.PackageStateMutator;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.function.Consumer;
+
+/**
+ * Internal manager variant of {@link IPackageManagerBase}. See that class for info.
+ * {@link PackageManagerInternal} should eventually passing in a snapshot instance, deprecating
+ * this class, but that requires much larger refactor.
+ */
+abstract class PackageManagerInternalBase extends PackageManagerInternal {
+
+    @NonNull
+    private final PackageManagerService mService;
+
+    public PackageManagerInternalBase(@NonNull PackageManagerService service) {
+        mService = service;
+    }
+
+    @NonNull protected abstract Context getContext();
+    @NonNull protected abstract PermissionManagerServiceInternal getPermissionManager();
+    @NonNull protected abstract AppDataHelper getAppDataHelper();
+    @NonNull protected abstract PackageObserverHelper getPackageObserverHelper();
+    @NonNull protected abstract ResolveIntentHelper getResolveIntentHelper();
+    @NonNull protected abstract SuspendPackageHelper getSuspendPackageHelper();
+    @NonNull protected abstract ProtectedPackages getProtectedPackages();
+    @NonNull protected abstract UserNeedsBadgingCache getUserNeedsBadging();
+    @NonNull protected abstract InstantAppRegistry getInstantAppRegistry();
+    @NonNull protected abstract ApexManager getApexManager();
+    @NonNull protected abstract DexManager getDexManager();
+
+    @Override
+    public final Computer snapshot() {
+        return mService.snapshotComputer();
+    }
+
+    @Override
+    @Deprecated
+    public final List<ApplicationInfo> getInstalledApplications(
+            @PackageManager.ApplicationInfoFlagsBits long flags, int userId, int callingUid) {
+        return snapshot().getInstalledApplications(flags, userId, callingUid);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isInstantApp(String packageName, int userId) {
+        return snapshot().isInstantApp(packageName, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final String getInstantAppPackageName(int uid) {
+        return snapshot().getInstantAppPackageName(uid);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) {
+        return snapshot().filterAppAccess(pkg, callingUid, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean filterAppAccess(String packageName, int callingUid, int userId) {
+        return snapshot().filterAppAccess(packageName, callingUid, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean filterAppAccess(int uid, int callingUid) {
+        return snapshot().filterAppAccess(uid, callingUid);
+    }
+
+    @Nullable
+    @Override
+    @Deprecated
+    public final int[] getVisibilityAllowList(@NonNull String packageName, int userId) {
+        return snapshot().getVisibilityAllowList(packageName, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean canQueryPackage(int callingUid, @Nullable String packageName) {
+        return snapshot().canQueryPackage(callingUid, packageName);
+    }
+
+    @Override
+    @Deprecated
+    public final AndroidPackage getPackage(String packageName) {
+        return snapshot().getPackage(packageName);
+    }
+
+    @Nullable
+    @Override
+    @Deprecated
+    public final AndroidPackageApi getAndroidPackage(@NonNull String packageName) {
+        return snapshot().getPackage(packageName);
+    }
+
+    @Override
+    @Deprecated
+    public final AndroidPackage getPackage(int uid) {
+        return snapshot().getPackage(uid);
+    }
+
+    @Override
+    @Deprecated
+    public final List<AndroidPackage> getPackagesForAppId(int appId) {
+        return snapshot().getPackagesForAppId(appId);
+    }
+
+    @Nullable
+    @Override
+    @Deprecated
+    public final PackageStateInternal getPackageStateInternal(String packageName) {
+        return snapshot().getPackageStateInternal(packageName);
+    }
+
+    @NonNull
+    @Override
+    @Deprecated
+    public final ArrayMap<String, ? extends PackageStateInternal> getPackageStates() {
+        return snapshot().getPackageStates();
+    }
+
+    @Override
+    @Deprecated
+    public final void removePackageListObserver(PackageListObserver observer) {
+        getPackageObserverHelper().removeObserver(observer);
+    }
+
+    @Override
+    @Deprecated
+    public final PackageStateInternal getDisabledSystemPackage(@NonNull String packageName) {
+        return snapshot().getDisabledSystemPackage(packageName);
+    }
+
+    @Override
+    @Deprecated
+    public final @NonNull String[] getKnownPackageNames(int knownPackage, int userId) {
+        return mService.getKnownPackageNamesInternal(snapshot(), knownPackage, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final void setKeepUninstalledPackages(final List<String> packageList) {
+        mService.setKeepUninstalledPackagesInternal(snapshot(), packageList);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isPermissionsReviewRequired(String packageName, int userId) {
+        return getPermissionManager().isPermissionsReviewRequired(packageName, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final PackageInfo getPackageInfo(String packageName,
+            @PackageManager.PackageInfoFlagsBits long flags, int filterCallingUid, int userId) {
+        return snapshot().getPackageInfoInternal(packageName,
+                PackageManager.VERSION_CODE_HIGHEST, flags, filterCallingUid, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final Bundle getSuspendedPackageLauncherExtras(String packageName, int userId) {
+        return getSuspendPackageHelper().getSuspendedPackageLauncherExtras(snapshot(), packageName,
+                userId, Binder.getCallingUid());
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isPackageSuspended(String packageName, int userId) {
+        return getSuspendPackageHelper().isPackageSuspended(snapshot(), packageName, userId,
+                Binder.getCallingUid());
+    }
+
+    @Override
+    @Deprecated
+    public final void removeNonSystemPackageSuspensions(String packageName, int userId) {
+        getSuspendPackageHelper().removeSuspensionsBySuspendingPackage(snapshot(),
+                new String[]{packageName},
+                (suspendingPackage) -> !PackageManagerService.PLATFORM_PACKAGE_NAME.equals(
+                        suspendingPackage),
+                userId);
+    }
+
+    @Override
+    @Deprecated
+    public final void removeDistractingPackageRestrictions(String packageName, int userId) {
+        mService.removeDistractingPackageRestrictions(snapshot(), new String[]{packageName},
+                userId);
+    }
+
+    @Override
+    @Deprecated
+    public final void removeAllDistractingPackageRestrictions(int userId) {
+        mService.removeAllDistractingPackageRestrictions(snapshot(), userId);
+    }
+
+    @Override
+    @Deprecated
+    public final String getSuspendingPackage(String suspendedPackage, int userId) {
+        return getSuspendPackageHelper().getSuspendingPackage(snapshot(), suspendedPackage, userId,
+                Binder.getCallingUid());
+    }
+
+    @Override
+    @Deprecated
+    public final SuspendDialogInfo getSuspendedDialogInfo(String suspendedPackage,
+            String suspendingPackage, int userId) {
+        return getSuspendPackageHelper().getSuspendedDialogInfo(snapshot(), suspendedPackage,
+                suspendingPackage, userId, Binder.getCallingUid());
+    }
+
+    @Override
+    @Deprecated
+    public final int getDistractingPackageRestrictions(String packageName, int userId) {
+        final PackageStateInternal packageState = getPackageStateInternal(packageName);
+        return (packageState == null) ? RESTRICTION_NONE
+                : packageState.getUserStateOrDefault(userId).getDistractionFlags();
+    }
+
+    @Override
+    @Deprecated
+    public final int getPackageUid(String packageName,
+            @PackageManager.PackageInfoFlagsBits long flags, int userId) {
+        return snapshot().getPackageUidInternal(packageName, flags, userId, Process.SYSTEM_UID);
+    }
+
+    @Override
+    @Deprecated
+    public final ApplicationInfo getApplicationInfo(String packageName,
+            @PackageManager.ApplicationInfoFlagsBits long flags, int filterCallingUid, int userId) {
+        return snapshot().getApplicationInfoInternal(packageName, flags, filterCallingUid, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final ActivityInfo getActivityInfo(ComponentName component,
+            @PackageManager.ComponentInfoFlagsBits long flags, int filterCallingUid, int userId) {
+        return snapshot().getActivityInfoInternal(component, flags, filterCallingUid, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final List<ResolveInfo> queryIntentActivities(
+            Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
+            int filterCallingUid, int userId) {
+        return snapshot().queryIntentActivitiesInternal(intent, resolvedType, flags, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final List<ResolveInfo> queryIntentReceivers(Intent intent,
+            String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
+            int filterCallingUid, int userId) {
+        return getResolveIntentHelper().queryIntentReceiversInternal(
+                snapshot(), intent, resolvedType, flags, userId, filterCallingUid);
+    }
+
+    @Override
+    @Deprecated
+    public final List<ResolveInfo> queryIntentServices(
+            Intent intent, @PackageManager.ResolveInfoFlagsBits long flags, int callingUid,
+            int userId) {
+        final String resolvedType = intent.resolveTypeIfNeeded(getContext().getContentResolver());
+        return snapshot().queryIntentServicesInternal(intent, resolvedType, flags, userId,
+                callingUid, false);
+    }
+
+    @Override
+    @Deprecated
+    public final ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates,
+            int userId) {
+        return snapshot().getHomeActivitiesAsUser(allHomeCandidates, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final ComponentName getDefaultHomeActivity(int userId) {
+        return snapshot().getDefaultHomeActivity(userId);
+    }
+
+    @Override
+    @Deprecated
+    public final ComponentName getSystemUiServiceComponent() {
+        return ComponentName.unflattenFromString(getContext().getResources().getString(
+                com.android.internal.R.string.config_systemUIServiceComponent));
+    }
+
+    @Override
+    @Deprecated
+    public final void setDeviceOwnerProtectedPackages(
+            String deviceOwnerPackageName, List<String> packageNames) {
+        getProtectedPackages().setDeviceOwnerProtectedPackages(
+                deviceOwnerPackageName, packageNames);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isPackageDataProtected(int userId, String packageName) {
+        return getProtectedPackages().isPackageDataProtected(userId, packageName);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isPackageStateProtected(String packageName, int userId) {
+        return getProtectedPackages().isPackageStateProtected(userId, packageName);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isPackageEphemeral(int userId, String packageName) {
+        final PackageStateInternal packageState = getPackageStateInternal(packageName);
+        return packageState != null
+                && packageState.getUserStateOrDefault(userId).isInstantApp();
+    }
+
+    @Override
+    @Deprecated
+    public final boolean wasPackageEverLaunched(String packageName, int userId) {
+        final PackageStateInternal packageState = getPackageStateInternal(packageName);
+        if (packageState == null) {
+            throw new IllegalArgumentException("Unknown package: " + packageName);
+        }
+        return !packageState.getUserStateOrDefault(userId).isNotLaunched();
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isEnabledAndMatches(ParsedMainComponent component, long flags, int userId) {
+        return PackageStateUtils.isEnabledAndMatches(
+                getPackageStateInternal(component.getPackageName()), component, flags, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean userNeedsBadging(int userId) {
+        return getUserNeedsBadging().get(userId);
+    }
+
+    @Override
+    @Deprecated
+    public final String getNameForUid(int uid) {
+        return snapshot().getNameForUid(uid);
+    }
+
+    @Override
+    @Deprecated
+    public final void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj,
+            Intent origIntent, String resolvedType, String callingPackage,
+            @Nullable String callingFeatureId, boolean isRequesterInstantApp,
+            Bundle verificationBundle, int userId) {
+        mService.requestInstantAppResolutionPhaseTwo(responseObj, origIntent,
+                resolvedType, callingPackage, callingFeatureId, isRequesterInstantApp,
+                verificationBundle, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final void grantImplicitAccess(int userId, Intent intent,
+            int recipientAppId, int visibleUid, boolean direct) {
+        grantImplicitAccess(userId, intent, recipientAppId, visibleUid, direct,
+                false /* retainOnUpdate */);
+    }
+
+    @Override
+    @Deprecated
+    public final void grantImplicitAccess(int userId, Intent intent,
+            int recipientAppId, int visibleUid, boolean direct, boolean retainOnUpdate) {
+        mService.grantImplicitAccess(snapshot(), userId, intent,
+                recipientAppId, visibleUid, direct, retainOnUpdate);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isInstantAppInstallerComponent(ComponentName component) {
+        final ActivityInfo instantAppInstallerActivity = mService.mInstantAppInstallerActivity;
+        return instantAppInstallerActivity != null
+                && instantAppInstallerActivity.getComponentName().equals(component);
+    }
+
+    @Override
+    @Deprecated
+    public final void pruneInstantApps() {
+        getInstantAppRegistry().pruneInstantApps(snapshot());
+    }
+
+    @Override
+    @Deprecated
+    public final String getSetupWizardPackageName() {
+        return mService.mSetupWizardPackage;
+    }
+
+    @Override
+    @Deprecated
+    public final ResolveInfo resolveIntent(Intent intent, String resolvedType,
+            @PackageManager.ResolveInfoFlagsBits long flags,
+            @PackageManagerInternal.PrivateResolveFlags long privateResolveFlags, int userId,
+            boolean resolveForStart, int filterCallingUid) {
+        return getResolveIntentHelper().resolveIntentInternal(snapshot(),
+                intent, resolvedType, flags, privateResolveFlags, userId, resolveForStart,
+                filterCallingUid);
+    }
+
+    @Override
+    @Deprecated
+    public final ResolveInfo resolveService(Intent intent, String resolvedType,
+            @PackageManager.ResolveInfoFlagsBits long flags, int userId, int callingUid) {
+        return getResolveIntentHelper().resolveServiceInternal(snapshot(), intent,
+                resolvedType, flags, userId, callingUid);
+    }
+
+    @Override
+    @Deprecated
+    public final ProviderInfo resolveContentProvider(String name,
+            @PackageManager.ResolveInfoFlagsBits long flags, int userId, int callingUid) {
+        return snapshot().resolveContentProvider(name, flags, userId,callingUid);
+    }
+
+    @Override
+    @Deprecated
+    public final int getUidTargetSdkVersion(int uid) {
+        return snapshot().getUidTargetSdkVersion(uid);
+    }
+
+    @Override
+    @Deprecated
+    public final int getPackageTargetSdkVersion(String packageName) {
+        final PackageStateInternal packageState = getPackageStateInternal(packageName);
+        if (packageState != null && packageState.getPkg() != null) {
+            return packageState.getPkg().getTargetSdkVersion();
+        }
+        return Build.VERSION_CODES.CUR_DEVELOPMENT;
+    }
+
+    @Override
+    @Deprecated
+    public final boolean canAccessInstantApps(int callingUid, @UserIdInt int userId) {
+        return snapshot().canViewInstantApps(callingUid, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean canAccessComponent(int callingUid, @NonNull ComponentName component,
+            @UserIdInt int userId) {
+        return snapshot().canAccessComponent(callingUid, component, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean hasInstantApplicationMetadata(String packageName, int userId) {
+        return getInstantAppRegistry().hasInstantApplicationMetadata(packageName, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final SparseArray<String> getAppsWithSharedUserIds() {
+        return snapshot().getAppsWithSharedUserIds();
+    }
+
+    @Override
+    @NonNull
+    @Deprecated
+    public final String[] getSharedUserPackagesForPackage(String packageName, int userId) {
+        return snapshot().getSharedUserPackagesForPackage(packageName, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final ArrayMap<String, ProcessInfo> getProcessesForUid(int uid) {
+        return snapshot().getProcessesForUid(uid);
+    }
+
+    @Override
+    @Deprecated
+    public final int[] getPermissionGids(String permissionName, int userId) {
+        return getPermissionManager().getPermissionGids(permissionName, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isOnlyCoreApps() {
+        return mService.isOnlyCoreApps();
+    }
+
+    @Override
+    @Deprecated
+    public final void freeStorage(String volumeUuid, long bytes,
+            @StorageManager.AllocateFlags int flags) throws IOException {
+        mService.freeStorage(volumeUuid, bytes, flags);
+    }
+
+    @Override
+    @Deprecated
+    public final void freeAllAppCacheAboveQuota(@NonNull String volumeUuid) throws IOException {
+        mService.freeAllAppCacheAboveQuota(volumeUuid);
+    }
+
+    @Override
+    @Deprecated
+    public final void forEachPackageSetting(Consumer<PackageSetting> actionLocked) {
+        mService.forEachPackageSetting(actionLocked);
+    }
+
+    @Override
+    @Deprecated
+    public final void forEachPackageState(Consumer<PackageStateInternal> action) {
+        mService.forEachPackageState(snapshot(), action);
+    }
+
+    @Override
+    @Deprecated
+    public final void forEachPackage(Consumer<AndroidPackage> action) {
+        mService.forEachPackage(snapshot(), action);
+    }
+
+    @Override
+    @Deprecated
+    public final void forEachInstalledPackage(@NonNull Consumer<AndroidPackage> action,
+            @UserIdInt int userId) {
+        mService.forEachInstalledPackage(snapshot(), action, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final ArraySet<String> getEnabledComponents(String packageName, int userId) {
+        final PackageStateInternal packageState = getPackageStateInternal(packageName);
+        if (packageState == null) {
+            return new ArraySet<>();
+        }
+        return packageState.getUserStateOrDefault(userId).getEnabledComponents();
+    }
+
+    @Override
+    @Deprecated
+    public final ArraySet<String> getDisabledComponents(String packageName, int userId) {
+        final PackageStateInternal packageState = getPackageStateInternal(packageName);
+        if (packageState == null) {
+            return new ArraySet<>();
+        }
+        return packageState.getUserStateOrDefault(userId).getDisabledComponents();
+    }
+
+    @Override
+    @Deprecated
+    public final @PackageManager.EnabledState int getApplicationEnabledState(
+            String packageName, int userId) {
+        final PackageStateInternal packageState = getPackageStateInternal(packageName);
+        if (packageState == null) {
+            return COMPONENT_ENABLED_STATE_DEFAULT;
+        }
+        return packageState.getUserStateOrDefault(userId).getEnabledState();
+    }
+
+    @Override
+    @Deprecated
+    public final @PackageManager.EnabledState int getComponentEnabledSetting(
+            @NonNull ComponentName componentName, int callingUid, int userId) {
+        return snapshot().getComponentEnabledSettingInternal(
+                componentName, callingUid, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final void setEnableRollbackCode(int token, int enableRollbackCode) {
+        mService.setEnableRollbackCode(token, enableRollbackCode);
+    }
+
+    @Override
+    @Deprecated
+    public final void finishPackageInstall(int token, boolean didLaunch) {
+        mService.finishPackageInstall(token, didLaunch);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isApexPackage(String packageName) {
+        return getApexManager().isApexPackage(packageName);
+    }
+
+    @Override
+    @Deprecated
+    public final List<String> getApksInApex(String apexPackageName) {
+        return getApexManager().getApksInApex(apexPackageName);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid) {
+        return snapshot().isCallerInstallerOfRecord(pkg, callingUid);
+    }
+
+    @Override
+    @Deprecated
+    public final List<String> getMimeGroup(String packageName, String mimeGroup) {
+        return mService.getMimeGroupInternal(snapshot(), packageName, mimeGroup);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isSystemPackage(@NonNull String packageName) {
+        return packageName.equals(mService.ensureSystemPackageName(snapshot(), packageName));
+    }
+
+    @Override
+    @Deprecated
+    public final void unsuspendForSuspendingPackage(final String packageName, int affectedUser) {
+        mService.unsuspendForSuspendingPackage(snapshot(), packageName, affectedUser);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isSuspendingAnyPackages(String suspendingPackage, int userId) {
+        return snapshot().isSuspendingAnyPackages(suspendingPackage, userId);
+    }
+
+    @Override
+    @Deprecated
+    public final void requestChecksums(@NonNull String packageName, boolean includeSplits,
+            @Checksum.TypeMask int optional, @Checksum.TypeMask int required,
+            @Nullable List trustedInstallers,
+            @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId,
+            @NonNull Executor executor, @NonNull Handler handler) {
+        mService.requestChecksumsInternal(snapshot(), packageName, includeSplits, optional,
+                required, trustedInstallers, onChecksumsReadyListener, userId, executor,
+                handler);
+    }
+
+    @Override
+    @Deprecated
+    public final boolean isPackageFrozen(@NonNull String packageName,
+            int callingUid, int userId) {
+        return snapshot().getPackageStartability(mService.getSafeMode(), packageName, callingUid, userId)
+                == PackageManagerService.PACKAGE_STARTABILITY_FROZEN;
+    }
+
+    @Override
+    @Deprecated
+    public final long deleteOatArtifactsOfPackage(String packageName) {
+        return mService.deleteOatArtifactsOfPackage(snapshot(), packageName);
+    }
+
+    @Override
+    @Deprecated
+    public final void reconcileAppsData(int userId, @StorageManager.StorageFlags int flags,
+            boolean migrateAppsData) {
+        getAppDataHelper().reconcileAppsData(userId, flags, migrateAppsData);
+    }
+
+    @Override
+    @NonNull
+    public ArraySet<PackageStateInternal> getSharedUserPackages(int sharedUserAppId) {
+        return snapshot().getSharedUserPackages(sharedUserAppId);
+    }
+
+    @Override
+    @Nullable
+    public SharedUserApi getSharedUserApi(int sharedUserAppId) {
+        return snapshot().getSharedUser(sharedUserAppId);
+    }
+
+    @NonNull
+    @Override
+    @Deprecated
+    public final PackageStateMutator.InitialState recordInitialState() {
+        return mService.recordInitialState();
+    }
+
+    @Nullable
+    @Override
+    @Deprecated
+    public final PackageStateMutator.Result commitPackageStateMutation(
+            @Nullable PackageStateMutator.InitialState state,
+            @NonNull Consumer<PackageStateMutator> consumer) {
+        return mService.commitPackageStateMutation(state, consumer);
+    }
+
+    @Override
+    @Deprecated
+    public final void shutdown() {
+        mService.shutdown();
+    }
+
+    @Override
+    @Deprecated
+    public final DynamicCodeLogger getDynamicCodeLogger() {
+        return getDexManager().getDynamicCodeLogger();
+    }
+}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index e20a861..99c9c68 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -29,7 +29,6 @@
 import static android.content.pm.PackageManager.MATCH_FACTORY_ONLY;
 import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
-import static android.content.pm.PackageManager.RESTRICTION_NONE;
 import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
 import static android.os.storage.StorageManager.FLAG_STORAGE_CE;
 import static android.os.storage.StorageManager.FLAG_STORAGE_DE;
@@ -83,21 +82,15 @@
 import android.content.pm.IOnChecksumsReadyListener;
 import android.content.pm.IPackageChangeObserver;
 import android.content.pm.IPackageDataObserver;
-import android.content.pm.IPackageDeleteObserver;
 import android.content.pm.IPackageDeleteObserver2;
 import android.content.pm.IPackageInstallObserver2;
-import android.content.pm.IPackageInstaller;
 import android.content.pm.IPackageLoadingProgressCallback;
 import android.content.pm.IPackageManager;
 import android.content.pm.IPackageMoveObserver;
-import android.content.pm.IPackageStatsObserver;
 import android.content.pm.IncrementalStatesInfo;
 import android.content.pm.InstallSourceInfo;
 import android.content.pm.InstantAppInfo;
 import android.content.pm.InstantAppRequest;
-import android.content.pm.InstrumentationInfo;
-import android.content.pm.IntentFilterVerificationInfo;
-import android.content.pm.KeySet;
 import android.content.pm.ModuleInfo;
 import android.content.pm.PackageChangeEvent;
 import android.content.pm.PackageInfo;
@@ -109,11 +102,8 @@
 import android.content.pm.PackagePartitions;
 import android.content.pm.ParceledListSlice;
 import android.content.pm.PermissionGroupInfo;
-import android.content.pm.PermissionInfo;
-import android.content.pm.ProcessInfo;
 import android.content.pm.ProviderInfo;
 import android.content.pm.ResolveInfo;
-import android.content.pm.ServiceInfo;
 import android.content.pm.SharedLibraryInfo;
 import android.content.pm.Signature;
 import android.content.pm.SigningDetails;
@@ -122,7 +112,6 @@
 import android.content.pm.UserInfo;
 import android.content.pm.VerifierDeviceIdentity;
 import android.content.pm.VersionedPackage;
-import android.content.pm.dex.IArtManager;
 import android.content.pm.overlay.OverlayPaths;
 import android.content.pm.parsing.PackageLite;
 import android.content.res.Resources;
@@ -213,7 +202,6 @@
 import com.android.server.pm.dex.ArtManagerService;
 import com.android.server.pm.dex.ArtUtils;
 import com.android.server.pm.dex.DexManager;
-import com.android.server.pm.dex.DynamicCodeLogger;
 import com.android.server.pm.dex.ViewCompiler;
 import com.android.server.pm.parsing.PackageCacher;
 import com.android.server.pm.parsing.PackageInfoUtils;
@@ -225,10 +213,7 @@
 import com.android.server.pm.permission.LegacyPermissionManagerService;
 import com.android.server.pm.permission.PermissionManagerService;
 import com.android.server.pm.permission.PermissionManagerServiceInternal;
-import com.android.server.pm.pkg.AndroidPackageApi;
-import com.android.server.pm.pkg.PackageState;
 import com.android.server.pm.pkg.PackageStateInternal;
-import com.android.server.pm.pkg.PackageStateUtils;
 import com.android.server.pm.pkg.PackageUserState;
 import com.android.server.pm.pkg.PackageUserStateInternal;
 import com.android.server.pm.pkg.SharedUserApi;
@@ -413,7 +398,8 @@
     public @interface ScanFlags {}
 
     /**
-     * Used as the result code of the {@link #getPackageStartability}.
+     * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int,
+     * int)}.
      */
     @IntDef(value = {
         PACKAGE_STARTABILITY_OK,
@@ -426,40 +412,43 @@
     public @interface PackageStartability {}
 
     /**
-     * Used as the result code of the {@link #getPackageStartability} to indicate
-     * the given package is allowed to start.
+     * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int,
+     * int)} to indicate the given package is allowed to start.
      */
     public static final int PACKAGE_STARTABILITY_OK = 0;
 
     /**
-     * Used as the result code of the {@link #getPackageStartability} to indicate
-     * the given package is <b>not</b> allowed to start because it's not found
+     * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int,
+     * int)} to indicate the given package is <b>not</b> allowed to start because it's not found
      * (could be due to that package is invisible to the given user).
      */
     public static final int PACKAGE_STARTABILITY_NOT_FOUND = 1;
 
     /**
-     * Used as the result code of the {@link #getPackageStartability} to indicate
-     * the given package is <b>not</b> allowed to start because it's not a system app
-     * and the system is running in safe mode.
+     * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int,
+     * int)} to indicate the given package is <b>not</b> allowed to start because it's not a system
+     * app and the system is running in safe mode.
      */
     public static final int PACKAGE_STARTABILITY_NOT_SYSTEM = 2;
 
     /**
-     * Used as the result code of the {@link #getPackageStartability} to indicate
-     * the given package is <b>not</b> allowed to start because it's currently frozen.
+     * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int,
+     * int)} to indicate the given package is <b>not</b> allowed to start because it's currently
+     * frozen.
      */
     public static final int PACKAGE_STARTABILITY_FROZEN = 3;
 
     /**
-     * Used as the result code of the {@link #getPackageStartability} to indicate
-     * the given package is <b>not</b> allowed to start because it doesn't support
+     * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int,
+     * int)} to indicate the given package is <b>not</b> allowed to start because it doesn't support
      * direct boot.
      */
     public static final int PACKAGE_STARTABILITY_DIRECT_BOOT_UNSUPPORTED = 4;
 
     private static final String STATIC_SHARED_LIB_DELIMITER = "_";
-    /** Extension of the compressed packages */
+    /**
+     * Extension of the compressed packages
+     */
     public final static String COMPRESSED_EXTENSION = ".gz";
     /** Suffix of stub packages on the system partition */
     public final static String STUB_SUFFIX = "-Stub";
@@ -644,9 +633,6 @@
      */
     boolean mPromoteSystemApps;
 
-    // TODO: Make IPackageManager reference private to hide discouraged APIs
-    final IPackageManagerImpl mIPackageManager;
-    private final PackageManagerInternal mPmInternal;
     private final TestUtilityService mTestUtilityService;
 
     @Watched
@@ -1057,9 +1043,6 @@
     // A lock-free cache for frequently called functions.
     private volatile Computer mSnapshotComputer;
 
-    // A trampoline that directs callers to either the live or snapshot computer.
-    final ComputerTracker mComputer = new ComputerTracker(this);
-
     // If true, the snapshot is invalid (stale).  The attribute is static since it may be
     // set from outside classes.  The attribute may be set to true anywhere, although it
     // should only be set true while holding mLock.  However, the attribute id guaranteed
@@ -1088,6 +1071,8 @@
      * Return the cached computer.  The method will rebuild the cached computer if necessary.
      * The live computer will be returned if snapshots are disabled.
      */
+    @VisibleForTesting(visibility = Visibility.PACKAGE)
+    @NonNull
     public Computer snapshotComputer() {
         if (Thread.holdsLock(mLock)) {
             // If the current thread holds mLock then it may have modified state but not
@@ -1247,15 +1232,15 @@
             ApkChecksums.Injector injector = new ApkChecksums.Injector(
                     () -> mContext,
                     () -> handler,
-                    () -> mInjector.getIncrementalManager(),
-                    () -> mPmInternal);
+                    mInjector::getIncrementalManager,
+                    () -> mInjector.getLocalService(PackageManagerInternal.class));
             ApkChecksums.getChecksums(filesToChecksum, optional, required, installerPackageName,
                     trustedCerts, onChecksumsReadyListener, injector);
         });
     }
 
-    private void requestChecksumsInternal(@NonNull String packageName, boolean includeSplits,
-            @Checksum.TypeMask int optional, @Checksum.TypeMask int required,
+    void requestChecksumsInternal(@NonNull Computer snapshot, @NonNull String packageName,
+            boolean includeSplits, @Checksum.TypeMask int optional, @Checksum.TypeMask int required,
             @Nullable List trustedInstallers,
             @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId,
             @NonNull Executor executor, @NonNull Handler handler) {
@@ -1264,13 +1249,12 @@
         Objects.requireNonNull(executor);
         Objects.requireNonNull(handler);
 
-        final ApplicationInfo applicationInfo = getApplicationInfoInternal(packageName, 0,
+        final ApplicationInfo applicationInfo = snapshot.getApplicationInfoInternal(packageName, 0,
                 Binder.getCallingUid(), userId);
         if (applicationInfo == null) {
             throw new ParcelableException(new PackageManager.NameNotFoundException(packageName));
         }
-        final InstallSourceInfo installSourceInfo =
-                mIPackageManager.getInstallSourceInfo(packageName);
+        final InstallSourceInfo installSourceInfo = snapshot.getInstallSourceInfo(packageName);
         final String installerPackageName =
                 installSourceInfo != null ? installSourceInfo.getInitiatingPackageName() : null;
 
@@ -1294,8 +1278,8 @@
             ApkChecksums.Injector injector = new ApkChecksums.Injector(
                     () -> mContext,
                     () -> handler,
-                    () -> mInjector.getIncrementalManager(),
-                    () -> mPmInternal);
+                    mInjector::getIncrementalManager,
+                    () -> mInjector.getLocalService(PackageManagerInternal.class));
             ApkChecksums.getChecksums(filesToChecksum, optional, required, installerPackageName,
                     trustedCerts, onChecksumsReadyListener, injector);
         });
@@ -1440,15 +1424,15 @@
                         RuntimePermissionsPersistence.createInstance(),
                         i.getPermissionManagerServiceInternal(),
                         domainVerificationService, lock),
-                (i, pm) -> AppsFilter.create(pm.mPmInternal, i),
+                (i, pm) -> AppsFilter.create(i, i.getLocalService(PackageManagerInternal.class)),
                 (i, pm) -> (PlatformCompat) ServiceManager.getService("platform_compat"),
                 (i, pm) -> SystemConfig.getInstance(),
                 (i, pm) -> new PackageDexOptimizer(i.getInstaller(), i.getInstallLock(),
                         i.getContext(), "*dexopt*"),
-                (i, pm) -> new DexManager(i.getContext(), pm.mIPackageManager,
-                        i.getPackageDexOptimizer(), i.getInstaller(), i.getInstallLock()),
-                (i, pm) -> new ArtManagerService(i.getContext(), pm.mIPackageManager,
+                (i, pm) -> new DexManager(i.getContext(), i.getPackageDexOptimizer(),
                         i.getInstaller(), i.getInstallLock()),
+                (i, pm) -> new ArtManagerService(i.getContext(), i.getInstaller(),
+                        i.getInstallLock()),
                 (i, pm) -> ApexManager.getInstance(),
                 (i, pm) -> new ViewCompiler(i.getInstallLock(), i.getInstaller()),
                 (i, pm) -> (IncrementalManager)
@@ -1470,7 +1454,7 @@
                         i.getContext(), pm, i::getScanningPackageParser),
                 (i, pm, cn) -> new InstantAppResolverConnection(
                         i.getContext(), cn, Intent.ACTION_RESOLVE_INSTANT_APP_PACKAGE),
-                (i, pm) -> new ModuleInfoProvider(i.getContext(), pm.mIPackageManager),
+                (i, pm) -> new ModuleInfoProvider(i.getContext()),
                 (i, pm) -> LegacyPermissionManagerService.create(i.getContext()),
                 (i, pm) -> domainVerificationService,
                 (i, pm) -> {
@@ -1498,13 +1482,15 @@
 
         final CompatChange.ChangeListener selinuxChangeListener = packageName -> {
             synchronized (m.mInstallLock) {
-                final PackageStateInternal packageState = m.getPackageStateInternal(packageName);
+                final Computer snapshot = m.snapshotComputer();
+                final PackageStateInternal packageState =
+                        snapshot.getPackageStateInternal(packageName);
                 if (packageState == null) {
                     Slog.e(TAG, "Failed to find package setting " + packageName);
                     return;
                 }
                 AndroidPackage pkg = packageState.getPkg();
-                SharedUserApi sharedUser = m.mComputer.getSharedUser(
+                SharedUserApi sharedUser = snapshot.getSharedUser(
                         packageState.getSharedUserAppId());
                 String oldSeInfo = AndroidPackageUtils.getSeInfo(pkg, packageState);
 
@@ -1531,11 +1517,12 @@
                 selinuxChangeListener);
 
         m.installAllowlistedSystemPackages();
-        ServiceManager.addService("package", m.mIPackageManager);
+        IPackageManagerImpl iPackageManager = m.new IPackageManagerImpl();
+        ServiceManager.addService("package", iPackageManager);
         final PackageManagerNative pmn = new PackageManagerNative(m);
         ServiceManager.addService("package_native", pmn);
         LocalManagerRegistry.addManager(PackageManagerLocal.class, m.new PackageManagerLocalImpl());
-        return Pair.create(m, m.mIPackageManager);
+        return Pair.create(m, iPackageManager);
     }
 
     /** Install/uninstall system packages for all users based on their user-type, as applicable. */
@@ -1641,8 +1628,6 @@
         mPackageDexOptimizer = testParams.packageDexOptimizer;
         mPackageParserCallback = testParams.packageParserCallback;
         mPendingBroadcasts = testParams.pendingPackageBroadcasts;
-        mIPackageManager = new IPackageManagerImpl();
-        mPmInternal = testParams.pmInternal;
         mTestUtilityService = testParams.testUtilityService;
         mProcessLoggingHandler = testParams.processLoggingHandler;
         mProtectedPackages = testParams.protectedPackages;
@@ -1703,7 +1688,6 @@
     public PackageManagerService(PackageManagerServiceInjector injector, boolean onlyCore,
             boolean factoryTest, final String buildFingerprint, final boolean isEngBuild,
             final boolean isUserDebugBuild, final int sdkVersion, final String incrementalVersion) {
-        mIPackageManager = new IPackageManagerImpl();
         mIsEngBuild = isEngBuild;
         mIsUserDebugBuild = isUserDebugBuild;
         mSdkVersion = sdkVersion;
@@ -1734,10 +1718,9 @@
         t.traceBegin("createSubComponents");
 
         // Expose private service for system components to use.
-        mPmInternal = new PackageManagerInternalImpl();
+        LocalServices.addService(PackageManagerInternal.class, new PackageManagerInternalImpl());
         LocalServices.addService(TestUtilityService.class, this);
         mTestUtilityService = LocalServices.getService(TestUtilityService.class);
-        LocalServices.addService(PackageManagerInternal.class, mPmInternal);
         mUserManager = injector.getUserManagerService();
         mUserNeedsBadging = new UserNeedsBadgingCache(mUserManager);
         mComponentResolver = injector.getComponentResolver();
@@ -1755,7 +1738,7 @@
 
             @Override
             public boolean hasFeature(String feature) {
-                return PackageManagerService.this.mIPackageManager.hasSystemFeature(feature, 0);
+                return PackageManagerService.this.hasSystemFeature(feature, 0);
             }
         };
 
@@ -1885,9 +1868,10 @@
                 final int dependencyCount = entry.dependencies.length;
                 for (int j = 0; j < dependencyCount; j++) {
                     final SharedLibraryInfo dependency =
-                        getSharedLibraryInfo(entry.dependencies[j], undefinedVersion);
+                        computer.getSharedLibraryInfo(entry.dependencies[j], undefinedVersion);
                     if (dependency != null) {
-                        getSharedLibraryInfo(name, undefinedVersion).addDependency(dependency);
+                        computer.getSharedLibraryInfo(name, undefinedVersion)
+                                .addDependency(dependency);
                     }
                 }
             }
@@ -1899,7 +1883,7 @@
             t.traceEnd();
 
             t.traceBegin("read user settings");
-            mFirstBoot = !mSettings.readLPw(mLiveComputer,
+            mFirstBoot = !mSettings.readLPw(computer,
                     mInjector.getUserManagerInternal().getUsers(
                     /* excludePartial= */ true,
                     /* excludeDying= */ false,
@@ -1980,19 +1964,26 @@
             // Resolve protected action filters. Only the setup wizard is allowed to
             // have a high priority filter for these actions.
             mSetupWizardPackage = getSetupWizardPackageNameImpl(computer);
-            mComponentResolver.fixProtectedFilterPriorities(mPmInternal.getSetupWizardPackageName());
+            mComponentResolver.fixProtectedFilterPriorities(mSetupWizardPackage);
 
-            mDefaultTextClassifierPackage = mIPackageManager.getDefaultTextClassifierPackageName();
-            mSystemTextClassifierPackageName =
-                    mIPackageManager.getSystemTextClassifierPackageName();
-            mConfiguratorPackage = getDeviceConfiguratorPackageName();
-            mAppPredictionServicePackage = mIPackageManager.getAppPredictionServicePackageName();
-            mIncidentReportApproverPackage =
-                    mIPackageManager.getIncidentReportApproverPackageName();
+            mDefaultTextClassifierPackage = ensureSystemPackageName(computer,
+                    mContext.getString(R.string.config_servicesExtensionPackage));
+            mSystemTextClassifierPackageName = ensureSystemPackageName(computer,
+                    mContext.getString(R.string.config_defaultTextClassifierPackage));
+            mConfiguratorPackage = ensureSystemPackageName(computer,
+                    mContext.getString(R.string.config_deviceConfiguratorPackageName));
+            mAppPredictionServicePackage = ensureSystemPackageName(computer,
+                    getPackageFromComponentString(R.string.config_defaultAppPredictionService));
+            mIncidentReportApproverPackage = ensureSystemPackageName(computer,
+                    mContext.getString(R.string.config_incidentReportApproverPackage));
             mRetailDemoPackage = getRetailDemoPackageName();
-            mOverlayConfigSignaturePackage = getOverlayConfigSignaturePackageName();
-            mRecentsPackage = getRecentsPackageName();
-            mAmbientContextDetectionPackage = getAmbientContextDetectionPackageName();
+            mOverlayConfigSignaturePackage = ensureSystemPackageName(computer,
+                    mInjector.getSystemConfig().getOverlayConfigSignaturePackage());
+            mRecentsPackage = ensureSystemPackageName(computer,
+                    getPackageFromComponentString(R.string.config_recentsComponentName));
+            mAmbientContextDetectionPackage = ensureSystemPackageName(computer,
+                    getPackageFromComponentString(
+                            R.string.config_defaultAmbientContextDetectionService));
 
             // Now that we know all of the shared libraries, update all clients to have
             // the correct library paths.
@@ -2126,8 +2117,8 @@
 
                 mDomainVerificationManager.setProxy(domainVerificationProxy);
 
-                mServicesExtensionPackageName = getRequiredServicesExtensionPackageLPr();
-                mSharedSystemSharedLibraryPackageName = getRequiredSharedLibrary(
+                mServicesExtensionPackageName = getRequiredServicesExtensionPackageLPr(computer);
+                mSharedSystemSharedLibraryPackageName = getRequiredSharedLibrary(computer,
                         PackageManager.SYSTEM_SHARED_LIBRARY_SHARED,
                         SharedLibraryInfo.VERSION_UNDEFINED);
             } else {
@@ -2143,11 +2134,11 @@
             mRequiredPermissionControllerPackage = getRequiredPermissionControllerLPr(computer);
 
             mSettings.setPermissionControllerVersion(
-                    mIPackageManager.getPackageInfo(mRequiredPermissionControllerPackage, 0,
+                    computer.getPackageInfo(mRequiredPermissionControllerPackage, 0,
                             UserHandle.USER_SYSTEM).getLongVersionCode());
 
             // Resolve the sdk sandbox package
-            mRequiredSdkSandboxPackage = getRequiredSdkSandboxPackageName();
+            mRequiredSdkSandboxPackage = getRequiredSdkSandboxPackageName(computer);
 
             // Initialize InstantAppRegistry's Instant App list for all users.
             for (AndroidPackage pkg : mPackages.values()) {
@@ -2155,7 +2146,8 @@
                     continue;
                 }
                 for (int userId : userIds) {
-                    final PackageStateInternal ps = getPackageStateInternal(pkg.getPackageName());
+                    final PackageStateInternal ps =
+                            computer.getPackageStateInternal(pkg.getPackageName());
                     if (ps == null || !ps.getUserStateOrDefault(userId).isInstantApp()
                             || !ps.getUserStateOrDefault(userId).isInstalled()) {
                         continue;
@@ -2165,7 +2157,7 @@
             }
 
             mInstallerService = mInjector.getPackageInstallerService();
-            final ComponentName instantAppResolverComponent = getInstantAppResolver();
+            final ComponentName instantAppResolverComponent = getInstantAppResolver(computer);
             if (instantAppResolverComponent != null) {
                 if (DEBUG_INSTANT) {
                     Slog.d(TAG, "Set ephemeral resolver: " + instantAppResolverComponent);
@@ -2191,7 +2183,7 @@
             // scanning).
             final Map<Integer, List<PackageInfo>> userPackages = new HashMap<>();
             for (int userId : userIds) {
-                userPackages.put(userId, mIPackageManager.getInstalledPackages(/*flags*/ 0, userId)
+                userPackages.put(userId, computer.getInstalledPackages(/*flags*/ 0, userId)
                         .getList());
             }
             mDexManager.load(userPackages);
@@ -2202,7 +2194,7 @@
                         SystemClock.uptimeMillis() - startTime);
             }
 
-            // Rebild the live computer since some attributes have been rebuilt.
+            // Rebuild the live computer since some attributes have been rebuilt.
             mLiveComputer = createLiveComputer();
 
         } // synchronized (mLock)
@@ -2210,6 +2202,7 @@
         // CHECKSTYLE:ON IndentationCheck
 
         mModuleInfoProvider = mInjector.getModuleInfoProvider();
+
         mInjector.getSystemWrapper().enablePackageCaches();
 
         // Now after opening every single application zip, make sure they
@@ -2281,8 +2274,9 @@
     }
 
     @NonNull
-    private String getRequiredSharedLibrary(@NonNull String name, int version) {
-        SharedLibraryInfo libraryInfo = getSharedLibraryInfo(name, version);
+    private String getRequiredSharedLibrary(@NonNull Computer snapshot, @NonNull String name,
+            int version) {
+        SharedLibraryInfo libraryInfo = snapshot.getSharedLibraryInfo(name, version);
         if (libraryInfo == null) {
             throw new IllegalStateException("Missing required shared library:" + name);
         }
@@ -2294,9 +2288,9 @@
     }
 
     @NonNull
-    private String getRequiredServicesExtensionPackageLPr() {
+    private String getRequiredServicesExtensionPackageLPr(@NonNull Computer computer) {
         String servicesExtensionPackage =
-                ensureSystemPackageName(
+                ensureSystemPackageName(computer,
                         mContext.getString(R.string.config_servicesExtensionPackage));
         if (TextUtils.isEmpty(servicesExtensionPackage)) {
             throw new RuntimeException(
@@ -2375,7 +2369,7 @@
         for (int i = 0; i < N; i++) {
             final ResolveInfo cur = matches.get(i);
             final String packageName = cur.getComponentInfo().packageName;
-            if (mIPackageManager.checkPermission(
+            if (checkPermission(
                     android.Manifest.permission.INTENT_FILTER_VERIFICATION_AGENT, packageName,
                     UserHandle.USER_SYSTEM) != PackageManager.PERMISSION_GRANTED) {
                 continue;
@@ -2405,7 +2399,7 @@
         for (int i = 0; i < N; i++) {
             final ResolveInfo cur = matches.get(i);
             final String packageName = cur.getComponentInfo().packageName;
-            if (mIPackageManager.checkPermission(
+            if (checkPermission(
                     android.Manifest.permission.DOMAIN_VERIFICATION_AGENT, packageName,
                     UserHandle.USER_SYSTEM) != PackageManager.PERMISSION_GRANTED) {
                 Slog.w(TAG, "Domain verification agent found but does not hold permission: "
@@ -2414,7 +2408,7 @@
             }
 
             if (best == null || cur.priority > best.priority) {
-                if (mComputer.isComponentEffectivelyEnabled(cur.getComponentInfo(),
+                if (computer.isComponentEffectivelyEnabled(cur.getComponentInfo(),
                         UserHandle.USER_SYSTEM)) {
                     best = cur;
                 } else {
@@ -2430,7 +2424,7 @@
         return null;
     }
 
-    private @Nullable ComponentName getInstantAppResolver() {
+    @Nullable ComponentName getInstantAppResolver(@NonNull Computer snapshot) {
         final String[] packageArray =
                 mContext.getResources().getStringArray(R.array.config_ephemeralResolverPackage);
         if (packageArray.length == 0 && !Build.IS_DEBUGGABLE) {
@@ -2446,7 +2440,7 @@
                 | MATCH_DIRECT_BOOT_UNAWARE
                 | (!Build.IS_DEBUGGABLE ? MATCH_SYSTEM_ONLY : 0);
         final Intent resolverIntent = new Intent(Intent.ACTION_RESOLVE_INSTANT_APP_PACKAGE);
-        List<ResolveInfo> resolvers = queryIntentServicesInternal(resolverIntent, null,
+        List<ResolveInfo> resolvers = snapshot.queryIntentServicesInternal(resolverIntent, null,
                 resolveFlags, UserHandle.USER_SYSTEM, callingUid, false /*includeInstantApps*/);
         final int N = resolvers.size();
         if (N == 0) {
@@ -2519,7 +2513,7 @@
         Iterator<ResolveInfo> iter = matches.iterator();
         while (iter.hasNext()) {
             final ResolveInfo rInfo = iter.next();
-            if (mIPackageManager.checkPermission(
+            if (checkPermission(
                     Manifest.permission.INSTALL_PACKAGES,
                     rInfo.activityInfo.packageName, 0) == PERMISSION_GRANTED || mIsEngBuild) {
                 continue;
@@ -2550,48 +2544,6 @@
         return matches.get(0).getComponentInfo().getComponentName();
     }
 
-    /**
-     * @see #shouldFilterApplication(PackageStateInternal, int, ComponentName, int, int)
-     */
-    boolean shouldFilterApplication(
-            @Nullable PackageStateInternal ps, int callingUid, int userId) {
-        return mComputer.shouldFilterApplication(
-            ps, callingUid, userId);
-    }
-
-    private @PackageStartability int getPackageStartability(String packageName,
-            int callingUid, int userId) {
-        return mComputer.getPackageStartability(mSafeMode, packageName, callingUid, userId);
-    }
-
-    /**
-     * Returns whether or not a full application can see an instant application.
-     * <p>
-     * Currently, there are four cases in which this can occur:
-     * <ol>
-     * <li>The calling application is a "special" process. Special processes
-     *     are those with a UID < {@link Process#FIRST_APPLICATION_UID}.</li>
-     * <li>The calling application has the permission
-     *     {@link android.Manifest.permission#ACCESS_INSTANT_APPS}.</li>
-     * <li>The calling application is the default launcher on the
-     *     system partition.</li>
-     * <li>The calling application is the default app prediction service.</li>
-     * </ol>
-     */
-    boolean canViewInstantApps(int callingUid, int userId) {
-        return mComputer.canViewInstantApps(callingUid, userId);
-    }
-
-    private PackageInfo generatePackageInfo(@NonNull PackageStateInternal ps,
-            @PackageManager.PackageInfoFlagsBits long flags, int userId) {
-        return mComputer.generatePackageInfo(ps, flags, userId);
-    }
-
-    int getPackageUidInternal(String packageName,
-            @PackageManager.PackageInfoFlagsBits long flags, int userId, int callingUid) {
-        return mComputer.getPackageUidInternal(packageName, flags, userId, callingUid);
-    }
-
     public PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags) {
         // Because this is accessed via the package manager service AIDL,
         // go through the permission manager service AIDL
@@ -2600,19 +2552,6 @@
     }
 
     /**
-     * Important: The provided filterCallingUid is used exclusively to filter out applications
-     * that can be seen based on user state. It's typically the original caller uid prior
-     * to clearing. Because it can only be provided by trusted code, its value can be
-     * trusted and will be used as-is; unlike userId which will be validated by this method.
-     */
-    private ApplicationInfo getApplicationInfoInternal(String packageName,
-            @PackageManager.ApplicationInfoFlagsBits long flags,
-            int filterCallingUid, int userId) {
-        return mComputer.getApplicationInfoInternal(packageName, flags,
-                filterCallingUid, userId);
-    }
-
-    /**
      * Blocking call to clear all cached app data above quota.
      */
     public void freeAllAppCacheAboveQuota(String volumeUuid) throws IOException {
@@ -2648,7 +2587,7 @@
             // 2. Consider preloaded data (after 1w honeymoon, unless aggressive)
             if (internalVolume && (aggressive || SystemProperties
                     .getBoolean("persist.sys.preloads.file_cache_expired", false))) {
-                mIPackageManager.deletePreloadsFileCache();
+                deletePreloadsFileCache();
                 if (file.getUsableSpace() >= bytes) return;
             }
 
@@ -2769,43 +2708,6 @@
         return recommendedInstallLocation;
     }
 
-    /**
-     * Update given flags when being used to request {@link ResolveInfo}.
-     * <p>Instant apps are resolved specially, depending upon context. Minimally,
-     * {@code}flags{@code} must have the {@link PackageManager#MATCH_INSTANT}
-     * flag set. However, this flag is only honoured in three circumstances:
-     * <ul>
-     * <li>when called from a system process</li>
-     * <li>when the caller holds the permission {@code android.permission.ACCESS_INSTANT_APPS}</li>
-     * <li>when resolution occurs to start an activity with a {@code android.intent.action.VIEW}
-     * action and a {@code android.intent.category.BROWSABLE} category</li>
-     * </ul>
-     */
-    long updateFlagsForResolve(long flags, int userId, int callingUid,
-            boolean wantInstantApps, boolean isImplicitImageCaptureIntentAndNotSetByDpc) {
-        return mComputer.updateFlagsForResolve(flags, userId, callingUid,
-                wantInstantApps, isImplicitImageCaptureIntentAndNotSetByDpc);
-    }
-
-    /**
-     * Important: The provided filterCallingUid is used exclusively to filter out activities
-     * that can be seen based on user state. It's typically the original caller uid prior
-     * to clearing. Because it can only be provided by trusted code, its value can be
-     * trusted and will be used as-is; unlike userId which will be validated by this method.
-     */
-    private ActivityInfo getActivityInfoInternal(ComponentName component,
-            @PackageManager.ComponentInfoFlagsBits long flags, int filterCallingUid, int userId) {
-        return mComputer.getActivityInfoInternal(component, flags,
-                filterCallingUid, userId);
-    }
-
-    @Nullable
-    List<VersionedPackage> getPackagesUsingSharedLibrary(
-            SharedLibraryInfo libInfo, @PackageManager.PackageInfoFlagsBits long flags,
-            int callingUid, int userId) {
-        return mComputer.getPackagesUsingSharedLibrary(libInfo, flags, callingUid, userId);
-    }
-
     public ModuleInfo getModuleInfo(String packageName, @PackageManager.ModuleInfoFlags int flags) {
         return mModuleInfoProvider.getModuleInfo(packageName, flags);
     }
@@ -2840,7 +2742,7 @@
         return mRequiredInstallerPackage;
     }
 
-    private void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj,
+    void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj,
             Intent origIntent, String resolvedType, String callingPackage,
             @Nullable String callingFeatureId, boolean isRequesterInstantApp,
             Bundle verificationBundle, int userId) {
@@ -2852,31 +2754,6 @@
         mHandler.sendMessage(msg);
     }
 
-    /**
-     * From Android R, camera intents have to match system apps. The only exception to this is if
-     * the DPC has set the camera persistent preferred activity. This case was introduced
-     * because it is important that the DPC has the ability to set both system and non-system
-     * camera persistent preferred activities.
-     *
-     * @return {@code true} if the intent is a camera intent and the persistent preferred
-     * activity was not set by the DPC.
-     */
-    @GuardedBy("mLock")
-    boolean isImplicitImageCaptureIntentAndNotSetByDpcLocked(Intent intent, int userId,
-            String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags) {
-        return mComputer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId,
-                resolvedType, flags);
-    }
-
-    @GuardedBy("mLock")
-    ResolveInfo findPersistentPreferredActivityLP(Intent intent,
-            String resolvedType,
-            @PackageManager.ResolveInfoFlagsBits long flags, List<ResolveInfo> query, boolean debug,
-            int userId) {
-        return mComputer.findPersistentPreferredActivityLP(intent,
-                resolvedType, flags, query, debug, userId);
-    }
-
     // findPreferredActivityBody returns two items: a "things changed" flag and a
     // ResolveInfo, which is the preferred activity itself.
     static class FindPreferredActivityBodyResult {
@@ -2884,24 +2761,6 @@
         ResolveInfo mPreferredResolveInfo;
     }
 
-    FindPreferredActivityBodyResult findPreferredActivityInternal(
-            Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
-            List<ResolveInfo> query, boolean always,
-            boolean removeMatches, boolean debug, int userId, boolean queryMayBeFiltered) {
-        return mComputer.findPreferredActivityInternal(
-            intent, resolvedType, flags,
-            query, always,
-            removeMatches, debug, userId, queryMayBeFiltered);
-    }
-
-    /**
-     * Returns the package name of the calling Uid if it's an instant app. If it isn't
-     * instant, returns {@code null}.
-     */
-    String getInstantAppPackageName(int callingUid) {
-        return mComputer.getInstantAppPackageName(callingUid);
-    }
-
     public @NonNull ParceledListSlice<ResolveInfo> queryIntentReceivers(@NonNull Computer snapshot,
             Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
             @UserIdInt int userId) {
@@ -2909,24 +2768,6 @@
                 snapshot, intent, resolvedType, flags, userId, Binder.getCallingUid()));
     }
 
-    @NonNull List<ResolveInfo> queryIntentServicesInternal(Intent intent,
-            String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId,
-            int callingUid, boolean includeInstantApps) {
-        return mComputer.queryIntentServicesInternal(intent,
-                resolvedType, flags, userId, callingUid,
-                includeInstantApps);
-    }
-
-    private boolean isInstantAppInternal(String packageName, @UserIdInt int userId,
-            int callingUid) {
-        return mComputer.isInstantAppInternal(packageName, userId,
-                callingUid);
-    }
-
-    boolean isCallerSameApp(String packageName, int uid) {
-        return mComputer.isCallerSameApp(packageName, uid);
-    }
-
     public static void reportSettingsProblem(int priority, String msg) {
         logCriticalInfo(priority, msg);
     }
@@ -2943,39 +2784,6 @@
         return packageName + STATIC_SHARED_LIB_DELIMITER + libraryVersion;
     }
 
-    /**
-     * Enforces the request is from the system or an app that has INTERACT_ACROSS_USERS
-     * or INTERACT_ACROSS_USERS_FULL permissions, if the {@code userId} is not for the caller.
-     *
-     * @param checkShell whether to prevent shell from access if there's a debugging restriction
-     * @param message the message to log on security exception
-     */
-    void enforceCrossUserPermission(int callingUid, @UserIdInt int userId,
-            boolean requireFullPermission, boolean checkShell, String message) {
-        mComputer.enforceCrossUserPermission(callingUid, userId,
-                requireFullPermission, checkShell, message);
-    }
-
-    /**
-     * Checks if the request is from the system or an app that has the appropriate cross-user
-     * permissions defined as follows:
-     * <ul>
-     * <li>INTERACT_ACROSS_USERS_FULL if {@code requireFullPermission} is true.</li>
-     * <li>INTERACT_ACROSS_USERS if the given {@code userId} is in a different profile group
-     * to the caller.</li>
-     * <li>Otherwise, INTERACT_ACROSS_PROFILES if the given {@code userId} is in the same profile
-     * group as the caller.</li>
-     * </ul>
-     *
-     * @param checkShell whether to prevent shell from access if there's a debugging restriction
-     * @param message the message to log on security exception
-     */
-    private void enforceCrossUserOrProfilePermission(int callingUid, @UserIdInt int userId,
-            boolean requireFullPermission, boolean checkShell, String message) {
-        mComputer.enforceCrossUserOrProfilePermission(callingUid, userId,
-                requireFullPermission, checkShell, message);
-    }
-
     public void performFstrimIfNeeded() {
         PackageManagerServiceUtils.enforceSystemOrRoot("Only the system can request fstrim");
 
@@ -3033,17 +2841,6 @@
         return mDexManager;
     }
 
-    @NonNull
-    List<PackageStateInternal> findSharedNonSystemLibraries(
-            @NonNull PackageStateInternal pkgSetting) {
-        return mComputer.findSharedNonSystemLibraries(pkgSetting);
-    }
-
-    @Nullable
-    SharedLibraryInfo getSharedLibraryInfo(String name, long version) {
-        return mComputer.getSharedLibraryInfo(name, version);
-    }
-
     public void shutdown() {
         mCompilerStats.writeNow();
         mDexManager.writePackageDexUsageNow();
@@ -3141,14 +2938,14 @@
         mPackageObserverHelper.notifyRemoved(packageName, uid);
     }
 
-    void sendPackageAddedForUser(String packageName, @NonNull PackageStateInternal packageState,
-            int userId, int dataLoaderType) {
+    void sendPackageAddedForUser(@NonNull Computer snapshot, String packageName,
+            @NonNull PackageStateInternal packageState, int userId, int dataLoaderType) {
         final PackageUserStateInternal userState = packageState.getUserStateOrDefault(userId);
         final boolean isSystem = packageState.isSystem();
         final boolean isInstantApp = userState.isInstantApp();
         final int[] userIds = isInstantApp ? EMPTY_INT_ARRAY : new int[] { userId };
         final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY;
-        sendPackageAddedForNewUsers(packageName, isSystem /*sendBootCompleted*/,
+        sendPackageAddedForNewUsers(snapshot, packageName, isSystem /*sendBootCompleted*/,
                 false /*startReceiver*/, packageState.getAppId(), userIds, instantUserIds,
                 dataLoaderType);
 
@@ -3160,15 +2957,15 @@
     }
 
     @Override
-    public void sendPackageAddedForNewUsers(String packageName, boolean sendBootCompleted,
-            boolean includeStopped, @AppIdInt int appId, int[] userIds, int[] instantUserIds,
-            int dataLoaderType) {
+    public void sendPackageAddedForNewUsers(@NonNull Computer snapshot, String packageName,
+            boolean sendBootCompleted, boolean includeStopped, @AppIdInt int appId, int[] userIds,
+            int[] instantUserIds, int dataLoaderType) {
         if (ArrayUtils.isEmpty(userIds) && ArrayUtils.isEmpty(instantUserIds)) {
             return;
         }
         SparseArray<int[]> broadcastAllowList = mAppsFilter.getVisibilityAllowList(
-                getPackageStateInternal(packageName, Process.SYSTEM_UID),
-                userIds, getPackageStates());
+                snapshot.getPackageStateInternal(packageName, Process.SYSTEM_UID),
+                userIds, snapshot.getPackageStates());
         mHandler.post(() -> mBroadcastHelper.sendPackageAddedForNewUsers(
                 packageName, appId, userIds, instantUserIds, dataLoaderType, broadcastAllowList));
         if (sendBootCompleted && !ArrayUtils.isEmpty(userIds)) {
@@ -3202,8 +2999,8 @@
         return false;
     }
 
-    private void enforceCanSetPackagesSuspendedAsUser(String callingPackage, int callingUid,
-            int userId, String callingMethod) {
+    private void enforceCanSetPackagesSuspendedAsUser(@NonNull Computer snapshot,
+            String callingPackage, int callingUid, int userId, String callingMethod) {
         if (callingUid == Process.ROOT_UID
                 // Need to compare app-id to allow system dialogs access on secondary users
                 || UserHandle.getAppId(callingUid) == Process.SYSTEM_UID) {
@@ -3212,7 +3009,7 @@
 
         final String ownerPackage = mProtectedPackages.getDeviceOwnerOrProfileOwnerPackage(userId);
         if (ownerPackage != null) {
-            final int ownerUid = mIPackageManager.getPackageUid(ownerPackage, 0, userId);
+            final int ownerUid = snapshot.getPackageUid(ownerPackage, 0, userId);
             if (ownerUid == callingUid) {
                 return;
             }
@@ -3221,7 +3018,7 @@
         mContext.enforceCallingOrSelfPermission(android.Manifest.permission.SUSPEND_APPS,
                 callingMethod);
 
-        final int packageUid = mIPackageManager.getPackageUid(callingPackage, 0, userId);
+        final int packageUid = snapshot.getPackageUid(callingPackage, 0, userId);
         final boolean allowedPackageUid = packageUid == callingUid;
         // TODO(b/139383163): remove special casing for shell and enforce INTERACT_ACROSS_USERS_FULL
         final boolean allowedShell = callingUid == SHELL_UID
@@ -3242,13 +3039,9 @@
                 allPackages, suspendingPackage::equals, userId);
     }
 
-    private boolean isSuspendingAnyPackages(String suspendingPackage, int userId) {
-        return mComputer.isSuspendingAnyPackages(suspendingPackage, userId);
-    }
-
-    void removeAllDistractingPackageRestrictions(int userId) {
-        final String[] allPackages = mComputer.getAllAvailablePackageNames();
-        removeDistractingPackageRestrictions(allPackages, userId);
+    void removeAllDistractingPackageRestrictions(@NonNull Computer snapshot, int userId) {
+        final String[] allPackages = snapshot.getAllAvailablePackageNames();
+        removeDistractingPackageRestrictions(snapshot, allPackages, userId);
     }
 
     /**
@@ -3260,11 +3053,12 @@
      * @param packagesToChange The packages on which restrictions are to be removed.
      * @param userId the user for which changes are taking place.
      */
-    private void removeDistractingPackageRestrictions(String[] packagesToChange, int userId) {
+    void removeDistractingPackageRestrictions(@NonNull Computer snapshot,
+            String[] packagesToChange, int userId) {
         final List<String> changedPackages = new ArrayList<>();
         final IntArray changedUids = new IntArray();
         for (String packageName : packagesToChange) {
-            final PackageStateInternal ps = getPackageStateInternal(packageName);
+            final PackageStateInternal ps = snapshot.getPackageStateInternal(packageName);
             if (ps != null && ps.getUserStateOrDefault(userId).getDistractionFlags() != 0) {
                 changedPackages.add(ps.getPackageName());
                 changedUids.add(UserHandle.getUid(userId, ps.getAppId()));
@@ -3287,7 +3081,7 @@
         }
     }
 
-    private void setEnableRollbackCode(int token, int enableRollbackCode) {
+    void setEnableRollbackCode(int token, int enableRollbackCode) {
         final Message msg = mHandler.obtainMessage(ENABLE_ROLLBACK_STATUS);
         msg.arg1 = token;
         msg.arg2 = enableRollbackCode;
@@ -3334,7 +3128,7 @@
             if (DEBUG_BACKUP) {
                 Slog.i(TAG, "Package " + packageName + " sending normal FIRST_LAUNCH");
             }
-            final boolean isInstantApp = isInstantAppInternal(
+            final boolean isInstantApp = snapshotComputer().isInstantAppInternal(
                     packageName, userId, Process.SYSTEM_UID);
             final int[] userIds = isInstantApp ? EMPTY_INT_ARRAY : new int[] { userId };
             final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY;
@@ -3384,30 +3178,22 @@
                 versionedPackage, observer, userId, deleteFlags, false);
     }
 
-    private String resolveExternalPackageName(AndroidPackage pkg) {
-        return mComputer.resolveExternalPackageName(pkg);
-    }
-
-    String resolveInternalPackageName(String packageName, long versionCode) {
-        return mComputer.resolveInternalPackageName(packageName, versionCode);
-    }
-
-    boolean isCallerVerifier(int callingUid) {
+    boolean isCallerVerifier(@NonNull Computer snapshot, int callingUid) {
         final int callingUserId = UserHandle.getUserId(callingUid);
-        return mRequiredVerifierPackage != null && callingUid == mIPackageManager.getPackageUid(
+        return mRequiredVerifierPackage != null && callingUid == snapshot.getPackageUid(
                 mRequiredVerifierPackage, 0, callingUserId);
     }
 
-    public boolean isPackageDeviceAdminOnAnyUser(String packageName) {
+    public boolean isPackageDeviceAdminOnAnyUser(@NonNull Computer snapshot, String packageName) {
         final int callingUid = Binder.getCallingUid();
-        if (mIPackageManager.checkUidPermission(android.Manifest.permission.MANAGE_USERS,
-                callingUid) != PERMISSION_GRANTED) {
+        if (snapshot.checkUidPermission(android.Manifest.permission.MANAGE_USERS, callingUid)
+                != PERMISSION_GRANTED) {
             EventLog.writeEvent(0x534e4554, "128599183", -1, "");
             throw new SecurityException(android.Manifest.permission.MANAGE_USERS
                     + " permission is required to call this API");
         }
-        if (getInstantAppPackageName(callingUid) != null
-                && !isCallerSameApp(packageName, callingUid)) {
+        if (snapshot.getInstantAppPackageName(callingUid) != null
+                && !snapshot.isCallerSameApp(packageName, callingUid)) {
             return false;
         }
         return isPackageDeviceAdmin(packageName, UserHandle.USER_ALL);
@@ -3456,14 +3242,15 @@
         return mDevicePolicyManager;
     }
 
-    private boolean clearApplicationUserDataLIF(String packageName, int userId) {
+    private boolean clearApplicationUserDataLIF(@NonNull Computer snapshot, String packageName,
+            int userId) {
         if (packageName == null) {
             Slog.w(TAG, "Attempt to delete null packageName.");
             return false;
         }
 
         // Try finding details about the requested package
-        AndroidPackage pkg = getPackage(packageName);
+        AndroidPackage pkg = snapshot.getPackage(packageName);
         if (pkg == null) {
             Slog.w(TAG, "Package named '" + packageName + "' doesn't exist.");
             return false;
@@ -3486,8 +3273,8 @@
         } else {
             flags = 0;
         }
-        mAppDataHelper.prepareAppDataContentsLIF(pkg, getPackageStateInternal(packageName), userId,
-                flags);
+        mAppDataHelper.prepareAppDataContentsLIF(pkg, snapshot.getPackageStateInternal(packageName),
+                userId, flags);
 
         return true;
     }
@@ -3538,10 +3325,6 @@
         }
     }
 
-    int getUidTargetSdkVersion(int uid) {
-        return mComputer.getUidTargetSdkVersion(uid);
-    }
-
     void postPreferredActivityChangedBroadcast(int userId) {
         mHandler.post(() -> mBroadcastHelper.sendPreferredActivityChangedBroadcast(userId));
     }
@@ -3562,18 +3345,19 @@
 
         // Persistent preferred activity might have came into effect due to this
         // install.
-        mPreferredActivityHelper.updateDefaultHomeNotLocked(userId);
+        mPreferredActivityHelper.updateDefaultHomeNotLocked(snapshotComputer(), userId);
     }
 
     /**
      * Variant that takes a {@link WatchedIntentFilter}
      */
-    public void addCrossProfileIntentFilter(WatchedIntentFilter intentFilter, String ownerPackage,
-            int sourceUserId, int targetUserId, int flags) {
+    public void addCrossProfileIntentFilter(@NonNull Computer snapshot,
+            WatchedIntentFilter intentFilter, String ownerPackage, int sourceUserId,
+            int targetUserId, int flags) {
         mContext.enforceCallingOrSelfPermission(
                         android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
         int callingUid = Binder.getCallingUid();
-        enforceOwnerRights(ownerPackage, callingUid);
+        enforceOwnerRights(snapshot, ownerPackage, callingUid);
         PackageManagerServiceUtils.enforceShellRestriction(mInjector.getUserManagerInternal(),
                 UserManager.DISALLOW_DEBUGGING_FEATURES, callingUid, sourceUserId);
         if (intentFilter.countActions() == 0) {
@@ -3601,18 +3385,18 @@
     }
 
     // Enforcing that callingUid is owning pkg on userId
-    private void enforceOwnerRights(String pkg, int callingUid) {
+    private void enforceOwnerRights(@NonNull Computer snapshot, String pkg, int callingUid) {
         // The system owns everything.
         if (UserHandle.getAppId(callingUid) == Process.SYSTEM_UID) {
             return;
         }
-        final String[] callerPackageNames = mIPackageManager.getPackagesForUid(callingUid);
+        final String[] callerPackageNames = snapshot.getPackagesForUid(callingUid);
         if (!ArrayUtils.contains(callerPackageNames, pkg)) {
             throw new SecurityException("Calling uid " + callingUid
                     + " does not own package " + pkg);
         }
         final int callingUserId = UserHandle.getUserId(callingUid);
-        PackageInfo pi = mIPackageManager.getPackageInfo(pkg, 0, callingUserId);
+        PackageInfo pi = snapshot.getPackageInfo(pkg, 0, callingUserId);
         if (pi == null) {
             throw new IllegalArgumentException("Unknown package " + pkg + " on user "
                     + callingUserId);
@@ -3626,29 +3410,13 @@
         }
         final UserInfo parent = ums.getProfileParent(userId);
         final int launcherUid = (parent != null) ? parent.id : userId;
-        final ComponentName launcherComponent = getDefaultHomeActivity(launcherUid);
+        // TODO: Should this snapshot be moved further up?
+        final ComponentName launcherComponent = snapshotComputer()
+                .getDefaultHomeActivity(launcherUid);
         mBroadcastHelper.sendSessionCommitBroadcast(sessionInfo, userId, launcherUid,
                 launcherComponent, mAppPredictionServicePackage);
     }
 
-    /**
-     * Report the 'Home' activity which is currently set as "always use this one". If non is set
-     * then reports the most likely home activity or null if there are more than one.
-     */
-    private ComponentName getDefaultHomeActivity(int userId) {
-        return mComputer.getDefaultHomeActivity(userId);
-    }
-
-    Intent getHomeIntent() {
-        return mComputer.getHomeIntent();
-    }
-
-    ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates,
-            int userId) {
-        return mComputer.getHomeActivitiesAsUser(allHomeCandidates,
-                userId);
-    }
-
     private @Nullable String getSetupWizardPackageNameImpl(@NonNull Computer computer) {
         final Intent intent = new Intent(Intent.ACTION_MAIN);
         intent.addCategory(Intent.CATEGORY_SETUP_WIZARD);
@@ -3682,10 +3450,11 @@
         }
     }
 
-    private @NonNull String getRequiredSdkSandboxPackageName() {
+    @NonNull
+    private static String getRequiredSdkSandboxPackageName(@NonNull Computer computer) {
         final Intent intent = new Intent(SdkSandboxManagerLocal.SERVICE_INTERFACE);
 
-        final List<ResolveInfo> matches = queryIntentServicesInternal(
+        final List<ResolveInfo> matches = computer.queryIntentServicesInternal(
                 intent,
                 /* resolvedType= */ null,
                 MATCH_SYSTEM_ONLY | MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE,
@@ -3701,22 +3470,6 @@
     }
 
     @Nullable
-    private String getDeviceConfiguratorPackageName() {
-        return ensureSystemPackageName(mContext.getString(
-                R.string.config_deviceConfiguratorPackageName));
-    }
-
-    public @Nullable String getAmbientContextDetectionPackageName() {
-        return ensureSystemPackageName(getPackageFromComponentString(
-                        R.string.config_defaultAmbientContextDetectionService));
-    }
-
-    public String getOverlayConfigSignaturePackageName() {
-        return ensureSystemPackageName(mInjector.getSystemConfig()
-                .getOverlayConfigSignaturePackage());
-    }
-
-    @Nullable
     private String getRetailDemoPackageName() {
         final String predefinedPkgName = mContext.getString(R.string.config_retailDemoPackage);
         final String predefinedSignature = mContext.getString(
@@ -3752,14 +3505,7 @@
     }
 
     @Nullable
-    private String getRecentsPackageName() {
-        return ensureSystemPackageName(
-                getPackageFromComponentString(R.string.config_recentsComponentName));
-
-    }
-
-    @Nullable
-    private String getPackageFromComponentString(@StringRes int stringResId) {
+    String getPackageFromComponentString(@StringRes int stringResId) {
         final String componentString = mContext.getString(stringResId);
         if (TextUtils.isEmpty(componentString)) {
             return null;
@@ -3772,16 +3518,17 @@
     }
 
     @Nullable
-    private String ensureSystemPackageName(@Nullable String packageName) {
+    String ensureSystemPackageName(@NonNull Computer snapshot,
+            @Nullable String packageName) {
         if (packageName == null) {
             return null;
         }
         final long token = Binder.clearCallingIdentity();
         try {
-            if (mIPackageManager.getPackageInfo(packageName, MATCH_FACTORY_ONLY,
+            if (snapshot.getPackageInfo(packageName, MATCH_FACTORY_ONLY,
                     UserHandle.USER_SYSTEM) == null) {
                 PackageInfo packageInfo =
-                        mIPackageManager.getPackageInfo(packageName, 0, UserHandle.USER_SYSTEM);
+                        snapshot.getPackageInfo(packageName, 0, UserHandle.USER_SYSTEM);
                 if (packageInfo != null) {
                     EventLog.writeEvent(0x534e4554, "145981139", packageInfo.applicationInfo.uid,
                             "");
@@ -3863,8 +3610,10 @@
     private void setEnabledSettings(List<ComponentEnabledSetting> settings, int userId,
             String callingPackage) {
         final int callingUid = Binder.getCallingUid();
-        enforceCrossUserPermission(callingUid, userId, false /* requireFullPermission */,
-                true /* checkShell */, "set enabled");
+        // TODO: This method is not properly snapshotified beyond this call
+        final Computer preLockSnapshot = snapshotComputer();
+        preLockSnapshot.enforceCrossUserPermission(callingUid, userId,
+                false /* requireFullPermission */, true /* checkShell */, "set enabled");
 
         final int targetSize = settings.size();
         for (int i = 0; i < targetSize; i++) {
@@ -3920,6 +3669,7 @@
         final Map<String, PackageSetting> pkgSettings = new ArrayMap<>(targetSize);
         // reader
         synchronized (mLock) {
+            final Computer snapshot = snapshotComputer();
             // Checks for target packages
             for (int i = 0; i < targetSize; i++) {
                 final ComponentEnabledSetting setting = settings.get(i);
@@ -3929,13 +3679,13 @@
                     continue;
                 }
                 final boolean isCallerTargetApp = ArrayUtils.contains(
-                        mIPackageManager.getPackagesForUid(callingUid), packageName);
+                        snapshot.getPackagesForUid(callingUid), packageName);
                 final PackageSetting pkgSetting = mSettings.getPackageLPr(packageName);
                 // Limit who can change which apps
                 if (!isCallerTargetApp) {
                     // Don't allow apps that don't have permission to modify other apps
                     if (!allowedByPermission
-                            || shouldFilterApplication(pkgSetting, callingUid, userId)) {
+                            || snapshot.shouldFilterApplication(pkgSetting, callingUid, userId)) {
                         throw new SecurityException("Attempt to change component state; "
                                 + "pid=" + Binder.getCallingPid()
                                 + ", uid=" + callingUid
@@ -4108,12 +3858,13 @@
 
         final long callingId = Binder.clearCallingIdentity();
         try {
+            final Computer newSnapshot = snapshotComputer();
             for (int i = 0; i < sendNowBroadcasts.size(); i++) {
                 final String packageName = sendNowBroadcasts.keyAt(i);
                 final ArrayList<String> components = sendNowBroadcasts.valueAt(i);
                 final int packageUid = UserHandle.getUid(
                         userId, pkgSettings.get(packageName).getAppId());
-                sendPackageChangedBroadcast(packageName, false /* dontKillApp */,
+                sendPackageChangedBroadcast(newSnapshot, packageName, false /* dontKillApp */,
                         components, packageUid, null /* reason */);
             }
         } finally {
@@ -4137,13 +3888,13 @@
             pkgSetting.setEnabled(newState, userId, callingPackage);
             if ((newState == COMPONENT_ENABLED_STATE_DISABLED_USER
                     || newState == COMPONENT_ENABLED_STATE_DISABLED)
-                    && mIPackageManager.checkPermission(Manifest.permission.SUSPEND_APPS,
-                    packageName, userId) == PERMISSION_GRANTED) {
+                    && checkPermission(Manifest.permission.SUSPEND_APPS, packageName, userId)
+                    == PERMISSION_GRANTED) {
                 // This app should not generally be allowed to get disabled by the UI, but
                 // if it ever does, we don't want to end up with some of the user's apps
                 // permanently suspended.
                 unsuspendForSuspendingPackage(computer, packageName, userId);
-                removeAllDistractingPackageRestrictions(userId);
+                removeAllDistractingPackageRestrictions(computer, userId);
             }
             success = true;
         } else {
@@ -4194,25 +3945,20 @@
         }
     }
 
-    void sendPackageChangedBroadcast(String packageName,
+    void sendPackageChangedBroadcast(@NonNull Computer snapshot, String packageName,
             boolean dontKillApp, ArrayList<String> componentNames, int packageUid, String reason) {
         final int userId = UserHandle.getUserId(packageUid);
-        final boolean isInstantApp = isInstantAppInternal(packageName, userId, Process.SYSTEM_UID);
+        final boolean isInstantApp =
+                snapshot.isInstantAppInternal(packageName, userId, Process.SYSTEM_UID);
         final int[] userIds = isInstantApp ? EMPTY_INT_ARRAY : new int[] { userId };
         final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY;
-        final SparseArray<int[]> broadcastAllowList = getBroadcastAllowList(
+        final SparseArray<int[]> broadcastAllowList = snapshot.getBroadcastAllowList(
                 packageName, userIds, isInstantApp);
         mHandler.post(() -> mBroadcastHelper.sendPackageChangedBroadcast(
                 packageName, dontKillApp, componentNames, packageUid, reason, userIds,
                 instantUserIds, broadcastAllowList));
     }
 
-    @Nullable
-    private SparseArray<int[]> getBroadcastAllowList(@NonNull String packageName,
-            @UserIdInt int[] userIds, boolean isInstantApp) {
-        return mComputer.getBroadcastAllowList(packageName, userIds, isInstantApp);
-    }
-
     /**
      * Used by SystemServer
      */
@@ -4296,7 +4042,7 @@
 
         // Now that we're mostly running, clean up stale users and apps
         mUserManager.reconcileUsers(StorageManager.UUID_PRIVATE_INTERNAL);
-        storageEventHelper.reconcileApps(StorageManager.UUID_PRIVATE_INTERNAL);
+        storageEventHelper.reconcileApps(snapshotComputer(), StorageManager.UUID_PRIVATE_INTERNAL);
 
         mPermissionManager.onSystemReady();
 
@@ -4308,7 +4054,7 @@
         final int livingUserCount = livingUsers.size();
         for (int i = 0; i < livingUserCount; i++) {
             final int userId = livingUsers.get(i).id;
-            if (mPmInternal.isPermissionUpgradeNeeded(userId)) {
+            if (mSettings.isPermissionUpgradeNeeded(userId)) {
                 grantPermissionsUserIds = ArrayUtils.appendInt(
                         grantPermissionsUserIds, userId);
             }
@@ -4350,11 +4096,12 @@
                 if (packageName == null) {
                     return;
                 }
-                AndroidPackage pkg = mPackages.get(packageName);
+                final Computer snapshot = snapshotComputer();
+                AndroidPackage pkg = snapshot.getPackage(packageName);
                 if (pkg == null) {
                     return;
                 }
-                sendPackageChangedBroadcast(pkg.getPackageName(),
+                sendPackageChangedBroadcast(snapshot, pkg.getPackageName(),
                         true /* dontKillApp */,
                         new ArrayList<>(Collections.singletonList(pkg.getPackageName())),
                         pkg.getUid(),
@@ -4407,14 +4154,6 @@
         mSnapshotStatistics.dump(pw, "  ", now, hits, -1, isBrief);
     }
 
-    /**
-     * Dump package manager states to the file according to a given dumping type of
-     * {@link DumpState}.
-     */
-    void dumpComputer(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState) {
-        mComputer.dump(type, fd, pw, dumpState);
-    }
-
     //TODO: b/111402650
     private void disableSkuSpecificApps() {
         String[] apkList = mContext.getResources().getStringArray(
@@ -4428,10 +4167,11 @@
         if (!TextUtils.isEmpty(sku) && ArrayUtils.contains(skuArray, sku)) {
             return;
         }
+        final Computer snapshot = snapshotComputer();
         for (String packageName : apkList) {
-            mIPackageManager.setSystemAppHiddenUntilInstalled(packageName, true);
+            setSystemAppHiddenUntilInstalled(snapshot, packageName, true);
             for (UserInfo user : mInjector.getUserManagerInternal().getUsers(false)) {
-                mIPackageManager.setSystemAppInstallState(packageName, false, user.id);
+                setSystemAppInstallState(snapshot, packageName, false, user.id);
             }
         }
     }
@@ -4524,7 +4264,7 @@
             mPermissionManager.writeLegacyPermissionStateTEMP();
             mSettings.readPermissionStateForUserSyncLPr(userId);
             mPermissionManager.readLegacyPermissionStateTEMP();
-            return mPmInternal.isPermissionUpgradeNeeded(userId);
+            return mSettings.isPermissionUpgradeNeeded(userId);
         }
     }
 
@@ -4544,12 +4284,8 @@
         }
     }
 
-    boolean userNeedsBadging(int userId) {
-        return mUserNeedsBadging.get(userId);
-    }
-
-    private void deletePackageIfUnused(final String packageName) {
-        PackageStateInternal ps = getPackageStateInternal(packageName);
+    private void deletePackageIfUnused(@NonNull Computer snapshot, final String packageName) {
+        PackageStateInternal ps = snapshot.getPackageStateInternal(packageName);
         if (ps == null) {
             return;
         }
@@ -4567,41 +4303,101 @@
                 0, PackageManager.DELETE_ALL_USERS, true /*removedBySystem*/));
     }
 
-    private AndroidPackage getPackage(String packageName) {
-        return mComputer.getPackage(packageName);
+    void deletePreloadsFileCache() {
+        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.CLEAR_APP_CACHE,
+                "deletePreloadsFileCache");
+        File dir = Environment.getDataPreloadsFileCacheDirectory();
+        Slog.i(PackageManagerService.TAG, "Deleting preloaded file cache " + dir);
+        FileUtils.deleteContents(dir);
     }
 
-    private AndroidPackage getPackage(int uid) {
-        return mComputer.getPackage(uid);
+    void setSystemAppHiddenUntilInstalled(@NonNull Computer snapshot, String packageName,
+            boolean hidden) {
+        final int callingUid = Binder.getCallingUid();
+        final boolean calledFromSystemOrPhone = callingUid == Process.PHONE_UID
+                || callingUid == Process.SYSTEM_UID;
+        if (!calledFromSystemOrPhone) {
+            mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS,
+                    "setSystemAppHiddenUntilInstalled");
+        }
+
+        final PackageStateInternal stateRead = snapshot.getPackageStateInternal(packageName);
+        if (stateRead == null || !stateRead.isSystem() || stateRead.getPkg() == null) {
+            return;
+        }
+        if (stateRead.getPkg().isCoreApp() && !calledFromSystemOrPhone) {
+            throw new SecurityException("Only system or phone callers can modify core apps");
+        }
+
+        commitPackageStateMutation(null, mutator -> {
+            mutator.forPackage(packageName)
+                    .setHiddenUntilInstalled(hidden);
+            mutator.forDisabledSystemPackage(packageName)
+                    .setHiddenUntilInstalled(hidden);
+        });
     }
 
-    private SigningDetails getSigningDetails(@NonNull String packageName) {
-        return mComputer.getSigningDetails(packageName);
+    boolean setSystemAppInstallState(@NonNull Computer snapshot, String packageName,
+            boolean installed, int userId) {
+        final int callingUid = Binder.getCallingUid();
+        final boolean calledFromSystemOrPhone = callingUid == Process.PHONE_UID
+                || callingUid == Process.SYSTEM_UID;
+        if (!calledFromSystemOrPhone) {
+            mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS,
+                    "setSystemAppHiddenUntilInstalled");
+        }
+
+        final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
+        // The target app should always be in system
+        if (packageState == null || !packageState.isSystem() || packageState.getPkg() == null) {
+            return false;
+        }
+        if (packageState.getPkg().isCoreApp() && !calledFromSystemOrPhone) {
+            throw new SecurityException("Only system or phone callers can modify core apps");
+        }
+        // Check if the install state is the same
+        if (packageState.getUserStateOrDefault(userId).isInstalled() == installed) {
+            return false;
+        }
+
+        final long callingId = Binder.clearCallingIdentity();
+        try {
+            if (installed) {
+                // install the app from uninstalled state
+                mInstallPackageHelper.installExistingPackageAsUser(
+                        packageName,
+                        userId,
+                        PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS,
+                        PackageManager.INSTALL_REASON_DEVICE_SETUP,
+                        null,
+                        null);
+                return true;
+            }
+
+            // uninstall the app from installed state
+            deletePackageVersioned(
+                    new VersionedPackage(packageName, PackageManager.VERSION_CODE_HIGHEST),
+                    new PackageManager.LegacyPackageDeleteObserver(null).getBinder(),
+                    userId,
+                    PackageManager.DELETE_SYSTEM_APP);
+            return true;
+        } finally {
+            Binder.restoreCallingIdentity(callingId);
+        }
     }
 
-    private SigningDetails getSigningDetails(int uid) {
-        return mComputer.getSigningDetails(uid);
-    }
+    void finishPackageInstall(int token, boolean didLaunch) {
+        PackageManagerServiceUtils.enforceSystemOrRoot(
+                "Only the system is allowed to finish installs");
 
-    private boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) {
-        return mComputer.filterAppAccess(pkg, callingUid, userId);
-    }
+        if (PackageManagerService.DEBUG_INSTALL) {
+            Slog.v(PackageManagerService.TAG, "BM finishing package install for " + token);
+        }
+        Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "restore", token);
 
-    private boolean filterAppAccess(String packageName, int callingUid, int userId) {
-        return mComputer.filterAppAccess(packageName, callingUid, userId);
-    }
-
-    private boolean filterAppAccess(int uid, int callingUid) {
-        return mComputer.filterAppAccess(uid, callingUid);
-    }
-
-    @Nullable
-    private int[] getVisibilityAllowList(@NonNull String packageName, @UserIdInt int userId) {
-        return mComputer.getVisibilityAllowList(packageName, userId);
-    }
-
-    boolean canQueryPackage(int callingUid, @Nullable String targetPackageName) {
-        return mComputer.canQueryPackage(callingUid, targetPackageName);
+        final Message msg = mHandler.obtainMessage(PackageManagerService.POST_INSTALL, token,
+                didLaunch ? 1 : 0);
+        mHandler.sendMessage(msg);
     }
 
     void checkPackageStartable(@NonNull Computer snapshot, @NonNull String packageName,
@@ -4689,71 +4485,15 @@
         }
     }
 
-    public class IPackageManagerImpl extends IPackageManager.Stub {
+    public class IPackageManagerImpl extends IPackageManagerBase {
 
-        @Override
-        public boolean activitySupportsIntent(ComponentName component, Intent intent,
-                String resolvedType) {
-            return mComputer.activitySupportsIntent(mResolveComponentName, component, intent,
-                    resolvedType);
-        }
-
-        @Override
-        public void addCrossProfileIntentFilter(IntentFilter intentFilter, String ownerPackage,
-                int sourceUserId, int targetUserId, int flags) {
-            PackageManagerService.this.addCrossProfileIntentFilter(
-                    new WatchedIntentFilter(intentFilter), ownerPackage, sourceUserId, targetUserId,
-                    flags);
-        }
-
-        // NOTE: Can't remove due to unsupported app usage
-        @Override
-        public boolean addPermission(PermissionInfo info) {
-            // Because this is accessed via the package manager service AIDL,
-            // go through the permission manager service AIDL
-            return mContext.getSystemService(PermissionManager.class).addPermission(info, false);
-        }
-
-        // NOTE: Can't remove due to unsupported app usage
-        @Override
-        public boolean addPermissionAsync(PermissionInfo info) {
-            // Because this is accessed via the package manager service AIDL,
-            // go through the permission manager service AIDL
-            return mContext.getSystemService(PermissionManager.class).addPermission(info, true);
-        }
-
-        @Override
-        public void addPersistentPreferredActivity(IntentFilter filter, ComponentName activity,
-                int userId) {
-            mPreferredActivityHelper.addPersistentPreferredActivity(new WatchedIntentFilter(filter),
-                    activity, userId);
-        }
-
-        @Override
-        public void addPreferredActivity(IntentFilter filter, int match,
-                ComponentName[] set, ComponentName activity, int userId, boolean removeExisting) {
-            mPreferredActivityHelper.addPreferredActivity(new WatchedIntentFilter(filter), match,
-                    set, activity, true, userId, "Adding preferred", removeExisting);
-        }
-
-        /*
-         * Returns if intent can be forwarded from the sourceUserId to the targetUserId
-         */
-        @Override
-        public boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType,
-                @UserIdInt int sourceUserId, @UserIdInt int targetUserId) {
-            return mComputer.canForwardTo(intent, resolvedType, sourceUserId, targetUserId);
-        }
-
-        @Override
-        public boolean canRequestPackageInstalls(String packageName, int userId) {
-            return mComputer.canRequestPackageInstalls(packageName, Binder.getCallingUid(), userId,
-                    true /* throwIfPermNotDeclared*/);
-        }
-
-        @Override
-        public String[] canonicalToCurrentPackageNames(String[] names) {
-            return mComputer.canonicalToCurrentPackageNames(names);
+        public IPackageManagerImpl() {
+            super(PackageManagerService.this, mContext, mDexOptHelper, mModuleInfoProvider,
+                    mPreferredActivityHelper, mResolveIntentHelper, mDomainVerificationManager,
+                    mDomainVerificationConnection, mInstallerService, mPackageProperty,
+                    mResolveComponentName, mInstantAppResolverSettingsComponent,
+                    mRequiredSdkSandboxPackage, mServicesExtensionPackageName,
+                    mSharedSystemSharedLibraryPackageName);
         }
 
         @Override
@@ -4762,33 +4502,13 @@
                     .checkPackageStartable(snapshotComputer(), packageName, userId);
         }
 
-        // NOTE: Can't remove due to unsupported app usage
-        @Override
-        public int checkPermission(String permName, String pkgName, int userId) {
-            return PackageManagerService.this.checkPermission(permName, pkgName, userId);
-        }
-
-        @Override
-        public int checkSignatures(@NonNull String pkg1, @NonNull String pkg2) {
-            return mComputer.checkSignatures(pkg1, pkg2);
-        }
-
-        @Override
-        public int checkUidPermission(String permName, int uid) {
-            return mComputer.checkUidPermission(permName, uid);
-        }
-
-        @Override
-        public int checkUidSignatures(int uid1, int uid2) {
-            return mComputer.checkUidSignatures(uid1, uid2);
-        }
-
         @Override
         public void clearApplicationProfileData(String packageName) {
             PackageManagerServiceUtils.enforceSystemOrRoot(
                     "Only the system can clear all profile data");
 
-            final AndroidPackage pkg = getPackage(packageName);
+            final Computer snapshot = snapshotComputer();
+            final AndroidPackage pkg = snapshot.getPackage(packageName);
             try (PackageFreezer ignored = freezePackage(packageName, "clearApplicationProfileData")) {
                 synchronized (mInstallLock) {
                     mAppDataHelper.clearAppProfilesLIF(pkg);
@@ -4803,10 +4523,11 @@
                     android.Manifest.permission.CLEAR_APP_USER_DATA, null);
 
             final int callingUid = Binder.getCallingUid();
-            enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
+            final Computer snapshot = snapshotComputer();
+            snapshot.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
                     false /* checkShell */, "clear application data");
 
-            if (mComputer.getPackageStateFiltered(packageName, callingUid, userId) == null) {
+            if (snapshot.getPackageStateFiltered(packageName, callingUid, userId) == null) {
                 if (observer != null) {
                     mHandler.post(() -> {
                         try {
@@ -4831,7 +4552,8 @@
                     try (PackageFreezer freezer = freezePackage(packageName,
                             "clearApplicationUserData")) {
                         synchronized (mInstallLock) {
-                            succeeded = clearApplicationUserDataLIF(packageName, userId);
+                            succeeded = clearApplicationUserDataLIF(snapshotComputer(), packageName,
+                                    userId);
                         }
                         mInstantAppRegistry.deleteInstantApplicationMetadata(packageName, userId);
                         synchronized (mLock) {
@@ -4849,8 +4571,9 @@
                         }
                         if (checkPermission(Manifest.permission.SUSPEND_APPS, packageName, userId)
                                 == PERMISSION_GRANTED) {
-                            unsuspendForSuspendingPackage(snapshotComputer(), packageName, userId);
-                            removeAllDistractingPackageRestrictions(userId);
+                            final Computer snapshot = snapshotComputer();
+                            unsuspendForSuspendingPackage(snapshot, packageName, userId);
+                            removeAllDistractingPackageRestrictions(snapshot, userId);
                             flushPackageRestrictionsAsUserInternalLocked(userId);
                         }
                     }
@@ -4870,7 +4593,8 @@
             mContext.enforceCallingOrSelfPermission(
                     android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
             final int callingUid = Binder.getCallingUid();
-            enforceOwnerRights(ownerPackage, callingUid);
+            final Computer snapshot = snapshotComputer();
+            enforceOwnerRights(snapshot, ownerPackage, callingUid);
             PackageManagerServiceUtils.enforceShellRestriction(mInjector.getUserManagerInternal(),
                     UserManager.DISALLOW_DEBUGGING_FEATURES, callingUid, sourceUserId);
             synchronized (mLock) {
@@ -4888,22 +4612,7 @@
         }
 
         @Override
-        public void clearPackagePersistentPreferredActivities(String packageName, int userId) {
-            mPreferredActivityHelper.clearPackagePersistentPreferredActivities(packageName, userId);
-        }
-
-        @Override
-        public void clearPackagePreferredActivities(String packageName) {
-            mPreferredActivityHelper.clearPackagePreferredActivities(packageName);
-        }
-
-        @Override
-        public String[] currentToCanonicalPackageNames(String[] names) {
-            return mComputer.currentToCanonicalPackageNames(names);
-        }
-
-        @Override
-        public void deleteApplicationCacheFiles(final String packageName,
+        public final void deleteApplicationCacheFiles(final String packageName,
                 final IPackageDataObserver observer) {
             final int userId = UserHandle.getCallingUserId();
             deleteApplicationCacheFilesAsUser(packageName, userId, observer);
@@ -4928,17 +4637,18 @@
                 mContext.enforceCallingOrSelfPermission(
                         android.Manifest.permission.INTERNAL_DELETE_CACHE_FILES, null);
             }
-            enforceCrossUserPermission(callingUid, userId, /* requireFullPermission= */ true,
+            final Computer snapshot = snapshotComputer();
+            snapshot.enforceCrossUserPermission(callingUid, userId, /* requireFullPermission= */ true,
                     /* checkShell= */ false, "delete application cache files");
             final int hasAccessInstantApps = mContext.checkCallingOrSelfPermission(
                     android.Manifest.permission.ACCESS_INSTANT_APPS);
 
-            final AndroidPackage pkg = getPackage(packageName);
-
             // Queue up an async operation since the package deletion may take a little while.
             mHandler.post(() -> {
-                final PackageStateInternal ps =
-                        pkg == null ? null : getPackageStateInternal(pkg.getPackageName());
+                // Snapshot in the Handler Runnable since this may be deferred quite a bit
+                // TODO: Is this and the later mInstallLock re-snapshot necessary?
+                final Computer newSnapshot = snapshotComputer();
+                final PackageStateInternal ps = newSnapshot.getPackageStateInternal(packageName);
                 boolean doClearData = true;
                 if (ps != null) {
                     final boolean targetIsInstantApp =
@@ -4949,6 +4659,8 @@
                 if (doClearData) {
                     synchronized (mInstallLock) {
                         final int flags = FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL;
+                        // Snapshot again after mInstallLock?
+                        final AndroidPackage pkg = snapshotComputer().getPackage(packageName);
                         // We're only clearing cache files, so we don't care if the
                         // app is unfrozen and still able to run
                         mAppDataHelper.clearAppDataLIF(pkg, userId,
@@ -4968,47 +4680,18 @@
         }
 
         @Override
-        public void deleteExistingPackageAsUser(VersionedPackage versionedPackage,
-                final IPackageDeleteObserver2 observer, final int userId) {
-            PackageManagerService.this.deleteExistingPackageAsUser(versionedPackage, observer,
-                    userId);
-        }
-
-        @Override
-        public void deletePackageAsUser(String packageName, int versionCode,
-                IPackageDeleteObserver observer, int userId, int flags) {
-            deletePackageVersioned(new VersionedPackage(packageName, versionCode),
-                    new PackageManager.LegacyPackageDeleteObserver(observer).getBinder(), userId, flags);
-        }
-
-        @Override
-        public void deletePackageVersioned(VersionedPackage versionedPackage,
-                final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags) {
-            PackageManagerService.this.deletePackageVersioned(versionedPackage, observer,
-                    userId, deleteFlags);
-        }
-
-        @Override
-        public void deletePreloadsFileCache() {
-            mContext.enforceCallingOrSelfPermission(android.Manifest.permission.CLEAR_APP_CACHE,
-                    "deletePreloadsFileCache");
-            File dir = Environment.getDataPreloadsFileCacheDirectory();
-            Slog.i(PackageManagerService.TAG, "Deleting preloaded file cache " + dir);
-            FileUtils.deleteContents(dir);
-        }
-
-        @Override
         public void dumpProfiles(String packageName) {
             /* Only the shell, root, or the app user should be able to dump profiles. */
             final int callingUid = Binder.getCallingUid();
-            final String[] callerPackageNames = getPackagesForUid(callingUid);
+            final Computer snapshot = snapshotComputer();
+            final String[] callerPackageNames = snapshot.getPackagesForUid(callingUid);
             if (callingUid != Process.SHELL_UID
                     && callingUid != Process.ROOT_UID
                     && !ArrayUtils.contains(callerPackageNames, packageName)) {
                 throw new SecurityException("dumpProfiles");
             }
 
-            AndroidPackage pkg = mComputer.getPackage(packageName);
+            AndroidPackage pkg = snapshot.getPackage(packageName);
             if (pkg == null) {
                 throw new IllegalArgumentException("Unknown package: " + packageName);
             }
@@ -5062,46 +4745,25 @@
             });
         }
 
-        @Override
-        public ResolveInfo findPersistentPreferredActivity(Intent intent, int userId) {
-            return mPreferredActivityHelper.findPersistentPreferredActivity(intent, userId);
-        }
-
-        @Override
-        public void finishPackageInstall(int token, boolean didLaunch) {
-            PackageManagerServiceUtils.enforceSystemOrRoot(
-                    "Only the system is allowed to finish installs");
-
-            if (PackageManagerService.DEBUG_INSTALL) {
-                Slog.v(PackageManagerService.TAG, "BM finishing package install for " + token);
-            }
-            Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "restore", token);
-
-            final Message msg = mHandler.obtainMessage(PackageManagerService.POST_INSTALL, token, didLaunch ? 1 : 0);
-            mHandler.sendMessage(msg);
-        }
-
         @WorkerThread
         @Override
         public void flushPackageRestrictionsAsUser(int userId) {
-            if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+            final Computer snapshot = snapshotComputer();
+            final int callingUid = Binder.getCallingUid();
+            if (snapshot.getInstantAppPackageName(callingUid) != null) {
                 return;
             }
             if (!mUserManager.exists(userId)) {
                 return;
             }
-            enforceCrossUserPermission(Binder.getCallingUid(), userId, false /* requireFullPermission*/,
-                    false /* checkShell */, "flushPackageRestrictions");
+            snapshot.enforceCrossUserPermission(callingUid, userId,
+                    false /* requireFullPermission*/, false /* checkShell */,
+                    "flushPackageRestrictions");
             synchronized (mLock) {
                 flushPackageRestrictionsAsUserInternalLocked(userId);
             }
         }
 
-        @Override
-        public void forceDexOpt(String packageName) {
-            mDexOptHelper.forceDexOpt(packageName);
-        }
-
 
         @Override
         public void freeStorage(final String volumeUuid, final long freeStorageSize,
@@ -5150,83 +4812,17 @@
         }
 
         @Override
-        public ActivityInfo getActivityInfo(ComponentName component,
-                @PackageManager.ComponentInfoFlagsBits long flags, int userId) {
-            return mComputer.getActivityInfo(component, flags, userId);
-        }
-
-        @NonNull
-        @Override
-        public ParceledListSlice<IntentFilter> getAllIntentFilters(@NonNull String packageName) {
-            return mComputer.getAllIntentFilters(packageName);
-        }
-
-        @Override
-        public List<String> getAllPackages() {
-            return mComputer.getAllPackages();
-        }
-
-        // NOTE: Can't remove due to unsupported app usage
-        @NonNull
-        @Override
-        public String[] getAppOpPermissionPackages(@NonNull String permissionName) {
-            return mComputer.getAppOpPermissionPackages(permissionName);
-        }
-
-        @Override
-        public String getAppPredictionServicePackageName() {
-            return ensureSystemPackageName(
-                    getPackageFromComponentString(R.string.config_defaultAppPredictionService));
-        }
-
-        @PackageManager.EnabledState
-        @Override
-        public int getApplicationEnabledSetting(@NonNull String packageName, @UserIdInt int userId) {
-            return mComputer.getApplicationEnabledSetting(packageName, userId);
-        }
-
-        /**
-         * Returns true if application is not found or there was an error. Otherwise it returns
-         * the hidden state of the package for the given user.
-         */
-        @Override
-        public boolean getApplicationHiddenSettingAsUser(@NonNull String packageName,
-                @UserIdInt int userId) {
-            return mComputer.getApplicationHiddenSettingAsUser(packageName, userId);
-        }
-
-        @Override
-        public ApplicationInfo getApplicationInfo(String packageName,
-                @PackageManager.ApplicationInfoFlagsBits long flags, int userId) {
-            return mComputer.getApplicationInfo(packageName, flags, userId);
-        }
-
-        @Override
-        public IArtManager getArtManager() {
-            return mArtManagerService;
-        }
-
-        @Override
-        public @Nullable String getAttentionServicePackageName() {
-            return ensureSystemPackageName(
-                    getPackageFromComponentString(R.string.config_defaultAttentionService));
-        }
-
-        @Override
-        public boolean getBlockUninstallForUser(@NonNull String packageName, @UserIdInt int userId) {
-            return mComputer.getBlockUninstallForUser(packageName, userId);
-        }
-
-        @Override
         public ChangedPackages getChangedPackages(int sequenceNumber, int userId) {
             final int callingUid = Binder.getCallingUid();
-            if (getInstantAppPackageName(callingUid) != null) {
+            final Computer snapshot = snapshotComputer();
+            if (snapshot.getInstantAppPackageName(callingUid) != null) {
                 return null;
             }
             if (!mUserManager.exists(userId)) {
                 return null;
             }
-            enforceCrossUserPermission(callingUid, userId, false, false, "getChangedPackages");
+            snapshot.enforceCrossUserPermission(callingUid, userId, false, false,
+                    "getChangedPackages");
             final ChangedPackages changedPackages = mChangedPackagesTracker.getChangedPackages(
                     sequenceNumber, userId);
 
@@ -5234,8 +4830,9 @@
                 final List<String> packageNames = changedPackages.getPackageNames();
                 for (int index = packageNames.size() - 1; index >= 0; index--) {
                     // Filter out the changes if the calling package should not be able to see it.
-                    final PackageSetting ps = mSettings.getPackageLPr(packageNames.get(index));
-                    if (shouldFilterApplication(ps, callingUid, userId)) {
+                    final PackageStateInternal packageState =
+                            snapshot.getPackageStateInternal(packageNames.get(index));
+                    if (snapshot.shouldFilterApplication(packageState, callingUid, userId)) {
                         packageNames.remove(index);
                     }
                 }
@@ -5245,41 +4842,6 @@
         }
 
         @Override
-        public int getComponentEnabledSetting(@NonNull ComponentName component, int userId) {
-            return mComputer.getComponentEnabledSetting(component, Binder.getCallingUid(), userId);
-        }
-
-        @Override
-        public String getContentCaptureServicePackageName() {
-            return ensureSystemPackageName(
-                    getPackageFromComponentString(R.string.config_defaultContentCaptureService));
-        }
-
-        @Nullable
-        @Override
-        public ParceledListSlice<SharedLibraryInfo> getDeclaredSharedLibraries(
-                @NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags,
-                @NonNull int userId) {
-            return mComputer.getDeclaredSharedLibraries(packageName, flags, userId);
-        }
-
-        /**
-         * Non-Binder method, support for the backup/restore mechanism: write the
-         * default browser (etc) settings in its canonical XML format.  Returns the default
-         * browser XML representation as a byte array, or null if there is none.
-         */
-        @Override
-        public byte[] getDefaultAppsBackup(int userId) {
-            return mPreferredActivityHelper.getDefaultAppsBackup(userId);
-        }
-
-        @Override
-        public String getDefaultTextClassifierPackageName() {
-            return ensureSystemPackageName(
-                    mContext.getString(R.string.config_servicesExtensionPackage));
-        }
-
-        @Override
         public byte[] getDomainVerificationBackup(int userId) {
             if (Binder.getCallingUid() != Process.SYSTEM_UID) {
                 throw new SecurityException("Only the system may call getDomainVerificationBackup()");
@@ -5301,17 +4863,6 @@
         }
 
         @Override
-        public int getFlagsForUid(int uid) {
-            return mComputer.getFlagsForUid(uid);
-        }
-
-        @Nullable
-        @Override
-        public CharSequence getHarmfulAppWarning(@NonNull String packageName, @UserIdInt int userId) {
-            return mComputer.getHarmfulAppWarning(packageName, userId);
-        }
-
-        @Override
         public IBinder getHoldLockToken() {
             if (!Build.IS_DEBUGGABLE) {
                 throw new SecurityException("getHoldLockToken requires a debuggable build");
@@ -5327,72 +4878,15 @@
         }
 
         @Override
-        public ComponentName getHomeActivities(List<ResolveInfo> allHomeCandidates) {
-            if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
-                return null;
-            }
-            return getHomeActivitiesAsUser(allHomeCandidates, UserHandle.getCallingUserId());
-        }
-
-        public String getIncidentReportApproverPackageName() {
-            return ensureSystemPackageName(mContext.getString(
-                    R.string.config_incidentReportApproverPackage));
-        }
-
-        @Override
-        public int getInstallLocation() {
-            // allow instant app access
-            return android.provider.Settings.Global.getInt(mContext.getContentResolver(),
-                    android.provider.Settings.Global.DEFAULT_INSTALL_LOCATION,
-                    InstallLocationUtils.APP_INSTALL_AUTO);
-        }
-
-        @PackageManager.InstallReason
-        @Override
-        public int getInstallReason(@NonNull String packageName, @UserIdInt int userId) {
-            return mComputer.getInstallReason(packageName, userId);
-        }
-
-        @Override
-        @Nullable
-        public InstallSourceInfo getInstallSourceInfo(@NonNull String packageName) {
-            return mComputer.getInstallSourceInfo(packageName);
-        }
-
-        @Override
-        public ParceledListSlice<ApplicationInfo> getInstalledApplications(
-                @PackageManager.ApplicationInfoFlagsBits long flags, int userId) {
-            final int callingUid = Binder.getCallingUid();
-            return new ParceledListSlice<>(
-                    mComputer.getInstalledApplications(flags, userId, callingUid));
-        }
-
-        @Override
-        public List<ModuleInfo> getInstalledModules(int flags) {
-            return mModuleInfoProvider.getInstalledModules(flags);
-        }
-
-        @Override
-        public ParceledListSlice<PackageInfo> getInstalledPackages(
-                @PackageManager.PackageInfoFlagsBits long flags, int userId) {
-            return mComputer.getInstalledPackages(flags, userId);
-        }
-
-        @Nullable
-        @Override
-        public String getInstallerPackageName(@NonNull String packageName) {
-            return mComputer.getInstallerPackageName(packageName);
-        }
-
-        @Override
         public String getInstantAppAndroidId(String packageName, int userId) {
-            mContext.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_INSTANT_APPS,
-                    "getInstantAppAndroidId");
-            enforceCrossUserPermission(Binder.getCallingUid(), userId,
+            mContext.enforceCallingOrSelfPermission(
+                    android.Manifest.permission.ACCESS_INSTANT_APPS, "getInstantAppAndroidId");
+            final Computer snapshot = snapshotComputer();
+            snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId,
                     true /* requireFullPermission */, false /* checkShell */,
                     "getInstantAppAndroidId");
             // Make sure the target is an Instant App.
-            if (!isInstantApp(packageName, userId)) {
+            if (!snapshot.isInstantApp(packageName, userId)) {
                 return null;
             }
             return mInstantAppRegistry.getInstantAppAndroidId(packageName, userId);
@@ -5404,13 +4898,14 @@
                 return null;
             }
 
-            enforceCrossUserPermission(Binder.getCallingUid(), userId,
+            final Computer snapshot = snapshotComputer();
+            snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId,
                     true /* requireFullPermission */, false /* checkShell */,
                     "getInstantAppCookie");
-            if (!isCallerSameApp(packageName, Binder.getCallingUid())) {
+            if (!snapshot.isCallerSameApp(packageName, Binder.getCallingUid())) {
                 return null;
             }
-            PackageStateInternal packageState = getPackageStateInternal(packageName);
+            PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
             if (packageState == null || packageState.getPkg() == null) {
                 return null;
             }
@@ -5423,11 +4918,12 @@
                 return null;
             }
 
-            if (!canViewInstantApps(Binder.getCallingUid(), userId)) {
+            final Computer snapshot = snapshotComputer();
+            if (!snapshot.canViewInstantApps(Binder.getCallingUid(), userId)) {
                 mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_INSTANT_APPS,
                         "getInstantAppIcon");
             }
-            enforceCrossUserPermission(Binder.getCallingUid(), userId,
+            snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId,
                     true /* requireFullPermission */, false /* checkShell */,
                     "getInstantAppIcon");
 
@@ -5435,76 +4931,31 @@
         }
 
         @Override
-        public ComponentName getInstantAppInstallerComponent() {
-            if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
-                return null;
-            }
-            return mInstantAppInstallerActivity == null
-                    ? null : mInstantAppInstallerActivity.getComponentName();
-        }
-
-        @Override
-        public @Nullable ComponentName getInstantAppResolverComponent() {
-            if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
-                return null;
-            }
-            return getInstantAppResolver();
-        }
-
-        @Override
-        public ComponentName getInstantAppResolverSettingsComponent() {
-            return mInstantAppResolverSettingsComponent;
-        }
-
-        @Override
         public ParceledListSlice<InstantAppInfo> getInstantApps(int userId) {
-            if (PackageManagerService.HIDE_EPHEMERAL_APIS) {
+            if (HIDE_EPHEMERAL_APIS) {
                 return null;
             }
-            if (!canViewInstantApps(Binder.getCallingUid(), userId)) {
+
+            final Computer snapshot = snapshotComputer();
+            if (!snapshot.canViewInstantApps(Binder.getCallingUid(), userId)) {
                 mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_INSTANT_APPS,
                         "getEphemeralApplications");
             }
-            enforceCrossUserPermission(Binder.getCallingUid(), userId,
+            snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId,
                     true /* requireFullPermission */, false /* checkShell */,
                     "getEphemeralApplications");
 
-            Computer computer = snapshotComputer();
-            List<InstantAppInfo> instantApps = mInstantAppRegistry.getInstantApps(computer, userId);
+            List<InstantAppInfo> instantApps = mInstantAppRegistry.getInstantApps(snapshot, userId);
             if (instantApps != null) {
                 return new ParceledListSlice<>(instantApps);
             }
             return null;
         }
 
-        @Nullable
-        @Override
-        public InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component, int flags) {
-            return mComputer.getInstrumentationInfo(component, flags);
-        }
-
-        @Deprecated
-        @Override
-        public @NonNull ParceledListSlice<IntentFilterVerificationInfo> getIntentFilterVerifications(
-                String packageName) {
-            return ParceledListSlice.emptyList();
-        }
-
-        @Deprecated
-        @Override
-        public int getIntentVerificationStatus(String packageName, int userId) {
-            return mDomainVerificationManager.getLegacyState(packageName, userId);
-        }
-
-        @Nullable
-        @Override
-        public KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias) {
-            return mComputer.getKeySetByAlias(packageName, alias);
-        }
-
         @Override
         public ResolveInfo getLastChosenActivity(Intent intent, String resolvedType, int flags) {
-            return mPreferredActivityHelper.getLastChosenActivity(intent, resolvedType, flags);
+            return mPreferredActivityHelper.getLastChosenActivity(snapshotComputer(), intent,
+                    resolvedType, flags);
         }
 
         @Override
@@ -5516,13 +4967,9 @@
 
         @Override
         public List<String> getMimeGroup(String packageName, String mimeGroup) {
-            enforceOwnerRights(packageName, Binder.getCallingUid());
-            return getMimeGroupInternal(packageName, mimeGroup);
-        }
-
-        @Override
-        public ModuleInfo getModuleInfo(String packageName, @PackageManager.ModuleInfoFlags int flags) {
-            return PackageManagerService.this.getModuleInfo(packageName, flags);
+            final Computer snapshot = snapshotComputer();
+            enforceOwnerRights(snapshot, packageName, Binder.getCallingUid());
+            return getMimeGroupInternal(snapshot, packageName, mimeGroup);
         }
 
         @Override
@@ -5532,99 +4979,11 @@
             return mMoveCallbacks.mLastStatus.get(moveId);
         }
 
-        @Nullable
-        @Override
-        public String getNameForUid(int uid) {
-            return mComputer.getNameForUid(uid);
-        }
-
-        @Nullable
-        @Override
-        public String[] getNamesForUids(@NonNull int[] uids) {
-            return mComputer.getNamesForUids(uids);
-        }
-
-        @Override
-        public int[] getPackageGids(String packageName, @PackageManager.PackageInfoFlagsBits long flags,
-                int userId) {
-            return mComputer.getPackageGids(packageName, flags, userId);
-        }
-
-        @Override
-        public PackageInfo getPackageInfo(String packageName,
-                @PackageManager.PackageInfoFlagsBits long flags, int userId) {
-            return mComputer.getPackageInfo(packageName, flags, userId);
-        }
-
-        @Override
-        public PackageInfo getPackageInfoVersioned(VersionedPackage versionedPackage,
-                @PackageManager.PackageInfoFlagsBits long flags, int userId) {
-            return mComputer.getPackageInfoInternal(versionedPackage.getPackageName(),
-                    versionedPackage.getLongVersionCode(), flags, Binder.getCallingUid(), userId);
-        }
-
-        @Override
-        public IPackageInstaller getPackageInstaller() {
-            // Return installer service for internal calls.
-            if (PackageManagerServiceUtils.isSystemOrRoot()) {
-                return mInstallerService;
-            }
-            // Return null for InstantApps.
-            if (snapshotComputer().getInstantAppPackageName(Binder.getCallingUid()) != null) {
-                return null;
-            }
-            return mInstallerService;
-        }
-
-        @Override
-        public void getPackageSizeInfo(final String packageName, int userId,
-                final IPackageStatsObserver observer) {
-            throw new UnsupportedOperationException(
-                    "Shame on you for calling the hidden API getPackageSizeInfo(). Shame!");
-        }
-
-        @Override
-        public int getPackageUid(@NonNull String packageName,
-                @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) {
-            return mComputer.getPackageUid(packageName, flags, userId);
-        }
-
-        /**
-         * <em>IMPORTANT:</em> Not all packages returned by this method may be known
-         * to the system. There are two conditions in which this may occur:
-         * <ol>
-         *   <li>The package is on adoptable storage and the device has been removed</li>
-         *   <li>The package is being removed and the internal structures are partially updated</li>
-         * </ol>
-         * The second is an artifact of the current data structures and should be fixed. See
-         * b/111075456 for one such instance.
-         * This binder API is cached.  If the algorithm in this method changes,
-         * or if the underlying objecs (as returned by getSettingLPr()) change
-         * then the logic that invalidates the cache must be revisited.  See
-         * calls to invalidateGetPackagesForUidCache() to locate the points at
-         * which the cache is invalidated.
-         */
-        @Override
-        public String[] getPackagesForUid(int uid) {
-            final int callingUid = Binder.getCallingUid();
-            final int userId = UserHandle.getUserId(uid);
-            mComputer.enforceCrossUserOrProfilePermission(callingUid, userId,
-                    /* requireFullPermission */ false,
-                    /* checkShell */ false, "getPackagesForUid");
-            return mComputer.getPackagesForUid(uid);
-        }
-
-        @Override
-        public ParceledListSlice<PackageInfo> getPackagesHoldingPermissions(
-                @NonNull String[] permissions, @PackageManager.PackageInfoFlagsBits long flags,
-                @UserIdInt int userId) {
-            return mComputer.getPackagesHoldingPermissions(permissions, flags, userId);
-        }
-
         @Override
         public String getPermissionControllerPackageName() {
             final int callingUid = Binder.getCallingUid();
-            if (mComputer.getPackageStateFiltered(mRequiredPermissionControllerPackage,
+            final Computer snapshot = snapshotComputer();
+            if (snapshot.getPackageStateFiltered(mRequiredPermissionControllerPackage,
                     callingUid, UserHandle.getUserId(callingUid)) != null) {
                 return mRequiredPermissionControllerPackage;
             }
@@ -5632,73 +4991,6 @@
             throw new IllegalStateException("PermissionController is not found");
         }
 
-        // NOTE: Can't remove due to unsupported app usage
-        @Override
-        public PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags) {
-            return PackageManagerService.this.getPermissionGroupInfo(groupName, flags);
-        }
-
-        @Override
-        public @NonNull ParceledListSlice<ApplicationInfo> getPersistentApplications(int flags) {
-            if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
-                return ParceledListSlice.emptyList();
-            }
-            return new ParceledListSlice<>(mComputer.getPersistentApplications(mSafeMode, flags));
-        }
-
-        @Override
-        public int getPreferredActivities(List<IntentFilter> outFilters,
-                List<ComponentName> outActivities, String packageName) {
-            return mPreferredActivityHelper.getPreferredActivities(outFilters, outActivities,
-                    packageName, snapshotComputer());
-        }
-
-        /**
-         * Non-Binder method, support for the backup/restore mechanism: write the
-         * full set of preferred activities in its canonical XML format.  Returns the
-         * XML output as a byte array, or null if there is none.
-         */
-        @Override
-        public byte[] getPreferredActivityBackup(int userId) {
-            return mPreferredActivityHelper.getPreferredActivityBackup(userId);
-        }
-
-        @Override
-        public int getPrivateFlagsForUid(int uid) {
-            return mComputer.getPrivateFlagsForUid(uid);
-        }
-
-        @Override
-        public PackageManager.Property getProperty(String propertyName, String packageName, String className) {
-            Objects.requireNonNull(propertyName);
-            Objects.requireNonNull(packageName);
-            PackageStateInternal packageState = mComputer.getPackageStateFiltered(packageName,
-                    Binder.getCallingUid(), UserHandle.getCallingUserId());
-            if (packageState == null) {
-                return null;
-            }
-            return mPackageProperty.getProperty(propertyName, packageName, className);
-        }
-
-        @Nullable
-        @Override
-        public ProviderInfo getProviderInfo(@NonNull ComponentName component,
-                @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) {
-            return mComputer.getProviderInfo(component, flags, userId);
-        }
-
-        @Override
-        public ActivityInfo getReceiverInfo(ComponentName component,
-                @PackageManager.ComponentInfoFlagsBits long flags, int userId) {
-            return mComputer.getReceiverInfo(component, flags, userId);
-        }
-
-        @Override
-        public @Nullable String getRotationResolverPackageName() {
-            return ensureSystemPackageName(
-                    getPackageFromComponentString(R.string.config_defaultRotationResolverService));
-        }
-
         @Override
         public int getRuntimePermissionsVersion(@UserIdInt int userId) {
             Preconditions.checkArgumentNonnegative(userId);
@@ -5707,65 +4999,25 @@
             return mSettings.getDefaultRuntimePermissionsVersion(userId);
         }
 
-        @Nullable
-        @Override
-        public ServiceInfo getServiceInfo(@NonNull ComponentName component,
-                @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) {
-            return mComputer.getServiceInfo(component, flags, userId);
-        }
-
-        @Override
-        public @NonNull String getServicesSystemSharedLibraryPackageName() {
-            return mServicesExtensionPackageName;
-        }
-
-        @Override
-        public String getSetupWizardPackageName() {
-            if (Binder.getCallingUid() != Process.SYSTEM_UID) {
-                throw new SecurityException("Non-system caller");
-            }
-            return mPmInternal.getSetupWizardPackageName();
-        }
-
-        @Override
-        public ParceledListSlice<SharedLibraryInfo> getSharedLibraries(String packageName,
-                @PackageManager.PackageInfoFlagsBits long flags, int userId) {
-            return mComputer.getSharedLibraries(packageName, flags, userId);
-        }
-
-        @Override
-        public @NonNull String getSharedSystemSharedLibraryPackageName() {
-            return mSharedSystemSharedLibraryPackageName;
-        }
-
-        @Nullable
-        @Override
-        public KeySet getSigningKeySet(@NonNull String packageName) {
-            return mComputer.getSigningKeySet(packageName);
-        }
-
         @Override
         public String getSplashScreenTheme(@NonNull String packageName, int userId) {
-            PackageStateInternal packageState =
-                    getPackageStateInstalledFiltered(packageName, Binder.getCallingUid(), userId);
+            final Computer snapshot = snapshotComputer();
+            PackageStateInternal packageState = filterPackageStateForInstalledAndFiltered(snapshot,
+                    packageName, Binder.getCallingUid(), userId);
             return packageState == null ? null
                     : packageState.getUserStateOrDefault(userId).getSplashScreenTheme();
         }
 
         @Override
-        public String getSdkSandboxPackageName() {
-            return mRequiredSdkSandboxPackage;
-        }
-
-        @Override
         public Bundle getSuspendedPackageAppExtras(String packageName, int userId) {
             final int callingUid = Binder.getCallingUid();
-            if (getPackageUid(packageName, 0, userId) != callingUid) {
+            final Computer snapshot = snapshot();
+            if (snapshot.getPackageUid(packageName, 0, userId) != callingUid) {
                 throw new SecurityException("Calling package " + packageName
                         + " does not belong to calling uid " + callingUid);
             }
-            return mSuspendPackageHelper.getSuspendedPackageAppExtras(
-                    packageName, userId, callingUid);
+            return mSuspendPackageHelper
+                    .getSuspendedPackageAppExtras(snapshot, packageName, userId, callingUid);
         }
 
         @Override
@@ -5785,34 +5037,6 @@
         }
 
         @Override
-        public String getSystemCaptionsServicePackageName() {
-            return ensureSystemPackageName(
-                    getPackageFromComponentString(R.string.config_defaultSystemCaptionsService));
-        }
-
-        @Nullable
-        @Override
-        public String[] getSystemSharedLibraryNames() {
-            return mComputer.getSystemSharedLibraryNames();
-        }
-
-        @Override
-        public String getSystemTextClassifierPackageName() {
-            return ensureSystemPackageName(
-                    mContext.getString(R.string.config_defaultTextClassifierPackage));
-        }
-
-        @Override
-        public int getTargetSdkVersion(@NonNull String packageName)  {
-            return mComputer.getTargetSdkVersion(packageName);
-        }
-
-        @Override
-        public int getUidForSharedUser(@NonNull String sharedUserName) {
-            return mComputer.getUidForSharedUser(sharedUserName);
-        }
-
-        @Override
         public String[] getUnsuspendablePackagesForUser(String[] packageNames, int userId) {
             Objects.requireNonNull(packageNames, "packageNames cannot be null");
             mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS,
@@ -5838,18 +5062,6 @@
         }
 
         @Override
-        public String getWellbeingPackageName() {
-            final long identity = Binder.clearCallingIdentity();
-            try {
-                return CollectionUtils.firstOrNull(
-                        mContext.getSystemService(RoleManager.class).getRoleHolders(
-                                RoleManager.ROLE_SYSTEM_WELLBEING));
-            } finally {
-                Binder.restoreCallingIdentity(identity);
-            }
-        }
-
-        @Override
         public void grantImplicitAccess(int recipientUid, @NonNull String visibleAuthority) {
             final Computer snapshot = snapshotComputer();
             final int recipientUserId = UserHandle.getUserId(recipientUid);
@@ -5864,38 +5076,6 @@
                     false /*direct*/, false /* retainOnUpdate */);
         }
 
-        // NOTE: Can't remove due to unsupported app usage
-        @Override
-        public void grantRuntimePermission(String packageName, String permName, final int userId) {
-            // Because this is accessed via the package manager service AIDL,
-            // go through the permission manager service AIDL
-            mContext.getSystemService(PermissionManager.class)
-                    .grantRuntimePermission(packageName, permName, UserHandle.of(userId));
-        }
-
-        @Override
-        public boolean hasSigningCertificate(@NonNull String packageName, @NonNull byte[] certificate,
-                @PackageManager.CertificateInputType int type) {
-            return mComputer.hasSigningCertificate(packageName, certificate, type);
-        }
-
-        @Override
-        public boolean hasSystemFeature(String name, int version) {
-            return PackageManagerService.this.hasSystemFeature(name, version);
-        }
-
-        @Override
-        public boolean hasSystemUidErrors() {
-            // allow instant applications
-            return false;
-        }
-
-        @Override
-        public boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate,
-                @PackageManager.CertificateInputType int type) {
-            return mComputer.hasUidSigningCertificate(uid, certificate, type);
-        }
-
         @Override
         public void holdLock(IBinder token, int durationMs) {
             mTestUtilityService.verifyHoldLockToken(token);
@@ -5924,55 +5104,17 @@
         }
 
         @Override
-        public boolean isDeviceUpgrading() {
-            return PackageManagerService.this.isDeviceUpgrading();
-        }
-
-        @Override
-        public boolean isFirstBoot() {
-            return PackageManagerService.this.isFirstBoot();
-        }
-
-        @Override
-        public boolean isInstantApp(String packageName, int userId) {
-            return mComputer.isInstantApp(packageName, userId);
-        }
-
-        @Override
-        public boolean isOnlyCoreApps() {
-            return PackageManagerService.this.isOnlyCoreApps();
-        }
-
-        @Override
-        public boolean isPackageAvailable(String packageName, int userId) {
-            return mComputer.isPackageAvailable(packageName, userId);
-        }
-
-        @Override
-        public boolean isPackageDeviceAdminOnAnyUser(String packageName) {
-            return PackageManagerService.this.isPackageDeviceAdminOnAnyUser(packageName);
-        }
-
-        @Override
-        public boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks) {
-            return mComputer.isPackageSignedByKeySet(packageName, ks);
-        }
-
-        @Override
-        public boolean isPackageSignedByKeySetExactly(@NonNull String packageName, @NonNull KeySet ks) {
-            return mComputer.isPackageSignedByKeySetExactly(packageName, ks);
-        }
-
-        @Override
         public boolean isPackageStateProtected(@NonNull String packageName, @UserIdInt int userId) {
             final int callingUid = Binder.getCallingUid();
             final int callingAppId = UserHandle.getAppId(callingUid);
 
-            enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/,
+            final Computer snapshot = snapshotComputer();
+            snapshot.enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/,
                     true /*checkShell*/, "isPackageStateProtected");
 
             if (callingAppId != Process.SYSTEM_UID && callingAppId != Process.ROOT_UID
-                    && checkUidPermission(MANAGE_DEVICE_ADMINS, callingUid) != PERMISSION_GRANTED) {
+                    && snapshot.checkUidPermission(MANAGE_DEVICE_ADMINS, callingUid)
+                    != PERMISSION_GRANTED) {
                 throw new SecurityException("Caller must have the "
                         + MANAGE_DEVICE_ADMINS + " permission.");
             }
@@ -5981,11 +5123,6 @@
         }
 
         @Override
-        public boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId) {
-            return mComputer.isPackageSuspendedForUser(packageName, userId);
-        }
-
-        @Override
         public boolean isProtectedBroadcast(String actionName) {
             if (actionName != null) {
                 // TODO: remove these terrible hacks
@@ -6002,22 +5139,6 @@
             }
         }
 
-        @Override
-        public boolean isSafeMode() {
-            // allow instant applications
-            return mSafeMode;
-        }
-
-        @Override
-        public boolean isStorageLow() {
-            return PackageManagerService.this.isStorageLow();
-        }
-
-        @Override
-        public boolean isUidPrivileged(int uid) {
-            return mComputer.isUidPrivileged(uid);
-        }
-
         /**
          * Logs process start information (including base APK hash) to the security log.
          * @hide
@@ -6025,13 +5146,15 @@
         @Override
         public void logAppProcessStartIfNeeded(String packageName, String processName, int uid,
                 String seinfo, String apkFile, int pid) {
-            if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+            final Computer snapshot = snapshotComputer();
+            if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
                 return;
             }
             if (!SecurityLog.isLoggingEnabled()) {
                 return;
             }
-            mProcessLoggingHandler.logAppProcessStart(mContext, mPmInternal, apkFile, packageName,
+            mProcessLoggingHandler.logAppProcessStart(mContext,
+                    LocalServices.getService(PackageManagerInternal.class), apkFile, packageName,
                     processName, uid, seinfo, pid);
         }
 
@@ -6083,25 +5206,29 @@
         }
 
         @Override
-        public void notifyDexLoad(String loadingPackageName, Map<String, String> classLoaderContextMap,
+        public void notifyDexLoad(String loadingPackageName,
+                Map<String, String> classLoaderContextMap,
                 String loaderIsa) {
             int callingUid = Binder.getCallingUid();
-            if (PackageManagerService.PLATFORM_PACKAGE_NAME.equals(loadingPackageName) && callingUid != Process.SYSTEM_UID) {
-                Slog.w(PackageManagerService.TAG, "Non System Server process reporting dex loads as system server. uid="
-                        + callingUid);
+            if (PackageManagerService.PLATFORM_PACKAGE_NAME.equals(loadingPackageName)
+                    && callingUid != Process.SYSTEM_UID) {
+                Slog.w(PackageManagerService.TAG,
+                        "Non System Server process reporting dex loads as system server. uid="
+                                + callingUid);
                 // Do not record dex loads from processes pretending to be system server.
                 // Only the system server should be assigned the package "android", so reject calls
                 // that don't satisfy the constraint.
                 //
                 // notifyDexLoad is a PM API callable from the app process. So in theory, apps could
-                // craft calls to this API and pretend to be system server. Doing so poses no particular
-                // danger for dex load reporting or later dexopt, however it is a sensible check to do
-                // in order to verify the expectations.
+                // craft calls to this API and pretend to be system server. Doing so poses no
+                // particular danger for dex load reporting or later dexopt, however it is a
+                // sensible check to do in order to verify the expectations.
                 return;
             }
 
             int userId = UserHandle.getCallingUserId();
-            ApplicationInfo ai = getApplicationInfo(loadingPackageName, /*flags*/ 0, userId);
+            ApplicationInfo ai = snapshot().getApplicationInfo(loadingPackageName, /*flags*/ 0,
+                    userId);
             if (ai == null) {
                 Slog.w(PackageManagerService.TAG, "Loading a package that does not exist for the calling user. package="
                         + loadingPackageName + ", user=" + userId);
@@ -6115,11 +5242,13 @@
         public void notifyPackageUse(String packageName, int reason) {
             final int callingUid = Binder.getCallingUid();
             final int callingUserId = UserHandle.getUserId(callingUid);
+            Computer snapshot = snapshotComputer();
             final boolean notify;
-            if (getInstantAppPackageName(callingUid) != null) {
-                notify = isCallerSameApp(packageName, callingUid);
+            if (snapshot.getInstantAppPackageName(callingUid) != null) {
+                notify = snapshot.isCallerSameApp(packageName, callingUid);
             } else {
-                notify = !isInstantAppInternal(packageName, callingUserId, Process.SYSTEM_UID);
+                notify = !snapshot.isInstantAppInternal(packageName, callingUserId,
+                        Process.SYSTEM_UID);
             }
             if (!notify) {
                 return;
@@ -6137,102 +5266,18 @@
             updateComponentLabelIcon(componentName, nonLocalizedLabel, icon, userId);
         }
 
-        /**
-         * Ask the package manager to perform a dex-opt with the given compiler filter.
-         *
-         * Note: exposed only for the shell command to allow moving packages explicitly to a
-         *       definite state.
-         */
-        @Override
-        public boolean performDexOptMode(String packageName,
-                boolean checkProfiles, String targetCompilerFilter, boolean force,
-                boolean bootComplete, String splitName) {
-            return mDexOptHelper.performDexOptMode(packageName, checkProfiles, targetCompilerFilter,
-                    force, bootComplete, splitName);
-        }
-
-        /**
-         * Ask the package manager to perform a dex-opt with the given compiler filter on the
-         * secondary dex files belonging to the given package.
-         *
-         * Note: exposed only for the shell command to allow moving packages explicitly to a
-         *       definite state.
-         */
-        @Override
-        public boolean performDexOptSecondary(String packageName, String compilerFilter,
-                boolean force) {
-            return mDexOptHelper.performDexOptSecondary(packageName, compilerFilter, force);
-        }
-
-        @NonNull
-        @Override
-        public ParceledListSlice<ProviderInfo> queryContentProviders(@Nullable  String processName,
-                int uid, @PackageManager.ComponentInfoFlagsBits long flags,
-                @Nullable String metaDataKey) {
-            return mComputer.queryContentProviders(processName, uid, flags, metaDataKey);
-        }
-
-        @NonNull
-        @Override
-        public ParceledListSlice<InstrumentationInfo> queryInstrumentation(
-                @NonNull String targetPackage, int flags) {
-            return mComputer.queryInstrumentation(targetPackage, flags);
-        }
-
-        @Override
-        public @NonNull ParceledListSlice<ResolveInfo> queryIntentActivities(Intent intent,
-                String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
-            try {
-                Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "queryIntentActivities");
-
-                return new ParceledListSlice<>(snapshotComputer().queryIntentActivitiesInternal(intent,
-                        resolvedType, flags, userId));
-            } finally {
-                Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
-            }
-        }
-
-        @Override
-        public @NonNull ParceledListSlice<ResolveInfo> queryIntentActivityOptions(ComponentName caller,
-                Intent[] specifics, String[] specificTypes, Intent intent,
-                String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
-            return new ParceledListSlice<>(mResolveIntentHelper.queryIntentActivityOptionsInternal(
-                    snapshotComputer(), caller, specifics, specificTypes, intent, resolvedType, flags,
-                    userId));
-        }
-
-        @Override
-        public @NonNull ParceledListSlice<ResolveInfo> queryIntentContentProviders(Intent intent,
-                String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
-            return new ParceledListSlice<>(mResolveIntentHelper.queryIntentContentProvidersInternal(
-                    snapshotComputer(), intent, resolvedType, flags, userId));
-        }
-
-        @Override
-        public @NonNull ParceledListSlice<ResolveInfo> queryIntentReceivers(Intent intent,
-                String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
-            return new ParceledListSlice<>(mResolveIntentHelper.queryIntentReceiversInternal(
-                    snapshotComputer(), intent, resolvedType, flags, userId, Binder.getCallingUid()));
-        }
-
-        @Override
-        public @NonNull ParceledListSlice<ResolveInfo> queryIntentServices(Intent intent,
-                String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
-            final int callingUid = Binder.getCallingUid();
-            return new ParceledListSlice<>(snapshotComputer().queryIntentServicesInternal(
-                    intent, resolvedType, flags, userId, callingUid, false /*includeInstantApps*/));
-        }
-
         @Override
         public ParceledListSlice<PackageManager.Property> queryProperty(
                 String propertyName, @PackageManager.PropertyLocation int componentType) {
             Objects.requireNonNull(propertyName);
             final int callingUid = Binder.getCallingUid();
             final int callingUserId = UserHandle.getCallingUserId();
+            final Computer snapshot = snapshotComputer();
             final List<PackageManager.Property> result =
                     mPackageProperty.queryProperty(propertyName, componentType, packageName -> {
-                        final PackageStateInternal ps = getPackageStateInternal(packageName);
-                        return shouldFilterApplication(ps, callingUid, callingUserId);
+                        final PackageStateInternal ps =
+                                snapshot.getPackageStateInternal(packageName);
+                        return snapshot.shouldFilterApplication(ps, callingUid, callingUserId);
                     });
             if (result == null) {
                 return ParceledListSlice.emptyList();
@@ -6240,11 +5285,6 @@
             return new ParceledListSlice<>(result);
         }
 
-        @Deprecated
-        public void querySyncProviders(List<String> outNames, List<ProviderInfo> outInfo) {
-            mComputer.querySyncProviders(mSafeMode, outNames, outInfo);
-        }
-
         /**
          * Reconcile the information we have about the secondary dex files belonging to
          * {@code packageName} and the actual dex files. For all dex files that were
@@ -6252,9 +5292,10 @@
          */
         @Override
         public void reconcileSecondaryDexFiles(String packageName) {
-            if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+            final Computer snapshot = snapshotComputer();
+            if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
                 return;
-            } else if (isInstantAppInternal(
+            } else if (snapshot.isInstantAppInternal(
                     packageName, UserHandle.getCallingUserId(), Process.SYSTEM_UID)) {
                 return;
             }
@@ -6262,14 +5303,16 @@
         }
 
         @Override
-        public void registerDexModule(String packageName, String dexModulePath, boolean isSharedModule,
+        public void registerDexModule(String packageName, String dexModulePath,
+                boolean isSharedModule,
                 IDexModuleRegisterCallback callback) {
             int userId = UserHandle.getCallingUserId();
-            ApplicationInfo ai = getApplicationInfo(packageName, /*flags*/ 0, userId);
+            ApplicationInfo ai = snapshot().getApplicationInfo(packageName, /*flags*/ 0, userId);
             DexManager.RegisterDexModuleResult result;
             if (ai == null) {
-                Slog.w(PackageManagerService.TAG, "Registering a dex module for a package that does not exist for the" +
-                        " calling user. package=" + packageName + ", user=" + userId);
+                Slog.w(PackageManagerService.TAG,
+                        "Registering a dex module for a package that does not exist for the" +
+                                " calling user. package=" + packageName + ", user=" + userId);
                 result = new DexManager.RegisterDexModuleResult(false, "Package not installed");
             } else {
                 result = mDexManager.registerDexModule(ai, dexModulePath, isSharedModule, userId);
@@ -6278,9 +5321,11 @@
             if (callback != null) {
                 mHandler.post(() -> {
                     try {
-                        callback.onDexModuleRegistered(dexModulePath, result.success, result.message);
+                        callback.onDexModuleRegistered(dexModulePath, result.success,
+                                result.message);
                     } catch (RemoteException e) {
-                        Slog.w(PackageManagerService.TAG, "Failed to callback after module registration " + dexModulePath, e);
+                        Slog.w(PackageManagerService.TAG,
+                                "Failed to callback after module registration " + dexModulePath, e);
                     }
                 });
             }
@@ -6293,52 +5338,6 @@
             mMoveCallbacks.register(callback);
         }
 
-        // NOTE: Can't remove due to unsupported app usage
-        @Override
-        public void removePermission(String permName) {
-            // Because this is accessed via the package manager service AIDL,
-            // go through the permission manager service AIDL
-            mContext.getSystemService(PermissionManager.class).removePermission(permName);
-        }
-
-        @Override
-        public void replacePreferredActivity(IntentFilter filter, int match,
-                ComponentName[] set, ComponentName activity, int userId) {
-            mPreferredActivityHelper.replacePreferredActivity(new WatchedIntentFilter(filter),
-                    match, set, activity, userId);
-        }
-
-        @Override
-        public void resetApplicationPreferences(int userId) {
-            mPreferredActivityHelper.resetApplicationPreferences(userId);
-        }
-
-        @Override
-        public ProviderInfo resolveContentProvider(String name,
-                @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
-            return mComputer.resolveContentProvider(name, flags, userId, Binder.getCallingUid());
-        }
-
-        @Override
-        public ResolveInfo resolveIntent(Intent intent, String resolvedType,
-                @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
-            return mResolveIntentHelper.resolveIntentInternal(snapshotComputer(), intent, resolvedType,
-                    flags, 0 /*privateResolveFlags*/, userId, false, Binder.getCallingUid());
-        }
-
-        @Override
-        public ResolveInfo resolveService(Intent intent, String resolvedType,
-                @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
-            final int callingUid = Binder.getCallingUid();
-            return mResolveIntentHelper.resolveServiceInternal(snapshotComputer(), intent, resolvedType,
-                    flags, userId, callingUid);
-        }
-
-        @Override
-        public void restoreDefaultApps(byte[] backup, int userId) {
-            mPreferredActivityHelper.restoreDefaultApps(backup, userId);
-        }
-
         @Override
         public void restoreDomainVerification(byte[] backup, int userId) {
             if (Binder.getCallingUid() != Process.SYSTEM_UID) {
@@ -6366,11 +5365,6 @@
         }
 
         @Override
-        public void restorePreferredActivities(byte[] backup, int userId) {
-            mPreferredActivityHelper.restorePreferredActivities(backup, userId);
-        }
-
-        @Override
         public void sendDeviceCustomizationReadyBroadcast() {
             mContext.enforceCallingPermission(Manifest.permission.SEND_DEVICE_CUSTOMIZATION_READY,
                     "sendDeviceCustomizationReadyBroadcast");
@@ -6386,16 +5380,17 @@
         @Override
         public void setApplicationCategoryHint(String packageName, int categoryHint,
                 String callerPackageName) {
-            if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
-                throw new SecurityException("Instant applications don't have access to this method");
-            }
-            mInjector.getSystemService(AppOpsManager.class).checkPackage(Binder.getCallingUid(),
-                    callerPackageName);
-
             final PackageStateMutator.InitialState initialState = recordInitialState();
 
             final FunctionalUtils.ThrowingFunction<Computer, PackageStateMutator.Result>
                     implementation = computer -> {
+                if (computer.getInstantAppPackageName(Binder.getCallingUid()) != null) {
+                    throw new SecurityException(
+                            "Instant applications don't have access to this method");
+                }
+                mInjector.getSystemService(AppOpsManager.class)
+                        .checkPackage(Binder.getCallingUid(), callerPackageName);
+
                 PackageStateInternal packageState = computer.getPackageStateFiltered(packageName,
                         Binder.getCallingUid(), UserHandle.getCallingUserId());
                 if (packageState == null) {
@@ -6447,7 +5442,8 @@
                 int userId) {
             mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USERS, null);
             final int callingUid = Binder.getCallingUid();
-            enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
+            final Computer snapshot = snapshotComputer();
+            snapshot.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
                     true /* checkShell */, "setApplicationHiddenSetting for user " + userId);
 
             if (hidden && isPackageDeviceAdmin(packageName, userId)) {
@@ -6464,7 +5460,7 @@
             final long callingId = Binder.clearCallingIdentity();
             try {
                 final PackageStateInternal packageState =
-                        mComputer.getPackageStateFiltered(packageName, callingUid, userId);
+                        snapshot.getPackageStateFiltered(packageName, callingUid, userId);
                 if (packageState == null) {
                     return false;
                 }
@@ -6505,13 +5501,16 @@
                 commitPackageStateMutation(null, packageName, packageState1 ->
                         packageState1.userState(userId).setHidden(hidden));
 
-                final PackageStateInternal newPackageState = getPackageStateInternal(packageName);
+                final Computer newSnapshot = snapshotComputer();
+                final PackageStateInternal newPackageState =
+                        newSnapshot.getPackageStateInternal(packageName);
 
                 if (hidden) {
                     killApplication(packageName, newPackageState.getAppId(), userId, "hiding pkg");
                     sendApplicationHiddenForUser(packageName, newPackageState, userId);
                 } else {
-                    sendPackageAddedForUser(packageName, newPackageState, userId, DataLoaderType.NONE);
+                    sendPackageAddedForUser(newSnapshot, packageName, newPackageState, userId,
+                            DataLoaderType.NONE);
                 }
 
                 scheduleWritePackageRestrictions(userId);
@@ -6526,7 +5525,8 @@
                 int userId) {
             mContext.enforceCallingOrSelfPermission(
                     Manifest.permission.DELETE_PACKAGES, null);
-            PackageStateInternal packageState = getPackageStateInternal(packageName);
+            final Computer snapshot = snapshotComputer();
+            PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
             if (packageState != null && packageState.getPkg() != null) {
                 AndroidPackage pkg = packageState.getPkg();
                 // Cannot block uninstall SDK libs as they are controlled by SDK manager.
@@ -6584,8 +5584,10 @@
                         + userId);
             }
             Objects.requireNonNull(packageNames, "packageNames cannot be null");
+            final Computer snapshot = snapshotComputer();
             if (restrictionFlags != 0
-                    && !mSuspendPackageHelper.isSuspendAllowedForUser(userId, callingUid)) {
+                    && !mSuspendPackageHelper.isSuspendAllowedForUser(snapshot, userId,
+                    callingUid)) {
                 Slog.w(PackageManagerService.TAG, "Cannot restrict packages due to restrictions on user " + userId);
                 return packageNames;
             }
@@ -6595,16 +5597,15 @@
             final List<String> unactionedPackages = new ArrayList<>(packageNames.length);
 
             ArraySet<String> changesToCommit = new ArraySet<>();
-            Computer computer = snapshotComputer();
             final boolean[] canRestrict = (restrictionFlags != 0)
-                    ? mSuspendPackageHelper.canSuspendPackageForUser(computer, packageNames, userId,
+                    ? mSuspendPackageHelper.canSuspendPackageForUser(snapshot, packageNames, userId,
                     callingUid) : null;
             for (int i = 0; i < packageNames.length; i++) {
                 final String packageName = packageNames[i];
                 final PackageStateInternal packageState =
-                        computer.getPackageStateInternal(packageName);
+                        snapshot.getPackageStateInternal(packageName);
                 if (packageState == null
-                        || computer.shouldFilterApplication(packageState, callingUid, userId)) {
+                        || snapshot.shouldFilterApplication(packageState, callingUid, userId)) {
                     Slog.w(PackageManagerService.TAG, "Could not find package setting for package: " + packageName
                             + ". Skipping...");
                     unactionedPackages.add(packageName);
@@ -6648,11 +5649,13 @@
             final int callingUid = Binder.getCallingUid();
             final int callingAppId = UserHandle.getAppId(callingUid);
 
-            enforceCrossUserPermission(callingUid, userId, true /*requireFullPermission*/,
+            final Computer snapshot = snapshotComputer();
+            snapshot.enforceCrossUserPermission(callingUid, userId, true /*requireFullPermission*/,
                     true /*checkShell*/, "setHarmfulAppInfo");
 
             if (callingAppId != Process.SYSTEM_UID && callingAppId != Process.ROOT_UID &&
-                    checkUidPermission(SET_HARMFUL_APP_WARNINGS, callingUid) != PERMISSION_GRANTED) {
+                    snapshot.checkUidPermission(SET_HARMFUL_APP_WARNINGS, callingUid)
+                            != PERMISSION_GRANTED) {
                 throw new SecurityException("Caller must have the "
                         + SET_HARMFUL_APP_WARNINGS + " permission.");
             }
@@ -6667,11 +5670,6 @@
         }
 
         @Override
-        public void setHomeActivity(ComponentName comp, int userId) {
-            mPreferredActivityHelper.setHomeActivity(comp, userId);
-        }
-
-        @Override
         public boolean setInstallLocation(int loc) {
             mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS,
                     null);
@@ -6693,24 +5691,24 @@
             final int callingUid = Binder.getCallingUid();
             final int callingUserId = UserHandle.getUserId(callingUid);
             final FunctionalUtils.ThrowingCheckedFunction<Computer, Boolean, RuntimeException>
-                    implementation = computer -> {
-                if (computer.getInstantAppPackageName(callingUid) != null) {
+                    implementation = snapshot -> {
+                if (snapshot.getInstantAppPackageName(callingUid) != null) {
                     return false;
                 }
 
                 PackageStateInternal targetPackageState =
-                        computer.getPackageStateInternal(targetPackage);
+                        snapshot.getPackageStateInternal(targetPackage);
                 if (targetPackageState == null
-                        || computer.shouldFilterApplication(targetPackageState, callingUid,
+                        || snapshot.shouldFilterApplication(targetPackageState, callingUid,
                         callingUserId)) {
                     throw new IllegalArgumentException("Unknown target package: " + targetPackage);
                 }
 
                 PackageStateInternal installerPackageState = null;
                 if (installerPackageName != null) {
-                    installerPackageState = computer.getPackageStateInternal(installerPackageName);
+                    installerPackageState = snapshot.getPackageStateInternal(installerPackageName);
                     if (installerPackageState == null
-                            || shouldFilterApplication(
+                            || snapshot.shouldFilterApplication(
                             installerPackageState, callingUid, callingUserId)) {
                         throw new IllegalArgumentException("Unknown installer package: "
                                 + installerPackageName);
@@ -6720,7 +5718,7 @@
                 Signature[] callerSignature;
                 final int appId = UserHandle.getAppId(callingUid);
                 Pair<PackageStateInternal, SharedUserApi> either =
-                        computer.getPackageOrSharedUser(appId);
+                        snapshot.getPackageOrSharedUser(appId);
                 if (either != null) {
                     if (either.first != null) {
                         callerSignature = either.first.getSigningDetails().getSignatures();
@@ -6748,7 +5746,7 @@
                 String targetInstallerPackageName =
                         targetPackageState.getInstallSource().installerPackageName;
                 PackageStateInternal targetInstallerPkgSetting = targetInstallerPackageName == null
-                        ? null : computer.getPackageStateInternal(targetInstallerPackageName);
+                        ? null : snapshot.getPackageStateInternal(targetInstallerPackageName);
 
                 if (targetInstallerPkgSetting != null) {
                     if (compareSignatures(callerSignature,
@@ -6804,7 +5802,7 @@
                             }
                         }
                     }
-                    targetPackageState = getPackageStateInternal(targetPackage);
+                    targetPackageState = snapshotComputer().getPackageStateInternal(targetPackage);
                     mSettings.addInstallerPackageNames(targetPackageState.getInstallSource());
                 }
                 mAppsFilter.addPackage(targetPackageState);
@@ -6818,14 +5816,15 @@
                 return true;
             }
 
-            enforceCrossUserPermission(Binder.getCallingUid(), userId,
+            final Computer snapshot = snapshotComputer();
+            snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId,
                     true /* requireFullPermission */, true /* checkShell */,
                     "setInstantAppCookie");
-            if (!isCallerSameApp(packageName, Binder.getCallingUid())) {
+            if (!snapshot.isCallerSameApp(packageName, Binder.getCallingUid())) {
                 return false;
             }
 
-            PackageStateInternal packageState = getPackageStateInternal(packageName);
+            PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
             if (packageState == null || packageState.getPkg() == null) {
                 return false;
             }
@@ -6840,21 +5839,15 @@
                     "setKeepUninstalledPackages requires KEEP_UNINSTALLED_PACKAGES permission");
             Objects.requireNonNull(packageList);
 
-            setKeepUninstalledPackagesInternal(packageList);
-        }
-
-        @Override
-        public void setLastChosenActivity(Intent intent, String resolvedType, int flags,
-                IntentFilter filter, int match, ComponentName activity) {
-            mPreferredActivityHelper.setLastChosenActivity(intent, resolvedType, flags,
-                    new WatchedIntentFilter(filter), match, activity);
+            setKeepUninstalledPackagesInternal(snapshot(), packageList);
         }
 
         @Override
         public void setMimeGroup(String packageName, String mimeGroup, List<String> mimeTypes) {
-            enforceOwnerRights(packageName, Binder.getCallingUid());
+            final Computer snapshot = snapshotComputer();
+            enforceOwnerRights(snapshot, packageName, Binder.getCallingUid());
             mimeTypes = CollectionUtils.emptyIfNull(mimeTypes);
-            final PackageStateInternal packageState = getPackageStateInternal(packageName);
+            final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
             Set<String> existingMimeTypes = packageState.getMimeGroups().get(mimeGroup);
             if (existingMimeTypes == null) {
                 throw new IllegalArgumentException("Unknown MIME group " + mimeGroup
@@ -6889,11 +5882,11 @@
                 PersistableBundle appExtras, PersistableBundle launcherExtras,
                 SuspendDialogInfo dialogInfo, String callingPackage, int userId) {
             final int callingUid = Binder.getCallingUid();
-            enforceCanSetPackagesSuspendedAsUser(callingPackage, callingUid, userId,
+            final Computer snapshot = snapshotComputer();
+            enforceCanSetPackagesSuspendedAsUser(snapshot, callingPackage, callingUid, userId,
                     "setPackagesSuspendedAsUser");
-            return mSuspendPackageHelper.setPackagesSuspended(snapshotComputer(), packageNames,
-                    suspended, appExtras, launcherExtras, dialogInfo, callingPackage, userId,
-                    callingUid);
+            return mSuspendPackageHelper.setPackagesSuspended(snapshot, packageNames, suspended,
+                    appExtras, launcherExtras, dialogInfo, callingPackage, userId, callingUid);
         }
 
         @Override
@@ -6924,12 +5917,13 @@
         public void setSplashScreenTheme(@NonNull String packageName, @Nullable String themeId,
                 int userId) {
             final int callingUid = Binder.getCallingUid();
-            enforceCrossUserPermission(callingUid, userId, false /* requireFullPermission */,
+            final Computer snapshot = snapshotComputer();
+            snapshot.enforceCrossUserPermission(callingUid, userId, false /* requireFullPermission */,
                     false /* checkShell */, "setSplashScreenTheme");
-            enforceOwnerRights(packageName, callingUid);
+            enforceOwnerRights(snapshot, packageName, callingUid);
 
-            PackageStateInternal packageState = getPackageStateInstalledFiltered(packageName,
-                    callingUid, userId);
+            PackageStateInternal packageState = filterPackageStateForInstalledAndFiltered(snapshot,
+                    packageName, callingUid, userId);
             if (packageState == null) {
                 return;
             }
@@ -6939,80 +5933,6 @@
         }
 
         @Override
-        public void setSystemAppHiddenUntilInstalled(String packageName, boolean hidden) {
-            final int callingUid = Binder.getCallingUid();
-            final boolean calledFromSystemOrPhone = callingUid == Process.PHONE_UID
-                    || callingUid == Process.SYSTEM_UID;
-            if (!calledFromSystemOrPhone) {
-                mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS,
-                        "setSystemAppHiddenUntilInstalled");
-            }
-
-            final PackageStateInternal stateRead = getPackageStateInternal(packageName);
-            if (stateRead == null || !stateRead.isSystem() || stateRead.getPkg() == null) {
-                return;
-            }
-            if (stateRead.getPkg().isCoreApp() && !calledFromSystemOrPhone) {
-                throw new SecurityException("Only system or phone callers can modify core apps");
-            }
-
-            commitPackageStateMutation(null, mutator -> {
-                mutator.forPackage(packageName)
-                        .setHiddenUntilInstalled(hidden);
-                mutator.forDisabledSystemPackage(packageName)
-                        .setHiddenUntilInstalled(hidden);
-            });
-        }
-
-        @Override
-        public boolean setSystemAppInstallState(String packageName, boolean installed, int userId) {
-            final int callingUid = Binder.getCallingUid();
-            final boolean calledFromSystemOrPhone = callingUid == Process.PHONE_UID
-                    || callingUid == Process.SYSTEM_UID;
-            if (!calledFromSystemOrPhone) {
-                mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS,
-                        "setSystemAppHiddenUntilInstalled");
-            }
-
-            final PackageStateInternal packageState = getPackageStateInternal(packageName);
-            // The target app should always be in system
-            if (packageState == null || !packageState.isSystem() || packageState.getPkg() == null) {
-                return false;
-            }
-            if (packageState.getPkg().isCoreApp() && !calledFromSystemOrPhone) {
-                throw new SecurityException("Only system or phone callers can modify core apps");
-            }
-            // Check if the install state is the same
-            if (packageState.getUserStateOrDefault(userId).isInstalled() == installed) {
-                return false;
-            }
-
-            final long callingId = Binder.clearCallingIdentity();
-            try {
-                if (installed) {
-                    // install the app from uninstalled state
-                    installExistingPackageAsUser(
-                            packageName,
-                            userId,
-                            PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS,
-                            PackageManager.INSTALL_REASON_DEVICE_SETUP,
-                            null);
-                    return true;
-                }
-
-                // uninstall the app from installed state
-                deletePackageVersioned(
-                        new VersionedPackage(packageName, PackageManager.VERSION_CODE_HIGHEST),
-                        new PackageManager.LegacyPackageDeleteObserver(null).getBinder(),
-                        userId,
-                        PackageManager.DELETE_SYSTEM_APP);
-                return true;
-            } finally {
-                Binder.restoreCallingIdentity(callingId);
-            }
-        }
-
-        @Override
         public void setUpdateAvailable(String packageName, boolean updateAvailable) {
             mContext.enforceCallingOrSelfPermission(Manifest.permission.INSTALL_PACKAGES, null);
             commitPackageStateMutation(null, packageName, state ->
@@ -7026,19 +5946,6 @@
             mMoveCallbacks.unregister(callback);
         }
 
-        @Deprecated
-        @Override
-        public boolean updateIntentVerificationStatus(String packageName, int status, int userId) {
-            return mDomainVerificationManager.setLegacyUserState(packageName, userId, status);
-        }
-
-        @Deprecated
-        @Override
-        public void verifyIntentFilter(int id, int verificationCode, List<String> failedDomains) {
-            DomainVerificationProxyV1.queueLegacyVerifyResult(mContext, mDomainVerificationConnection,
-                    id, verificationCode, failedDomains, Binder.getCallingUid());
-        }
-
         @Override
         public void verifyPendingInstall(int id, int verificationCode) throws RemoteException {
             mContext.enforceCallingOrSelfPermission(
@@ -7059,9 +5966,9 @@
                 @Checksum.TypeMask int optional, @Checksum.TypeMask int required,
                 @Nullable List trustedInstallers,
                 @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId) {
-            requestChecksumsInternal(packageName, includeSplits, optional, required, trustedInstallers,
-                    onChecksumsReadyListener, userId, mInjector.getBackgroundExecutor(),
-                    mInjector.getBackgroundHandler());
+            requestChecksumsInternal(snapshotComputer(), packageName, includeSplits, optional,
+                    required, trustedInstallers, onChecksumsReadyListener, userId,
+                    mInjector.getBackgroundExecutor(), mInjector.getBackgroundHandler());
         }
 
         @Override
@@ -7074,12 +5981,6 @@
         }
 
         @Override
-        public boolean canPackageQuery(@NonNull String sourcePackageName,
-                @NonNull String targetPackageName, @UserIdInt int userId) {
-            return mComputer.canPackageQuery(sourcePackageName, targetPackageName, userId);
-        }
-
-        @Override
         public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
                 throws RemoteException {
             try {
@@ -7097,8 +5998,8 @@
         public void onShellCommand(FileDescriptor in, FileDescriptor out,
                 FileDescriptor err, String[] args, ShellCallback callback,
                 ResultReceiver resultReceiver) {
-            (new PackageManagerShellCommand(mIPackageManager,
-                    mContext,mDomainVerificationManager.getShell()))
+            (new PackageManagerShellCommand(this, mContext,
+                    mDomainVerificationManager.getShell()))
                     .exec(this, in, out, err, args, callback, resultReceiver);
         }
 
@@ -7113,17 +6014,81 @@
     private class PackageManagerLocalImpl implements PackageManagerLocal {
     }
 
-    private class PackageManagerInternalImpl extends PackageManagerInternal {
+    private class PackageManagerInternalImpl extends PackageManagerInternalBase {
+
+        public PackageManagerInternalImpl() {
+            super(PackageManagerService.this);
+        }
+
+        @NonNull
         @Override
-        public List<ApplicationInfo> getInstalledApplications(
-                @PackageManager.ApplicationInfoFlagsBits long flags, int userId, int callingUid) {
-            return PackageManagerService.this.mComputer.getInstalledApplications(flags, userId,
-                    callingUid);
+        protected Context getContext() {
+            return mContext;
+        }
+
+        @NonNull
+        @Override
+        protected PermissionManagerServiceInternal getPermissionManager() {
+            return mPermissionManager;
+        }
+
+        @NonNull
+        @Override
+        protected AppDataHelper getAppDataHelper() {
+            return mAppDataHelper;
+        }
+
+        @NonNull
+        @Override
+        protected PackageObserverHelper getPackageObserverHelper() {
+            return mPackageObserverHelper;
+        }
+
+        @NonNull
+        @Override
+        protected ResolveIntentHelper getResolveIntentHelper() {
+            return mResolveIntentHelper;
+        }
+
+        @NonNull
+        @Override
+        protected SuspendPackageHelper getSuspendPackageHelper() {
+            return mSuspendPackageHelper;
+        }
+
+        @NonNull
+        @Override
+        protected ProtectedPackages getProtectedPackages() {
+            return mProtectedPackages;
+        }
+
+        @NonNull
+        @Override
+        protected UserNeedsBadgingCache getUserNeedsBadging() {
+            return mUserNeedsBadging;
+        }
+
+        @NonNull
+        @Override
+        protected InstantAppRegistry getInstantAppRegistry() {
+            return mInstantAppRegistry;
+        }
+
+        @NonNull
+        @Override
+        protected ApexManager getApexManager() {
+            return mApexManager;
+        }
+
+        @NonNull
+        @Override
+        protected DexManager getDexManager() {
+            return mDexManager;
         }
 
         @Override
         public boolean isPlatformSigned(String packageName) {
-            PackageStateInternal packageState = getPackageStateInternal(packageName);
+            PackageStateInternal packageState = snapshot().getPackageStateInternal(packageName);
             if (packageState == null) {
                 return false;
             }
@@ -7135,7 +6100,8 @@
 
         @Override
         public boolean isDataRestoreSafe(byte[] restoringFromSigHash, String packageName) {
-            SigningDetails sd = getSigningDetails(packageName);
+            final Computer snapshot = snapshot();
+            SigningDetails sd = snapshot.getSigningDetails(packageName);
             if (sd == null) {
                 return false;
             }
@@ -7145,7 +6111,8 @@
 
         @Override
         public boolean isDataRestoreSafe(Signature restoringFromSig, String packageName) {
-            SigningDetails sd = getSigningDetails(packageName);
+            final Computer snapshot = snapshot();
+            SigningDetails sd = snapshot.getSigningDetails(packageName);
             if (sd == null) {
                 return false;
             }
@@ -7156,100 +6123,17 @@
         @Override
         public boolean hasSignatureCapability(int serverUid, int clientUid,
                 @SigningDetails.CertCapabilities int capability) {
-            SigningDetails serverSigningDetails = getSigningDetails(serverUid);
-            SigningDetails clientSigningDetails = getSigningDetails(clientUid);
+            final Computer snapshot = snapshot();
+            SigningDetails serverSigningDetails = snapshot.getSigningDetails(serverUid);
+            SigningDetails clientSigningDetails = snapshot.getSigningDetails(clientUid);
             return serverSigningDetails.checkCapability(clientSigningDetails, capability)
                     || clientSigningDetails.hasAncestorOrSelf(serverSigningDetails);
-
-        }
-
-        private SigningDetails getSigningDetails(@NonNull String packageName) {
-            return PackageManagerService.this.getSigningDetails(packageName);
-        }
-
-        private SigningDetails getSigningDetails(int uid) {
-            return PackageManagerService.this.getSigningDetails(uid);
-        }
-
-        @Override
-        public boolean isInstantApp(String packageName, int userId) {
-            return PackageManagerService.this.mIPackageManager.isInstantApp(packageName, userId);
-        }
-
-        @Override
-        public String getInstantAppPackageName(int uid) {
-            return PackageManagerService.this.getInstantAppPackageName(uid);
-        }
-
-        @Override
-        public boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) {
-            return PackageManagerService.this.filterAppAccess(pkg, callingUid, userId);
-        }
-
-        @Override
-        public boolean filterAppAccess(String packageName, int callingUid, int userId) {
-            return PackageManagerService.this.filterAppAccess(packageName, callingUid, userId);
-        }
-
-        @Override
-        public boolean filterAppAccess(int uid, int callingUid) {
-            return PackageManagerService.this.filterAppAccess(uid, callingUid);
-        }
-
-        @Nullable
-        @Override
-        public int[] getVisibilityAllowList(@NonNull String packageName, int userId) {
-            return PackageManagerService.this.getVisibilityAllowList(packageName, userId);
-        }
-
-        @Override
-        public boolean canQueryPackage(int callingUid, @Nullable String packageName) {
-            return PackageManagerService.this.canQueryPackage(callingUid, packageName);
-        }
-
-        @Override
-        public AndroidPackage getPackage(String packageName) {
-            return PackageManagerService.this.getPackage(packageName);
-        }
-
-        @Nullable
-        @Override
-        public AndroidPackageApi getAndroidPackage(@NonNull String packageName) {
-            return PackageManagerService.this.getPackage(packageName);
-        }
-
-        @Override
-        public AndroidPackage getPackage(int uid) {
-            return PackageManagerService.this.getPackage(uid);
-        }
-
-        @Override
-        public List<AndroidPackage> getPackagesForAppId(int appId) {
-            return mComputer.getPackagesForAppId(appId);
-        }
-
-        @Nullable
-        @Override
-        public PackageStateInternal getPackageStateInternal(String packageName) {
-            return PackageManagerService.this.getPackageStateInternal(packageName);
-        }
-
-        @Nullable
-        @Override
-        public PackageState getPackageState(@NonNull String packageName) {
-            return PackageManagerService.this.getPackageState(packageName);
-        }
-
-        @NonNull
-        @Override
-        public ArrayMap<String, ? extends PackageStateInternal> getPackageStates() {
-            return PackageManagerService.this.getPackageStates();
         }
 
         @Override
         public PackageList getPackageList(@Nullable PackageListObserver observer) {
             final ArrayList<String> list = new ArrayList<>();
-            forEachPackageState(packageState -> {
+            PackageManagerService.this.forEachPackageState(snapshot(), packageState -> {
                 AndroidPackage pkg = packageState.getPkg();
                 if (pkg != null) {
                     list.add(pkg.getPackageName());
@@ -7263,19 +6147,9 @@
         }
 
         @Override
-        public void removePackageListObserver(PackageListObserver observer) {
-            mPackageObserverHelper.removeObserver(observer);
-        }
-
-        @Override
-        public PackageStateInternal getDisabledSystemPackage(@NonNull String packageName) {
-            return snapshotComputer().getDisabledSystemPackage(packageName);
-        }
-
-        @Override
         public @Nullable
         String getDisabledSystemPackageName(@NonNull String packageName) {
-            PackageStateInternal disabledPkgSetting = getDisabledSystemPackage(
+            PackageStateInternal disabledPkgSetting = snapshot().getDisabledSystemPackage(
                     packageName);
             AndroidPackage disabledPkg = disabledPkgSetting == null
                     ? null : disabledPkgSetting.getPkg();
@@ -7283,51 +6157,15 @@
         }
 
         @Override
-        public @NonNull String[] getKnownPackageNames(int knownPackage, int userId) {
-            return PackageManagerService.this.getKnownPackageNamesInternal(knownPackage, userId);
-        }
-
-        @Override
-        public boolean isSameApp(@Nullable String packageName, int callingUid, int userId) {
-            if (packageName == null) {
-                return false;
-            }
-
-            if (Process.isSdkSandboxUid(callingUid)) {
-                return packageName.equals(getSdkSandboxPackageName());
-            }
-            int uid = getPackageUid(packageName, 0, userId);
-            return UserHandle.isSameApp(uid, callingUid);
-        }
-
-        @Override
         public boolean isResolveActivityComponent(ComponentInfo component) {
             return mResolveActivity.packageName.equals(component.packageName)
                     && mResolveActivity.name.equals(component.name);
         }
 
         @Override
-        public void setKeepUninstalledPackages(final List<String> packageList) {
-            PackageManagerService.this.setKeepUninstalledPackagesInternal(packageList);
-        }
-
-        @Override
-        public boolean isPermissionsReviewRequired(String packageName, int userId) {
-            return mPermissionManager.isPermissionsReviewRequired(packageName, userId);
-        }
-
-        @Override
-        public PackageInfo getPackageInfo(
-                String packageName, @PackageManager.PackageInfoFlagsBits long flags,
-                int filterCallingUid, int userId) {
-            return PackageManagerService.this.mComputer
-                    .getPackageInfoInternal(packageName, PackageManager.VERSION_CODE_HIGHEST,
-                            flags, filterCallingUid, userId);
-        }
-
-        @Override
         public long getCeDataInode(String packageName, int userId) {
-            final PackageStateInternal packageState = getPackageStateInternal(packageName);
+            final PackageStateInternal packageState =
+                    snapshot().getPackageStateInternal(packageName);
             if (packageState == null) {
                 return 0;
             } else {
@@ -7336,18 +6174,6 @@
         }
 
         @Override
-        public Bundle getSuspendedPackageLauncherExtras(String packageName, int userId) {
-            return mSuspendPackageHelper.getSuspendedPackageLauncherExtras(
-                    packageName, userId, Binder.getCallingUid());
-        }
-
-        @Override
-        public boolean isPackageSuspended(String packageName, int userId) {
-            return mSuspendPackageHelper.isPackageSuspended(
-                    packageName, userId, Binder.getCallingUid());
-        }
-
-        @Override
         public void removeAllNonSystemPackageSuspensions(int userId) {
             final Computer computer = snapshotComputer();
             final String[] allPackages = computer.getAllAvailablePackageNames();
@@ -7357,14 +6183,6 @@
         }
 
         @Override
-        public void removeNonSystemPackageSuspensions(String packageName, int userId) {
-            mSuspendPackageHelper.removeSuspensionsBySuspendingPackage(snapshotComputer(),
-                    new String[]{packageName},
-                    (suspendingPackage) -> !PLATFORM_PACKAGE_NAME.equals(suspendingPackage),
-                    userId);
-        }
-
-        @Override
         public void flushPackageRestrictions(int userId) {
             synchronized (mLock) {
                 PackageManagerService.this.flushPackageRestrictionsAsUserInternalLocked(userId);
@@ -7372,103 +6190,6 @@
         }
 
         @Override
-        public void removeDistractingPackageRestrictions(String packageName, int userId) {
-            PackageManagerService.this.removeDistractingPackageRestrictions(
-                    new String[]{packageName}, userId);
-        }
-
-        @Override
-        public void removeAllDistractingPackageRestrictions(int userId) {
-            PackageManagerService.this.removeAllDistractingPackageRestrictions(userId);
-        }
-
-        @Override
-        public String getSuspendingPackage(String suspendedPackage, int userId) {
-            return mSuspendPackageHelper.getSuspendingPackage(
-                    suspendedPackage, userId, Binder.getCallingUid());
-        }
-
-        @Override
-        public SuspendDialogInfo getSuspendedDialogInfo(String suspendedPackage,
-                String suspendingPackage, int userId) {
-            return mSuspendPackageHelper.getSuspendedDialogInfo(
-                    suspendedPackage, suspendingPackage, userId, Binder.getCallingUid());
-        }
-
-        @Override
-        public int getDistractingPackageRestrictions(String packageName, int userId) {
-            final PackageStateInternal packageState = getPackageStateInternal(packageName);
-            return (packageState == null) ? RESTRICTION_NONE
-                    : packageState.getUserStateOrDefault(userId).getDistractionFlags();
-        }
-
-        @Override
-        public int getPackageUid(String packageName,
-                @PackageManager.PackageInfoFlagsBits long flags, int userId) {
-            return PackageManagerService.this
-                    .getPackageUidInternal(packageName, flags, userId, Process.SYSTEM_UID);
-        }
-
-        @Override
-        public ApplicationInfo getApplicationInfo(
-                String packageName, @PackageManager.ApplicationInfoFlagsBits long flags,
-                int filterCallingUid, int userId) {
-            return PackageManagerService.this
-                    .getApplicationInfoInternal(packageName, flags, filterCallingUid, userId);
-        }
-
-        @Override
-        public ActivityInfo getActivityInfo(
-                ComponentName component, @PackageManager.ComponentInfoFlagsBits long flags,
-                int filterCallingUid, int userId) {
-            return PackageManagerService.this
-                    .getActivityInfoInternal(component, flags, filterCallingUid, userId);
-        }
-
-        @Override
-        public List<ResolveInfo> queryIntentActivities(
-                Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
-                int filterCallingUid, int userId) {
-            return snapshotComputer().queryIntentActivitiesInternal(intent, resolvedType, flags,
-                    userId);
-        }
-
-        @Override
-        public List<ResolveInfo> queryIntentReceivers(Intent intent,
-                String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
-                int filterCallingUid, int userId) {
-            return PackageManagerService.this.mResolveIntentHelper.queryIntentReceiversInternal(
-                    snapshotComputer(), intent, resolvedType, flags, userId, filterCallingUid);
-        }
-
-        @Override
-        public List<ResolveInfo> queryIntentServices(
-                Intent intent, @PackageManager.ResolveInfoFlagsBits long flags, int callingUid,
-                int userId) {
-            final String resolvedType = intent.resolveTypeIfNeeded(mContext.getContentResolver());
-            return PackageManagerService.this
-                    .queryIntentServicesInternal(intent, resolvedType, flags, userId, callingUid,
-                            false);
-        }
-
-        @Override
-        public ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates,
-                int userId) {
-            return PackageManagerService.this.getHomeActivitiesAsUser(allHomeCandidates, userId);
-        }
-
-        @Override
-        public ComponentName getDefaultHomeActivity(int userId) {
-            return PackageManagerService.this.getDefaultHomeActivity(userId);
-        }
-
-        @Override
-        public ComponentName getSystemUiServiceComponent() {
-            return ComponentName.unflattenFromString(mContext.getResources().getString(
-                    com.android.internal.R.string.config_systemUIServiceComponent));
-        }
-
-        @Override
         public void setDeviceAndProfileOwnerPackages(
                 int deviceOwnerUserId, String deviceOwnerPackage,
                 SparseArray<String> profileOwnerPackages) {
@@ -7487,118 +6208,6 @@
         }
 
         @Override
-        public void setDeviceOwnerProtectedPackages(
-                String deviceOwnerPackageName, List<String> packageNames) {
-            mProtectedPackages.setDeviceOwnerProtectedPackages(
-                    deviceOwnerPackageName, packageNames);
-        }
-
-        @Override
-        public boolean isPackageDataProtected(int userId, String packageName) {
-            return mProtectedPackages.isPackageDataProtected(userId, packageName);
-        }
-
-        @Override
-        public boolean isPackageStateProtected(String packageName, int userId) {
-            return mProtectedPackages.isPackageStateProtected(userId, packageName);
-        }
-
-        @Override
-        public boolean isPackageEphemeral(int userId, String packageName) {
-            final PackageStateInternal packageState = getPackageStateInternal(packageName);
-            return packageState != null
-                    && packageState.getUserStateOrDefault(userId).isInstantApp();
-        }
-
-        @Override
-        public boolean wasPackageEverLaunched(String packageName, int userId) {
-            final PackageStateInternal packageState = getPackageStateInternal(packageName);
-            if (packageState == null) {
-                throw new IllegalArgumentException("Unknown package: " + packageName);
-            }
-            return !packageState.getUserStateOrDefault(userId).isNotLaunched();
-        }
-
-        @Override
-        public boolean isEnabledAndMatches(ParsedMainComponent component, long flags, int userId) {
-            return PackageStateUtils.isEnabledAndMatches(
-                    getPackageStateInternal(component.getPackageName()), component, flags, userId);
-        }
-
-        @Override
-        public boolean userNeedsBadging(int userId) {
-            synchronized (mLock) {
-                return PackageManagerService.this.userNeedsBadging(userId);
-            }
-        }
-
-        @Override
-        public String getNameForUid(int uid) {
-            return mIPackageManager.getNameForUid(uid);
-        }
-
-        @Override
-        public void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj,
-                Intent origIntent, String resolvedType, String callingPackage,
-                @Nullable String callingFeatureId, boolean isRequesterInstantApp,
-                Bundle verificationBundle, int userId) {
-            PackageManagerService.this.requestInstantAppResolutionPhaseTwo(responseObj, origIntent,
-                    resolvedType, callingPackage, callingFeatureId, isRequesterInstantApp,
-                    verificationBundle, userId);
-        }
-
-        @Override
-        public void grantImplicitAccess(int userId, Intent intent,
-                int recipientAppId, int visibleUid, boolean direct) {
-            grantImplicitAccess(userId, intent, recipientAppId, visibleUid, direct,
-                    false /* retainOnUpdate */);
-        }
-
-        @Override
-        public void grantImplicitAccess(int userId, Intent intent,
-                int recipientAppId, int visibleUid, boolean direct, boolean retainOnUpdate) {
-            Computer computer = snapshotComputer();
-            final AndroidPackage visiblePackage = computer.getPackage(visibleUid);
-            final int recipientUid = UserHandle.getUid(userId, recipientAppId);
-            if (visiblePackage == null || computer.getPackage(recipientUid) == null) {
-                return;
-            }
-
-            final boolean instantApp = computer.isInstantAppInternal(
-                    visiblePackage.getPackageName(), userId, visibleUid);
-            final boolean accessGranted;
-            if (instantApp) {
-                if (!direct) {
-                    // if the interaction that lead to this granting access to an instant app
-                    // was indirect (i.e.: URI permission grant), do not actually execute the
-                    // grant.
-                    return;
-                }
-                accessGranted = mInstantAppRegistry.grantInstantAccess(userId, intent,
-                        recipientAppId, UserHandle.getAppId(visibleUid) /*instantAppId*/);
-            } else {
-                accessGranted = mAppsFilter.grantImplicitAccess(recipientUid, visibleUid,
-                        retainOnUpdate);
-            }
-
-            if (accessGranted) {
-                ApplicationPackageManager.invalidateGetPackagesForUidCache();
-            }
-        }
-
-        @Override
-        public boolean isInstantAppInstallerComponent(ComponentName component) {
-            final ActivityInfo instantAppInstallerActivity = mInstantAppInstallerActivity;
-            return instantAppInstallerActivity != null
-                    && instantAppInstallerActivity.getComponentName().equals(component);
-        }
-
-        @Override
-        public void pruneInstantApps() {
-            mInstantAppRegistry.pruneInstantApps(snapshotComputer());
-        }
-
-        @Override
         public void pruneCachedApksInApex(@NonNull List<PackageInfo> apexPackages) {
             if (mCacheDir == null) {
                 return;
@@ -7606,11 +6215,12 @@
 
             final PackageCacher cacher = new PackageCacher(mCacheDir);
             synchronized (mLock) {
+                final Computer snapshot = snapshot();
                 for (int i = 0, size = apexPackages.size(); i < size; i++) {
                     final List<String> apkNames =
                             mApexManager.getApksInApex(apexPackages.get(i).packageName);
                     for (int j = 0, apksInApex = apkNames.size(); j < apksInApex; j++) {
-                        final AndroidPackage pkg = getPackage(apkNames.get(j));
+                        final AndroidPackage pkg = snapshot.getPackage(apkNames.get(j));
                         cacher.cleanCachedResult(new File(pkg.getPath()));
                     }
                 }
@@ -7618,10 +6228,6 @@
         }
 
         @Override
-        public String getSetupWizardPackageName() {
-            return mSetupWizardPackage;
-        }
-
         public void setExternalSourcesPolicy(ExternalSourcesPolicy policy) {
             if (policy != null) {
                 mExternalSourcesPolicy = policy;
@@ -7630,7 +6236,8 @@
 
         @Override
         public boolean isPackagePersistent(String packageName) {
-            final PackageStateInternal packageState = getPackageStateInternal(packageName);
+            final PackageStateInternal packageState =
+                    snapshot().getPackageStateInternal(packageName);
             if (packageState == null) {
                 return false;
             }
@@ -7641,16 +6248,20 @@
 
         @Override
         public List<PackageInfo> getOverlayPackages(int userId) {
+            final Computer snapshot = snapshotComputer();
             final ArrayList<PackageInfo> overlayPackages = new ArrayList<>();
-            forEachPackageState(packageState -> {
+            final ArrayMap<String, ? extends PackageStateInternal> packageStates =
+                    snapshot.getPackageStates();
+            for (int index = 0; index < packageStates.size(); index++) {
+                final PackageStateInternal packageState = packageStates.valueAt(index);
                 final AndroidPackage pkg = packageState.getPkg();
                 if (pkg != null && pkg.getOverlayTarget() != null) {
-                    PackageInfo pkgInfo = generatePackageInfo(packageState, 0, userId);
+                    PackageInfo pkgInfo = snapshot.generatePackageInfo(packageState, 0, userId);
                     if (pkgInfo != null) {
                         overlayPackages.add(pkgInfo);
                     }
                 }
-            });
+            }
 
             return overlayPackages;
         }
@@ -7658,7 +6269,7 @@
         @Override
         public List<String> getTargetPackageNames(int userId) {
             List<String> targetPackages = new ArrayList<>();
-            forEachPackageState(packageState -> {
+            PackageManagerService.this.forEachPackageState(snapshot(), packageState -> {
                 final AndroidPackage pkg = packageState.getPkg();
                 if (pkg != null && !pkg.isOverlay()) {
                     targetPackages.add(pkg.getPackageName());
@@ -7676,30 +6287,6 @@
         }
 
         @Override
-        public ResolveInfo resolveIntent(Intent intent, String resolvedType,
-                @PackageManager.ResolveInfoFlagsBits long flags,
-                @PackageManagerInternal.PrivateResolveFlags long privateResolveFlags, int userId,
-                boolean resolveForStart, int filterCallingUid) {
-            return mResolveIntentHelper.resolveIntentInternal(snapshotComputer(),
-                    intent, resolvedType, flags, privateResolveFlags, userId, resolveForStart,
-                    filterCallingUid);
-        }
-
-        @Override
-        public ResolveInfo resolveService(Intent intent, String resolvedType,
-                @PackageManager.ResolveInfoFlagsBits long flags, int userId, int callingUid) {
-            return mResolveIntentHelper.resolveServiceInternal(snapshotComputer(), intent,
-                    resolvedType, flags, userId, callingUid);
-        }
-
-        @Override
-        public ProviderInfo resolveContentProvider(String name,
-                @PackageManager.ResolveInfoFlagsBits long flags, int userId, int callingUid) {
-            return PackageManagerService.this.mComputer
-                    .resolveContentProvider(name, flags, userId,callingUid);
-        }
-
-        @Override
         public void addIsolatedUid(int isolatedUid, int ownerUid) {
             synchronized (mLock) {
                 mIsolatedOwners.put(isolatedUid, ownerUid);
@@ -7714,146 +6301,12 @@
         }
 
         @Override
-        public int getUidTargetSdkVersion(int uid) {
-            return PackageManagerService.this.getUidTargetSdkVersion(uid);
-        }
-
-        @Override
-        public int getPackageTargetSdkVersion(String packageName) {
-            final PackageStateInternal packageState = getPackageStateInternal(packageName);
-            if (packageState != null && packageState.getPkg() != null) {
-                return packageState.getPkg().getTargetSdkVersion();
-            }
-            return Build.VERSION_CODES.CUR_DEVELOPMENT;
-        }
-
-        @Override
-        public boolean canAccessInstantApps(int callingUid, int userId) {
-            return PackageManagerService.this.canViewInstantApps(callingUid, userId);
-        }
-
-        @Override
-        public boolean canAccessComponent(int callingUid, @NonNull ComponentName component,
-                @UserIdInt int userId) {
-            return mComputer.canAccessComponent(callingUid, component, userId);
-        }
-
-        @Override
-        public boolean hasInstantApplicationMetadata(String packageName, int userId) {
-            return mInstantAppRegistry.hasInstantApplicationMetadata(packageName, userId);
-        }
-
-        @Override
         public void notifyPackageUse(String packageName, int reason) {
             synchronized (mLock) {
                 PackageManagerService.this.notifyPackageUseInternal(packageName, reason);
             }
         }
 
-        @Override
-        public void onPackageProcessKilledForUninstall(String packageName) {
-            mHandler.post(() -> PackageManagerService.this.notifyInstallObserver(packageName,
-                    true /* killApp */));
-        }
-
-        @Override
-        public SparseArray<String> getAppsWithSharedUserIds() {
-            return mComputer.getAppsWithSharedUserIds();
-        }
-
-        @Override
-        @NonNull
-        public String[] getSharedUserPackagesForPackage(String packageName, int userId) {
-            return mComputer.getSharedUserPackagesForPackage(packageName, userId);
-        }
-
-        @Override
-        public ArrayMap<String, ProcessInfo> getProcessesForUid(int uid) {
-            return mComputer.getProcessesForUid(uid);
-        }
-
-        @Override
-        public int[] getPermissionGids(String permissionName, int userId) {
-            return mPermissionManager.getPermissionGids(permissionName, userId);
-        }
-
-        @Override
-        public boolean isOnlyCoreApps() {
-            return mIPackageManager.isOnlyCoreApps();
-        }
-
-        @Override
-        public void freeStorage(String volumeUuid, long bytes,
-                @StorageManager.AllocateFlags int flags) throws IOException {
-            PackageManagerService.this.freeStorage(volumeUuid, bytes, flags);
-        }
-
-        @Override
-        public void freeAllAppCacheAboveQuota(@NonNull String volumeUuid) throws IOException {
-            PackageManagerService.this.freeAllAppCacheAboveQuota(volumeUuid);
-        }
-
-        @Override
-        public void forEachPackageSetting(Consumer<PackageSetting> actionLocked) {
-            PackageManagerService.this.forEachPackageSetting(actionLocked);
-        }
-
-        @Override
-        public void forEachPackageState(Consumer<PackageStateInternal> action) {
-            PackageManagerService.this.forEachPackageState(action);
-        }
-
-        @Override
-        public void forEachPackage(Consumer<AndroidPackage> action) {
-            PackageManagerService.this.forEachPackage(action);
-        }
-
-        @Override
-        public void forEachInstalledPackage(@NonNull Consumer<AndroidPackage> action,
-                @UserIdInt int userId) {
-            PackageManagerService.this.forEachInstalledPackage(action, userId);
-        }
-
-        @Override
-        public ArraySet<String> getEnabledComponents(String packageName, int userId) {
-            final PackageStateInternal packageState = getPackageStateInternal(packageName);
-            if (packageState == null) {
-                return new ArraySet<>();
-            }
-            return packageState.getUserStateOrDefault(userId).getEnabledComponents();
-        }
-
-        @Override
-        public ArraySet<String> getDisabledComponents(String packageName, int userId) {
-            final PackageStateInternal packageState = getPackageStateInternal(packageName);
-            if (packageState == null) {
-                return new ArraySet<>();
-            }
-            return packageState.getUserStateOrDefault(userId).getDisabledComponents();
-        }
-
-        @Override
-        public @PackageManager.EnabledState int getApplicationEnabledState(
-                String packageName, int userId) {
-            final PackageStateInternal packageState = getPackageStateInternal(packageName);
-            if (packageState == null) {
-                return COMPONENT_ENABLED_STATE_DEFAULT;
-            }
-            return packageState.getUserStateOrDefault(userId).getEnabledState();
-        }
-
-        @Override
-        public @PackageManager.EnabledState int getComponentEnabledSetting(
-                @NonNull ComponentName componentName, int callingUid, int userId) {
-            return PackageManagerService.this.mComputer.getComponentEnabledSettingInternal(
-                    componentName, callingUid, userId);
-        }
-
-        @Override
-        public void setEnableRollbackCode(int token, int enableRollbackCode) {
-            PackageManagerService.this.setEnableRollbackCode(token, enableRollbackCode);
-        }
-
         /**
          * Ask the package manager to compile layouts in the given package.
          */
@@ -7869,11 +6322,6 @@
             return mArtManagerService.compileLayouts(pkg);
         }
 
-        @Override
-        public void finishPackageInstall(int token, boolean didLaunch) {
-            mIPackageManager.finishPackageInstall(token, didLaunch);
-        }
-
         @Nullable
         @Override
         public String removeLegacyDefaultBrowserPackageName(int userId) {
@@ -7883,16 +6331,6 @@
         }
 
         @Override
-        public boolean isApexPackage(String packageName) {
-            return PackageManagerService.this.mApexManager.isApexPackage(packageName);
-        }
-
-        @Override
-        public List<String> getApksInApex(String apexPackageName) {
-            return PackageManagerService.this.mApexManager.getApksInApex(apexPackageName);
-        }
-
-        @Override
         public void uninstallApex(String packageName, long versionCode, int userId,
                 IntentSender intentSender, int flags) {
             final int callerUid = Binder.getCallingUid();
@@ -7967,11 +6405,6 @@
         }
 
         @Override
-        public boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid) {
-            return mComputer.isCallerInstallerOfRecord(pkg, callingUid);
-        }
-
-        @Override
         public boolean isPermissionUpgradeNeeded(int userId) {
             return mSettings.isPermissionUpgradeNeeded(userId);
         }
@@ -7985,13 +6418,9 @@
         }
 
         @Override
-        public List<String> getMimeGroup(String packageName, String mimeGroup) {
-            return PackageManagerService.this.getMimeGroupInternal(packageName, mimeGroup);
-        }
-
-        @Override
         public void setVisibilityLogging(String packageName, boolean enable) {
-            final PackageStateInternal packageState = getPackageStateInternal(packageName);
+            final PackageStateInternal packageState =
+                    snapshot().getPackageStateInternal(packageName);
             if (packageState == null) {
                 throw new IllegalStateException("No package found for " + packageName);
             }
@@ -7999,12 +6428,6 @@
         }
 
         @Override
-        public boolean isSystemPackage(@NonNull String packageName) {
-            return packageName.equals(
-                    PackageManagerService.this.ensureSystemPackageName(packageName));
-        }
-
-        @Override
         public void clearBlockUninstallForUser(@UserIdInt int userId) {
             synchronized (mLock) {
                 mSettings.clearBlockUninstallLPw(userId);
@@ -8013,21 +6436,11 @@
         }
 
         @Override
-        public void unsuspendForSuspendingPackage(final String packageName, int affectedUser) {
-            PackageManagerService.this.unsuspendForSuspendingPackage(snapshotComputer(),
-                    packageName, affectedUser);
-        }
-
-        @Override
-        public boolean isSuspendingAnyPackages(String suspendingPackage, int userId) {
-            return PackageManagerService.this.isSuspendingAnyPackages(suspendingPackage, userId);
-        }
-
-        @Override
         public boolean registerInstalledLoadingProgressCallback(String packageName,
                 PackageManagerInternal.InstalledLoadingProgressCallback callback, int userId) {
-            final PackageStateInternal ps =
-                    getPackageStateInstalledFiltered(packageName, Binder.getCallingUid(), userId);
+            final Computer snapshot = snapshotComputer();
+            final PackageStateInternal ps = filterPackageStateForInstalledAndFiltered(snapshot,
+                    packageName, Binder.getCallingUid(), userId);
             if (ps == null) {
                 return false;
             }
@@ -8048,8 +6461,9 @@
         @Override
         public IncrementalStatesInfo getIncrementalStatesInfo(
                 @NonNull String packageName, int filterCallingUid, int userId) {
-            final PackageStateInternal ps =
-                    getPackageStateInstalledFiltered(packageName, filterCallingUid, userId);
+            final Computer snapshot = snapshotComputer();
+            final PackageStateInternal ps = filterPackageStateForInstalledAndFiltered(snapshot,
+                    packageName, filterCallingUid, userId);
             if (ps == null) {
                 return null;
             }
@@ -8057,74 +6471,23 @@
         }
 
         @Override
-        public void requestChecksums(@NonNull String packageName, boolean includeSplits,
-                @Checksum.TypeMask int optional, @Checksum.TypeMask int required,
-                @Nullable List trustedInstallers,
-                @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId,
-                @NonNull Executor executor, @NonNull Handler handler) {
-            requestChecksumsInternal(packageName, includeSplits, optional, required,
-                    trustedInstallers, onChecksumsReadyListener, userId, executor, handler);
+        public boolean isSameApp(@Nullable String packageName, int callingUid, int userId) {
+            if (packageName == null) {
+                return false;
+            }
+
+            if (Process.isSdkSandboxUid(callingUid)) {
+                return packageName.equals(mRequiredSdkSandboxPackage);
+            }
+            Computer snapshot = snapshot();
+            int uid = snapshot.getPackageUid(packageName, 0, userId);
+            return UserHandle.isSameApp(uid, callingUid);
         }
 
         @Override
-        public boolean isPackageFrozen(@NonNull String packageName,
-                int callingUid, int userId) {
-            return PackageManagerService.this.getPackageStartability(
-                    packageName, callingUid, userId) == PACKAGE_STARTABILITY_FROZEN;
-        }
-
-        @Override
-        public long deleteOatArtifactsOfPackage(String packageName) {
-            return PackageManagerService.this.deleteOatArtifactsOfPackage(packageName);
-        }
-
-        @Override
-        public void reconcileAppsData(int userId, @StorageManager.StorageFlags int flags,
-                boolean migrateAppsData) {
-            PackageManagerService.this.mAppDataHelper.reconcileAppsData(userId, flags,
-                    migrateAppsData);
-        }
-
-        @Override
-        @NonNull
-        public ArraySet<PackageStateInternal> getSharedUserPackages(int sharedUserAppId) {
-            return PackageManagerService.this.mComputer.getSharedUserPackages(sharedUserAppId);
-        }
-
-        @Override
-        @Nullable
-        public SharedUserApi getSharedUserApi(int sharedUserAppId) {
-            return mComputer.getSharedUser(sharedUserAppId);
-        }
-
-        @NonNull
-        @Override
-        public PackageStateMutator.InitialState recordInitialState() {
-            return PackageManagerService.this.recordInitialState();
-        }
-
-        @Nullable
-        @Override
-        public PackageStateMutator.Result commitPackageStateMutation(
-                @Nullable PackageStateMutator.InitialState state,
-                @NonNull Consumer<PackageStateMutator> consumer) {
-            return PackageManagerService.this.commitPackageStateMutation(state, consumer);
-        }
-
-        @NonNull
-        @Override
-        public Computer snapshot() {
-            return snapshotComputer();
-        }
-
-        @Override
-        public void shutdown() {
-            PackageManagerService.this.shutdown();
-        }
-
-        @Override
-        public DynamicCodeLogger getDynamicCodeLogger() {
-            return PackageManagerService.this.getDexManager().getDynamicCodeLogger();
+        public void onPackageProcessKilledForUninstall(String packageName) {
+            mHandler.post(() -> PackageManagerService.this.notifyInstallObserver(packageName,
+                    true /* killApp */));
         }
     }
 
@@ -8239,24 +6602,6 @@
         return mSettings.getDisabledSystemPkgLPr(packageName);
     }
 
-    @VisibleForTesting(visibility = Visibility.PRIVATE)
-    @Nullable
-    PackageStateInternal getPackageStateInternal(String packageName) {
-        return mComputer.getPackageStateInternal(packageName);
-    }
-
-    @Nullable
-    PackageStateInternal getPackageStateInternal(String packageName, int callingUid) {
-        return mComputer.getPackageStateInternal(packageName, callingUid);
-    }
-
-    @Nullable
-    PackageStateInternal getPackageStateInstalledFiltered(@NonNull String packageName,
-            int callingUid, @UserIdInt int userId) {
-        return filterPackageStateForInstalledAndFiltered(mComputer, packageName, callingUid,
-                userId);
-    }
-
     @Nullable
     private PackageStateInternal filterPackageStateForInstalledAndFiltered(
             @NonNull Computer computer, @NonNull String packageName, int callingUid,
@@ -8272,22 +6617,8 @@
         }
     }
 
-    @Nullable
-    private PackageState getPackageState(String packageName) {
-        return mComputer.getPackageStateCopied(packageName);
-    }
-
-    @NonNull
-    ArrayMap<String, ? extends PackageStateInternal> getPackageStates() {
-        Computer computer = snapshotComputer();
-        if (computer == mLiveComputer) {
-            return new ArrayMap<>(computer.getPackageStates());
-        } else {
-            return computer.getPackageStates();
-        }
-    }
-
-    private void forEachPackageSetting(Consumer<PackageSetting> actionLocked) {
+    @Deprecated
+    void forEachPackageSetting(Consumer<PackageSetting> actionLocked) {
         synchronized (mLock) {
             int size = mSettings.getPackagesLocked().size();
             for (int index = 0; index < size; index++) {
@@ -8296,13 +6627,13 @@
         }
     }
 
-    void forEachPackageState(Consumer<PackageStateInternal> consumer) {
-        forEachPackageState(mComputer.getPackageStates(), consumer);
+    void forEachPackageState(@NonNull Computer snapshot, Consumer<PackageStateInternal> consumer) {
+        forEachPackageState(snapshot.getPackageStates(), consumer);
     }
 
-    void forEachPackage(Consumer<AndroidPackage> consumer) {
+    void forEachPackage(@NonNull Computer snapshot, Consumer<AndroidPackage> consumer) {
         final ArrayMap<String, ? extends PackageStateInternal> packageStates =
-                mComputer.getPackageStates();
+                snapshot.getPackageStates();
         int size = packageStates.size();
         for (int index = 0; index < size; index++) {
             PackageStateInternal packageState = packageStates.valueAt(index);
@@ -8322,7 +6653,7 @@
         }
     }
 
-    void forEachInstalledPackage(@NonNull Consumer<AndroidPackage> action,
+    void forEachInstalledPackage(@NonNull Computer snapshot, @NonNull Consumer<AndroidPackage> action,
             @UserIdInt int userId) {
         Consumer<PackageStateInternal> actionWrapped = packageState -> {
             if (packageState.getPkg() != null
@@ -8330,7 +6661,7 @@
                 action.accept(packageState.getPkg());
             }
         };
-        forEachPackageState(mComputer.getPackageStates(), actionWrapped);
+        forEachPackageState(snapshot.getPackageStates(), actionWrapped);
     }
 
     boolean isHistoricalPackageUsageAvailable() {
@@ -8345,15 +6676,7 @@
         return mCompilerStats.getOrCreatePackageStats(pkgName);
     }
 
-    /**
-     * Returns true if the system or user is explicitly preventing an otherwise valid installer to
-     * complete an install. This includes checks like unknown sources and user restrictions.
-     */
-    public boolean isInstallDisabledForPackage(String packageName, int uid, int userId) {
-        return mComputer.isInstallDisabledForPackage(packageName, uid, userId);
-    }
-
-    private void grantImplicitAccess(@NonNull Computer snapshot, @UserIdInt int userId,
+    void grantImplicitAccess(@NonNull Computer snapshot, @UserIdInt int userId,
             Intent intent, @AppIdInt int recipientAppId, int visibleUid, boolean direct,
             boolean retainOnUpdate) {
         final AndroidPackage visiblePackage = snapshot.getPackage(visibleUid);
@@ -8384,8 +6707,8 @@
         }
     }
 
-    boolean canHaveOatDir(String packageName) {
-        final PackageStateInternal packageState = getPackageStateInternal(packageName);
+    boolean canHaveOatDir(@NonNull Computer snapshot, String packageName) {
+        final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
         if (packageState == null || packageState.getPkg() == null) {
             return false;
         }
@@ -8393,8 +6716,8 @@
                 packageState.getTransientState().isUpdatedSystemApp());
     }
 
-    long deleteOatArtifactsOfPackage(String packageName) {
-        PackageStateInternal packageState = getPackageStateInternal(packageName);
+    long deleteOatArtifactsOfPackage(@NonNull Computer snapshot, String packageName) {
+        PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
         if (packageState == null || packageState.getPkg() == null) {
             return -1; // error code of deleteOptimizedFiles
         }
@@ -8402,13 +6725,9 @@
                 ArtUtils.createArtPackageInfo(packageState.getPkg(), packageState));
     }
 
-    @NonNull
-    Set<String> getUnusedPackages(long downgradeTimeThresholdMillis) {
-        return mComputer.getUnusedPackages(downgradeTimeThresholdMillis);
-    }
-
-    private List<String> getMimeGroupInternal(String packageName, String mimeGroup) {
-        final PackageStateInternal packageState = getPackageStateInternal(packageName);
+    List<String> getMimeGroupInternal(@NonNull Computer snapshot, String packageName,
+            String mimeGroup) {
+        final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
         if (packageState == null) {
             return Collections.emptyList();
         }
@@ -8473,16 +6792,16 @@
      * Returns the array containing per-uid timeout configuration.
      * This is derived from DeviceConfig flags.
      */
-    public @NonNull PerUidReadTimeouts[] getPerUidReadTimeouts() {
+    public @NonNull PerUidReadTimeouts[] getPerUidReadTimeouts(@NonNull Computer snapshot) {
         PerUidReadTimeouts[] result = mPerUidReadTimeoutsCache;
         if (result == null) {
-            result = parsePerUidReadTimeouts();
+            result = parsePerUidReadTimeouts(snapshot);
             mPerUidReadTimeoutsCache = result;
         }
         return result;
     }
 
-    private @NonNull PerUidReadTimeouts[] parsePerUidReadTimeouts() {
+    private @NonNull PerUidReadTimeouts[] parsePerUidReadTimeouts(@NonNull Computer snapshot) {
         final String defaultTimeouts = getDefaultTimeouts();
         final String knownDigestersList = getKnownDigestersList();
         final List<PerPackageReadTimeouts> perPackageReadTimeouts =
@@ -8496,7 +6815,8 @@
         final List<PerUidReadTimeouts> result = new ArrayList<>(perPackageReadTimeouts.size());
         for (int i = 0, size = perPackageReadTimeouts.size(); i < size; ++i) {
             final PerPackageReadTimeouts perPackage = perPackageReadTimeouts.get(i);
-            final PackageStateInternal ps = getPackageStateInternal(perPackage.packageName);
+            final PackageStateInternal ps =
+                    snapshot.getPackageStateInternal(perPackage.packageName);
             if (ps == null) {
                 if (DEBUG_PER_UID_READ_TIMEOUTS) {
                     Slog.i(TAG, "PerUidReadTimeouts: package not found = "
@@ -8546,7 +6866,7 @@
         return result.toArray(new PerUidReadTimeouts[result.size()]);
     }
 
-    private void setKeepUninstalledPackagesInternal(List<String> packageList) {
+    void setKeepUninstalledPackagesInternal(@NonNull Computer snapshot, List<String> packageList) {
         Preconditions.checkNotNull(packageList);
         synchronized (mKeepUninstalledPackages) {
             List<String> toRemove = new ArrayList<>(mKeepUninstalledPackages);
@@ -8556,7 +6876,7 @@
             mKeepUninstalledPackages.addAll(packageList);
 
             for (int i = 0; i < toRemove.size(); i++) {
-                deletePackageIfUnused(toRemove.get(i));
+                deletePackageIfUnused(snapshot, toRemove.get(i));
             }
         }
     }
@@ -8603,43 +6923,44 @@
         mInstrumentation.put(name, instrumentation);
     }
 
-    String[] getKnownPackageNamesInternal(int knownPackage, int userId) {
+    String[] getKnownPackageNamesInternal(@NonNull Computer snapshot, int knownPackage,
+            int userId) {
         switch (knownPackage) {
             case PackageManagerInternal.PACKAGE_BROWSER:
                 return new String[] { mDefaultAppProvider.getDefaultBrowser(userId) };
             case PackageManagerInternal.PACKAGE_INSTALLER:
-                return mComputer.filterOnlySystemPackages(mRequiredInstallerPackage);
+                return snapshot.filterOnlySystemPackages(mRequiredInstallerPackage);
             case PackageManagerInternal.PACKAGE_UNINSTALLER:
-                return mComputer.filterOnlySystemPackages(mRequiredUninstallerPackage);
+                return snapshot.filterOnlySystemPackages(mRequiredUninstallerPackage);
             case PackageManagerInternal.PACKAGE_SETUP_WIZARD:
-                return mComputer.filterOnlySystemPackages(mSetupWizardPackage);
+                return snapshot.filterOnlySystemPackages(mSetupWizardPackage);
             case PackageManagerInternal.PACKAGE_SYSTEM:
                 return new String[]{"android"};
             case PackageManagerInternal.PACKAGE_VERIFIER:
-                return mComputer.filterOnlySystemPackages(mRequiredVerifierPackage);
+                return snapshot.filterOnlySystemPackages(mRequiredVerifierPackage);
             case PackageManagerInternal.PACKAGE_SYSTEM_TEXT_CLASSIFIER:
-                return mComputer.filterOnlySystemPackages(
+                return snapshot.filterOnlySystemPackages(
                         mDefaultTextClassifierPackage, mSystemTextClassifierPackageName);
             case PackageManagerInternal.PACKAGE_PERMISSION_CONTROLLER:
-                return mComputer.filterOnlySystemPackages(mRequiredPermissionControllerPackage);
+                return snapshot.filterOnlySystemPackages(mRequiredPermissionControllerPackage);
             case PackageManagerInternal.PACKAGE_CONFIGURATOR:
-                return mComputer.filterOnlySystemPackages(mConfiguratorPackage);
+                return snapshot.filterOnlySystemPackages(mConfiguratorPackage);
             case PackageManagerInternal.PACKAGE_INCIDENT_REPORT_APPROVER:
-                return mComputer.filterOnlySystemPackages(mIncidentReportApproverPackage);
+                return snapshot.filterOnlySystemPackages(mIncidentReportApproverPackage);
             case PackageManagerInternal.PACKAGE_AMBIENT_CONTEXT_DETECTION:
-                return mComputer.filterOnlySystemPackages(mAmbientContextDetectionPackage);
+                return snapshot.filterOnlySystemPackages(mAmbientContextDetectionPackage);
             case PackageManagerInternal.PACKAGE_APP_PREDICTOR:
-                return mComputer.filterOnlySystemPackages(mAppPredictionServicePackage);
+                return snapshot.filterOnlySystemPackages(mAppPredictionServicePackage);
             case PackageManagerInternal.PACKAGE_COMPANION:
-                return mComputer.filterOnlySystemPackages(COMPANION_PACKAGE_NAME);
+                return snapshot.filterOnlySystemPackages(COMPANION_PACKAGE_NAME);
             case PackageManagerInternal.PACKAGE_RETAIL_DEMO:
                 return TextUtils.isEmpty(mRetailDemoPackage)
                         ? ArrayUtils.emptyArray(String.class)
                         : new String[] {mRetailDemoPackage};
             case PackageManagerInternal.PACKAGE_OVERLAY_CONFIG_SIGNATURE:
-                return mComputer.filterOnlySystemPackages(getOverlayConfigSignaturePackageName());
+                return snapshot.filterOnlySystemPackages(mOverlayConfigSignaturePackage);
             case PackageManagerInternal.PACKAGE_RECENTS:
-                return mComputer.filterOnlySystemPackages(mRecentsPackage);
+                return snapshot.filterOnlySystemPackages(mRecentsPackage);
             default:
                 return ArrayUtils.emptyArray(String.class);
         }
@@ -8659,10 +6980,6 @@
         mDefaultAppProvider.setDefaultBrowser(packageName, async, userId);
     }
 
-    ResolveInfo getInstantAppInstallerInfo() {
-        return mInstantAppInstallerInfo;
-    }
-
     PackageUsage getPackageUsage() {
         return mPackageUsage;
     }
@@ -8754,10 +7071,6 @@
         }
     }
 
-    ResolveInfo getResolveInfo() {
-        return mResolveInfo;
-    }
-
     ApplicationInfo getCoreAndroidApplication() {
         return mAndroidApplication;
     }
diff --git a/services/core/java/com/android/server/pm/PackageSender.java b/services/core/java/com/android/server/pm/PackageSender.java
index d380098..656d596 100644
--- a/services/core/java/com/android/server/pm/PackageSender.java
+++ b/services/core/java/com/android/server/pm/PackageSender.java
@@ -16,6 +16,7 @@
 
 package com.android.server.pm;
 
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.content.IIntentReceiver;
 import android.os.Bundle;
@@ -30,9 +31,9 @@
             Bundle extras, int flags, String targetPkg,
             IIntentReceiver finishedReceiver, int[] userIds, int[] instantUserIds,
             @Nullable SparseArray<int[]> broadcastAllowList, @Nullable Bundle bOptions);
-    void sendPackageAddedForNewUsers(String packageName, boolean sendBootCompleted,
-            boolean includeStopped, int appId, int[] userIds, int[] instantUserIds,
-            int dataLoaderType);
+    void sendPackageAddedForNewUsers(@NonNull Computer snapshot, String packageName,
+            boolean sendBootCompleted, boolean includeStopped, int appId, int[] userIds,
+            int[] instantUserIds, int dataLoaderType);
     void notifyPackageAdded(String packageName, int uid);
     void notifyPackageChanged(String packageName, int uid);
     void notifyPackageRemoved(String packageName, int uid);
diff --git a/services/core/java/com/android/server/pm/PreferredActivityHelper.java b/services/core/java/com/android/server/pm/PreferredActivityHelper.java
index 7253ae4..9befd6e 100644
--- a/services/core/java/com/android/server/pm/PreferredActivityHelper.java
+++ b/services/core/java/com/android/server/pm/PreferredActivityHelper.java
@@ -25,6 +25,7 @@
 import static com.android.server.pm.PackageManagerService.TAG;
 
 import android.annotation.NonNull;
+import android.annotation.UserIdInt;
 import android.content.ComponentName;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -74,17 +75,18 @@
         mPm = pm;
     }
 
-    private ResolveInfo findPreferredActivityNotLocked(Intent intent, String resolvedType,
-            @PackageManager.ResolveInfoFlagsBits long flags, List<ResolveInfo> query,
-            boolean always, boolean removeMatches, boolean debug, int userId) {
-        return findPreferredActivityNotLocked(
-                intent, resolvedType, flags, query, always, removeMatches, debug, userId,
+    private ResolveInfo findPreferredActivityNotLocked(@NonNull Computer snapshot, Intent intent,
+            String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
+            List<ResolveInfo> query, boolean always, boolean removeMatches, boolean debug,
+            @UserIdInt int userId) {
+        return findPreferredActivityNotLocked(snapshot, intent, resolvedType, flags, query, always,
+                removeMatches, debug, userId,
                 UserHandle.getAppId(Binder.getCallingUid()) >= Process.FIRST_APPLICATION_UID);
     }
 
     // TODO: handle preferred activities missing while user has amnesia
     /** <b>must not hold {@link PackageManagerService.mLock}</b> */
-    public ResolveInfo findPreferredActivityNotLocked(
+    public ResolveInfo findPreferredActivityNotLocked(@NonNull Computer snapshot,
             Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
             List<ResolveInfo> query, boolean always, boolean removeMatches, boolean debug,
             int userId, boolean queryMayBeFiltered) {
@@ -95,7 +97,7 @@
         if (!mPm.mUserManager.exists(userId)) return null;
 
         PackageManagerService.FindPreferredActivityBodyResult body =
-                mPm.findPreferredActivityInternal(
+                snapshot.findPreferredActivityInternal(
                 intent, resolvedType, flags, query, always,
                 removeMatches, debug, userId, queryMayBeFiltered);
         if (body.mChanged) {
@@ -117,7 +119,7 @@
             mPm.clearPackagePreferredActivitiesLPw(packageName, changedUsers, userId);
         }
         if (changedUsers.size() > 0) {
-            updateDefaultHomeNotLocked(changedUsers);
+            updateDefaultHomeNotLocked(mPm.snapshotComputer(), changedUsers);
             mPm.postPreferredActivityChangedBroadcast(userId);
             mPm.scheduleWritePackageRestrictions(userId);
         }
@@ -128,7 +130,7 @@
      *
      * @return Whether the ACTION_PREFERRED_ACTIVITY_CHANGED broadcast has been scheduled.
      */
-    public boolean updateDefaultHomeNotLocked(int userId) {
+    public boolean updateDefaultHomeNotLocked(@NonNull Computer snapshot, @UserIdInt int userId) {
         if (Thread.holdsLock(mPm.mLock)) {
             Slog.wtf(TAG, "Calling thread " + Thread.currentThread().getName()
                     + " is holding mLock", new Throwable());
@@ -139,10 +141,10 @@
             // before that.
             return false;
         }
-        final Intent intent = mPm.getHomeIntent();
-        final List<ResolveInfo> resolveInfos = mPm.snapshotComputer().queryIntentActivitiesInternal(
+        final Intent intent = snapshot.getHomeIntent();
+        final List<ResolveInfo> resolveInfos = snapshot.queryIntentActivitiesInternal(
                 intent, null, MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE, userId);
-        final ResolveInfo preferredResolveInfo = findPreferredActivityNotLocked(
+        final ResolveInfo preferredResolveInfo = findPreferredActivityNotLocked(snapshot,
                 intent, null, 0, resolveInfos, true, false, false, userId);
         final String packageName = preferredResolveInfo != null
                 && preferredResolveInfo.activityInfo != null
@@ -151,8 +153,7 @@
         if (TextUtils.equals(currentPackageName, packageName)) {
             return false;
         }
-        final String[] callingPackages = mPm.mIPackageManager
-                .getPackagesForUid(Binder.getCallingUid());
+        final String[] callingPackages = snapshot.getPackagesForUid(Binder.getCallingUid());
         if (callingPackages != null && ArrayUtils.contains(callingPackages,
                 mPm.mRequiredPermissionControllerPackage)) {
             // PermissionController manages default home directly.
@@ -174,23 +175,21 @@
     /**
      * Variant that takes a {@link WatchedIntentFilter}
      */
-    public void addPreferredActivity(WatchedIntentFilter filter, int match,
-            ComponentName[] set, ComponentName activity, boolean always, int userId,
+    public void addPreferredActivity(@NonNull Computer snapshot, WatchedIntentFilter filter,
+            int match, ComponentName[] set, ComponentName activity, boolean always, int userId,
             String opname, boolean removeExisting) {
         // writer
         int callingUid = Binder.getCallingUid();
-        mPm.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
+        snapshot.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
                 false /* checkShell */, "add preferred activity");
         if (mPm.mContext.checkCallingOrSelfPermission(
                 android.Manifest.permission.SET_PREFERRED_APPLICATIONS)
                 != PackageManager.PERMISSION_GRANTED) {
-            synchronized (mPm.mLock) {
-                if (mPm.getUidTargetSdkVersion(callingUid)
-                        < Build.VERSION_CODES.FROYO) {
-                    Slog.w(TAG, "Ignoring addPreferredActivity() from uid "
-                            + callingUid);
-                    return;
-                }
+            if (snapshot.getUidTargetSdkVersion(callingUid)
+                    < Build.VERSION_CODES.FROYO) {
+                Slog.w(TAG, "Ignoring addPreferredActivity() from uid "
+                        + callingUid);
+                return;
             }
             mPm.mContext.enforceCallingOrSelfPermission(
                     android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null);
@@ -214,7 +213,8 @@
                     new PreferredActivity(filter, match, set, activity, always));
             mPm.scheduleWritePackageRestrictions(userId);
         }
-        if (!(isHomeFilter(filter) && updateDefaultHomeNotLocked(userId))) {
+        // Re-snapshot after mLock
+        if (!(isHomeFilter(filter) && updateDefaultHomeNotLocked(mPm.snapshotComputer(), userId))) {
             mPm.postPreferredActivityChangedBroadcast(userId);
         }
     }
@@ -222,8 +222,8 @@
     /**
      * Variant that takes a {@link WatchedIntentFilter}
      */
-    public void replacePreferredActivity(WatchedIntentFilter filter, int match,
-            ComponentName[] set, ComponentName activity, int userId) {
+    public void replacePreferredActivity(@NonNull Computer snapshot, WatchedIntentFilter filter,
+            int match, ComponentName[] set, ComponentName activity, int userId) {
         if (filter.countActions() != 1) {
             throw new IllegalArgumentException(
                     "replacePreferredActivity expects filter to have only 1 action.");
@@ -238,13 +238,14 @@
         }
 
         final int callingUid = Binder.getCallingUid();
-        mPm.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
+        snapshot.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
                 false /* checkShell */, "replace preferred activity");
         if (mPm.mContext.checkCallingOrSelfPermission(
                 android.Manifest.permission.SET_PREFERRED_APPLICATIONS)
                 != PackageManager.PERMISSION_GRANTED) {
             synchronized (mPm.mLock) {
-                if (mPm.getUidTargetSdkVersion(callingUid)
+                // TODO: Remove lock?
+                if (mPm.snapshotComputer().getUidTargetSdkVersion(callingUid)
                         < Build.VERSION_CODES.FROYO) {
                     Slog.w(TAG, "Ignoring replacePreferredActivity() from uid "
                             + Binder.getCallingUid());
@@ -296,21 +297,23 @@
                 }
             }
         }
-        addPreferredActivity(filter, match, set, activity, true, userId,
+
+        // Retake a snapshot after editing with lock held
+        addPreferredActivity(mPm.snapshotComputer(), filter, match, set, activity, true, userId,
                 "Replacing preferred", false);
     }
 
-    public void clearPackagePreferredActivities(String packageName) {
+    public void clearPackagePreferredActivities(@NonNull Computer snapshot, String packageName) {
         final int callingUid = Binder.getCallingUid();
-        if (mPm.getInstantAppPackageName(callingUid) != null) {
+        if (snapshot.getInstantAppPackageName(callingUid) != null) {
             return;
         }
-        final PackageStateInternal packageState = mPm.getPackageStateInternal(packageName);
-        if (packageState == null || !mPm.isCallerSameApp(packageName, callingUid)) {
+        final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
+        if (packageState == null || !snapshot.isCallerSameApp(packageName, callingUid)) {
             if (mPm.mContext.checkCallingOrSelfPermission(
                     android.Manifest.permission.SET_PREFERRED_APPLICATIONS)
                     != PackageManager.PERMISSION_GRANTED) {
-                if (mPm.getUidTargetSdkVersion(callingUid)
+                if (snapshot.getUidTargetSdkVersion(callingUid)
                         < Build.VERSION_CODES.FROYO) {
                     Slog.w(TAG, "Ignoring clearPackagePreferredActivities() from uid "
                             + callingUid);
@@ -320,7 +323,7 @@
                         android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null);
             }
         }
-        if (packageState != null && mPm.shouldFilterApplication(packageState, callingUid,
+        if (packageState != null && snapshot.shouldFilterApplication(packageState, callingUid,
                 UserHandle.getUserId(callingUid))) {
             return;
         }
@@ -329,23 +332,23 @@
     }
 
     /** <b>must not hold {@link #PackageManagerService.mLock}</b> */
-    void updateDefaultHomeNotLocked(SparseBooleanArray userIds) {
+    void updateDefaultHomeNotLocked(@NonNull Computer snapshot, SparseBooleanArray userIds) {
         if (Thread.holdsLock(mPm.mLock)) {
             Slog.wtf(TAG, "Calling thread " + Thread.currentThread().getName()
                     + " is holding mLock", new Throwable());
         }
         for (int i = userIds.size() - 1; i >= 0; --i) {
             final int userId = userIds.keyAt(i);
-            updateDefaultHomeNotLocked(userId);
+            updateDefaultHomeNotLocked(snapshot, userId);
         }
     }
 
-    public void setHomeActivity(ComponentName comp, int userId) {
-        if (mPm.getInstantAppPackageName(Binder.getCallingUid()) != null) {
+    public void setHomeActivity(@NonNull Computer snapshot, ComponentName comp, int userId) {
+        if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
             return;
         }
         ArrayList<ResolveInfo> homeActivities = new ArrayList<>();
-        mPm.getHomeActivitiesAsUser(homeActivities, userId);
+        snapshot.getHomeActivitiesAsUser(homeActivities, userId);
 
         boolean found = false;
 
@@ -364,7 +367,7 @@
             throw new IllegalArgumentException("Component " + comp + " cannot be home on user "
                     + userId);
         }
-        replacePreferredActivity(getHomeFilter(), IntentFilter.MATCH_CATEGORY_EMPTY,
+        replacePreferredActivity(snapshot, getHomeFilter(), IntentFilter.MATCH_CATEGORY_EMPTY,
                 set, comp, userId);
     }
 
@@ -401,7 +404,7 @@
             mPm.scheduleWritePackageRestrictions(userId);
         }
         if (isHomeFilter(filter)) {
-            updateDefaultHomeNotLocked(userId);
+            updateDefaultHomeNotLocked(mPm.snapshotComputer(), userId);
         }
         mPm.postPreferredActivityChangedBroadcast(userId);
     }
@@ -417,7 +420,7 @@
             changed = mPm.mSettings.clearPackagePersistentPreferredActivities(packageName, userId);
         }
         if (changed) {
-            updateDefaultHomeNotLocked(userId);
+            updateDefaultHomeNotLocked(mPm.snapshotComputer(), userId);
             mPm.postPreferredActivityChangedBroadcast(userId);
             mPm.scheduleWritePackageRestrictions(userId);
         }
@@ -506,7 +509,7 @@
                         synchronized (mPm.mLock) {
                             mPm.mSettings.readPreferredActivitiesLPw(readParser, readUserId);
                         }
-                        updateDefaultHomeNotLocked(readUserId);
+                        updateDefaultHomeNotLocked(mPm.snapshotComputer(), readUserId);
                     });
         } catch (Exception e) {
             if (DEBUG_BACKUP) {
@@ -598,7 +601,7 @@
                     mPm.mPermissionManager.resetRuntimePermissions(pkg, userId);
                 }
             }
-            updateDefaultHomeNotLocked(userId);
+            updateDefaultHomeNotLocked(mPm.snapshotComputer(), userId);
             resetNetworkPolicies(userId);
             mPm.scheduleWritePackageRestrictions(userId);
         } finally {
@@ -610,12 +613,11 @@
         mPm.mInjector.getLocalService(NetworkPolicyManagerInternal.class).resetUserState(userId);
     }
 
-    // TODO: This method should not touch the Computer directly
-    public int getPreferredActivities(List<IntentFilter> outFilters,
-            List<ComponentName> outActivities, String packageName, Computer computer) {
+    public int getPreferredActivities(@NonNull Computer snapshot, List<IntentFilter> outFilters,
+            List<ComponentName> outActivities, String packageName) {
         List<WatchedIntentFilter> temp =
                 WatchedIntentFilter.toWatchedIntentFilterList(outFilters);
-        int result = getPreferredActivitiesInternal(temp, outActivities, packageName, computer);
+        int result = getPreferredActivitiesInternal(snapshot, temp, outActivities, packageName);
         outFilters.clear();
         for (int i = 0; i < temp.size(); i++) {
             outFilters.add(temp.get(i).getIntentFilter());
@@ -626,16 +628,17 @@
     /**
      * Variant that takes a {@link WatchedIntentFilter}
      */
-    private int getPreferredActivitiesInternal(List<WatchedIntentFilter> outFilters,
-            List<ComponentName> outActivities, String packageName, Computer computer) {
+    private int getPreferredActivitiesInternal(@NonNull Computer snapshot,
+            List<WatchedIntentFilter> outFilters, List<ComponentName> outActivities,
+            String packageName) {
         final int callingUid = Binder.getCallingUid();
-        if (mPm.getInstantAppPackageName(callingUid) != null) {
+        if (snapshot.getInstantAppPackageName(callingUid) != null) {
             return 0;
         }
         int num = 0;
         final int userId = UserHandle.getCallingUserId();
 
-        PreferredIntentResolver pir = computer.getPreferredActivities(userId);
+        PreferredIntentResolver pir = snapshot.getPreferredActivities(userId);
         if (pir != null) {
             final Iterator<PreferredActivity> it = pir.filterIterator();
             while (it.hasNext()) {
@@ -643,8 +646,9 @@
                 final String prefPackageName = pa.mPref.mComponent.getPackageName();
                 if (packageName == null
                         || (prefPackageName.equals(packageName) && pa.mPref.mAlways)) {
-                    if (mPm.shouldFilterApplication(
-                            mPm.getPackageStateInternal(prefPackageName), callingUid, userId)) {
+                    if (snapshot.shouldFilterApplication(
+                            snapshot.getPackageStateInternal(prefPackageName), callingUid,
+                            userId)) {
                         continue;
                     }
                     if (outFilters != null) {
@@ -660,7 +664,8 @@
         return num;
     }
 
-    public ResolveInfo findPersistentPreferredActivity(Intent intent, int userId) {
+    public ResolveInfo findPersistentPreferredActivity(@NonNull Computer snapshot, Intent intent,
+            int userId) {
         if (!UserHandle.isSameApp(Binder.getCallingUid(), Process.SYSTEM_UID)) {
             throw new SecurityException(
                     "findPersistentPreferredActivity can only be run by the system");
@@ -671,24 +676,23 @@
         final int callingUid = Binder.getCallingUid();
         intent = PackageManagerServiceUtils.updateIntentForResolve(intent);
         final String resolvedType = intent.resolveTypeIfNeeded(mPm.mContext.getContentResolver());
-        final long flags = mPm.updateFlagsForResolve(
+        final long flags = snapshot.updateFlagsForResolve(
                 0, userId, callingUid, false /*includeInstantApps*/,
-                mPm.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, resolvedType,
+                snapshot.isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId, resolvedType,
                         0));
-        final List<ResolveInfo> query = mPm.snapshotComputer().queryIntentActivitiesInternal(intent,
+        final List<ResolveInfo> query = snapshot.queryIntentActivitiesInternal(intent,
                 resolvedType, flags, userId);
-        synchronized (mPm.mLock) {
-            return mPm.findPersistentPreferredActivityLP(intent, resolvedType, flags, query, false,
-                    userId);
-        }
+        return snapshot.findPersistentPreferredActivity(intent, resolvedType, flags, query, false,
+                userId);
     }
 
     /**
      * Variant that takes a {@link WatchedIntentFilter}
      */
-    public void setLastChosenActivity(Intent intent, String resolvedType, int flags,
-            WatchedIntentFilter filter, int match, ComponentName activity) {
-        if (mPm.getInstantAppPackageName(Binder.getCallingUid()) != null) {
+    public void setLastChosenActivity(@NonNull Computer snapshot, Intent intent,
+            String resolvedType, int flags, WatchedIntentFilter filter, int match,
+            ComponentName activity) {
+        if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
             return;
         }
         final int userId = UserHandle.getCallingUserId();
@@ -702,25 +706,26 @@
             filter.dump(new PrintStreamPrinter(System.out), "    ");
         }
         intent.setComponent(null);
-        final List<ResolveInfo> query = mPm.snapshotComputer().queryIntentActivitiesInternal(intent,
+        final List<ResolveInfo> query = snapshot.queryIntentActivitiesInternal(intent,
                 resolvedType, flags, userId);
         // Find any earlier preferred or last chosen entries and nuke them
-        findPreferredActivityNotLocked(
-                intent, resolvedType, flags, query, false, true, false, userId);
+        findPreferredActivityNotLocked(snapshot, intent, resolvedType, flags, query, false, true,
+                false, userId);
         // Add the new activity as the last chosen for this filter
-        addPreferredActivity(filter, match, null, activity, false, userId,
+        addPreferredActivity(snapshot, filter, match, null, activity, false, userId,
                 "Setting last chosen", false);
     }
 
-    public ResolveInfo getLastChosenActivity(Intent intent, String resolvedType, int flags) {
-        if (mPm.getInstantAppPackageName(Binder.getCallingUid()) != null) {
+    public ResolveInfo getLastChosenActivity(@NonNull Computer snapshot, Intent intent,
+            String resolvedType, int flags) {
+        if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
             return null;
         }
         final int userId = UserHandle.getCallingUserId();
         if (DEBUG_PREFERRED) Log.v(TAG, "Querying last chosen activity for " + intent);
-        final List<ResolveInfo> query = mPm.snapshotComputer().queryIntentActivitiesInternal(intent,
+        final List<ResolveInfo> query = snapshot.queryIntentActivitiesInternal(intent,
                 resolvedType, flags, userId);
-        return findPreferredActivityNotLocked(
-                intent, resolvedType, flags, query, false, false, false, userId);
+        return findPreferredActivityNotLocked(snapshot, intent, resolvedType, flags, query, false,
+                false, false, userId);
     }
 }
diff --git a/services/core/java/com/android/server/pm/PreferredComponent.java b/services/core/java/com/android/server/pm/PreferredComponent.java
index 4ec042f..2a1ca2c 100644
--- a/services/core/java/com/android/server/pm/PreferredComponent.java
+++ b/services/core/java/com/android/server/pm/PreferredComponent.java
@@ -57,7 +57,6 @@
     private String mParseError;
 
     private final Callbacks mCallbacks;
-    private final String mSetupWizardPackageName;
 
     public interface Callbacks {
         public boolean onReadTag(String tagName, TypedXmlPullParser parser)
@@ -72,7 +71,6 @@
         mAlways = always;
         mShortComponent = component.flattenToShortString();
         mParseError = null;
-        mSetupWizardPackageName = null;
         if (set != null) {
             final int N = set.length;
             String[] myPackages = new String[N];
@@ -174,8 +172,6 @@
         mSetPackages = myPackages;
         mSetClasses = myClasses;
         mSetComponents = myComponents;
-        final PackageManagerInternal packageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
-        mSetupWizardPackageName = packageManagerInternal.getSetupWizardPackageName();
     }
 
     public String getParseError() {
@@ -209,6 +205,7 @@
         final int NQ = query.size();
         final int NS = mSetPackages.length;
         final PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
+        String setupWizardPackageName = pmi.getSetupWizardPackageName();
         int numMatch = 0;
         for (int i=0; i<NQ; i++) {
             ResolveInfo ri = query.get(i);
@@ -217,7 +214,7 @@
 
             // ignore SetupWizard package's launcher capability because it is only existed
             // during SetupWizard is running
-            if (excludeSetupWizardPackage && ai.packageName.equals(mSetupWizardPackageName)) {
+            if (excludeSetupWizardPackage && ai.packageName.equals(setupWizardPackageName)) {
                 continue;
             }
 
@@ -307,6 +304,8 @@
         if (!excludeSetupWizardPackage && NS < NQ) {
             return false;
         }
+        final PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
+        String setupWizardPackageName = pmi.getSetupWizardPackageName();
         for (int i=0; i<NQ; i++) {
             ResolveInfo ri = query.get(i);
             ActivityInfo ai = ri.activityInfo;
@@ -314,7 +313,7 @@
 
             // ignore SetupWizard package's launcher capability because it is only existed
             // during SetupWizard is running
-            if (excludeSetupWizardPackage && ai.packageName.equals(mSetupWizardPackageName)) {
+            if (excludeSetupWizardPackage && ai.packageName.equals(setupWizardPackageName)) {
                 continue;
             }
 
diff --git a/services/core/java/com/android/server/pm/RemovePackageHelper.java b/services/core/java/com/android/server/pm/RemovePackageHelper.java
index 88df843..b181cdd 100644
--- a/services/core/java/com/android/server/pm/RemovePackageHelper.java
+++ b/services/core/java/com/android/server/pm/RemovePackageHelper.java
@@ -118,7 +118,8 @@
 
     public void removePackageLI(AndroidPackage pkg, boolean chatty) {
         // Remove the parent package setting
-        PackageStateInternal ps = mPm.getPackageStateInternal(pkg.getPackageName());
+        PackageStateInternal ps = mPm.snapshotComputer()
+                .getPackageStateInternal(pkg.getPackageName());
         if (ps != null) {
             removePackageLI(ps.getPackageName(), chatty);
         } else if (DEBUG_REMOVE && chatty) {
@@ -271,8 +272,8 @@
             synchronized (mPm.mLock) {
                 mPm.mDomainVerificationManager.clearPackage(deletedPs.getPackageName());
                 mPm.mSettings.getKeySetManagerService().removeAppKeySetDataLPw(packageName);
-                mPm.mAppsFilter.removePackage(mPm.getPackageStateInternal(packageName),
-                        false /* isReplace */);
+                mPm.mAppsFilter.removePackage(mPm.snapshotComputer()
+                                .getPackageStateInternal(packageName), false /* isReplace */);
                 removedAppId = mPm.mSettings.removePackageLPw(packageName);
                 if (outInfo != null) {
                     outInfo.mRemovedAppId = removedAppId;
@@ -298,7 +299,8 @@
             if (changedUsers.size() > 0) {
                 final PreferredActivityHelper preferredActivityHelper =
                         new PreferredActivityHelper(mPm);
-                preferredActivityHelper.updateDefaultHomeNotLocked(changedUsers);
+                preferredActivityHelper.updateDefaultHomeNotLocked(mPm.snapshotComputer(),
+                        changedUsers);
                 mPm.postPreferredActivityChangedBroadcast(UserHandle.USER_ALL);
             }
         }
diff --git a/services/core/java/com/android/server/pm/ResolveIntentHelper.java b/services/core/java/com/android/server/pm/ResolveIntentHelper.java
index 25356a4..b74670b 100644
--- a/services/core/java/com/android/server/pm/ResolveIntentHelper.java
+++ b/services/core/java/com/android/server/pm/ResolveIntentHelper.java
@@ -115,7 +115,7 @@
             if (!mUserManager.exists(userId)) return null;
             final int callingUid = Binder.getCallingUid();
             flags = computer.updateFlagsForResolve(flags, userId, filterCallingUid, resolveForStart,
-                    computer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId,
+                    computer.isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId,
                             resolvedType, flags));
             computer.enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/,
                     false /*checkShell*/, "resolve intent");
@@ -170,9 +170,9 @@
                 }
                 // If we have saved a preference for a preferred activity for
                 // this Intent, use that.
-                ResolveInfo ri = mPreferredActivityHelper.findPreferredActivityNotLocked(intent,
-                        resolvedType, flags, query, true, false, debug, userId,
-                        queryMayBeFiltered);
+                ResolveInfo ri = mPreferredActivityHelper.findPreferredActivityNotLocked(computer,
+                        intent, resolvedType, flags, query, true, false, debug,
+                        userId, queryMayBeFiltered);
                 if (ri != null) {
                     return ri;
                 }
@@ -317,7 +317,7 @@
         final String instantAppPkgName = computer.getInstantAppPackageName(filterCallingUid);
         flags = computer.updateFlagsForResolve(flags, userId, filterCallingUid,
                 false /*includeInstantApps*/,
-                computer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId,
+                computer.isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId,
                         resolvedType, flags));
         Intent originalIntent = null;
         ComponentName comp = intent.getComponent();
@@ -562,7 +562,7 @@
         final int callingUid = Binder.getCallingUid();
         flags = computer.updateFlagsForResolve(flags, userId, callingUid,
                 false /*includeInstantApps*/,
-                computer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId,
+                computer.isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId,
                         resolvedType, flags));
         computer.enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/,
                 false /*checkShell*/, "query intent activity options");
diff --git a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java
index 3fe0790..479a404 100644
--- a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java
+++ b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java
@@ -741,9 +741,11 @@
         }
         SharedLibraryInfo libraryInfo = versionedLib.valueAt(libIdx);
 
+        final Computer snapshot = mPm.snapshotComputer();
+
         // Remove the shared library overlays from its dependent packages.
         for (int currentUserId : mPm.mUserManager.getUserIds()) {
-            final List<VersionedPackage> dependents = mPm.getPackagesUsingSharedLibrary(
+            final List<VersionedPackage> dependents = snapshot.getPackagesUsingSharedLibrary(
                     libraryInfo, 0, Process.SYSTEM_UID, currentUserId);
             if (dependents == null) {
                 continue;
diff --git a/services/core/java/com/android/server/pm/StorageEventHelper.java b/services/core/java/com/android/server/pm/StorageEventHelper.java
index bb7e55a..df19d3e 100644
--- a/services/core/java/com/android/server/pm/StorageEventHelper.java
+++ b/services/core/java/com/android/server/pm/StorageEventHelper.java
@@ -26,13 +26,13 @@
 import static com.android.server.pm.PackageManagerService.TAG;
 import static com.android.server.pm.PackageManagerServiceUtils.logCriticalInfo;
 
+import android.annotation.NonNull;
 import android.app.ResourcesManager;
 import android.content.IIntentReceiver;
 import android.content.pm.PackageManager;
 import android.content.pm.PackagePartitions;
 import android.content.pm.UserInfo;
 import android.content.pm.VersionedPackage;
-import com.android.server.pm.pkg.parsing.ParsingPackageUtils;
 import android.os.Environment;
 import android.os.FileUtils;
 import android.os.UserHandle;
@@ -48,6 +48,7 @@
 import com.android.internal.policy.AttributeCache;
 import com.android.server.pm.parsing.pkg.AndroidPackage;
 import com.android.server.pm.pkg.PackageStateInternal;
+import com.android.server.pm.pkg.parsing.ParsingPackageUtils;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -78,7 +79,7 @@
                 // Clean up any users or apps that were removed or recreated
                 // while this volume was missing
                 mPm.mUserManager.reconcileUsers(volumeUuid);
-                reconcileApps(volumeUuid);
+                reconcileApps(mPm.snapshotComputer(), volumeUuid);
 
                 // Clean up any install sessions that expired or were
                 // cancelled while this volume was missing
@@ -299,8 +300,8 @@
      * aren't expected, either due to uninstallation or reinstallation on
      * another volume.
      */
-    public void reconcileApps(String volumeUuid) {
-        List<String> absoluteCodePaths = collectAbsoluteCodePaths();
+    public void reconcileApps(@NonNull Computer snapshot, String volumeUuid) {
+        List<String> absoluteCodePaths = collectAbsoluteCodePaths(snapshot);
         List<File> filesToDelete = null;
 
         final File[] files = FileUtils.listFilesOrEmpty(
@@ -345,10 +346,10 @@
         }
     }
 
-    private List<String> collectAbsoluteCodePaths() {
+    private List<String> collectAbsoluteCodePaths(@NonNull Computer snapshot) {
         List<String> codePaths = new ArrayList<>();
         final ArrayMap<String, ? extends PackageStateInternal> packageStates =
-                mPm.getPackageStates();
+                snapshot.getPackageStates();
         final int packageCount = packageStates.size();
         for (int i = 0; i < packageCount; i++) {
             final PackageStateInternal ps = packageStates.valueAt(i);
diff --git a/services/core/java/com/android/server/pm/SuspendPackageHelper.java b/services/core/java/com/android/server/pm/SuspendPackageHelper.java
index 3ef5599..588dfaf 100644
--- a/services/core/java/com/android/server/pm/SuspendPackageHelper.java
+++ b/services/core/java/com/android/server/pm/SuspendPackageHelper.java
@@ -100,14 +100,14 @@
      * @return The names of failed packages.
      */
     @Nullable
-    String[] setPackagesSuspended(@NonNull Computer computer, @Nullable String[] packageNames,
+    String[] setPackagesSuspended(@NonNull Computer snapshot, @Nullable String[] packageNames,
             boolean suspended, @Nullable PersistableBundle appExtras,
             @Nullable PersistableBundle launcherExtras, @Nullable SuspendDialogInfo dialogInfo,
             @NonNull String callingPackage, @UserIdInt int userId, int callingUid) {
         if (ArrayUtils.isEmpty(packageNames)) {
             return packageNames;
         }
-        if (suspended && !isSuspendAllowedForUser(userId, callingUid)) {
+        if (suspended && !isSuspendAllowedForUser(snapshot, userId, callingUid)) {
             Slog.w(TAG, "Cannot suspend due to restrictions on user " + userId);
             return packageNames;
         }
@@ -123,7 +123,7 @@
         ArraySet<String> modifiedPackages = new ArraySet<>();
 
         final boolean[] canSuspend = suspended
-                ? canSuspendPackageForUser(computer, packageNames, userId, callingUid) : null;
+                ? canSuspendPackageForUser(snapshot, packageNames, userId, callingUid) : null;
         for (int i = 0; i < packageNames.length; i++) {
             final String packageName = packageNames[i];
             if (callingPackage.equals(packageName)) {
@@ -133,9 +133,9 @@
                 continue;
             }
             final PackageStateInternal packageState =
-                    computer.getPackageStateInternal(packageName);
+                    snapshot.getPackageStateInternal(packageName);
             if (packageState == null
-                    || computer.shouldFilterApplication(packageState, callingUid, userId)) {
+                    || snapshot.shouldFilterApplication(packageState, callingUid, userId)) {
                 Slog.w(TAG, "Could not find package setting for package: " + packageName
                         + ". Skipping suspending/un-suspending.");
                 unmodifiablePackages.add(packageName);
@@ -191,9 +191,11 @@
             }
         });
 
+        final Computer newSnapshot = mPm.snapshotComputer();
+
         if (!changedPackagesList.isEmpty()) {
             final String[] changedPackages = changedPackagesList.toArray(new String[0]);
-            sendPackagesSuspendedForUser(
+            sendPackagesSuspendedForUser(newSnapshot,
                     suspended ? Intent.ACTION_PACKAGES_SUSPENDED
                             : Intent.ACTION_PACKAGES_UNSUSPENDED,
                     changedPackages, changedUids.toArray(), userId);
@@ -202,7 +204,7 @@
         }
         // Send the suspension changed broadcast to ensure suspension state is not stale.
         if (!modifiedPackages.isEmpty()) {
-            sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENSION_CHANGED,
+            sendPackagesSuspendedForUser(newSnapshot, Intent.ACTION_PACKAGES_SUSPENSION_CHANGED,
                     modifiedPackages.toArray(new String[0]), modifiedUids.toArray(), userId);
         }
         return unmodifiablePackages.toArray(new String[0]);
@@ -217,14 +219,14 @@
      * @return The names of packages which are Unsuspendable.
      */
     @NonNull
-    String[] getUnsuspendablePackagesForUser(@NonNull Computer computer,
+    String[] getUnsuspendablePackagesForUser(@NonNull Computer snapshot,
             @NonNull String[] packageNames, @UserIdInt int userId, int callingUid) {
-        if (!isSuspendAllowedForUser(userId, callingUid)) {
+        if (!isSuspendAllowedForUser(snapshot, userId, callingUid)) {
             Slog.w(TAG, "Cannot suspend due to restrictions on user " + userId);
             return packageNames;
         }
         final ArraySet<String> unactionablePackages = new ArraySet<>();
-        final boolean[] canSuspend = canSuspendPackageForUser(computer, packageNames, userId,
+        final boolean[] canSuspend = canSuspendPackageForUser(snapshot, packageNames, userId,
                 callingUid);
         for (int i = 0; i < packageNames.length; i++) {
             if (!canSuspend[i]) {
@@ -232,7 +234,7 @@
                 continue;
             }
             final PackageStateInternal packageState =
-                    computer.getPackageStateFiltered(packageNames[i], callingUid, userId);
+                    snapshot.getPackageStateFiltered(packageNames[i], callingUid, userId);
             if (packageState == null) {
                 Slog.w(TAG, "Could not find package setting for package: " + packageNames[i]);
                 unactionablePackages.add(packageNames[i]);
@@ -250,8 +252,9 @@
      * @return The app extras of the suspended package.
      */
     @Nullable
-    Bundle getSuspendedPackageAppExtras(@NonNull String packageName, int userId, int callingUid) {
-        final PackageStateInternal ps = mPm.getPackageStateInternal(packageName, callingUid);
+    Bundle getSuspendedPackageAppExtras(@NonNull Computer snapshot, @NonNull String packageName,
+            int userId, int callingUid) {
+        final PackageStateInternal ps = snapshot.getPackageStateInternal(packageName, callingUid);
         if (ps == null) {
             return null;
         }
@@ -329,12 +332,14 @@
             }
         });
 
+        final Computer newSnapshot = mPm.snapshotComputer();
+
         mPm.scheduleWritePackageRestrictions(userId);
         if (!unsuspendedPackages.isEmpty()) {
             final String[] packageArray = unsuspendedPackages.toArray(
                     new String[unsuspendedPackages.size()]);
             sendMyPackageSuspendedOrUnsuspended(packageArray, false, userId);
-            sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_UNSUSPENDED,
+            sendPackagesSuspendedForUser(newSnapshot, Intent.ACTION_PACKAGES_UNSUSPENDED,
                     packageArray, unsuspendedUids.toArray(), userId);
         }
     }
@@ -348,10 +353,10 @@
      * @return The launcher extras.
      */
     @Nullable
-    Bundle getSuspendedPackageLauncherExtras(@NonNull String packageName, int userId,
-            int callingUid) {
-        final PackageStateInternal packageState = mPm.getPackageStateInternal(
-                packageName, callingUid);
+    Bundle getSuspendedPackageLauncherExtras(@NonNull Computer snapshot,
+            @NonNull String packageName, int userId, int callingUid) {
+        final PackageStateInternal packageState =
+                snapshot.getPackageStateInternal(packageName, callingUid);
         if (packageState == null) {
             return null;
         }
@@ -376,9 +381,10 @@
      * @param callingUid The caller's uid.
      * @return {@code true}, if the given package is suspended.
      */
-    boolean isPackageSuspended(@NonNull String packageName, int userId, int callingUid) {
-        final PackageStateInternal packageState = mPm.getPackageStateInternal(
-                packageName, callingUid);
+    boolean isPackageSuspended(@NonNull Computer snapshot, @NonNull String packageName, int userId,
+            int callingUid) {
+        final PackageStateInternal packageState =
+                snapshot.getPackageStateInternal(packageName, callingUid);
         return packageState != null && packageState.getUserStateOrDefault(userId)
                 .isSuspended();
     }
@@ -392,8 +398,9 @@
      * @return The name of suspending package.
      */
     @Nullable
-    String getSuspendingPackage(@NonNull String suspendedPackage, int userId, int callingUid) {
-        final PackageStateInternal packageState = mPm.getPackageStateInternal(
+    String getSuspendingPackage(@NonNull Computer snapshot, @NonNull String suspendedPackage,
+            int userId, int callingUid) {
+        final PackageStateInternal packageState = snapshot.getPackageStateInternal(
                 suspendedPackage, callingUid);
         if (packageState == null) {
             return  null;
@@ -424,9 +431,10 @@
      * @return The dialog info.
      */
     @Nullable
-    SuspendDialogInfo getSuspendedDialogInfo(@NonNull String suspendedPackage,
-            @NonNull String suspendingPackage, int userId, int callingUid) {
-        final PackageStateInternal packageState = mPm.getPackageStateInternal(
+    SuspendDialogInfo getSuspendedDialogInfo(@NonNull Computer snapshot,
+            @NonNull String suspendedPackage, @NonNull String suspendingPackage, int userId,
+            int callingUid) {
+        final PackageStateInternal packageState = snapshot.getPackageStateInternal(
                 suspendedPackage, callingUid);
         if (packageState == null) {
             return  null;
@@ -454,9 +462,9 @@
      * @param callingUid The caller's uid.
      * @return {@code true} if the user is allowed to suspend packages by the caller.
      */
-    boolean isSuspendAllowedForUser(int userId, int callingUid) {
+    boolean isSuspendAllowedForUser(@NonNull Computer snapshot, int userId, int callingUid) {
         final UserManagerService userManager = mInjector.getUserManagerService();
-        return isCallerDeviceOrProfileOwner(userId, callingUid)
+        return isCallerDeviceOrProfileOwner(snapshot, userId, callingUid)
                 || (!userManager.hasUserRestriction(UserManager.DISALLOW_APPS_CONTROL, userId)
                 && !userManager.hasUserRestriction(UserManager.DISALLOW_UNINSTALL_APPS, userId));
     }
@@ -471,21 +479,23 @@
      * @return An array containing results of the checks
      */
     @NonNull
-    boolean[] canSuspendPackageForUser(@NonNull Computer computer, @NonNull String[] packageNames,
+    boolean[] canSuspendPackageForUser(@NonNull Computer snapshot, @NonNull String[] packageNames,
             int userId, int callingUid) {
         final boolean[] canSuspend = new boolean[packageNames.length];
-        final boolean isCallerOwner = isCallerDeviceOrProfileOwner(userId, callingUid);
+        final boolean isCallerOwner = isCallerDeviceOrProfileOwner(snapshot, userId, callingUid);
         final long token = Binder.clearCallingIdentity();
         try {
             final DefaultAppProvider defaultAppProvider = mInjector.getDefaultAppProvider();
             final String activeLauncherPackageName = defaultAppProvider.getDefaultHome(userId);
             final String dialerPackageName = defaultAppProvider.getDefaultDialer(userId);
-            final String requiredInstallerPackage = getKnownPackageName(PACKAGE_INSTALLER, userId);
+            final String requiredInstallerPackage =
+                    getKnownPackageName(snapshot, PACKAGE_INSTALLER, userId);
             final String requiredUninstallerPackage =
-                    getKnownPackageName(PACKAGE_UNINSTALLER, userId);
-            final String requiredVerifierPackage = getKnownPackageName(PACKAGE_VERIFIER, userId);
+                    getKnownPackageName(snapshot, PACKAGE_UNINSTALLER, userId);
+            final String requiredVerifierPackage =
+                    getKnownPackageName(snapshot, PACKAGE_VERIFIER, userId);
             final String requiredPermissionControllerPackage =
-                    getKnownPackageName(PACKAGE_PERMISSION_CONTROLLER, userId);
+                    getKnownPackageName(snapshot, PACKAGE_PERMISSION_CONTROLLER, userId);
             for (int i = 0; i < packageNames.length; i++) {
                 canSuspend[i] = false;
                 final String packageName = packageNames[i];
@@ -530,7 +540,7 @@
                             + "\": protected package");
                     continue;
                 }
-                if (!isCallerOwner && computer.getBlockUninstall(userId, packageName)) {
+                if (!isCallerOwner && snapshot.getBlockUninstall(userId, packageName)) {
                     Slog.w(TAG, "Cannot suspend package \"" + packageName
                             + "\": blocked by admin");
                     continue;
@@ -539,7 +549,7 @@
                 // Cannot suspend static shared libs as they are considered
                 // a part of the using app (emulating static linking). Also
                 // static libs are installed always on internal storage.
-                PackageStateInternal packageState = computer.getPackageStateInternal(packageName);
+                PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
                 AndroidPackage pkg = packageState == null ? null : packageState.getPkg();
                 if (pkg != null) {
                     // Cannot suspend SDK libs as they are controlled by SDK manager.
@@ -580,8 +590,8 @@
      * @param userId The user where packages reside.
      */
     @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
-    void sendPackagesSuspendedForUser(@NonNull String intent, @NonNull String[] pkgList,
-            @NonNull int[] uidList, int userId) {
+    void sendPackagesSuspendedForUser(@NonNull Computer snapshot, @NonNull String intent,
+            @NonNull String[] pkgList, @NonNull int[] uidList, int userId) {
         final List<List<String>> pkgsToSend = new ArrayList(pkgList.length);
         final List<IntArray> uidsToSend = new ArrayList(pkgList.length);
         final List<SparseArray<int[]>> allowListsToSend = new ArrayList(pkgList.length);
@@ -592,8 +602,8 @@
             final String pkgName = pkgList[i];
             final int uid = uidList[i];
             SparseArray<int[]> allowList = mInjector.getAppsFilter().getVisibilityAllowList(
-                    mPm.getPackageStateInternal(pkgName, SYSTEM_UID),
-                    userIds, mPm.getPackageStates());
+                    snapshot.getPackageStateInternal(pkgName, SYSTEM_UID),
+                    userIds, snapshot.getPackageStates());
             if (allowList == null) {
                 allowList = new SparseArray<>(0);
             }
@@ -628,19 +638,22 @@
         }
     }
 
-    private String getKnownPackageName(@KnownPackage int knownPackage, int userId) {
-        final String[] knownPackages = mPm.getKnownPackageNamesInternal(knownPackage, userId);
+    private String getKnownPackageName(@NonNull Computer snapshot, @KnownPackage int knownPackage,
+            int userId) {
+        final String[] knownPackages =
+                mPm.getKnownPackageNamesInternal(snapshot, knownPackage, userId);
         return knownPackages.length > 0 ? knownPackages[0] : null;
     }
 
-    private boolean isCallerDeviceOrProfileOwner(int userId, int callingUid) {
+    private boolean isCallerDeviceOrProfileOwner(@NonNull Computer snapshot, int userId,
+            int callingUid) {
         if (callingUid == SYSTEM_UID) {
             return true;
         }
         final String ownerPackage = mProtectedPackages.getDeviceOwnerOrProfileOwnerPackage(userId);
         if (ownerPackage != null) {
-            return callingUid == mPm.getPackageUidInternal(
-                    ownerPackage, 0, userId, callingUid);
+            return callingUid == snapshot.getPackageUidInternal(ownerPackage, 0, userId,
+                    callingUid);
         }
         return false;
     }
@@ -659,9 +672,10 @@
                 return;
             }
             final int[] targetUserIds = new int[] {userId};
+            final Computer snapshot = mPm.snapshotComputer();
             for (String packageName : affectedPackages) {
                 final Bundle appExtras = suspended
-                        ? getSuspendedPackageAppExtras(packageName, userId, SYSTEM_UID)
+                        ? getSuspendedPackageAppExtras(snapshot, packageName, userId, SYSTEM_UID)
                         : null;
                 final Bundle intentExtras;
                 if (appExtras != null) {
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 33476ed..eae7658 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -4148,11 +4148,11 @@
                 continue;
             }
             if (filter.direction == DefaultCrossProfileIntentFilter.Direction.TO_PARENT) {
-                mPm.addCrossProfileIntentFilter(
+                mPm.addCrossProfileIntentFilter(mPm.snapshotComputer(),
                         filter.filter, mContext.getOpPackageName(), profileUserId, parentUserId,
                         filter.flags);
             } else {
-                mPm.addCrossProfileIntentFilter(
+                mPm.addCrossProfileIntentFilter(mPm.snapshotComputer(),
                         filter.filter, mContext.getOpPackageName(), parentUserId, profileUserId,
                         filter.flags);
             }
diff --git a/services/core/java/com/android/server/pm/WatchedIntentFilter.java b/services/core/java/com/android/server/pm/WatchedIntentFilter.java
index 30f276e..5d7a2a3 100644
--- a/services/core/java/com/android/server/pm/WatchedIntentFilter.java
+++ b/services/core/java/com/android/server/pm/WatchedIntentFilter.java
@@ -84,7 +84,7 @@
     }
 
     // Convert an {@link IntentFilter} to a {@link WatchedIntentFilter}
-    protected WatchedIntentFilter(IntentFilter f) {
+    public WatchedIntentFilter(IntentFilter f) {
         mFilter = new IntentFilter(f);
     }
 
diff --git a/services/core/java/com/android/server/pm/dex/ArtManagerService.java b/services/core/java/com/android/server/pm/dex/ArtManagerService.java
index e28a6ea..7e4da94 100644
--- a/services/core/java/com/android/server/pm/dex/ArtManagerService.java
+++ b/services/core/java/com/android/server/pm/dex/ArtManagerService.java
@@ -31,13 +31,13 @@
 import android.content.pm.dex.DexMetadataHelper;
 import android.content.pm.dex.ISnapshotRuntimeProfileCallback;
 import android.content.pm.dex.PackageOptimizationInfo;
-import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils;
 import android.os.Binder;
 import android.os.Build;
 import android.os.Handler;
 import android.os.ParcelFileDescriptor;
 import android.os.Process;
 import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.system.Os;
@@ -55,6 +55,7 @@
 import com.android.server.pm.Installer.InstallerException;
 import com.android.server.pm.PackageManagerServiceCompilerMapping;
 import com.android.server.pm.parsing.pkg.AndroidPackage;
+import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils;
 
 import dalvik.system.DexFile;
 import dalvik.system.VMRuntime;
@@ -92,7 +93,7 @@
     private static final String BOOT_IMAGE_PROFILE_NAME = "android.prof";
 
     private final Context mContext;
-    private final IPackageManager mPackageManager;
+    private IPackageManager mPackageManager;
     private final Object mInstallLock;
     @GuardedBy("mInstallLock")
     private final Installer mInstaller;
@@ -103,10 +104,9 @@
         verifyTronLoggingConstants();
     }
 
-    public ArtManagerService(Context context, IPackageManager pm, Installer installer,
+    public ArtManagerService(Context context, Installer installer,
             Object installLock) {
         mContext = context;
-        mPackageManager = pm;
         mInstaller = installer;
         mInstallLock = installLock;
         mHandler = new Handler(BackgroundThread.getHandler().getLooper());
@@ -114,6 +114,15 @@
         LocalServices.addService(ArtManagerInternal.class, new ArtManagerInternalImpl());
     }
 
+    @NonNull
+    private IPackageManager getPackageManager() {
+        if (mPackageManager == null) {
+            mPackageManager = IPackageManager.Stub.asInterface(
+                    ServiceManager.getService("package"));
+        }
+        return mPackageManager;
+    }
+
     private boolean checkAndroidPermissions(int callingUid, String callingPackage) {
         // Callers always need this permission
         mContext.enforceCallingOrSelfPermission(
@@ -157,7 +166,7 @@
         }
         PackageInfo info = null;
         try {
-            info = mPackageManager.getPackageInfo(packageName, /*flags*/ 0, /*userId*/ 0);
+            info =  getPackageManager().getPackageInfo(packageName, /*flags*/ 0, /*userId*/ 0);
         } catch (RemoteException ignored) {
             // Should not happen.
         }
@@ -221,7 +230,7 @@
 
             // TODO(calin): consider adding an API to PMS which can retrieve the
             // PackageParser.Package.
-            info = mPackageManager.getPackageInfo(packageName, /*flags*/ 0, /*userId*/ 0);
+            info =  getPackageManager().getPackageInfo(packageName, /*flags*/ 0, /*userId*/ 0);
         } catch (RemoteException ignored) {
             // Should not happen.
         }
diff --git a/services/core/java/com/android/server/pm/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java
index 5371454..17109e9 100644
--- a/services/core/java/com/android/server/pm/dex/DexManager.java
+++ b/services/core/java/com/android/server/pm/dex/DexManager.java
@@ -23,6 +23,8 @@
 
 import static java.util.function.Function.identity;
 
+import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.IPackageManager;
@@ -33,6 +35,7 @@
 import android.os.FileUtils;
 import android.os.PowerManager;
 import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.os.storage.StorageManager;
@@ -109,7 +112,7 @@
     // record class loaders or ISAs.)
     private final DynamicCodeLogger mDynamicCodeLogger;
 
-    private final IPackageManager mPackageManager;
+    private IPackageManager mPackageManager;
     private final PackageDexOptimizer mPackageDexOptimizer;
     private final Object mInstallLock;
     @GuardedBy("mInstallLock")
@@ -128,16 +131,22 @@
     private static int DEX_SEARCH_FOUND_SPLIT = 2;  // dex file is a split apk
     private static int DEX_SEARCH_FOUND_SECONDARY = 3;  // dex file is a secondary dex
 
-    public DexManager(Context context, IPackageManager pms, PackageDexOptimizer pdo,
-            Installer installer, Object installLock) {
+    public DexManager(Context context, PackageDexOptimizer pdo, Installer installer,
+            Object installLock) {
+        this(context, pdo, installer, installLock, null);
+    }
+
+    @VisibleForTesting
+    public DexManager(Context context, PackageDexOptimizer pdo, Installer installer,
+            Object installLock, @Nullable IPackageManager packageManager) {
         mContext = context;
         mPackageCodeLocationsCache = new HashMap<>();
         mPackageDexUsage = new PackageDexUsage();
-        mPackageManager = pms;
         mPackageDexOptimizer = pdo;
         mInstaller = installer;
         mInstallLock = installLock;
-        mDynamicCodeLogger = new DynamicCodeLogger(pms, installer);
+        mDynamicCodeLogger = new DynamicCodeLogger(installer);
+        mPackageManager = packageManager;
 
         // This is currently checked to handle tests that pass in a null context.
         // TODO(b/174783329): Modify the tests to pass in a mocked Context, PowerManager,
@@ -157,6 +166,15 @@
         }
     }
 
+    @NonNull
+    private IPackageManager getPackageManager() {
+        if (mPackageManager == null) {
+            mPackageManager = IPackageManager.Stub.asInterface(
+                    ServiceManager.getService("package"));
+        }
+        return mPackageManager;
+    }
+
     public DynamicCodeLogger getDynamicCodeLogger() {
         return mDynamicCodeLogger;
     }
@@ -529,7 +547,7 @@
 
             PackageInfo pkg;
             try {
-                pkg = mPackageManager.getPackageInfo(packageName, /*flags*/0,
+                pkg = getPackageManager().getPackageInfo(packageName, /*flags*/0,
                     dexUseInfo.getOwnerUserId());
             } catch (RemoteException e) {
                 throw new AssertionError(e);
@@ -673,7 +691,7 @@
                 // to get back the real app uid and its storage kind. These are only used
                 // to perform extra validation in installd.
                 // TODO(calin): maybe a bit overkill.
-                pkg = mPackageManager.getPackageInfo(packageName, /*flags*/0,
+                pkg = getPackageManager().getPackageInfo(packageName, /*flags*/0,
                     dexUseInfo.getOwnerUserId());
             } catch (RemoteException ignore) {
                 // Can't happen, DexManager is local.
diff --git a/services/core/java/com/android/server/pm/dex/DynamicCodeLogger.java b/services/core/java/com/android/server/pm/dex/DynamicCodeLogger.java
index 75b4e38..9b94e99 100644
--- a/services/core/java/com/android/server/pm/dex/DynamicCodeLogger.java
+++ b/services/core/java/com/android/server/pm/dex/DynamicCodeLogger.java
@@ -19,11 +19,13 @@
 import static com.android.server.pm.dex.PackageDynamicCodeLoading.FILE_TYPE_DEX;
 import static com.android.server.pm.dex.PackageDynamicCodeLoading.FILE_TYPE_NATIVE;
 
+import android.annotation.NonNull;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.IPackageManager;
 import android.content.pm.PackageInfo;
 import android.os.FileUtils;
 import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.os.UserHandle;
 import android.os.storage.StorageManager;
 import android.util.EventLog;
@@ -58,20 +60,30 @@
     private static final String DCL_DEX_SUBTAG = "dcl";
     private static final String DCL_NATIVE_SUBTAG = "dcln";
 
-    private final IPackageManager mPackageManager;
+    private IPackageManager mPackageManager;
     private final PackageDynamicCodeLoading mPackageDynamicCodeLoading;
     private final Installer mInstaller;
 
-    DynamicCodeLogger(IPackageManager pms, Installer installer) {
-        this(pms, installer, new PackageDynamicCodeLoading());
+    DynamicCodeLogger(Installer installer) {
+        mInstaller = installer;
+        mPackageDynamicCodeLoading = new PackageDynamicCodeLoading();
     }
 
     @VisibleForTesting
-    DynamicCodeLogger(IPackageManager pms, Installer installer,
-            PackageDynamicCodeLoading packageDynamicCodeLoading) {
-        mPackageManager = pms;
-        mPackageDynamicCodeLoading = packageDynamicCodeLoading;
+    DynamicCodeLogger(@NonNull IPackageManager packageManager, @NonNull Installer installer,
+            @NonNull PackageDynamicCodeLoading packageDynamicCodeLoading) {
+        mPackageManager = packageManager;
         mInstaller = installer;
+        mPackageDynamicCodeLoading = packageDynamicCodeLoading;
+    }
+
+    @NonNull
+    private IPackageManager getPackageManager() {
+        if (mPackageManager == null) {
+            mPackageManager = IPackageManager.Stub.asInterface(
+                    ServiceManager.getService("package"));
+        }
+        return mPackageManager;
     }
 
     public Set<String> getAllPackagesWithDynamicCodeLoading() {
@@ -104,7 +116,7 @@
 
                 try {
                     PackageInfo ownerInfo =
-                            mPackageManager.getPackageInfo(packageName, /*flags*/ 0, userId);
+                            getPackageManager().getPackageInfo(packageName, /*flags*/ 0, userId);
                     appInfo = ownerInfo == null ? null : ownerInfo.applicationInfo;
                 } catch (RemoteException ignored) {
                     // Can't happen, we're local.
@@ -167,7 +179,7 @@
                     loadingUid = appInfo.uid;
                 } else {
                     try {
-                        loadingUid = mPackageManager.getPackageUid(loadingPackageName, /*flags*/ 0,
+                        loadingUid =  getPackageManager().getPackageUid(loadingPackageName, /*flags*/ 0,
                                 userId);
                     } catch (RemoteException ignored) {
                         // Can't happen, we're local.
@@ -223,7 +235,7 @@
     public void recordNative(int loadingUid, String path) {
         String[] packages;
         try {
-            packages = mPackageManager.getPackagesForUid(loadingUid);
+            packages =  getPackageManager().getPackagesForUid(loadingUid);
             if (packages == null || packages.length == 0) {
                 return;
             }
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java
index 8223b8c..6f503c7 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java
@@ -116,7 +116,7 @@
         when(mInjector.getDataDirStorageLowBytes()).thenReturn(STORAGE_LOW_BYTES);
         when(mInjector.getDexOptThermalCutoff()).thenReturn(PowerManager.THERMAL_STATUS_CRITICAL);
         when(mInjector.getCurrentThermalStatus()).thenReturn(PowerManager.THERMAL_STATUS_NONE);
-        when(mDexOptHelper.getOptimizablePackages()).thenReturn(DEFAULT_PACKAGE_LIST);
+        when(mDexOptHelper.getOptimizablePackages(any())).thenReturn(DEFAULT_PACKAGE_LIST);
         when(mDexOptHelper.performDexOptWithStatus(any())).thenReturn(
                 PackageDexOptimizer.DEX_OPT_PERFORMED);
 
@@ -158,7 +158,7 @@
     @Test
     public void testNoExecutionForNoOptimizablePackages() {
         initUntilBootCompleted();
-        when(mDexOptHelper.getOptimizablePackages()).thenReturn(EMPTY_PACKAGE_LIST);
+        when(mDexOptHelper.getOptimizablePackages(any())).thenReturn(EMPTY_PACKAGE_LIST);
 
         assertThat(mService.onStartJob(mJobServiceForPostBoot,
                 mJobParametersForPostBoot)).isFalse();
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt b/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt
index 1319903..537a028 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt
@@ -157,7 +157,7 @@
         rule.system().validateFinalState()
         whenever(appHibernationManager.isHibernatingGlobally(TEST_PACKAGE_2_NAME)).thenReturn(true)
 
-        val optimizablePkgs = DexOptHelper(pm).optimizablePackages
+        val optimizablePkgs = DexOptHelper(pm).getOptimizablePackages(pm.snapshotComputer())
 
         assertTrue(optimizablePkgs.contains(TEST_PACKAGE_NAME))
         assertFalse(optimizablePkgs.contains(TEST_PACKAGE_2_NAME))
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt b/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt
index b063d22..97b52a9 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt
@@ -24,7 +24,6 @@
 import android.os.storage.StorageManager
 import android.util.ArrayMap
 import android.util.PackageUtils
-import com.android.internal.util.FunctionalUtils
 import com.android.server.SystemConfig.SharedLibraryEntry
 import com.android.server.compat.PlatformCompat
 import com.android.server.extendedtestutils.wheneverStatic
@@ -35,7 +34,6 @@
 import com.android.server.testutils.any
 import com.android.server.testutils.eq
 import com.android.server.testutils.mock
-import com.android.server.testutils.mockThrowOnUnmocked
 import com.android.server.testutils.nullable
 import com.android.server.testutils.spy
 import com.android.server.testutils.whenever
@@ -59,6 +57,7 @@
 import kotlin.test.assertFalse
 import kotlin.test.assertTrue
 
+@Ignore("b/216603387")
 @RunWith(JUnit4::class)
 class SharedLibrariesImplTest {
 
@@ -85,6 +84,7 @@
     private lateinit var mSharedLibrariesImpl: SharedLibrariesImpl
     private lateinit var mPms: PackageManagerService
     private lateinit var mSettings: Settings
+    private lateinit var mComputer: Computer
 
     @Mock
     private lateinit var mDeletePackageHelper: DeletePackageHelper
@@ -114,22 +114,16 @@
         mSharedLibrariesImpl.setDeletePackageHelper(mDeletePackageHelper)
         addExistingSharedLibraries()
 
+        mComputer = mock {
+            whenever(sharedLibraries) { mSharedLibrariesImpl.sharedLibraries }
+            whenever(resolveInternalPackageName(anyString(), anyLong())) { arguments[0] }
+        }
+
         whenever(mSettings.getPackageLPr(any())) { mExistingSettings[arguments[0]] }
         whenever(mRule.mocks().injector.getSystemService(StorageManager::class.java))
             .thenReturn(mStorageManager)
         whenever(mStorageManager.findPathForUuid(nullable())).thenReturn(mFile)
-        doAnswer { it.arguments[0] }.`when`(mPms).resolveInternalPackageName(any(), any())
-        doAnswer {
-            mockThrowOnUnmocked<Computer> {
-                whenever(sharedLibraries) { mSharedLibrariesImpl.sharedLibraries }
-                whenever(resolveInternalPackageName(anyString(), anyLong())) {
-                    mPms.resolveInternalPackageName(getArgument(0), getArgument(1))
-                }
-                whenever(getPackageStateInternal(anyString())) {
-                    mPms.getPackageStateInternal(getArgument(0))
-                }
-            }
-        }.`when`(mPms).snapshotComputer()
+        doAnswer { mComputer }.`when`(mPms).snapshotComputer()
         whenever(mDeletePackageHelper.deletePackageX(any(), any(), any(), any(), any()))
             .thenReturn(PackageManager.DELETE_SUCCEEDED)
         whenever(mRule.mocks().injector.compatibility).thenReturn(mPlatformCompat)
@@ -189,7 +183,8 @@
 
     @Test
     fun removeSharedLibrary() {
-        doAnswer { mutableListOf(VersionedPackage(CONSUMER_PACKAGE_NAME, 1L)) }.`when`(mPms)
+        doAnswer { mutableListOf(VersionedPackage(CONSUMER_PACKAGE_NAME, 1L)) }
+            .`when`(mComputer)
             .getPackagesUsingSharedLibrary(any(), any(), any(), any())
         val staticInfo = mSharedLibrariesImpl
             .getSharedLibraryInfo(STATIC_LIB_NAME, STATIC_LIB_VERSION)!!
@@ -253,7 +248,6 @@
         assertThat(testPackageSetting.usesLibraryFiles).contains(builtinLibPath(BUILTIN_LIB_NAME))
     }
 
-    @Ignore("b/216603387")
     @Test
     fun updateSharedLibraries_withStaticLibPackage() {
         val testPackageSetting = mExistingSettings[STATIC_LIB_PACKAGE_NAME]!!
@@ -266,7 +260,6 @@
         assertThat(testPackageSetting.usesLibraryFiles).contains(apkPath(DYNAMIC_LIB_PACKAGE_NAME))
     }
 
-    @Ignore("b/216603387")
     @Test
     fun updateSharedLibraries_withConsumerPackage() {
         val testPackageSetting = mExistingSettings[CONSUMER_PACKAGE_NAME]!!
@@ -280,7 +273,6 @@
         assertThat(testPackageSetting.usesLibraryFiles).contains(apkPath(STATIC_LIB_PACKAGE_NAME))
     }
 
-    @Ignore("b/216603387")
     @Test
     fun updateAllSharedLibraries() {
         mExistingSettings.forEach {
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt b/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt
index 5230ea7..4818573 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt
@@ -104,9 +104,9 @@
             pms, rule.mocks().injector, broadcastHelper, protectedPackages)
         defaultAppProvider = rule.mocks().defaultAppProvider
         testHandler = rule.mocks().handler
-        packageSetting1 = pms.getPackageStateInternal(TEST_PACKAGE_1)!!
-        packageSetting2 = pms.getPackageStateInternal(TEST_PACKAGE_2)!!
-        ownerSetting = pms.getPackageStateInternal(DEVICE_OWNER_PACKAGE)!!
+        packageSetting1 = pms.snapshotComputer().getPackageStateInternal(TEST_PACKAGE_1)!!
+        packageSetting2 = pms.snapshotComputer().getPackageStateInternal(TEST_PACKAGE_2)!!
+        ownerSetting = pms.snapshotComputer().getPackageStateInternal(DEVICE_OWNER_PACKAGE)!!
         deviceOwnerUid = UserHandle.getUid(TEST_USER_ID, ownerSetting.appId)
         packagesToSuspend = arrayOf(TEST_PACKAGE_1, TEST_PACKAGE_2)
         uidsToSuspend = intArrayOf(packageSetting1.appId, packageSetting2.appId)
@@ -270,7 +270,7 @@
         testHandler.flush()
         assertThat(failedNames).isEmpty()
 
-        val result = suspendPackageHelper.getSuspendedPackageAppExtras(
+        val result = suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(),
             TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)!!
 
         assertThat(result.getString(TEST_PACKAGE_1)).isEqualTo(TEST_PACKAGE_1)
@@ -286,13 +286,13 @@
             null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid)
         testHandler.flush()
         assertThat(failedNames).isEmpty()
-        assertThat(suspendPackageHelper.getSuspendingPackage(
+        assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(),
             TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isEqualTo(DEVICE_OWNER_PACKAGE)
-        assertThat(suspendPackageHelper.getSuspendingPackage(
+        assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(),
             TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(DEVICE_OWNER_PACKAGE)
-        assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(
+        assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(),
             TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isNotNull()
-        assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(
+        assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(),
             TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isNotNull()
 
         suspendPackageHelper.removeSuspensionsBySuspendingPackage(pms.snapshotComputer(),
@@ -311,13 +311,13 @@
             nullable(), nullable(), any(), eq(TEST_PACKAGE_2), nullable(), any(), any(),
             nullable(), nullable())
 
-        assertThat(suspendPackageHelper.getSuspendingPackage(
+        assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(),
             TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isNull()
-        assertThat(suspendPackageHelper.getSuspendingPackage(
+        assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(),
             TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isNull()
-        assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(
+        assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(),
             TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isNull()
-        assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(
+        assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(),
             TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isNull()
     }
 
@@ -331,7 +331,7 @@
         testHandler.flush()
         assertThat(failedNames).isEmpty()
 
-        val result = suspendPackageHelper.getSuspendedPackageLauncherExtras(
+        val result = suspendPackageHelper.getSuspendedPackageLauncherExtras(pms.snapshotComputer(),
             TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)!!
 
         assertThat(result.getString(TEST_PACKAGE_2)).isEqualTo(TEST_PACKAGE_2)
@@ -346,7 +346,7 @@
         testHandler.flush()
         assertThat(failedNames).isEmpty()
 
-        assertThat(suspendPackageHelper.isPackageSuspended(
+        assertThat(suspendPackageHelper.isPackageSuspended(pms.snapshotComputer(),
             TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isTrue()
     }
 
@@ -360,7 +360,7 @@
         testHandler.flush()
         assertThat(failedNames).isEmpty()
 
-        assertThat(suspendPackageHelper.getSuspendingPackage(
+        assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(),
             TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(DEVICE_OWNER_PACKAGE)
     }
 
@@ -375,7 +375,7 @@
         testHandler.flush()
         assertThat(failedNames).isEmpty()
 
-        val result = suspendPackageHelper.getSuspendedDialogInfo(
+        val result = suspendPackageHelper.getSuspendedDialogInfo(pms.snapshotComputer(),
             TEST_PACKAGE_1, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid)!!
 
         assertThat(result.title).isEqualTo(TEST_PACKAGE_1)
@@ -387,8 +387,8 @@
         mockAllowList(packageSetting1, allowList(10001, 10002, 10003))
         mockAllowList(packageSetting2, allowList(10001, 10002, 10003))
 
-        suspendPackageHelper.sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENDED,
-                packagesToSuspend, uidsToSuspend, TEST_USER_ID)
+        suspendPackageHelper.sendPackagesSuspendedForUser(pms.snapshotComputer(),
+            Intent.ACTION_PACKAGES_SUSPENDED, packagesToSuspend, uidsToSuspend, TEST_USER_ID)
         testHandler.flush()
         verify(broadcastHelper).sendPackageBroadcast(any(), nullable(), bundleCaptor.capture(),
                 anyInt(), nullable(), nullable(), any(), nullable(), any(), nullable())
@@ -406,8 +406,8 @@
         mockAllowList(packageSetting1, allowList(10001, 10002, 10003))
         mockAllowList(packageSetting2, allowList(10001, 10002, 10007))
 
-        suspendPackageHelper.sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENDED,
-                packagesToSuspend, uidsToSuspend, TEST_USER_ID)
+        suspendPackageHelper.sendPackagesSuspendedForUser(pms.snapshotComputer(),
+            Intent.ACTION_PACKAGES_SUSPENDED, packagesToSuspend, uidsToSuspend, TEST_USER_ID)
         testHandler.flush()
         verify(broadcastHelper, times(2)).sendPackageBroadcast(
                 any(), nullable(), bundleCaptor.capture(), anyInt(), nullable(), nullable(), any(),
@@ -429,8 +429,8 @@
         mockAllowList(packageSetting1, allowList(10001, 10002, 10003))
         mockAllowList(packageSetting2, null)
 
-        suspendPackageHelper.sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENDED,
-                packagesToSuspend, uidsToSuspend, TEST_USER_ID)
+        suspendPackageHelper.sendPackagesSuspendedForUser(pms.snapshotComputer(),
+            Intent.ACTION_PACKAGES_SUSPENDED, packagesToSuspend, uidsToSuspend, TEST_USER_ID)
         testHandler.flush()
         verify(broadcastHelper, times(2)).sendPackageBroadcast(
                 any(), nullable(), bundleCaptor.capture(), anyInt(), nullable(), nullable(), any(),
@@ -449,8 +449,9 @@
     @Test
     @Throws(Exception::class)
     fun sendPackagesSuspendModifiedForUser() {
-        suspendPackageHelper.sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENSION_CHANGED,
-                packagesToSuspend, uidsToSuspend, TEST_USER_ID)
+        suspendPackageHelper.sendPackagesSuspendedForUser(pms.snapshotComputer(),
+            Intent.ACTION_PACKAGES_SUSPENSION_CHANGED, packagesToSuspend, uidsToSuspend,
+            TEST_USER_ID)
         testHandler.flush()
         verify(broadcastHelper).sendPackageBroadcast(
                 eq(Intent.ACTION_PACKAGES_SUSPENSION_CHANGED), nullable(), bundleCaptor.capture(),
@@ -483,13 +484,13 @@
         Mockito.doReturn(DIALER_PACKAGE).`when`(defaultAppProvider)
             .getDefaultDialer(eq(TEST_USER_ID))
         Mockito.doReturn(arrayOf(INSTALLER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal(
-            eq(PackageManagerInternal.PACKAGE_INSTALLER), eq(TEST_USER_ID))
+            any(), eq(PackageManagerInternal.PACKAGE_INSTALLER), eq(TEST_USER_ID))
         Mockito.doReturn(arrayOf(UNINSTALLER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal(
-            eq(PackageManagerInternal.PACKAGE_UNINSTALLER), eq(TEST_USER_ID))
+            any(), eq(PackageManagerInternal.PACKAGE_UNINSTALLER), eq(TEST_USER_ID))
         Mockito.doReturn(arrayOf(VERIFIER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal(
-            eq(PackageManagerInternal.PACKAGE_VERIFIER), eq(TEST_USER_ID))
+            any(), eq(PackageManagerInternal.PACKAGE_VERIFIER), eq(TEST_USER_ID))
         Mockito.doReturn(arrayOf(PERMISSION_CONTROLLER_PACKAGE)).`when`(pms)
-            .getKnownPackageNamesInternal(
+            .getKnownPackageNamesInternal(any(),
                 eq(PackageManagerInternal.PACKAGE_PERMISSION_CONTROLLER), eq(TEST_USER_ID))
     }
 
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/dex/DexManagerTests.java b/services/tests/mockingservicestests/src/com/android/server/pm/dex/DexManagerTests.java
index 8abe46f..9d26971 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/dex/DexManagerTests.java
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/dex/DexManagerTests.java
@@ -159,8 +159,8 @@
             .when(mockContext)
                 .getSystemService(PowerManager.class);
 
-        mDexManager = new DexManager(mockContext, mPM, /*PackageDexOptimizer*/ null,
-                mInstaller, mInstallLock);
+        mDexManager = new DexManager(mockContext, /*PackageDexOptimizer*/ null,
+                mInstaller, mInstallLock, mPM);
 
         // Foo and Bar are available to user0.
         // Only Bar is available to user1;
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java
index 050b224..946108d 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java
@@ -23,11 +23,10 @@
 import static org.junit.Assert.fail;
 
 import static java.lang.reflect.Modifier.isFinal;
-import static java.lang.reflect.Modifier.isPrivate;
-import static java.lang.reflect.Modifier.isProtected;
 import static java.lang.reflect.Modifier.isPublic;
 import static java.lang.reflect.Modifier.isStatic;
 
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.AppGlobals;
 import android.content.IIntentReceiver;
@@ -63,7 +62,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
 import java.util.regex.Pattern;
 
@@ -101,7 +99,7 @@
                     @Nullable Bundle bOptions) {
             }
 
-            public void sendPackageAddedForNewUsers(String packageName,
+            public void sendPackageAddedForNewUsers(@NonNull Computer snapshot, String packageName,
                     boolean sendBootComplete, boolean includeStopped, int appId,
                     int[] userIds, int[] instantUserIds, int dataLoaderType) {
             }
@@ -456,147 +454,6 @@
         return null;
     }
 
-    // Return the boolean locked value.  A null return means the annotation was not
-    // found.  This method will fail if the annotation is found but is not one of the
-    // known constants.
-    private Boolean getOverride(Method m) {
-        final String name = "Computer." + displayName(m);
-        final Computer.LiveImplementation annotation =
-                m.getAnnotation(Computer.LiveImplementation.class);
-        if (annotation == null) {
-            return null;
-        }
-        final int override = annotation.override();
-        if (override == Computer.LiveImplementation.MANDATORY) {
-            return true;
-        } else if (override == Computer.LiveImplementation.NOT_ALLOWED) {
-            return false;
-        } else {
-            flag(name, "invalid Live value: " + override);
-            return null;
-        }
-    }
-
-    @Test
-    public void testComputerStructure() {
-        // Verify that Copmuter methods are properly annotated and that ComputerLocked is
-        // properly populated per annotations.
-        // Call PackageManagerService.validateComputer();
-        Class base = Computer.class;
-
-        HashMap<Method, Boolean> methodType = new HashMap<>();
-
-        // Verify that all Computer methods are annotated and that the annotation
-        // parameter locked() is valid.
-        for (Method m : base.getDeclaredMethods()) {
-            final String name = "Computer." + displayName(m);
-            Boolean override = getOverride(m);
-            if (override == null) {
-                flag(name, "missing required Live annotation");
-            }
-            methodType.put(m, override);
-        }
-
-        Class coreClass = ComputerEngine.class;
-        final Method[] coreMethods = coreClass.getDeclaredMethods();
-
-        // Examine every method in the core.  If it inherits from a base method it must be
-        // "public final" if the base is NOT_ALLOWED or "public" if the base is MANDATORY.
-        // If the core method does not inherit from the base then it must be either
-        // private or protected.
-        for (Method m : base.getDeclaredMethods()) {
-            String name = "Computer." + displayName(m);
-            final boolean locked = methodType.get(m);
-            final Method core = matchMethod(m, coreMethods);
-            if (core == null) {
-                flag(name, "not overridden in ComputerEngine");
-                continue;
-            }
-            name = "ComputerEngine." + displayName(m);
-            final int modifiers = core.getModifiers();
-            if (!locked) {
-                if (!isPublic(modifiers)) {
-                    flag(name, "is not public");
-                }
-                if (!isFinal(modifiers)) {
-                    flag(name, "is not final");
-                }
-            }
-        }
-        // Any methods left in the coreMethods array must be private or protected.
-        // Protected methods must be overridden (and final) in the live list.
-        Method[] coreHelpers = new Method[coreMethods.length];
-        int coreIndex = 0;
-        for (Method m : coreMethods) {
-            if (m != null) {
-                final String name = "ComputerEngine." + displayName(m);
-                if (name.contains(".lambda$static")) {
-                    // skip static lambda function
-                    continue;
-                }
-
-                final int modifiers = m.getModifiers();
-                if (isPrivate(modifiers)) {
-                    // Okay
-                } else if (isProtected(modifiers)) {
-                    coreHelpers[coreIndex++] = m;
-                } else {
-                    flag(name, "is neither private nor protected");
-                }
-            }
-        }
-
-        Class liveClass = ComputerLocked.class;
-        final Method[] liveMethods = liveClass.getDeclaredMethods();
-
-        // Examine every method in the live list.  Every method must be final and must
-        // inherit either from base or core.  If the method inherits from a base method
-        // then the base must be MANDATORY.
-        for (Method m : base.getDeclaredMethods()) {
-            String name = "Computer." + displayName(m);
-            final boolean locked = methodType.get(m);
-            final Method live = matchMethod(m, liveMethods);
-            if (live == null) {
-                if (locked) {
-                    flag(name, "not overridden in ComputerLocked");
-                }
-                continue;
-            }
-            if (!locked) {
-                flag(name, "improperly overridden in ComputerLocked");
-                continue;
-            }
-
-            name = "ComputerLocked." + displayName(m);
-            final int modifiers = live.getModifiers();
-            if (!locked) {
-                if (!isPublic(modifiers)) {
-                    flag(name, "is not public");
-                }
-                if (!isFinal(modifiers)) {
-                    flag(name, "is not final");
-                }
-            }
-        }
-        for (Method m : coreHelpers) {
-            if (m == null) {
-                continue;
-            }
-            String name = "ComputerLocked." + displayName(m);
-            final Method live = matchMethod(m, liveMethods);
-            if (live == null) {
-                flag(name, "is not overridden in ComputerLocked");
-                continue;
-            }
-        }
-        for (Method m : liveMethods) {
-            if (m != null) {
-                String name = "ComputerLocked." + displayName(m);
-                flag(name, "illegal local method");
-            }
-        }
-    }
-
     private static PerPackageReadTimeouts[] getPerPackageReadTimeouts(String knownDigestersList) {
         final String defaultTimeouts = "3600000001:3600000002:3600000003";
         List<PerPackageReadTimeouts> result = PerPackageReadTimeouts.parseDigestersList(