From 82c14a0db7aaf4a29c93468be16b46c61caa3052 Mon Sep 17 00:00:00 2001 From: Jiaquan Si Date: Tue, 20 Sep 2022 17:33:52 +0800 Subject: [PATCH] Set threshold of historical sessions size in PackageInstallerService In extreme cases, size of historical sessions recorded in PackageInstallerService is very large, resulting in huge memory usage in system server. This commit adds threshold of historical sessions size and the oldest historical sessions will be cleared if the list size reaches the threshold. Bug: 248960979 Fixed: 248960979 Test: presubmit Signed-off-by: Jiaquan Si Change-Id: Ie0af8f00e73a59bdacc4b9a6f5bea0a2a3f9258b --- .../com/android/server/pm/PackageInstallerService.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 409d3524c3128..4803c5e873b64 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -154,6 +154,11 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements /** Destroy sessions older than this on storage free request */ private static final long MAX_SESSION_AGE_ON_LOW_STORAGE_MILLIS = 8 * DateUtils.HOUR_IN_MILLIS; + /** Threshold of historical sessions size */ + private static final int HISTORICAL_SESSIONS_THRESHOLD = 500; + /** Size of historical sessions to be cleared when reaching threshold */ + private static final int HISTORICAL_CLEAR_SIZE = 400; + /** * Allow verification-skipping if it's a development app installed through ADB with * disable verification flag specified. @@ -549,6 +554,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements CharArrayWriter writer = new CharArrayWriter(); IndentingPrintWriter pw = new IndentingPrintWriter(writer, " "); session.dump(pw); + if (mHistoricalSessions.size() > HISTORICAL_SESSIONS_THRESHOLD) { + Slog.d(TAG, "Historical sessions size reaches threshold, clear the oldest"); + mHistoricalSessions.subList(0, HISTORICAL_CLEAR_SIZE).clear(); + } mHistoricalSessions.add(writer.toString()); int installerUid = session.getInstallerUid();