Remove PackageInfo from ApexPackageInfo

Consumers inside system_server should use AndroidPackage/PackageState
directly.

This may regress some metrics as it pushes PackageInfo generation to
call time instead of cached ahead of time, but this method is more
accurate as it allows filling any user-specific fields and mirrors
how _Info objects are generated in the rest of the system.

Bug: 239965524

Test: atest ApexManagerTest

Change-Id: Ibdea719c75a9c72ac144a1f30692d04d280c6309
diff --git a/services/core/java/com/android/server/pm/ApexPackageInfo.java b/services/core/java/com/android/server/pm/ApexPackageInfo.java
index f959a52..1fd9f8e 100644
--- a/services/core/java/com/android/server/pm/ApexPackageInfo.java
+++ b/services/core/java/com/android/server/pm/ApexPackageInfo.java
@@ -22,10 +22,9 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.apex.ApexInfo;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.util.ArrayMap;
+import android.util.Pair;
 import android.util.PrintWriterPrinter;
 
 import com.android.internal.annotations.GuardedBy;
@@ -33,8 +32,9 @@
 import com.android.internal.util.Preconditions;
 import com.android.server.pm.parsing.PackageParser2;
 import com.android.server.pm.parsing.pkg.AndroidPackage;
+import com.android.server.pm.parsing.pkg.AndroidPackageUtils;
 import com.android.server.pm.parsing.pkg.ParsedPackage;
-import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils;
+import com.android.server.pm.pkg.PackageStateInternal;
 import com.android.server.pm.pkg.parsing.ParsingPackageUtils;
 
 import java.io.File;
@@ -59,17 +59,7 @@
     private final Object mLock = new Object();
 
     @GuardedBy("mLock")
-    private List<PackageInfo> mAllPackagesCache;
-
-    /**
-     * Whether an APEX package is active or not.
-     *
-     * @param packageInfo the package to check
-     * @return {@code true} if this package is active, {@code false} otherwise.
-     */
-    private static boolean isActive(PackageInfo packageInfo) {
-        return packageInfo.isActiveApex;
-    }
+    private List<Pair<ApexInfo, AndroidPackage>> mAllPackagesCache;
 
     /**
      * Called by package manager service to scan apex package files when device boots up.
@@ -105,20 +95,23 @@
      *         is not found.
      */
     @Nullable
