Merge "Skip no-state checkUseInstalled check inside PackageInfoUtils" into rvc-dev
diff --git a/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java b/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java
index e7d91c2..115d6c4 100644
--- a/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java
+++ b/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java
@@ -40,11 +40,6 @@
 import android.content.pm.ServiceInfo;
 import android.content.pm.Signature;
 import android.content.pm.SigningInfo;
-import android.content.pm.parsing.ParsingPackage;
-import android.os.Environment;
-import android.os.UserHandle;
-
-import com.android.internal.util.ArrayUtils;
 import android.content.pm.parsing.component.ComponentParseUtils;
 import android.content.pm.parsing.component.ParsedActivity;
 import android.content.pm.parsing.component.ParsedComponent;
@@ -54,6 +49,10 @@
 import android.content.pm.parsing.component.ParsedPermissionGroup;
 import android.content.pm.parsing.component.ParsedProvider;
 import android.content.pm.parsing.component.ParsedService;
+import android.os.Environment;
+import android.os.UserHandle;
+
+import com.android.internal.util.ArrayUtils;
 
 import libcore.util.EmptyArray;
 
@@ -186,6 +185,22 @@
             return null;
         }
 
+        return generateWithoutComponentsUnchecked(pkg, gids, flags, firstInstallTime,
+                lastUpdateTime, grantedPermissions, state, userId, apexInfo, applicationInfo);
+    }
+
+    /**
+     * This bypasses critical checks that are necessary for usage with data passed outside of
+     * system server.
+     *
+     * Prefer {@link #generateWithoutComponents(ParsingPackageRead, int[], int, long, long, Set,
+     * PackageUserState, int, ApexInfo, ApplicationInfo)}.
+     */
+    @NonNull
+    public static PackageInfo generateWithoutComponentsUnchecked(ParsingPackageRead pkg, int[] gids,
+            @PackageManager.PackageInfoFlags int flags, long firstInstallTime, long lastUpdateTime,
+            Set<String> grantedPermissions, PackageUserState state, int userId,
+            @Nullable ApexInfo apexInfo, @NonNull ApplicationInfo applicationInfo) {
         PackageInfo pi = new PackageInfo();
         pi.packageName = pkg.getPackageName();
         pi.splitNames = pkg.getSplitNames();
@@ -317,6 +332,18 @@
             return null;
         }
 
+        return generateApplicationInfoUnchecked(pkg, flags, state, userId);
+    }
+
+    /**
+     * This bypasses critical checks that are necessary for usage with data passed outside of
+     * system server.
+     *
+     * Prefer {@link #generateApplicationInfo(ParsingPackageRead, int, PackageUserState, int)}.
+     */
+    @NonNull
+    public static ApplicationInfo generateApplicationInfoUnchecked(@NonNull ParsingPackageRead pkg,
+            @PackageManager.ApplicationInfoFlags int flags, PackageUserState state, int userId) {
         // Make shallow copy so we can store the metadata/libraries safely
         ApplicationInfo ai = pkg.toAppInfoWithoutState();
         // Init handles data directories
@@ -378,6 +405,23 @@
         if (applicationInfo == null) {
             applicationInfo = generateApplicationInfo(pkg, flags, state, userId);
         }
+        if (applicationInfo == null) {
+            return null;
+        }
+
+        return generateActivityInfoUnchecked(a, applicationInfo);
+    }
+
+    /**
+     * This bypasses critical checks that are necessary for usage with data passed outside of
+     * system server.
+     *
+     * Prefer {@link #generateActivityInfo(ParsingPackageRead, ParsedActivity, int,
+     * PackageUserState, ApplicationInfo, int)}.
+     */
+    @NonNull
+    public static ActivityInfo generateActivityInfoUnchecked(@NonNull ParsedActivity a,
+            @NonNull ApplicationInfo applicationInfo) {
         // Make shallow copies so we can store the metadata safely
         ActivityInfo ai = new ActivityInfo();
         assignSharedFieldsForComponentInfo(ai, a);
@@ -431,6 +475,23 @@
         if (applicationInfo == null) {
             applicationInfo = generateApplicationInfo(pkg, flags, state, userId);
         }
+        if (applicationInfo == null) {
+            return null;
+        }
+
+        return generateServiceInfoUnchecked(s, applicationInfo);
+    }
+
+    /**
+     * This bypasses critical checks that are necessary for usage with data passed outside of
+     * system server.
+     *
+     * Prefer {@link #generateServiceInfo(ParsingPackageRead, ParsedService, int, PackageUserState,
+     * ApplicationInfo, int)}.
+     */
+    @NonNull
+    public static ServiceInfo generateServiceInfoUnchecked(@NonNull ParsedService s,
+            @NonNull ApplicationInfo applicationInfo) {
         // Make shallow copies so we can store the metadata safely
         ServiceInfo si = new ServiceInfo();
         assignSharedFieldsForComponentInfo(si, s);
@@ -461,6 +522,24 @@
         if (applicationInfo == null) {
             applicationInfo = generateApplicationInfo(pkg, flags, state, userId);
         }
+        if (applicationInfo == null) {
+            return null;
+        }
+
+        return generateProviderInfoUnchecked(p, flags, applicationInfo);
+    }
+
+    /**
+     * This bypasses critical checks that are necessary for usage with data passed outside of
+     * system server.
+     *
+     * Prefer {@link #generateProviderInfo(ParsingPackageRead, ParsedProvider, int,
+     * PackageUserState, ApplicationInfo, int)}.
+     */
+    @NonNull
+    public static ProviderInfo generateProviderInfoUnchecked(@NonNull ParsedProvider p,
+            @PackageManager.ComponentInfoFlags int flags,
+            @NonNull ApplicationInfo applicationInfo) {
         // Make shallow copies so we can store the metadata safely
         ProviderInfo pi = new ProviderInfo();
         assignSharedFieldsForComponentInfo(pi, p);
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 4ab1f396..d3f668c 100644
--- a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
+++ b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java
@@ -61,7 +61,6 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Set;
 
 
@@ -110,12 +109,9 @@
             return null;
         }
 
