diff --git a/services/core/java/com/android/server/pm/Computer.java b/services/core/java/com/android/server/pm/Computer.java index ad149d3434907..a878bfd46a541 100644 --- a/services/core/java/com/android/server/pm/Computer.java +++ b/services/core/java/com/android/server/pm/Computer.java @@ -236,7 +236,8 @@ public interface Computer extends PackageDataSnapshot { * existence. *

* Package with {@link PackageManager#SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN} is not - * treated as an uninstalled package for the carrier apps customization. + * treated as an uninstalled package for the carrier apps customization. Bypassing the + * uninstalled package check if the caller is system, shell or root uid. */ boolean shouldFilterApplicationIncludingUninstalled(@Nullable PackageStateInternal ps, int callingUid, int userId); diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java index 9489dc8de5930..b7d241e5867c1 100644 --- a/services/core/java/com/android/server/pm/ComputerEngine.java +++ b/services/core/java/com/android/server/pm/ComputerEngine.java @@ -58,6 +58,7 @@ import static com.android.server.pm.PackageManagerService.EMPTY_INT_ARRAY; import static com.android.server.pm.PackageManagerService.HIDE_EPHEMERAL_APIS; import static com.android.server.pm.PackageManagerService.TAG; import static com.android.server.pm.PackageManagerServiceUtils.compareSignatures; +import static com.android.server.pm.PackageManagerServiceUtils.isSystemOrRootOrShell; import static com.android.server.pm.resolution.ComponentResolver.RESOLVE_PRIORITY_SORTER; import android.Manifest; @@ -2737,9 +2738,13 @@ public class ComputerEngine implements Computer { final String instantAppPkgName = getInstantAppPackageName(callingUid); final boolean callerIsInstantApp = instantAppPkgName != null; // Don't treat hiddenUntilInstalled as an uninstalled state, phone app needs to access - // these hidden application details to customize carrier apps. - if (ps == null || (filterUninstall && !ps.isHiddenUntilInstalled() - && !ps.getUserStateOrDefault(userId).isInstalled())) { + // these hidden application details to customize carrier apps. Also, allowing the system + // caller accessing to application across users. + if (ps == null + || (filterUninstall + && !isSystemOrRootOrShell(callingUid) + && !ps.isHiddenUntilInstalled() + && !ps.getUserStateOrDefault(userId).isInstalled())) { // If caller is instant app or sdk sandbox and ps is null, pretend the application // exists, but, needs to be filtered return (callerIsInstantApp || filterUninstall || Process.isSdkSandboxUid(callingUid)); @@ -2837,6 +2842,9 @@ public class ComputerEngine implements Computer { if (shouldFilterApplication(sus, callingUid, userId)) { return true; } + if (isSystemOrRootOrShell(callingUid)) { + return false; + } final ArraySet packageStates = (ArraySet) sus.getPackageStates(); for (int index = 0; index < packageStates.size(); index++) { diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java index 629ac71b9824a..b7ab381a08b5d 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java @@ -1271,7 +1271,13 @@ public class PackageManagerServiceUtils { * Check if the Binder caller is system UID, root's UID, or shell's UID. */ public static boolean isSystemOrRootOrShell() { - final int uid = Binder.getCallingUid(); + return isSystemOrRootOrShell(Binder.getCallingUid()); + } + + /** + * @see #isSystemOrRoot() + */ + public static boolean isSystemOrRootOrShell(int uid) { return uid == Process.SYSTEM_UID || uid == Process.ROOT_UID || uid == Process.SHELL_UID; }