summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Narayan Kamath <narayan@google.com> 2017-06-13 10:32:22 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2017-06-13 10:32:28 +0000
commitc7ea7effde64c682ba8ddaca0fd9ac4354029e41 (patch)
tree410425a1f645c2f43b57d7d9ad0aafe44f4634cf
parent7fc501184ac64f2bdc420dfd03c64b698ca50e4a (diff)
parenta22a766ea3eb14466221ac5a29ac7c298446ca5e (diff)
Merge "Eagerly serialize historical sessions" into oc-dev
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerService.java28
1 files changed, 22 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 75e7a1ebe816..62b563a89d9c 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -81,8 +81,10 @@ import android.util.ExceptionUtils;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
+import android.util.SparseIntArray;
import android.util.Xml;
+import java.io.CharArrayWriter;
import libcore.io.IoUtils;
import com.android.internal.R;
@@ -195,7 +197,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
/** Historical sessions kept around for debugging purposes */
@GuardedBy("mSessions")
- private final SparseArray<PackageInstallerSession> mHistoricalSessions = new SparseArray<>();
+ private final List<String> mHistoricalSessions = new ArrayList<>();
+
+ @GuardedBy("mSessions")
+ private final SparseIntArray mHistoricalSessionsByInstaller = new SparseIntArray();
/** Sessions allocated to legacy users */
@GuardedBy("mSessions")
@@ -371,7 +376,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
// Since this is early during boot we don't send
// any observer events about the session, but we
// keep details around for dumpsys.
- mHistoricalSessions.put(session.sessionId, session);
+ addHistoricalSessionLocked(session);
}
mAllocatedSessions.put(session.sessionId, true);
}
@@ -386,6 +391,18 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
}
}
+ private void addHistoricalSessionLocked(PackageInstallerSession session) {
+ CharArrayWriter writer = new CharArrayWriter();
+ IndentingPrintWriter pw = new IndentingPrintWriter(writer, " ");
+ session.dump(pw);
+ mHistoricalSessions.add(writer.toString());
+
+ // Increment the number of sessions by this installerUid.
+ mHistoricalSessionsByInstaller.put(
+ session.installerUid,
+ mHistoricalSessionsByInstaller.get(session.installerUid) + 1);
+ }
+
private PackageInstallerSession readSessionLocked(XmlPullParser in) throws IOException,
XmlPullParserException {
final int sessionId = readIntAttribute(in, ATTR_SESSION_ID);
@@ -676,7 +693,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
throw new IllegalStateException(
"Too many active sessions for UID " + callingUid);
}
- final int historicalCount = getSessionCount(mHistoricalSessions, callingUid);
+ final int historicalCount = mHistoricalSessionsByInstaller.get(callingUid);
if (historicalCount >= MAX_HISTORICAL_SESSIONS) {
throw new IllegalStateException(
"Too many historical sessions for UID " + callingUid);
@@ -1228,8 +1245,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
pw.increaseIndent();
N = mHistoricalSessions.size();
for (int i = 0; i < N; i++) {
- final PackageInstallerSession session = mHistoricalSessions.valueAt(i);
- session.dump(pw);
+ pw.print(mHistoricalSessions.get(i));
pw.println();
}
pw.println();
@@ -1264,7 +1280,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
public void run() {
synchronized (mSessions) {
mSessions.remove(session.sessionId);
- mHistoricalSessions.put(session.sessionId, session);
+ addHistoricalSessionLocked(session);
final File appIconFile = buildAppIconFile(session.sessionId);
if (appIconFile.exists()) {