From 8d6900e011733c368c833d751fda7973af125d18 Mon Sep 17 00:00:00 2001 From: Lee Shombert Date: Tue, 20 Jul 2021 10:52:51 -0700 Subject: [PATCH 1/2] Do not cache wildcard users (PackageManager) Bug: 186778818 PropertyInvalidatedCache queries that contain wildcard user IDs are no longer cached. Some simple multi-user tests show that no current caches use wildcard user IDs, so the change has no effect on performance. The bypass() mechanism is used to avoid the cache when necessary. Test: atest * FrameworksServicesTests:UserManagerServiceCreateProfileTest Change-Id: I092d1385cc254b3f595ae3d0322f77dbaf456b65 --- .../android/app/ApplicationPackageManager.java | 8 ++++++-- core/java/android/content/pm/PackageManager.java | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 2d172c5b688de..245baf0880db7 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -1014,13 +1014,17 @@ public class ApplicationPackageManager extends PackageManager { } } @Override + protected boolean bypass(Integer uid) { + return uid < 0; + } + @Override public String queryToString(Integer uid) { return String.format("uid=%d", uid.intValue()); } }; @Override - public String[] getPackagesForUid(int uid) { + public String[] getPackagesForUid(@UserIdInt int uid) { return mGetPackagesForUidCache.query(uid).value(); } @@ -1035,7 +1039,7 @@ public class ApplicationPackageManager extends PackageManager { } @Override - public String getNameForUid(int uid) { + public String getNameForUid(@UserIdInt int uid) { try { return mPM.getNameForUid(uid); } catch (RemoteException e) { diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index c2f3ef0caaf4b..7101d1a58a6f2 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -9085,6 +9085,7 @@ public abstract class PackageManager { private static final class ApplicationInfoQuery { final String packageName; final int flags; + @UserIdInt final int userId; ApplicationInfoQuery(@Nullable String packageName, int flags, int userId) { @@ -9146,6 +9147,10 @@ public abstract class PackageManager { query.packageName, query.flags, query.userId); } @Override + protected boolean bypass(ApplicationInfoQuery query) { + return query.userId < 0; + } + @Override protected ApplicationInfo maybeCheckConsistency( ApplicationInfoQuery query, ApplicationInfo proposedResult) { // Implementing this debug check for ApplicationInfo would require a @@ -9156,7 +9161,7 @@ public abstract class PackageManager { /** @hide */ public static ApplicationInfo getApplicationInfoAsUserCached( - String packageName, int flags, int userId) { + String packageName, int flags, @UserIdInt int userId) { return sApplicationInfoCache.query( new ApplicationInfoQuery(packageName, flags, userId)); } @@ -9188,6 +9193,7 @@ public abstract class PackageManager { private static final class PackageInfoQuery { final String packageName; final int flags; + @UserIdInt final int userId; PackageInfoQuery(@Nullable String packageName, int flags, int userId) { @@ -9248,6 +9254,10 @@ public abstract class PackageManager { query.packageName, query.flags, query.userId); } @Override + protected boolean bypass(PackageInfoQuery query) { + return query.userId < 0; + } + @Override protected PackageInfo maybeCheckConsistency( PackageInfoQuery query, PackageInfo proposedResult) { // Implementing this debug check for PackageInfo would require a @@ -9258,7 +9268,7 @@ public abstract class PackageManager { /** @hide */ public static PackageInfo getPackageInfoAsUserCached( - String packageName, int flags, int userId) { + String packageName, int flags, @UserIdInt int userId) { return sPackageInfoCache.query(new PackageInfoQuery(packageName, flags, userId)); } From f7067b2477d99d03e6a5af5d174781b0e4781bb6 Mon Sep 17 00:00:00 2001 From: Lee Shombert Date: Tue, 20 Jul 2021 10:53:37 -0700 Subject: [PATCH 2/2] Do not cache wildcard users (UserManager) Bug: 186778818 PropertyInvalidatedCache queries that contain wildcard user IDs are no longer cached. Some simple multi-user tests show that no current caches use wildcard user IDs, so the change has no effect on performance. The bypass() mechanism is used to avoid the cache when necessary. Test: atest * FrameworksServicesTests:UserManagerServiceCreateProfileTest Change-Id: I68868b7f4142417d98b101504cb38c829b220e47 --- core/java/android/accounts/AccountManager.java | 9 ++++++++- core/java/android/os/UserManager.java | 8 ++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java index 79fb86365b74d..2bbf280277ff4 100644 --- a/core/java/android/accounts/AccountManager.java +++ b/core/java/android/accounts/AccountManager.java @@ -27,6 +27,7 @@ import android.annotation.Size; import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.UserHandleAware; +import android.annotation.UserIdInt; import android.app.Activity; import android.app.PropertyInvalidatedCache; import android.compat.annotation.UnsupportedAppUsage; @@ -349,6 +350,7 @@ public class AccountManager { private static final class UserIdPackage { + @UserIdInt public int userId; public String packageName; @@ -379,7 +381,8 @@ public class AccountManager { } PropertyInvalidatedCache mAccountsForUserCache = - new PropertyInvalidatedCache(CACHE_ACCOUNTS_DATA_SIZE, CACHE_KEY_ACCOUNTS_DATA_PROPERTY) { + new PropertyInvalidatedCache( + CACHE_ACCOUNTS_DATA_SIZE, CACHE_KEY_ACCOUNTS_DATA_PROPERTY) { @Override protected Account[] recompute(UserIdPackage userAndPackage) { try { @@ -389,6 +392,10 @@ public class AccountManager { } } @Override + protected boolean bypass(UserIdPackage query) { + return query.userId < 0; + } + @Override protected boolean debugCompareQueryResults(Account[] l, Account[] r) { if (l == r) { return true; diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 8709f071f222d..09b7aaa9545c2 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -2491,6 +2491,10 @@ public class UserManager { throw re.rethrowFromSystemServer(); } } + @Override + protected boolean bypass(Integer query) { + return query < 0; + } }; // Uses IS_USER_UNLOCKED_PROPERTY for invalidation as the APIs have the same dependencies. @@ -2505,6 +2509,10 @@ public class UserManager { throw re.rethrowFromSystemServer(); } } + @Override + protected boolean bypass(Integer query) { + return query < 0; + } }; /** {@hide} */