Add cache for PackageManager.getPackageUid to improvement performance

Context: `PackageManager.getPackageUid` is IPC which could be slow. Add a map in BatteryDiffEntry to cache the data. The cache lifecycle would be the same as other cache in BatteryDiffEntry.

Test: manual
Bug: 304439237
Fix: 304439237
Change-Id: I98d9c8cfee24dd43e9a4037b1b61c8353bf1bcea
This commit is contained in:
Jun Lan
2023-11-01 16:05:06 +08:00
parent 1742fa2ed0
commit 29b243bb3e
2 changed files with 30 additions and 4 deletions

View File

@@ -45,6 +45,9 @@ public class BatteryDiffEntry {
// Caches app label and icon to improve loading performance.
static final Map<String, BatteryEntry.NameAndIcon> sResourceCache = new HashMap<>();
// Caches package name and uid to improve loading performance.
static final Map<String, Integer> sPackageNameAndUidCache = new HashMap<>();
// Whether a specific item is valid to launch restriction page?
@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
static final Map<String, Boolean> sValidForRestriction = new HashMap<>();
@@ -289,10 +292,20 @@ public class BatteryDiffEntry {
return false;
}
final int uid = BatteryUtils.getInstance(mContext).getPackageUid(packageName);
final int uid = getPackageUid(packageName);
return uid == BatteryUtils.UID_REMOVED_APPS || uid == BatteryUtils.UID_NULL;
}
private int getPackageUid(String packageName) {
if (sPackageNameAndUidCache.containsKey(packageName)) {
return sPackageNameAndUidCache.get(packageName);
}
int uid = BatteryUtils.getInstance(mContext).getPackageUid(packageName);
sPackageNameAndUidCache.put(packageName, uid);
return uid;
}
void loadLabelAndIcon() {
if (mIsLoaded) {
return;
@@ -498,10 +511,11 @@ public class BatteryDiffEntry {
return builder.toString();
}
/** Clears app icon and label cache data. */
/** Clears all cache data. */
public static void clearCache() {
sResourceCache.clear();
sValidForRestriction.clear();
sPackageNameAndUidCache.clear();
}
private Drawable getBadgeIconForUser(Drawable icon) {