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;
/** 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")
// 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);
}
}
}
+ 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);
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);
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();
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()) {