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

Commit 6004600f authored by shafik's avatar shafik
Browse files

Add dumpsys for RollbackManager

Add a dump method to RollbackServiceManagerImpl that dumps the rollback
info of all rollbacks. The info includes:
        * Rollback Id
        * Rollback State
        * Staged session Id (if any)
        * Is rollback staged
        * Packages
        * Cause Packages (if any)
        * Committed session Id (if committed)
Example of format:
  868886202:
    -state: committed
    -timestamp: 2019-03-11T15:53:30.101Z
    -stagedSessionId: 1452111490
    -packages:
      com.android.tests.rollback.testapex 2 -> 1
    -causePackages:
    -committedSessionId: 1263657628

Fixes: 128404022
Test: adb shell dumpsys rollback
Change-Id: I624bfe465731d8e29fe65cd9f2587e59e348997a
parent b116b207
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -23,9 +23,11 @@ import android.content.rollback.RollbackInfo;
import java.io.File;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.text.ParseException;
import java.time.Instant;
import java.util.ArrayList;


/**
 * Information about a rollback available for a set of atomically installed
 * packages.
@@ -138,4 +140,27 @@ class RollbackData {
    public boolean isStaged() {
        return info.isStaged();
    }

    static String rollbackStateToString(@RollbackState int state) {
        switch (state) {
            case RollbackData.ROLLBACK_STATE_ENABLING: return "enabling";
            case RollbackData.ROLLBACK_STATE_AVAILABLE: return "available";
            case RollbackData.ROLLBACK_STATE_COMMITTED: return "committed";
        }
        throw new AssertionError("Invalid rollback state: " + state);
    }

    static @RollbackState int rollbackStateFromString(String state)
            throws ParseException {
        switch (state) {
            case "enabling": return RollbackData.ROLLBACK_STATE_ENABLING;
            case "available": return RollbackData.ROLLBACK_STATE_AVAILABLE;
            case "committed": return RollbackData.ROLLBACK_STATE_COMMITTED;
        }
        throw new ParseException("Invalid rollback state: " + state, 0);
    }

    public String getStateAsString() {
        return rollbackStateToString(state);
    }
}
+38 −0
Original line number Diff line number Diff line
@@ -50,11 +50,14 @@ import android.util.SparseLongArray;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.LocalServices;
import com.android.server.pm.Installer;

import java.io.File;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;
import java.security.SecureRandom;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
@@ -1268,4 +1271,39 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
                    + rollbackData.info.getRollbackId(), ioe);
        }
    }

    @Override
    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
        IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "  ");
        synchronized (mLock) {
            for (RollbackData data : mRollbacks) {
                RollbackInfo info = data.info;
                ipw.println(info.getRollbackId() + ":");
                ipw.increaseIndent();
                ipw.println("-state: " + data.getStateAsString());
                ipw.println("-timestamp: " + data.timestamp);
                if (data.stagedSessionId != -1) {
                    ipw.println("-stagedSessionId: " + data.stagedSessionId);
                }
                ipw.println("-packages:");
                ipw.increaseIndent();
                for (PackageRollbackInfo pkg : info.getPackages()) {
                    ipw.println(pkg.getPackageName()
                            + " " + pkg.getVersionRolledBackFrom().getLongVersionCode()
                            + " -> " + pkg.getVersionRolledBackTo().getLongVersionCode());
                }
                ipw.decreaseIndent();
                if (data.state == RollbackData.ROLLBACK_STATE_COMMITTED) {
                    ipw.println("-causePackages:");
                    ipw.increaseIndent();
                    for (VersionedPackage cPkg : info.getCausePackages()) {
                        ipw.println(cPkg.getPackageName() + " " + cPkg.getLongVersionCode());
                    }
                    ipw.decreaseIndent();
                    ipw.println("-committedSessionId: " + info.getCommittedSessionId());
                }
                ipw.decreaseIndent();
            }
        }
    }
}
+3 −19
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

package com.android.server.rollback;

import static com.android.server.rollback.RollbackData.rollbackStateFromString;
import static com.android.server.rollback.RollbackData.rollbackStateToString;

import android.annotation.NonNull;
import android.content.pm.VersionedPackage;
import android.content.rollback.PackageRollbackInfo;
@@ -401,23 +404,4 @@ class RollbackStore {
            file.delete();
        }
    }

    private static String rollbackStateToString(@RollbackData.RollbackState int state) {
        switch (state) {
            case RollbackData.ROLLBACK_STATE_ENABLING: return "enabling";
            case RollbackData.ROLLBACK_STATE_AVAILABLE: return "available";
            case RollbackData.ROLLBACK_STATE_COMMITTED: return "committed";
        }
        throw new AssertionError("Invalid rollback state: " + state);
    }

    private static @RollbackData.RollbackState int rollbackStateFromString(String state)
            throws ParseException {
        switch (state) {
            case "enabling": return RollbackData.ROLLBACK_STATE_ENABLING;
            case "available": return RollbackData.ROLLBACK_STATE_AVAILABLE;
            case "committed": return RollbackData.ROLLBACK_STATE_COMMITTED;
        }
        throw new ParseException("Invalid rollback state: " + state, 0);
    }
}