-        PackageInfo info = PackageInfoWithoutStateUtils.generateWithoutComponents(pkg, gids, flags,
-                firstInstallTime, lastUpdateTime, grantedPermissions, state, userId, apexInfo,
-                applicationInfo);
-        if (info == null) {
-            return null;
-        }
+        PackageInfo info = PackageInfoWithoutStateUtils.generateWithoutComponentsUnchecked(pkg,
+                gids, flags, firstInstallTime, lastUpdateTime, grantedPermissions, state, userId,
+                apexInfo, applicationInfo);
 
         info.isStub = pkg.isStub();
         info.coreApp = pkg.isCoreApp();
@@ -220,11 +216,8 @@
             return null;
         }
 
-        ApplicationInfo info = PackageInfoWithoutStateUtils.generateApplicationInfo(pkg, flags,
-                state, userId);
-        if (info == null) {
-            return null;
-        }
+        ApplicationInfo info = PackageInfoWithoutStateUtils.generateApplicationInfoUnchecked(pkg,
+                flags, state, userId);
 
         if (pkgSetting != null) {
             // TODO(b/135203078): Remove PackageParser1/toAppInfoWithoutState and clean all this up
@@ -267,12 +260,13 @@
         if (applicationInfo == null) {
             applicationInfo = generateApplicationInfo(pkg, flags, state, userId, pkgSetting);
         }
-        ActivityInfo info = PackageInfoWithoutStateUtils.generateActivityInfo(pkg, a, flags, state,
-                applicationInfo, userId);
-        if (info == null) {
+
+        if (applicationInfo == null) {
             return null;
         }
 
+        ActivityInfo info =
+                PackageInfoWithoutStateUtils.generateActivityInfoUnchecked(a, applicationInfo);
         assignSharedFieldsForComponentInfo(info, a, pkgSetting);
         return info;
     }
@@ -302,12 +296,12 @@
         if (applicationInfo == null) {
             applicationInfo = generateApplicationInfo(pkg, flags, state, userId, pkgSetting);
         }
-        ServiceInfo info = PackageInfoWithoutStateUtils.generateServiceInfo(pkg, s, flags, state,
-                applicationInfo, userId);
-        if (info == null) {
+        if (applicationInfo == null) {
             return null;
         }
 
+        ServiceInfo info =
+                PackageInfoWithoutStateUtils.generateServiceInfoUnchecked(s, applicationInfo);
         assignSharedFieldsForComponentInfo(info, s, pkgSetting);
         return info;
     }
@@ -321,21 +315,20 @@
             @NonNull ApplicationInfo applicationInfo, int userId,
             @Nullable PackageSetting pkgSetting) {
         if (p == null) return null;
+        if (!checkUseInstalledOrHidden(pkg, pkgSetting, state, flags)) {
+            return null;
+        }
         if (applicationInfo == null || !pkg.getPackageName().equals(applicationInfo.packageName)) {
             Slog.wtf(TAG, "AppInfo's package name is different. Expected=" + pkg.getPackageName()
                     + " actual=" + (applicationInfo == null ? "(null AppInfo)"
                     : applicationInfo.packageName));
             applicationInfo = generateApplicationInfo(pkg, flags, state, userId, pkgSetting);
         }
-        if (!checkUseInstalledOrHidden(pkg, pkgSetting, state, flags)) {
+        if (applicationInfo == null) {
             return null;
         }
-        ProviderInfo info = PackageInfoWithoutStateUtils.generateProviderInfo(pkg, p, flags, state,
-                applicationInfo, userId);
-        if (info == null) {
-            return null;
-        }
-
+        ProviderInfo info = PackageInfoWithoutStateUtils.generateProviderInfoUnchecked(p, flags,
+                applicationInfo);
         assignSharedFieldsForComponentInfo(info, p, pkgSetting);
         return info;
     }