diff options
| author | 2016-01-08 17:42:11 -0700 | |
|---|---|---|
| committer | 2016-01-08 18:35:54 -0700 | |
| commit | cd65448ccd13c4c2d0fe9e9623fec3a898ab9372 (patch) | |
| tree | da60bd6e2d928bfe7119258f8908d8360166f2c0 | |
| parent | 629f98466a4c2d778ddd4ce5a9df107e28f9b98a (diff) | |
Even more PackageManager caller triage.
Finish moving all UID/GID callers to single AIDL method that requires
callers to provide flags.
Triage AppWidgets and PrintServices, which currently can only live on
internal storage; we should revisit that later.
Fix two bugs where we'd drop pending install sessions and persisted
Uri grants for apps installed on external storage.
Bug: 26471205
Change-Id: I66fdfc737fda0042050d81ff8839de55c2b4effd
21 files changed, 148 insertions, 123 deletions
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 42b18384c588..0afca9d5dcc7 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -221,7 +221,7 @@ public class ApplicationPackageManager extends PackageManager { public int[] getPackageGids(String packageName, int flags) throws NameNotFoundException { try { - int[] gids = mPM.getPackageGidsEtc(packageName, flags, mContext.getUserId()); + int[] gids = mPM.getPackageGids(packageName, flags, mContext.getUserId()); if (gids != null) { return gids; } @@ -246,7 +246,7 @@ public class ApplicationPackageManager extends PackageManager { public int getPackageUidAsUser(String packageName, int flags, int userId) throws NameNotFoundException { try { - int uid = mPM.getPackageUidEtc(packageName, flags, userId); + int uid = mPM.getPackageUid(packageName, flags, userId); if (uid >= 0) { return uid; } @@ -314,8 +314,14 @@ public class ApplicationPackageManager extends PackageManager { @Override public ApplicationInfo getApplicationInfo(String packageName, int flags) throws NameNotFoundException { + return getApplicationInfoAsUser(packageName, flags, mContext.getUserId()); + } + + @Override + public ApplicationInfo getApplicationInfoAsUser(String packageName, int flags, int userId) + throws NameNotFoundException { try { - ApplicationInfo ai = mPM.getApplicationInfo(packageName, flags, mContext.getUserId()); + ApplicationInfo ai = mPM.getApplicationInfo(packageName, flags, userId); if (ai != null) { // This is a temporary hack. Callers must use // createPackageContext(packageName).getApplicationInfo() to @@ -352,7 +358,6 @@ public class ApplicationPackageManager extends PackageManager { } } - @Override public ActivityInfo getActivityInfo(ComponentName className, int flags) throws NameNotFoundException { @@ -1169,8 +1174,10 @@ public class ApplicationPackageManager extends PackageManager { throw new NameNotFoundException("Package " + appPackageName + " doesn't exist"); } - int mCachedSafeMode = -1; - @Override public boolean isSafeMode() { + volatile int mCachedSafeMode = -1; + + @Override + public boolean isSafeMode() { try { if (mCachedSafeMode < 0) { mCachedSafeMode = mPM.isSafeMode() ? 1 : 0; diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 39f59554c1df..f6119917c994 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -64,10 +64,8 @@ interface IPackageManager { void checkPackageStartable(String packageName, int userId); boolean isPackageAvailable(String packageName, int userId); PackageInfo getPackageInfo(String packageName, int flags, int userId); - int getPackageUid(String packageName, int userId); - int getPackageUidEtc(String packageName, int flags, int userId); - int[] getPackageGids(String packageName, int userId); - int[] getPackageGidsEtc(String packageName, int flags, int userId); + int getPackageUid(String packageName, int flags, int userId); + int[] getPackageGids(String packageName, int flags, int userId); String[] currentToCanonicalPackageNames(in String[] names); String[] canonicalToCurrentPackageNames(in String[] names); diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index a364c18b5390..78f5908adb6c 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -2541,6 +2541,10 @@ public abstract class PackageManager { public abstract ApplicationInfo getApplicationInfo(String packageName, @ApplicationInfoFlags int flags) throws NameNotFoundException; + /** {@hide} */ + public abstract ApplicationInfo getApplicationInfoAsUser(String packageName, + @ApplicationInfoFlags int flags, @UserIdInt int userId) throws NameNotFoundException; + /** * Retrieve all of the information we know about a particular activity * class. diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java index 867d0b963cda..bcc12139b5e4 100644 --- a/core/java/android/os/UserHandle.java +++ b/core/java/android/os/UserHandle.java @@ -33,13 +33,13 @@ public final class UserHandle implements Parcelable { public static final int PER_USER_RANGE = 100000; /** @hide A user id to indicate all users on the device */ - public static final int USER_ALL = -1; + public static final @UserIdInt int USER_ALL = -1; /** @hide A user handle to indicate all users on the device */ public static final UserHandle ALL = new UserHandle(USER_ALL); /** @hide A user id to indicate the currently active user */ - public static final int USER_CURRENT = -2; + public static final @UserIdInt int USER_CURRENT = -2; /** @hide A user handle to indicate the current user of the device */ public static final UserHandle CURRENT = new UserHandle(USER_CURRENT); @@ -47,7 +47,7 @@ public final class UserHandle implements Parcelable { /** @hide A user id to indicate that we would like to send to the current * user, but if this is calling from a user process then we will send it * to the caller's user instead of failing with a security exception */ - public static final int USER_CURRENT_OR_SELF = -3; + public static final @UserIdInt int USER_CURRENT_OR_SELF = -3; /** @hide A user handle to indicate that we would like to send to the current * user, but if this is calling from a user process then we will send it @@ -55,14 +55,14 @@ public final class UserHandle implements Parcelable { public static final UserHandle CURRENT_OR_SELF = new UserHandle(USER_CURRENT_OR_SELF); /** @hide An undefined user id */ - public static final int USER_NULL = -10000; + public static final @UserIdInt int USER_NULL = -10000; /** * @hide A user id constant to indicate the "owner" user of the device * @deprecated Consider using either {@link UserHandle#USER_SYSTEM} constant or * check the target user's flag {@link android.content.pm.UserInfo#isAdmin}. */ - public static final int USER_OWNER = 0; + public static final @UserIdInt int USER_OWNER = 0; /** * @hide A user handle to indicate the primary/owner user of the device @@ -72,7 +72,7 @@ public final class UserHandle implements Parcelable { public static final UserHandle OWNER = new UserHandle(USER_OWNER); /** @hide A user id constant to indicate the "system" user of the device */ - public static final int USER_SYSTEM = 0; + public static final @UserIdInt int USER_SYSTEM = 0; /** @hide A user handle to indicate the "system" user of the device */ public static final UserHandle SYSTEM = new UserHandle(USER_SYSTEM); diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index 49d41cfaf997..c8b942bb27de 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -882,7 +882,7 @@ public class StorageManager { } packageName = packageNames[0]; } - final int uid = ActivityThread.getPackageManager().getPackageUidEtc(packageName, + final int uid = ActivityThread.getPackageManager().getPackageUid(packageName, PackageManager.MATCH_DEBUG_TRIAGED_MISSING, userId); if (uid <= 0) { return new StorageVolume[0]; diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index 6f8f8eba75f4..db901aa4a730 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -16,7 +16,6 @@ package com.android.server.appwidget; -import android.app.ActivityManager; import android.app.AlarmManager; import android.app.AppGlobals; import android.app.AppOpsManager; @@ -2206,9 +2205,11 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku final Resources resources; final long identity = Binder.clearCallingIdentity(); try { - resources = mContext.getPackageManager() - .getResourcesForApplicationAsUser(activityInfo.packageName, - UserHandle.getUserId(providerId.uid)); + final PackageManager pm = mContext.getPackageManager(); + final int userId = UserHandle.getUserId(providerId.uid); + final ApplicationInfo app = pm.getApplicationInfoAsUser(activityInfo.packageName, + PackageManager.MATCH_DEBUG_TRIAGED_MISSING, userId); + resources = pm.getResourcesForApplication(app); } finally { Binder.restoreCallingIdentity(identity); } @@ -2309,6 +2310,10 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku try { int flags = PackageManager.GET_META_DATA; + // We really need packages to be around and parsed to know if they + // provide widgets, and we only load widgets after user is unlocked. + flags |= PackageManager.MATCH_DEBUG_TRIAGED_MISSING; + // Widgets referencing shared libraries need to have their // dependencies loaded. flags |= PackageManager.GET_SHARED_LIBRARY_FILES; diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java index 353b40475e5b..e6e69b1c6047 100644 --- a/services/core/java/com/android/server/AppOpsService.java +++ b/services/core/java/com/android/server/AppOpsService.java @@ -265,8 +265,8 @@ public class AppOpsService extends IAppOpsService.Stub { Ops ops = it.next(); int curUid = -1; try { - curUid = AppGlobals.getPackageManager().getPackageUidEtc(ops.packageName, - PackageManager.GET_UNINSTALLED_PACKAGES, + curUid = AppGlobals.getPackageManager().getPackageUid(ops.packageName, + PackageManager.MATCH_UNINSTALLED_PACKAGES, UserHandle.getUserId(ops.uidState.uid)); } catch (RemoteException ignored) { } @@ -691,7 +691,7 @@ public class AppOpsService extends IAppOpsService.Stub { if (reqPackageName != null) { try { reqUid = AppGlobals.getPackageManager().getPackageUid( - reqPackageName, reqUserId); + reqPackageName, PackageManager.MATCH_UNINSTALLED_PACKAGES, reqUserId); } catch (RemoteException e) { /* ignore - local call */ } @@ -1167,7 +1167,9 @@ public class AppOpsService extends IAppOpsService.Stub { int pkgUid = -1; try { ApplicationInfo appInfo = ActivityThread.getPackageManager() - .getApplicationInfo(packageName, 0, UserHandle.getUserId(uid)); + .getApplicationInfo(packageName, + PackageManager.MATCH_DEBUG_TRIAGED_MISSING, + UserHandle.getUserId(uid)); if (appInfo != null) { pkgUid = appInfo.uid; isPrivileged = (appInfo.privateFlags @@ -1647,7 +1649,8 @@ public class AppOpsService extends IAppOpsService.Stub { if ("root".equals(packageName)) { packageUid = 0; } else { - packageUid = AppGlobals.getPackageManager().getPackageUid(packageName, userId); + packageUid = AppGlobals.getPackageManager().getPackageUid(packageName, + PackageManager.MATCH_UNINSTALLED_PACKAGES, userId); } if (packageUid < 0) { err.println("Error: No UID for " + packageName + " in user " + userId); diff --git a/services/core/java/com/android/server/GraphicsStatsService.java b/services/core/java/com/android/server/GraphicsStatsService.java index 3fdef1dab2e5..044bb04dcd7f 100644 --- a/services/core/java/com/android/server/GraphicsStatsService.java +++ b/services/core/java/com/android/server/GraphicsStatsService.java @@ -16,9 +16,8 @@ package com.android.server; +import android.app.AppOpsManager; import android.content.Context; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager.NameNotFoundException; import android.os.Binder; import android.os.IBinder; import android.os.MemoryFile; @@ -66,6 +65,7 @@ public class GraphicsStatsService extends IGraphicsStats.Stub { private static final int HISTORY_SIZE = 20; private final Context mContext; + private final AppOpsManager mAppOps; private final Object mLock = new Object(); private ArrayList<ActiveBuffer> mActive = new ArrayList<>(); private HistoricalData[] mHistoricalLog = new HistoricalData[HISTORY_SIZE]; @@ -74,15 +74,7 @@ public class GraphicsStatsService extends IGraphicsStats.Stub { public GraphicsStatsService(Context context) { mContext = context; - } - - private boolean isValid(int uid, String packageName) { - try { - PackageInfo info = mContext.getPackageManager().getPackageInfo(packageName, 0); - return info.applicationInfo.uid == uid; - } catch (NameNotFoundException e) { - } - return false; + mAppOps = context.getSystemService(AppOpsManager.class); } @Override @@ -93,9 +85,7 @@ public class GraphicsStatsService extends IGraphicsStats.Stub { ParcelFileDescriptor pfd = null; long callingIdentity = Binder.clearCallingIdentity(); try { - if (!isValid(uid, packageName)) { - throw new RemoteException("Invalid package name"); - } + mAppOps.checkPackage(uid, packageName); synchronized (mLock) { pfd = requestBufferForProcessLocked(token, uid, pid, packageName); } diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java index 6cccf381401c..4a186a620cc1 100644 --- a/services/core/java/com/android/server/MountService.java +++ b/services/core/java/com/android/server/MountService.java @@ -2355,7 +2355,8 @@ class MountService extends IMountService.Stub return false; } - final int packageUid = mPms.getPackageUid(packageName, UserHandle.getUserId(callerUid)); + final int packageUid = mPms.getPackageUid(packageName, + PackageManager.MATCH_DEBUG_TRIAGED_MISSING, UserHandle.getUserId(callerUid)); if (DEBUG_OBB) { Slog.d(TAG, "packageName = " + packageName + ", packageUid = " + diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index aa9944278134..11f9e2d58c31 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -3174,7 +3174,8 @@ public class AccountManagerService int packageUid = -1; try { packageUid = AppGlobals.getPackageManager().getPackageUid( - packageName, UserHandle.getCallingUserId()); + packageName, PackageManager.MATCH_UNINSTALLED_PACKAGES, + UserHandle.getCallingUserId()); } catch (RemoteException re) { Slog.e(TAG, "Couldn't determine the packageUid for " + packageName + re); return new Account[0]; diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index ffa7cf38146f..f21eba1460ec 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -257,6 +257,7 @@ import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEME import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE; import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING; import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; +import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.provider.Settings.Global.ALWAYS_FINISH_ACTIVITIES; import static android.provider.Settings.Global.DEBUG_APP; @@ -3445,7 +3446,7 @@ public final class ActivityManagerService extends ActivityManagerNative try { checkTime(startTime, "startProcess: getting gids from package manager"); final IPackageManager pm = AppGlobals.getPackageManager(); - permGids = pm.getPackageGidsEtc(app.info.packageName, + permGids = pm.getPackageGids(app.info.packageName, MATCH_DEBUG_TRIAGED_MISSING, app.userId); MountServiceInternal mountServiceInternal = LocalServices.getService( MountServiceInternal.class); @@ -3705,21 +3706,11 @@ public final class ActivityManagerService extends ActivityManagerNative mCheckedForSetup = true; // See if we should be showing the platform update setup UI. - Intent intent = new Intent(Intent.ACTION_UPGRADE_SETUP); - List<ResolveInfo> ris = mContext.getPackageManager() - .queryIntentActivities(intent, PackageManager.GET_META_DATA); - - // We don't allow third party apps to replace this. - ResolveInfo ri = null; - for (int i=0; ris != null && i<ris.size(); i++) { - if ((ris.get(i).activityInfo.applicationInfo.flags - & ApplicationInfo.FLAG_SYSTEM) != 0) { - ri = ris.get(i); - break; - } - } - - if (ri != null) { + final Intent intent = new Intent(Intent.ACTION_UPGRADE_SETUP); + final List<ResolveInfo> ris = mContext.getPackageManager().queryIntentActivities(intent, + PackageManager.MATCH_SYSTEM_ONLY | PackageManager.GET_META_DATA); + if (!ris.isEmpty()) { + final ResolveInfo ri = ris.get(0); String vers = ri.activityInfo.metaData != null ? ri.activityInfo.metaData.getString(Intent.METADATA_SETUP_VERSION) : null; @@ -5387,7 +5378,7 @@ public final class ActivityManagerService extends ActivityManagerNative int pkgUid = -1; synchronized(this) { try { - pkgUid = pm.getPackageUid(packageName, userId); + pkgUid = pm.getPackageUid(packageName, MATCH_UNINSTALLED_PACKAGES, userId); } catch (RemoteException e) { } if (pkgUid == -1) { @@ -5472,7 +5463,8 @@ public final class ActivityManagerService extends ActivityManagerNative synchronized(this) { int appId = -1; try { - appId = UserHandle.getAppId(pm.getPackageUid(packageName, 0)); + appId = UserHandle.getAppId( + pm.getPackageUid(packageName, MATCH_DEBUG_TRIAGED_MISSING, userId)); } catch (RemoteException e) { } if (appId == -1) { @@ -5558,7 +5550,8 @@ public final class ActivityManagerService extends ActivityManagerNative for (int user : users) { int pkgUid = -1; try { - pkgUid = pm.getPackageUid(packageName, user); + pkgUid = pm.getPackageUid(packageName, MATCH_DEBUG_TRIAGED_MISSING, + user); } catch (RemoteException e) { } if (pkgUid == -1) { @@ -5952,8 +5945,8 @@ public final class ActivityManagerService extends ActivityManagerNative if (appId < 0 && packageName != null) { try { - appId = UserHandle.getAppId( - AppGlobals.getPackageManager().getPackageUid(packageName, 0)); + appId = UserHandle.getAppId(AppGlobals.getPackageManager() + .getPackageUid(packageName, MATCH_DEBUG_TRIAGED_MISSING, userId)); } catch (RemoteException e) { } } @@ -6933,8 +6926,8 @@ public final class ActivityManagerService extends ActivityManagerNative } try { if (callingUid != 0 && callingUid != Process.SYSTEM_UID) { - int uid = AppGlobals.getPackageManager() - .getPackageUid(packageName, UserHandle.getUserId(callingUid)); + final int uid = AppGlobals.getPackageManager().getPackageUid(packageName, + MATCH_DEBUG_TRIAGED_MISSING, UserHandle.getUserId(callingUid)); if (!UserHandle.isSameApp(callingUid, uid)) { String msg = "Permission Denial: getIntentSender() from pid=" + Binder.getCallingPid() @@ -7029,8 +7022,8 @@ public final class ActivityManagerService extends ActivityManagerNative synchronized(this) { PendingIntentRecord rec = (PendingIntentRecord)sender; try { - int uid = AppGlobals.getPackageManager() - .getPackageUid(rec.key.packageName, UserHandle.getCallingUserId()); + final int uid = AppGlobals.getPackageManager().getPackageUid(rec.key.packageName, + MATCH_DEBUG_TRIAGED_MISSING, UserHandle.getCallingUserId()); if (!UserHandle.isSameApp(uid, Binder.getCallingUid())) { String msg = "Permission Denial: cancelIntentSender() from pid=" + Binder.getCallingPid() @@ -7777,7 +7770,8 @@ public final class ActivityManagerService extends ActivityManagerNative int targetUid = lastTargetUid; if (targetUid < 0 && targetPkg != null) { try { - targetUid = pm.getPackageUid(targetPkg, UserHandle.getUserId(callingUid)); + targetUid = pm.getPackageUid(targetPkg, MATCH_DEBUG_TRIAGED_MISSING, + UserHandle.getUserId(callingUid)); if (targetUid < 0) { if (DEBUG_URI_PERMISSION) Slog.v(TAG_URI_PERMISSION, "Can't grant URI permission no uid for: " + targetPkg); @@ -7915,7 +7909,7 @@ public final class ActivityManagerService extends ActivityManagerNative int targetUid; final IPackageManager pm = AppGlobals.getPackageManager(); try { - targetUid = pm.getPackageUid(targetPkg, targetUserId); + targetUid = pm.getPackageUid(targetPkg, MATCH_DEBUG_TRIAGED_MISSING, targetUserId); } catch (RemoteException ex) { return; } @@ -7976,7 +7970,8 @@ public final class ActivityManagerService extends ActivityManagerNative targetUid = needed.targetUid; } else { try { - targetUid = pm.getPackageUid(targetPkg, targetUserId); + targetUid = pm.getPackageUid(targetPkg, MATCH_DEBUG_TRIAGED_MISSING, + targetUserId); } catch (RemoteException ex) { return null; } @@ -8443,8 +8438,8 @@ public final class ActivityManagerService extends ActivityManagerNative if (pi != null && sourcePkg.equals(pi.packageName)) { int targetUid = -1; try { - targetUid = AppGlobals.getPackageManager() - .getPackageUid(targetPkg, targetUserId); + targetUid = AppGlobals.getPackageManager().getPackageUid( + targetPkg, MATCH_UNINSTALLED_PACKAGES, targetUserId); } catch (RemoteException e) { } if (targetUid != -1) { @@ -8600,7 +8595,8 @@ public final class ActivityManagerService extends ActivityManagerNative final int callingUid = Binder.getCallingUid(); final IPackageManager pm = AppGlobals.getPackageManager(); try { - final int packageUid = pm.getPackageUid(packageName, UserHandle.getUserId(callingUid)); + final int packageUid = pm.getPackageUid(packageName, MATCH_DEBUG_TRIAGED_MISSING, + UserHandle.getUserId(callingUid)); if (packageUid != callingUid) { throw new SecurityException( "Package " + packageName + " does not belong to calling UID " + callingUid); @@ -12459,19 +12455,13 @@ public final class ActivityManagerService extends ActivityManagerNative List<ResolveInfo> ris = null; try { ris = AppGlobals.getPackageManager().queryIntentReceivers( - intent, null, 0, UserHandle.USER_SYSTEM); + intent, null, MATCH_SYSTEM_ONLY, UserHandle.USER_SYSTEM); } catch (RemoteException e) { } if (ris == null) { return false; } - for (int i=ris.size()-1; i>=0; i--) { - if ((ris.get(i).activityInfo.applicationInfo.flags - &ApplicationInfo.FLAG_SYSTEM) == 0) { - ris.remove(i); - } - } - intent.addFlags(Intent.FLAG_RECEIVER_BOOT_UPGRADE); + intent.addFlags(Intent.FLAG_RECEIVER_BOOT_UPGRADE | Intent.FLAG_DEBUG_TRIAGED_MISSING); ArrayList<ComponentName> lastDoneReceivers = readLastDonePreBootReceivers(); for (int i=0; i<ris.size(); i++) { @@ -13991,7 +13981,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (dumpPackage != null) { IPackageManager pm = AppGlobals.getPackageManager(); try { - dumpUid = pm.getPackageUid(dumpPackage, 0); + dumpUid = pm.getPackageUid(dumpPackage, MATCH_UNINSTALLED_PACKAGES, 0); } catch (RemoteException e) { } } @@ -14927,7 +14917,8 @@ public final class ActivityManagerService extends ActivityManagerNative int dumpUid = -2; if (dumpPackage != null) { try { - dumpUid = mContext.getPackageManager().getPackageUidAsUser(dumpPackage, 0); + dumpUid = mContext.getPackageManager().getPackageUidAsUser(dumpPackage, + MATCH_UNINSTALLED_PACKAGES, 0); } catch (NameNotFoundException e) { dumpUid = -1; } @@ -21080,7 +21071,7 @@ public final class ActivityManagerService extends ActivityManagerNative IPackageManager pm = AppGlobals.getPackageManager(); int pkgUid = -1; try { - pkgUid = pm.getPackageUid(packageName, userId); + pkgUid = pm.getPackageUid(packageName, MATCH_DEBUG_TRIAGED_MISSING, userId); } catch (RemoteException e) { } if (pkgUid == -1) { diff --git a/services/core/java/com/android/server/firewall/SenderPackageFilter.java b/services/core/java/com/android/server/firewall/SenderPackageFilter.java index dc3edd9c7888..91c9671357a8 100644 --- a/services/core/java/com/android/server/firewall/SenderPackageFilter.java +++ b/services/core/java/com/android/server/firewall/SenderPackageFilter.java @@ -20,6 +20,7 @@ import android.app.AppGlobals; import android.content.ComponentName; import android.content.Intent; import android.content.pm.IPackageManager; +import android.content.pm.PackageManager; import android.os.RemoteException; import android.os.UserHandle; @@ -46,7 +47,8 @@ public class SenderPackageFilter implements Filter { try { // USER_SYSTEM here is not important. Only app id is used and getPackageUid() will // return a uid whether the app is installed for a user or not. - packageUid = pm.getPackageUid(mPackageName, UserHandle.USER_SYSTEM); + packageUid = pm.getPackageUid(mPackageName, PackageManager.MATCH_UNINSTALLED_PACKAGES, + UserHandle.USER_SYSTEM); } catch (RemoteException ex) { // handled below } diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java index 0796811d6ad3..18618d545f80 100644 --- a/services/core/java/com/android/server/pm/LauncherAppsService.java +++ b/services/core/java/com/android/server/pm/LauncherAppsService.java @@ -24,8 +24,8 @@ import android.content.pm.ActivityInfo; import android.content.pm.ILauncherApps; import android.content.pm.IOnAppsChangedListener; import android.content.pm.IPackageManager; -import android.content.pm.PackageManager; import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; @@ -45,7 +45,6 @@ import android.util.Slog; import com.android.internal.content.PackageMonitor; import com.android.server.SystemService; -import java.util.ArrayList; import java.util.List; /** @@ -200,7 +199,8 @@ public class LauncherAppsService extends SystemService { mainIntent.setPackage(packageName); long ident = Binder.clearCallingIdentity(); try { - List<ResolveInfo> apps = mPm.queryIntentActivitiesAsUser(mainIntent, 0 /* flags */, + List<ResolveInfo> apps = mPm.queryIntentActivitiesAsUser(mainIntent, + PackageManager.MATCH_DEBUG_TRIAGED_MISSING, user.getIdentifier()); return new ParceledListSlice<>(apps); } finally { @@ -218,7 +218,8 @@ public class LauncherAppsService extends SystemService { long ident = Binder.clearCallingIdentity(); try { - ResolveInfo app = mPm.resolveActivityAsUser(intent, 0, user.getIdentifier()); + ResolveInfo app = mPm.resolveActivityAsUser(intent, + PackageManager.MATCH_DEBUG_TRIAGED_MISSING, user.getIdentifier()); return app; } finally { Binder.restoreCallingIdentity(ident); @@ -236,7 +237,8 @@ public class LauncherAppsService extends SystemService { long ident = Binder.clearCallingIdentity(); try { IPackageManager pm = AppGlobals.getPackageManager(); - PackageInfo info = pm.getPackageInfo(packageName, 0, user.getIdentifier()); + PackageInfo info = pm.getPackageInfo(packageName, + PackageManager.MATCH_DEBUG_TRIAGED_MISSING, user.getIdentifier()); return info != null && info.applicationInfo.enabled; } finally { Binder.restoreCallingIdentity(ident); @@ -254,7 +256,8 @@ public class LauncherAppsService extends SystemService { long ident = Binder.clearCallingIdentity(); try { IPackageManager pm = AppGlobals.getPackageManager(); - ActivityInfo info = pm.getActivityInfo(component, 0, user.getIdentifier()); + ActivityInfo info = pm.getActivityInfo(component, + PackageManager.MATCH_DEBUG_TRIAGED_MISSING, user.getIdentifier()); return info != null; } finally { Binder.restoreCallingIdentity(ident); @@ -279,7 +282,8 @@ public class LauncherAppsService extends SystemService { long ident = Binder.clearCallingIdentity(); try { IPackageManager pm = AppGlobals.getPackageManager(); - ActivityInfo info = pm.getActivityInfo(component, 0, user.getIdentifier()); + ActivityInfo info = pm.getActivityInfo(component, + PackageManager.MATCH_DEBUG_TRIAGED_MISSING, user.getIdentifier()); if (!info.exported) { throw new SecurityException("Cannot launch non-exported components " + component); @@ -289,7 +293,7 @@ public class LauncherAppsService extends SystemService { // as calling startActivityAsUser ignores the category and just // resolves based on the component if present. List<ResolveInfo> apps = mPm.queryIntentActivitiesAsUser(launchIntent, - 0 /* flags */, user.getIdentifier()); + PackageManager.MATCH_DEBUG_TRIAGED_MISSING, user.getIdentifier()); final int size = apps.size(); for (int i = 0; i < size; ++i) { ActivityInfo activityInfo = apps.get(i).activityInfo; diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 7e4e46b95177..55b8bf2f6206 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -386,8 +386,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub { final int sessionId = readIntAttribute(in, ATTR_SESSION_ID); final int userId = readIntAttribute(in, ATTR_USER_ID); final String installerPackageName = readStringAttribute(in, ATTR_INSTALLER_PACKAGE_NAME); - final int installerUid = readIntAttribute(in, ATTR_INSTALLER_UID, - mPm.getPackageUid(installerPackageName, userId)); + final int installerUid = readIntAttribute(in, ATTR_INSTALLER_UID, mPm.getPackageUid( + installerPackageName, PackageManager.MATCH_UNINSTALLED_PACKAGES, userId)); final long createdMillis = readLongAttribute(in, ATTR_CREATED_MILLIS); final String stageDirRaw = readStringAttribute(in, ATTR_SESSION_STAGE_DIR); final File stageDir = (stageDirRaw != null) ? new File(stageDirRaw) : null; diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 66d10b51dabc..1655cb67979d 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -947,7 +947,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } final int uid = mPm.getPackageUid(PackageManagerService.DEFAULT_CONTAINER_PACKAGE, - UserHandle.USER_SYSTEM); + PackageManager.MATCH_SYSTEM_ONLY, UserHandle.USER_SYSTEM); final int gid = UserHandle.getSharedAppGid(uid); if (!PackageHelper.fixSdPermissions(cid, gid, null)) { throw new PackageManagerException(INSTALL_FAILED_CONTAINER_ERROR, diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 34523ceb2445..870ae892d435 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -59,6 +59,7 @@ import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATIO import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER; import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; import static android.content.pm.PackageManager.MATCH_ALL; +import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING; import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS; import static android.content.pm.PackageManager.MATCH_ENCRYPTION_AWARE_AND_UNAWARE; import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; @@ -2836,12 +2837,7 @@ public class PackageManagerService extends IPackageManager.Stub { } @Override - public int getPackageUid(String packageName, int userId) { - return getPackageUidEtc(packageName, 0, userId); - } - - @Override - public int getPackageUidEtc(String packageName, int flags, int userId) { + public int getPackageUid(String packageName, int flags, int userId) { if (!sUserManager.exists(userId)) return -1; flags = updateFlagsForPackage(flags, userId, packageName); enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, "get package uid"); @@ -2864,12 +2860,7 @@ public class PackageManagerService extends IPackageManager.Stub { } @Override - public int[] getPackageGids(String packageName, int userId) { - return getPackageGidsEtc(packageName, 0, userId); - } - - @Override - public int[] getPackageGidsEtc(String packageName, int flags, int userId) { + public int[] getPackageGids(String packageName, int flags, int userId) { if (!sUserManager.exists(userId)) return null; flags = updateFlagsForPackage(flags, userId, packageName); enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, @@ -4039,7 +4030,7 @@ public class PackageManagerService extends IPackageManager.Stub { "canShowRequestPermissionRationale for user " + userId); } - final int uid = getPackageUid(packageName, userId); + final int uid = getPackageUid(packageName, MATCH_DEBUG_TRIAGED_MISSING, userId); if (UserHandle.getAppId(getCallingUid()) != UserHandle.getAppId(uid)) { return false; } @@ -11205,7 +11196,8 @@ public class PackageManagerService extends IPackageManager.Stub { * do, then we'll defer to them to verify the packages. */ final int requiredUid = mRequiredVerifierPackage == null ? -1 - : getPackageUid(mRequiredVerifierPackage, verifierUser.getIdentifier()); + : getPackageUid(mRequiredVerifierPackage, MATCH_DEBUG_TRIAGED_MISSING, + verifierUser.getIdentifier()); if (!origin.existing && requiredUid != -1 && isVerificationEnabled(verifierUser.getIdentifier(), installFlags)) { final Intent verification = new Intent( @@ -12052,8 +12044,8 @@ public class PackageManagerService extends IPackageManager.Stub { @Override int doPreCopy() { if (isFwdLocked()) { - if (!PackageHelper.fixSdPermissions(cid, - getPackageUid(DEFAULT_CONTAINER_PACKAGE, 0), RES_FILE_NAME)) { + if (!PackageHelper.fixSdPermissions(cid, getPackageUid(DEFAULT_CONTAINER_PACKAGE, + MATCH_SYSTEM_ONLY, UserHandle.USER_SYSTEM), RES_FILE_NAME)) { return PackageManager.INSTALL_FAILED_CONTAINER_ERROR; } } @@ -13055,6 +13047,7 @@ public class PackageManagerService extends IPackageManager.Stub { final int verifierUid = getPackageUid( mIntentFilterVerifierComponent.getPackageName(), + MATCH_DEBUG_TRIAGED_MISSING, (userId == UserHandle.USER_ALL) ? UserHandle.USER_SYSTEM : userId); mHandler.removeMessages(START_INTENT_FILTER_VERIFICATIONS); @@ -15686,11 +15679,14 @@ public class PackageManagerService extends IPackageManager.Stub { pw.print(" Required: "); pw.print(mRequiredVerifierPackage); pw.print(" (uid="); - pw.print(getPackageUid(mRequiredVerifierPackage, 0)); + pw.print(getPackageUid(mRequiredVerifierPackage, MATCH_DEBUG_TRIAGED_MISSING, + UserHandle.USER_SYSTEM)); pw.println(")"); } else if (mRequiredVerifierPackage != null) { pw.print("vrfy,"); pw.print(mRequiredVerifierPackage); - pw.print(","); pw.println(getPackageUid(mRequiredVerifierPackage, 0)); + pw.print(","); + pw.println(getPackageUid(mRequiredVerifierPackage, MATCH_DEBUG_TRIAGED_MISSING, + UserHandle.USER_SYSTEM)); } } @@ -15705,11 +15701,14 @@ public class PackageManagerService extends IPackageManager.Stub { pw.print(" Using: "); pw.print(verifierPackageName); pw.print(" (uid="); - pw.print(getPackageUid(verifierPackageName, 0)); + pw.print(getPackageUid(verifierPackageName, MATCH_DEBUG_TRIAGED_MISSING, + UserHandle.USER_SYSTEM)); pw.println(")"); } else if (verifierPackageName != null) { pw.print("ifv,"); pw.print(verifierPackageName); - pw.print(","); pw.println(getPackageUid(verifierPackageName, 0)); + pw.print(","); + pw.println(getPackageUid(verifierPackageName, MATCH_DEBUG_TRIAGED_MISSING, + UserHandle.USER_SYSTEM)); } } else { pw.println(); diff --git a/services/print/java/com/android/server/print/PrintManagerService.java b/services/print/java/com/android/server/print/PrintManagerService.java index 00e1acb4d267..2e0866cc130a 100644 --- a/services/print/java/com/android/server/print/PrintManagerService.java +++ b/services/print/java/com/android/server/print/PrintManagerService.java @@ -16,6 +16,9 @@ package com.android.server.print; +import static android.content.pm.PackageManager.GET_SERVICES; +import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING; + import android.Manifest; import android.app.ActivityManager; import android.app.ActivityManagerNative; @@ -61,7 +64,6 @@ import java.util.List; * Context.PRINT_SERVICE. * PrintManager implementation is contained within. */ - public final class PrintManagerService extends SystemService { private final PrintManagerImpl mPrintManagerImpl; @@ -586,7 +588,8 @@ public final class PrintManagerService extends SystemService { intent.setPackage(packageName); List<ResolveInfo> installedServices = mContext.getPackageManager() - .queryIntentServicesAsUser(intent, PackageManager.GET_SERVICES, + .queryIntentServicesAsUser(intent, + GET_SERVICES | MATCH_DEBUG_TRIAGED_MISSING, getChangingUserId()); if (installedServices != null) { diff --git a/services/print/java/com/android/server/print/UserState.java b/services/print/java/com/android/server/print/UserState.java index dcc02a3638e8..41982170c84c 100644 --- a/services/print/java/com/android/server/print/UserState.java +++ b/services/print/java/com/android/server/print/UserState.java @@ -16,12 +16,15 @@ package com.android.server.print; +import static android.content.pm.PackageManager.GET_META_DATA; +import static android.content.pm.PackageManager.GET_SERVICES; +import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING; + import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentSender; -import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.content.pm.ResolveInfo; import android.graphics.drawable.Icon; @@ -676,8 +679,8 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks { Set<PrintServiceInfo> tempPrintServices = new HashSet<PrintServiceInfo>(); List<ResolveInfo> installedServices = mContext.getPackageManager() - .queryIntentServicesAsUser(mQueryIntent, PackageManager.GET_SERVICES - | PackageManager.GET_META_DATA, mUserId); + .queryIntentServicesAsUser(mQueryIntent, + GET_SERVICES | GET_META_DATA | MATCH_DEBUG_TRIAGED_MISSING, mUserId); final int installedCount = installedServices.size(); for (int i = 0, count = installedCount; i < count; i++) { diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 98bccb06c99a..e27441e12a72 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -418,7 +418,8 @@ public class UsageStatsService extends SystemService implements private void notifyBatteryStats(String packageName, int userId, boolean idle) { try { - int uid = AppGlobals.getPackageManager().getPackageUid(packageName, userId); + final int uid = AppGlobals.getPackageManager().getPackageUid(packageName, + PackageManager.MATCH_UNINSTALLED_PACKAGES, userId); if (idle) { mBatteryStats.noteEvent(BatteryStats.HistoryItem.EVENT_PACKAGE_INACTIVE, packageName, uid); diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java index 5381e4ef6bf9..01583f56ef73 100644 --- a/test-runner/src/android/test/mock/MockPackageManager.java +++ b/test-runner/src/android/test/mock/MockPackageManager.java @@ -149,7 +149,14 @@ public class MockPackageManager extends PackageManager { @Override public ApplicationInfo getApplicationInfo(String packageName, int flags) - throws NameNotFoundException { + throws NameNotFoundException { + throw new UnsupportedOperationException(); + } + + /** @hide */ + @Override + public ApplicationInfo getApplicationInfoAsUser(String packageName, int flags, int userId) + throws NameNotFoundException { throw new UnsupportedOperationException(); } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java index 4625de25d200..08258c99c25e 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java @@ -145,6 +145,12 @@ public class BridgePackageManager extends PackageManager { } @Override + public ApplicationInfo getApplicationInfoAsUser(String packageName, int flags, int userId) + throws NameNotFoundException { + return null; + } + + @Override public ActivityInfo getActivityInfo(ComponentName component, int flags) throws NameNotFoundException { return null; |