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