-    PackageInfo getPackageInfo(String packageName, @ApexManager.PackageInfoFlags int flags) {
+    Pair<ApexInfo, AndroidPackage> getPackageInfo(String packageName,
+            @ApexManager.PackageInfoFlags int flags) {
         synchronized (mLock) {
             Preconditions.checkState(mAllPackagesCache != null,
                     "APEX packages have not been scanned");
             boolean matchActive = (flags & MATCH_ACTIVE_PACKAGE) != 0;
             boolean matchFactory = (flags & MATCH_FACTORY_PACKAGE) != 0;
             for (int i = 0, size = mAllPackagesCache.size(); i < size; i++) {
-                final PackageInfo packageInfo = mAllPackagesCache.get(i);
-                if (!packageInfo.packageName.equals(packageName)) {
+                final Pair<ApexInfo, AndroidPackage> pair = mAllPackagesCache.get(i);
+                var apexInfo = pair.first;
+                var pkg = pair.second;
+                if (!pkg.getPackageName().equals(packageName)) {
                     continue;
                 }
-                if ((matchActive && isActive(packageInfo))
-                        || (matchFactory && isFactory(packageInfo))) {
-                    return packageInfo;
+                if ((matchActive && apexInfo.isActive)
+                        || (matchFactory && apexInfo.isFactory)) {
+                    return pair;
                 }
             }
             return null;
@@ -128,18 +121,18 @@
     /**
      * Retrieves information about all active APEX packages.
      *
-     * @return a List of PackageInfo object, each one containing information about a different
-     *         active package.
+     * @return list containing information about different active packages.
      */
-    List<PackageInfo> getActivePackages() {
+    @NonNull
+    List<Pair<ApexInfo, AndroidPackage>> getActivePackages() {
         synchronized (mLock) {
             Preconditions.checkState(mAllPackagesCache != null,
                     "APEX packages have not been scanned");
-            final List<PackageInfo> activePackages = new ArrayList<>();
+            final List<Pair<ApexInfo, AndroidPackage>> activePackages = new ArrayList<>();
             for (int i = 0; i < mAllPackagesCache.size(); i++) {
-                final PackageInfo packageInfo = mAllPackagesCache.get(i);
-                if (isActive(packageInfo)) {
-                    activePackages.add(packageInfo);
+                final var pair = mAllPackagesCache.get(i);
+                if (pair.first.isActive) {
+                    activePackages.add(pair);
                 }
             }
             return activePackages;
@@ -147,20 +140,20 @@
     }
 
     /**
-     * Retrieves information about all active pre-installed APEX packages.
+     * Retrieves information about all pre-installed APEX packages.
      *
-     * @return a List of PackageInfo object, each one containing information about a different
-     *         active pre-installed package.
+     * @return list containing information about different pre-installed packages.
      */
-    List<PackageInfo> getFactoryPackages() {
+    @NonNull
+    List<Pair<ApexInfo, AndroidPackage>> getFactoryPackages() {
         synchronized (mLock) {
             Preconditions.checkState(mAllPackagesCache != null,
                     "APEX packages have not been scanned");
-            final List<PackageInfo> factoryPackages = new ArrayList<>();
+            final List<Pair<ApexInfo, AndroidPackage>> factoryPackages = new ArrayList<>();
             for (int i = 0; i < mAllPackagesCache.size(); i++) {
-                final PackageInfo packageInfo = mAllPackagesCache.get(i);
-                if (isFactory(packageInfo)) {
-                    factoryPackages.add(packageInfo);
+                final var pair = mAllPackagesCache.get(i);
+                if (pair.first.isFactory) {
+                    factoryPackages.add(pair);
                 }
             }
             return factoryPackages;
@@ -170,18 +163,18 @@
     /**
      * Retrieves information about all inactive APEX packages.
      *
-     * @return a List of PackageInfo object, each one containing information about a different
-     *         inactive package.
+     * @return list containing information about different inactive packages.
      */
-    List<PackageInfo> getInactivePackages() {
+    @NonNull
+    List<Pair<ApexInfo, AndroidPackage>> getInactivePackages() {
         synchronized (mLock) {
             Preconditions.checkState(mAllPackagesCache != null,
                     "APEX packages have not been scanned");
-            final List<PackageInfo> inactivePackages = new ArrayList<>();
+            final List<Pair<ApexInfo, AndroidPackage>> inactivePackages = new ArrayList<>();
             for (int i = 0; i < mAllPackagesCache.size(); i++) {
-                final PackageInfo packageInfo = mAllPackagesCache.get(i);
-                if (!isActive(packageInfo)) {
-                    inactivePackages.add(packageInfo);
+                final var pair = mAllPackagesCache.get(i);
+                if (!pair.first.isActive) {
+                    inactivePackages.add(pair);
                 }
             }
             return inactivePackages;
@@ -199,8 +192,8 @@
             Preconditions.checkState(mAllPackagesCache != null,
                     "APEX packages have not been scanned");
             for (int i = 0, size = mAllPackagesCache.size(); i < size; i++) {
-                final PackageInfo packageInfo = mAllPackagesCache.get(i);
-                if (packageInfo.packageName.equals(packageName)) {
+                final var pair = mAllPackagesCache.get(i);
+                if (pair.second.getPackageName().equals(packageName)) {
                     return true;
                 }
             }
@@ -222,21 +215,18 @@
     }
 
     void notifyPackageInstalled(ApexInfo apexInfo, AndroidPackage pkg) {
-        final int flags = PackageManager.GET_META_DATA
-                | PackageManager.GET_SIGNING_CERTIFICATES
-                | PackageManager.GET_SIGNATURES;
-        final PackageInfo newApexPkg = PackageInfoWithoutStateUtils.generate(
-                pkg, apexInfo, flags);
-        final String packageName = newApexPkg.packageName;
+        final String packageName = pkg.getPackageName();
         synchronized (mLock) {
             for (int i = 0, size = mAllPackagesCache.size(); i < size; i++) {
-                PackageInfo oldApexPkg = mAllPackagesCache.get(i);
-                if (oldApexPkg.isActiveApex && oldApexPkg.packageName.equals(packageName)) {
-                    if (isFactory(oldApexPkg)) {
-                        oldApexPkg.isActiveApex = false;
-                        mAllPackagesCache.add(newApexPkg);
+                var pair = mAllPackagesCache.get(i);
+                var oldApexInfo = pair.first;
+                var oldApexPkg = pair.second;
+                if (oldApexInfo.isActive && oldApexPkg.getPackageName().equals(packageName)) {
+                    if (oldApexInfo.isFactory) {
+                        oldApexInfo.isActive = false;
+                        mAllPackagesCache.add(Pair.create(apexInfo, pkg));
                     } else {
-                        mAllPackagesCache.set(i, newApexPkg);
+                        mAllPackagesCache.set(i, Pair.create(apexInfo, pkg));
                     }
                     break;
                 }
@@ -245,16 +235,6 @@
     }
 
     /**
-     * Whether the APEX package is pre-installed or not.
-     *
-     * @param packageInfo the package to check
-     * @return {@code true} if this package is pre-installed, {@code false} otherwise.
-     */
-    private static boolean isFactory(@NonNull PackageInfo packageInfo) {
-        return (packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0;
-    }
-
-    /**
      * Dumps various state information to the provided {@link PrintWriter} object.
      *
      * @param pw the {@link PrintWriter} object to send information to.
@@ -288,33 +268,25 @@
         HashSet<String> factoryPackagesSet = new HashSet<>();
         for (ApexManager.ScanResult result : scanResults) {
             ApexInfo ai = result.apexInfo;
-
-            final PackageInfo packageInfo = PackageInfoWithoutStateUtils.generate(
-                    result.pkg, ai, flags);
-            if (packageInfo == null) {
-                throw new IllegalStateException("Unable to generate package info: "
-                        + ai.modulePath);
-            }
-            if (!packageInfo.packageName.equals(result.packageName)) {
+            String packageName = result.pkg.getPackageName();
+            if (!packageName.equals(result.packageName)) {
                 throw new IllegalStateException("Unmatched package name: "
-                        + result.packageName + " != " + packageInfo.packageName
+                        + result.packageName + " != " + packageName
                         + ", path=" + ai.modulePath);
             }
-            mAllPackagesCache.add(packageInfo);
+            mAllPackagesCache.add(Pair.create(ai, result.pkg));
             if (ai.isActive) {
-                if (!activePackagesSet.add(packageInfo.packageName)) {
+                if (!activePackagesSet.add(packageName)) {
                     throw new IllegalStateException(
-                            "Two active packages have the same name: "
-                                    + packageInfo.packageName);
+                            "Two active packages have the same name: " + packageName);
                 }
             }
             if (ai.isFactory) {
                 // Don't throw when the duplicating APEX is VNDK APEX
-                if (!factoryPackagesSet.add(packageInfo.packageName)
+                if (!factoryPackagesSet.add(packageName)
                         && !ai.moduleName.startsWith(VNDK_APEX_MODULE_NAME_PREFIX)) {
                     throw new IllegalStateException(
-                            "Two factory packages have the same name: "
-                                    + packageInfo.packageName);
+                            "Two factory packages have the same name: " + packageName);
                 }
             }
         }
@@ -363,30 +335,65 @@
     }
 
     /**
+     * @see #dumpPackages(List, String, IndentingPrintWriter)
+     */
+    static void dumpPackageStates(List<PackageStateInternal> packageStates, boolean isActive,
+            @Nullable String packageName, IndentingPrintWriter ipw) {
+        ipw.println();
+        ipw.increaseIndent();
+        for (int i = 0, size = packageStates.size(); i < size; i++) {
+            final var packageState = packageStates.get(i);
+            var pkg = packageState.getPkg();
+            if (packageName != null && !packageName.equals(pkg.getPackageName())) {
+                continue;
+            }
+            ipw.println(pkg.getPackageName());
+            ipw.increaseIndent();
+            ipw.println("Version: " + pkg.getLongVersionCode());
+            ipw.println("Path: " + pkg.getBaseApkPath());
+            ipw.println("IsActive: " + isActive);
+            ipw.println("IsFactory: " + !packageState.isUpdatedSystemApp());
+            ipw.println("ApplicationInfo: ");
+            ipw.increaseIndent();
+            // TODO: Dump the package manually
+            AndroidPackageUtils.generateAppInfoWithoutState(pkg)
+                    .dump(new PrintWriterPrinter(ipw), "");
+            ipw.decreaseIndent();
+            ipw.decreaseIndent();
+        }
+        ipw.decreaseIndent();
+        ipw.println();
+    }
+
+    /**
      * Dump information about the packages contained in a particular cache
      * @param packagesCache the cache to print information about.
      * @param packageName a {@link String} containing a package name, or {@code null}. If set,
      *                    only information about that specific package will be dumped.
      * @param ipw the {@link IndentingPrintWriter} object to send information to.
      */
-    static void dumpPackages(List<PackageInfo> packagesCache,
+    static void dumpPackages(List<Pair<ApexInfo, AndroidPackage>> packagesCache,
             @Nullable String packageName, IndentingPrintWriter ipw) {
         ipw.println();
         ipw.increaseIndent();
         for (int i = 0, size = packagesCache.size(); i < size; i++) {
-            final PackageInfo pi = packagesCache.get(i);
-            if (packageName != null && !packageName.equals(pi.packageName)) {
+            final var pair = packagesCache.get(i);
+            var apexInfo = pair.first;
+            var pkg = pair.second;
+            if (packageName != null && !packageName.equals(pkg.getPackageName())) {
                 continue;
             }
-            ipw.println(pi.packageName);
+            ipw.println(pkg.getPackageName());
             ipw.increaseIndent();
-            ipw.println("Version: " + pi.versionCode);
-            ipw.println("Path: " + pi.applicationInfo.sourceDir);
-            ipw.println("IsActive: " + isActive(pi));
-            ipw.println("IsFactory: " + isFactory(pi));
+            ipw.println("Version: " + pkg.getLongVersionCode());
+            ipw.println("Path: " + pkg.getBaseApkPath());
+            ipw.println("IsActive: " + apexInfo.isActive);
+            ipw.println("IsFactory: " + apexInfo.isFactory);
             ipw.println("ApplicationInfo: ");
             ipw.increaseIndent();
-            pi.applicationInfo.dump(new PrintWriterPrinter(ipw), "");
+            // TODO: Dump the package manually
+            AndroidPackageUtils.generateAppInfoWithoutState(pkg)
+                    .dump(new PrintWriterPrinter(ipw), "");
             ipw.decreaseIndent();
             ipw.decreaseIndent();
         }
diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java
index 63c25ea..8ec3d2b 100644
--- a/services/core/java/com/android/server/pm/ComputerEngine.java
+++ b/services/core/java/com/android/server/pm/ComputerEngine.java
@@ -65,6 +65,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.UserIdInt;
+import android.apex.ApexInfo;
 import android.app.ActivityManager;
 import android.content.ComponentName;
 import android.content.Context;
@@ -1018,11 +1019,12 @@
                 if ((flags & PackageManager.MATCH_SYSTEM_ONLY) != 0) {
                     apexFlags = ApexManager.MATCH_FACTORY_PACKAGE;
                 }
-                final PackageInfo pi = mApexPackageInfo.getPackageInfo(packageName, apexFlags);
-                if (pi == null) {
+                final var pair = mApexPackageInfo.getPackageInfo(packageName, apexFlags);
+                if (pair == null) {
                     return null;
                 }
-                return pi.applicationInfo;
+                return PackageInfoUtils.generateApplicationInfo(pair.second, flags,
+                        PackageUserStateInternal.DEFAULT, userId, null);
             }
         }
         if ("android".equals(packageName) || "system".equals(packageName)) {
@@ -1718,8 +1720,12 @@
             // Instant app filtering for APEX modules is ignored
             if (!ApexPackageInfo.ENABLE_FEATURE_SCAN_APEX) {
                 if (matchApex) {
-                    return mApexPackageInfo.getPackageInfo(packageName,
+                    final var pair = mApexPackageInfo.getPackageInfo(packageName,
                             ApexManager.MATCH_FACTORY_PACKAGE);
+                    if (pair == null) {
+                        return null;
+                    }
+                    return PackageInfoUtils.generate(pair.second, pair.first, flags, null, userId);
                 }
             }
             final PackageStateInternal ps = mSettings.getDisabledSystemPkg(packageName);
@@ -1775,8 +1781,12 @@
         }
         if (!ApexPackageInfo.ENABLE_FEATURE_SCAN_APEX) {
             if (matchApex) {
-                return mApexPackageInfo.getPackageInfo(packageName,
+                final var pair = mApexPackageInfo.getPackageInfo(packageName,
                         ApexManager.MATCH_ACTIVE_PACKAGE);
+                if (pair == null) {
+                    return null;
+                }
+                return PackageInfoUtils.generate(pair.second, pair.first, flags, null, userId);
             }
         }
         return null;
@@ -1883,10 +1893,17 @@
         }
         if (!ApexPackageInfo.ENABLE_FEATURE_SCAN_APEX) {
             if (listApex) {
+                List<Pair<ApexInfo, AndroidPackage>> pairs;
                 if (listFactory) {
-                    list.addAll(mApexPackageInfo.getFactoryPackages());
+                    pairs = mApexPackageInfo.getFactoryPackages();
                 } else {
-                    list.addAll(mApexPackageInfo.getActivePackages());
+                    pairs = mApexPackageInfo.getActivePackages();
+                }
+
+                for (int index = 0; index < pairs.size(); index++) {
+                    var pair = pairs.get(index);
+                    list.add(PackageInfoUtils.generate(pair.second, pair.first, flags, null,
+                            userId));
                 }
             }
         }
@@ -3404,29 +3421,23 @@
         } // switch
     }
 
-    private void generateApexPackageInfo(List<PackageInfo> activePackages,
-            List<PackageInfo> inactivePackages, List<PackageInfo> factoryPackages) {
+    private void generateApexPackageInfo(@NonNull List<PackageStateInternal> activePackages,
+            @NonNull List<PackageStateInternal> inactivePackages,
+            @NonNull List<PackageStateInternal> factoryActivePackages,
+            @NonNull List<PackageStateInternal> factoryInactivePackages) {
         for (AndroidPackage p : mPackages.values()) {
             final String packageName = p.getPackageName();
             PackageStateInternal ps = mSettings.getPackage(packageName);
             if (!p.isApex() || ps == null) {
                 continue;
             }
-            PackageInfo pi = generatePackageInfo(ps, 0, 0);
-            if (pi == null) {
-                continue;
-            }
-            pi.isActiveApex = true;
-            activePackages.add(pi);
+            activePackages.add(ps);
             if (!ps.isUpdatedSystemApp()) {
-                factoryPackages.add(pi);
+                factoryActivePackages.add(ps);
             } else {
                 PackageStateInternal psDisabled = mSettings.getDisabledSystemPkg(packageName);
-                pi = generatePackageInfo(psDisabled, 0, 0);
-                if (pi != null) {
-                    factoryPackages.add(pi);
-                    inactivePackages.add(pi);
-                }
+                factoryInactivePackages.add(psDisabled);
+                inactivePackages.add(psDisabled);
             }
         }
     }
@@ -3434,16 +3445,19 @@
     private void dumpApex(PrintWriter pw, String packageName) {
         if (ApexPackageInfo.ENABLE_FEATURE_SCAN_APEX) {
             final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "  ", 120);
-            List<PackageInfo> activePackages = new ArrayList<>();
-            List<PackageInfo> inactivePackages = new ArrayList<>();
-            List<PackageInfo> factoryPackages = new ArrayList<>();
-            generateApexPackageInfo(activePackages, inactivePackages, factoryPackages);
+            List<PackageStateInternal> activePackages = new ArrayList<>();
+            List<PackageStateInternal> inactivePackages = new ArrayList<>();
+            List<PackageStateInternal> factoryActivePackages = new ArrayList<>();
+            List<PackageStateInternal> factoryInactivePackages = new ArrayList<>();
+            generateApexPackageInfo(activePackages, inactivePackages, factoryActivePackages,
+                    factoryInactivePackages);
             ipw.println("Active APEX packages:");
-            ApexPackageInfo.dumpPackages(activePackages, packageName, ipw);
+            ApexPackageInfo.dumpPackageStates(activePackages, true, packageName, ipw);
             ipw.println("Inactive APEX packages:");
-            ApexPackageInfo.dumpPackages(inactivePackages, packageName, ipw);
+            ApexPackageInfo.dumpPackageStates(inactivePackages, false, packageName, ipw);
             ipw.println("Factory APEX packages:");
-            ApexPackageInfo.dumpPackages(factoryPackages, packageName, ipw);
+            ApexPackageInfo.dumpPackageStates(factoryActivePackages, true, packageName, ipw);
+            ApexPackageInfo.dumpPackageStates(factoryInactivePackages, false, packageName, ipw);
         } else {
             mApexPackageInfo.dump(pw, packageName);
         }
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 3f052c0..be64414 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -1611,7 +1611,7 @@
         mSharedLibraries = injector.getSharedLibrariesImpl();
 
         mApexManager = testParams.apexManager;
-        mApexPackageInfo = new ApexPackageInfo();
+        mApexPackageInfo = new ApexPackageInfo(this);
         mArtManagerService = testParams.artManagerService;
         mAvailableFeatures = testParams.availableFeatures;
         mBackgroundDexOptService = testParams.backgroundDexOptService;
@@ -1811,7 +1811,7 @@
         mProtectedPackages = new ProtectedPackages(mContext);
 
         mApexManager = injector.getApexManager();
-        mApexPackageInfo = new ApexPackageInfo();
+        mApexPackageInfo = new ApexPackageInfo(this);
         mAppsFilter = mInjector.getAppsFilter();
 
         mInstantAppRegistry = new InstantAppRegistry(mContext, mPermissionManager,
diff --git a/services/core/java/com/android/server/pm/ScanPackageUtils.java b/services/core/java/com/android/server/pm/ScanPackageUtils.java
index 0e57c91..86affdd 100644
--- a/services/core/java/com/android/server/pm/ScanPackageUtils.java
+++ b/services/core/java/com/android/server/pm/ScanPackageUtils.java
@@ -823,8 +823,8 @@
      * ideally be static, but, it requires locks to read system state.
      */
     public static void applyPolicy(ParsedPackage parsedPackage,
-            final @PackageManagerService.ScanFlags int scanFlags, AndroidPackage platformPkg,
-            boolean isUpdatedSystemApp) {
+            final @PackageManagerService.ScanFlags int scanFlags,
+            @Nullable AndroidPackage platformPkg, boolean isUpdatedSystemApp) {
         if ((scanFlags & SCAN_AS_SYSTEM) != 0) {
             parsedPackage.setSystem(true);
             // TODO(b/135203078): Can this be done in PackageParser? Or just inferred when the flag
diff --git a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
index 9c620c4..a44def8 100644
--- a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
+++ b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
@@ -93,12 +93,14 @@
 
     /**
      * @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage.
+     * @deprecated Once ENABLE_FEATURE_SCAN_APEX is removed, this should also be removed.
      */
+    @Deprecated
     @Nullable
-    public static PackageInfo generate(AndroidPackage pkg, ApexInfo apexInfo, int flags,
-            @Nullable PackageStateInternal pkgSetting) {
+    public static PackageInfo generate(AndroidPackage pkg, ApexInfo apexInfo, long flags,
+            @Nullable PackageStateInternal pkgSetting, @UserIdInt int userId) {
         return generateWithComponents(pkg, EmptyArray.INT, flags, 0, 0, Collections.emptySet(),
-                PackageUserStateInternal.DEFAULT, UserHandle.getCallingUserId(), apexInfo, pkgSetting);
+                PackageUserStateInternal.DEFAULT, userId, apexInfo, pkgSetting);
     }
 
     /**
diff --git a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
index 20482af..503ca69 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
@@ -36,8 +36,6 @@
 import android.apex.ApexSessionParams;
 import android.apex.IApexService;
 import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
 import android.os.Environment;
 import android.os.RemoteException;
 import android.os.ServiceSpecificException;
@@ -93,16 +91,16 @@
         ApexPackageInfo apexPackageInfo = new ApexPackageInfo();
         apexPackageInfo.scanApexPackages(
                 apexInfo, mPackageParser2, ParallelPackageParser.makeExecutorService());
-        final PackageInfo activePkgPi = apexPackageInfo.getPackageInfo(TEST_APEX_PKG,
+        final var activePair = apexPackageInfo.getPackageInfo(TEST_APEX_PKG,
                 ApexManager.MATCH_ACTIVE_PACKAGE);
 
-        assertThat(activePkgPi).isNotNull();
-        assertThat(activePkgPi.packageName).contains(TEST_APEX_PKG);
+        assertThat(activePair).isNotNull();
+        assertThat(activePair.second.getPackageName()).contains(TEST_APEX_PKG);
 
-        final PackageInfo factoryPkgPi = apexPackageInfo.getPackageInfo(TEST_APEX_PKG,
+        final var factoryPair = apexPackageInfo.getPackageInfo(TEST_APEX_PKG,
                 ApexManager.MATCH_FACTORY_PACKAGE);
 
-        assertThat(factoryPkgPi).isNull();
+        assertThat(factoryPair).isNull();
     }
 
     @Test
@@ -111,16 +109,16 @@
         ApexPackageInfo apexPackageInfo = new ApexPackageInfo();
         apexPackageInfo.scanApexPackages(
                 apexInfo, mPackageParser2, ParallelPackageParser.makeExecutorService());
-        PackageInfo factoryPkgPi = apexPackageInfo.getPackageInfo(TEST_APEX_PKG,
+        var factoryPair = apexPackageInfo.getPackageInfo(TEST_APEX_PKG,
                 ApexManager.MATCH_FACTORY_PACKAGE);
 
-        assertThat(factoryPkgPi).isNotNull();
-        assertThat(factoryPkgPi.packageName).contains(TEST_APEX_PKG);
+        assertThat(factoryPair).isNotNull();
+        assertThat(factoryPair.second.getPackageName()).contains(TEST_APEX_PKG);
 
-        final PackageInfo activePkgPi = apexPackageInfo.getPackageInfo(TEST_APEX_PKG,
+        final var activePair = apexPackageInfo.getPackageInfo(TEST_APEX_PKG,
                 ApexManager.MATCH_ACTIVE_PACKAGE);
 
-        assertThat(activePkgPi).isNull();
+        assertThat(activePair).isNull();
     }
 
     @Test
@@ -388,23 +386,16 @@
         newApexInfo = mApexManager.installPackage(installedApex);
         apexPackageInfo.notifyPackageInstalled(newApexInfo, mPackageParser2);
 
-        PackageInfo newInfo = apexPackageInfo.getPackageInfo("test.apex.rebootless",
+        var newInfo = apexPackageInfo.getPackageInfo("test.apex.rebootless",
                 ApexManager.MATCH_ACTIVE_PACKAGE);
-        assertThat(newInfo.applicationInfo.sourceDir).isEqualTo(finalApex.getAbsolutePath());
-        assertThat(newInfo.applicationInfo.longVersionCode).isEqualTo(2);
-        assertThat(newInfo.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)
-                .isEqualTo(ApplicationInfo.FLAG_UPDATED_SYSTEM_APP);
-        assertThat(newInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED)
-            .isEqualTo(ApplicationInfo.FLAG_INSTALLED);
+        assertThat(newInfo.second.getBaseApkPath()).isEqualTo(finalApex.getAbsolutePath());
+        assertThat(newInfo.second.getLongVersionCode()).isEqualTo(2);
 
-        PackageInfo factoryInfo = apexPackageInfo.getPackageInfo("test.apex.rebootless",
+        var factoryInfo = apexPackageInfo.getPackageInfo("test.apex.rebootless",
                 ApexManager.MATCH_FACTORY_PACKAGE);
-        assertThat(factoryInfo.applicationInfo.sourceDir).isEqualTo(activeApexInfo.modulePath);
-        assertThat(factoryInfo.applicationInfo.longVersionCode).isEqualTo(1);
-        assertThat(factoryInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)
-            .isEqualTo(ApplicationInfo.FLAG_SYSTEM);
-        assertThat(factoryInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED)
-                .isEqualTo(ApplicationInfo.FLAG_INSTALLED);
+        assertThat(factoryInfo.second.getBaseApkPath()).isEqualTo(activeApexInfo.modulePath);
+        assertThat(factoryInfo.second.getLongVersionCode()).isEqualTo(1);
+        assertThat(factoryInfo.second.isSystem()).isTrue();
     }
 
     @Test
@@ -429,23 +420,16 @@
         newApexInfo = mApexManager.installPackage(installedApex);
         apexPackageInfo.notifyPackageInstalled(newApexInfo, mPackageParser2);
 
-        PackageInfo newInfo = apexPackageInfo.getPackageInfo("test.apex.rebootless",
+        var newInfo = apexPackageInfo.getPackageInfo("test.apex.rebootless",
                 ApexManager.MATCH_ACTIVE_PACKAGE);
-        assertThat(newInfo.applicationInfo.sourceDir).isEqualTo(finalApex.getAbsolutePath());
-        assertThat(newInfo.applicationInfo.longVersionCode).isEqualTo(2);
-        assertThat(newInfo.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)
-                .isEqualTo(ApplicationInfo.FLAG_UPDATED_SYSTEM_APP);
-        assertThat(newInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED)
-            .isEqualTo(ApplicationInfo.FLAG_INSTALLED);
+        assertThat(newInfo.second.getBaseApkPath()).isEqualTo(finalApex.getAbsolutePath());
+        assertThat(newInfo.second.getLongVersionCode()).isEqualTo(2);
 
-        PackageInfo factoryInfo = apexPackageInfo.getPackageInfo("test.apex.rebootless",
+        var factoryInfo = apexPackageInfo.getPackageInfo("test.apex.rebootless",
                 ApexManager.MATCH_FACTORY_PACKAGE);
-        assertThat(factoryInfo.applicationInfo.sourceDir).isEqualTo(factoryApexInfo.modulePath);
-        assertThat(factoryInfo.applicationInfo.longVersionCode).isEqualTo(1);
-        assertThat(factoryInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)
-            .isEqualTo(ApplicationInfo.FLAG_SYSTEM);
-        assertThat(factoryInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED)
-                .isEqualTo(ApplicationInfo.FLAG_INSTALLED);
+        assertThat(factoryInfo.second.getBaseApkPath()).isEqualTo(factoryApexInfo.modulePath);
+        assertThat(factoryInfo.second.getLongVersionCode()).isEqualTo(1);
+        assertThat(factoryInfo.second.isSystem()).isTrue();
     }
 
     @Test