Fix high traffic PMS lockless methods
The notifyPackageUse method is called so many times that it is
causing a spike in snapshot invalidations. This reverts to a
(broken) S state where the code takes the lock and updates
the time value, but doesn't actually invalidate the snapshot,
preventing the re-generation.
Also fixes a check in grantImplicitAccess that was calling
onChanged() even though nothing changed, which was the other
significant method.
Test: manual, run profiling steps in bug on pre-change and post-change
Test: atest AppsFilterImplTest
Bug: 236021119
Change-Id: I20b1bb1d8b4f3df09c901f39db8462ab1a67607d
diff --git a/services/core/java/com/android/server/pm/AppsFilterImpl.java b/services/core/java/com/android/server/pm/AppsFilterImpl.java
index 9fddc76..181c39e 100644
--- a/services/core/java/com/android/server/pm/AppsFilterImpl.java
+++ b/services/core/java/com/android/server/pm/AppsFilterImpl.java
@@ -418,7 +418,9 @@
} else if (changed) {
invalidateCache("grantImplicitAccess: " + recipientUid + " -> " + visibleUid);
}
- onChanged();
+ if (changed) {
+ onChanged();
+ }
return changed;
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 4f8c792..94e8ec5 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -2859,12 +2859,15 @@
mDexOptHelper.performPackageDexOptUpgradeIfNeeded();
}
-
private void notifyPackageUseInternal(String packageName, int reason) {
long time = System.currentTimeMillis();
- commitPackageStateMutation(null, packageName, packageState -> {
- packageState.setLastPackageUsageTime(reason, time);
- });
+ synchronized (mLock) {
+ final PackageSetting pkgSetting = mSettings.getPackageLPr(packageName);
+ if (pkgSetting == null) {
+ return;
+ }
+ pkgSetting.getPkgState().setLastPackageUsageTimeInMills(reason, time);
+ }
}
/*package*/ DexManager getDexManager() {
diff --git a/services/core/java/com/android/server/pm/pkg/PackageStateUnserialized.java b/services/core/java/com/android/server/pm/pkg/PackageStateUnserialized.java
index 7bd720a..5251fe0 100644
--- a/services/core/java/com/android/server/pm/pkg/PackageStateUnserialized.java
+++ b/services/core/java/com/android/server/pm/pkg/PackageStateUnserialized.java
@@ -79,7 +79,10 @@
return this;
}
getLastPackageUsageTimeInMills()[reason] = time;
- mPackageSetting.onChanged();
+ // TODO(b/236180425): This method does not notify snapshot changes because it's called too
+ // frequently, causing too many re-takes. This should be moved to a separate data structure
+ // or merged with the general UsageStats to avoid tracking heavily mutated data in the
+ // package data snapshot.
return this;
}