Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bf88348b authored by Nikita Ioffe's avatar Nikita Ioffe
Browse files

Group child sessions together with parent in output of pm get-stagedsessions

This makes relation between parent and child sessions easier to spot.

Also it unveiled that surprisingly some of sessions have child sessions
unknown to PackageManager. Will debug this.

Example output:
sessionId = 945170441; appPackageName = null; isStaged = true; isReady = false; isApplied = false; isFailed = true;
  sessionId = 381169012; not found
  sessionId = 1180853507; not found
sessionId = 1109749804; appPackageName = null; isStaged = true; isReady = false; isApplied = true; isFailed = false;
sessionId = 1870384217; appPackageName = null; isStaged = true; isReady = false; isApplied = true; isFailed = false;
  sessionId = 433320004; appPackageName = null; isStaged = true; isReady = false; isApplied = false; isFailed = false;
  sessionId = 865092704; appPackageName = null; isStaged = true; isReady = false; isApplied = false; isFailed = false;
sessionId = 2030351614; appPackageName = null; isStaged = true; isReady = false; isApplied = false; isFailed = true;
  sessionId = 497536355; not found
  sessionId = 1079410796; not found

Test: installed staged session & adb shell pm get-stagedsessions
Change-Id: I3c8d9590814a4246d85d52c189ad5abd5f72c9cf
parent 2e7d461e
Loading
Loading
Loading
Loading
+36 −9
Original line number Diff line number Diff line
@@ -94,9 +94,11 @@ import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.ArraySet;
import android.util.PrintWriterPrinter;
import android.util.SparseArray;

import com.android.internal.content.PackageHelper;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.LocalServices;
import com.android.server.SystemConfig;

@@ -347,17 +349,33 @@ class PackageManagerShellCommand extends ShellCommand {
    }

    private int getStagedSessions() {
        final PrintWriter pw = getOutPrintWriter();
        final IndentingPrintWriter pw = new IndentingPrintWriter(
                getOutPrintWriter(), /* singleIndent */ "  ", /* wrapLength */ 120);
        try {
            List<SessionInfo> stagedSessionsList =
            List<SessionInfo> stagedSessions =
                    mInterface.getPackageInstaller().getStagedSessions().getList();
            for (SessionInfo session: stagedSessionsList) {
                pw.println("appPackageName = " + session.getAppPackageName()
                        + "; sessionId = " + session.getSessionId()
                        + "; isStaged = " + session.isStaged()
                        + "; isStagedSessionReady = " + session.isStagedSessionReady()
                        + "; isStagedSessionApplied = " + session.isStagedSessionApplied()
                        + "; isStagedSessionFailed = " + session.isStagedSessionFailed() + ";");
            final SparseArray<SessionInfo> sessionById = new SparseArray<>(stagedSessions.size());
            for (SessionInfo session : stagedSessions) {
                sessionById.put(session.getSessionId(), session);
            }
            for (SessionInfo session: stagedSessions) {
                if (session.getParentSessionId() != SessionInfo.INVALID_ID) {
                    continue;
                }
                printStagedSession(session, pw);
                if (session.isMultiPackage()) {
                    pw.increaseIndent();
                    final int[] childIds = session.getChildSessionIds();
                    for (int i = 0; i < childIds.length; i++) {
                        final SessionInfo childSession = sessionById.get(childIds[i]);
                        if (childSession == null) {
                            pw.println("sessionId = " + childIds[i] + "; not found");
                        } else {
                            printStagedSession(childSession, pw);
                        }
                    }
                    pw.decreaseIndent();
                }
            }
        } catch (RemoteException e) {
            pw.println("Failure ["
@@ -368,6 +386,15 @@ class PackageManagerShellCommand extends ShellCommand {
        return 1;
    }

    private static void printStagedSession(SessionInfo session, PrintWriter pw) {
        pw.println("sessionId = " + session.getSessionId()
                + "; appPackageName = " + session.getAppPackageName()
                + "; isStaged = " + session.isStaged()
                + "; isReady = " + session.isStagedSessionReady()
                + "; isApplied = " + session.isStagedSessionApplied()
                + "; isFailed = " + session.isStagedSessionFailed() + ";");
    }

    private int uninstallSystemUpdates() {
        final PrintWriter pw = getOutPrintWriter();
        List<String> failedUninstalls = new LinkedList<>();