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

Commit 87c6587e authored by Kevin Han's avatar Kevin Han
Browse files

Add basic dumping to AppHibernationService

Dump the current hibernation states when the service is dumped.

Bug: 175829330
Test: adb shell dumpsys app_hibernation
Change-Id: I8f0bd18f03b9d762e1f43b96c5cbbee57fa2ab26
parent 6faddabe
Loading
Loading
Loading
Loading
+40 −0
Original line number Diff line number Diff line
@@ -57,10 +57,13 @@ import android.util.SparseArray;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.SystemService;

import java.io.File;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -511,6 +514,37 @@ public final class AppHibernationService extends SystemService {
        return mIsServiceEnabled;
    }

    private void dump(PrintWriter pw) {
        // Check usage stats permission since hibernation indirectly informs usage.
        if (!DumpUtils.checkDumpAndUsageStatsPermission(getContext(), TAG, pw)) return;

        IndentingPrintWriter idpw = new IndentingPrintWriter(pw, "  ");

        synchronized (mLock) {
            final int userCount = mUserStates.size();
            for (int i = 0; i < userCount; i++) {
                final int userId = mUserStates.keyAt(i);
                idpw.print("User Level Hibernation States, ");
                idpw.printPair("user", userId);
                idpw.println();
                Map<String, UserLevelState> stateMap = mUserStates.get(i);
                idpw.increaseIndent();
                for (UserLevelState state : stateMap.values()) {
                    idpw.print(state);
                    idpw.println();
                }
                idpw.decreaseIndent();
            }
            idpw.println();
            idpw.print("Global Level Hibernation States");
            idpw.println();
            for (GlobalLevelState state : mGlobalHibernationStates.values()) {
                idpw.print(state);
                idpw.println();
            }
        }
    }

    private final AppHibernationServiceStub mServiceStub = new AppHibernationServiceStub(this);

    static final class AppHibernationServiceStub extends IAppHibernationService.Stub {
@@ -547,6 +581,12 @@ public final class AppHibernationService extends SystemService {
            new AppHibernationShellCommand(mService).exec(this, in, out, err, args, callback,
                    resultReceiver);
        }

        @Override
        protected void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter fout,
                @Nullable String[] args) {
            mService.dump(fout);
        }
    }

    // Broadcast receiver for package add/removal events
+8 −0
Original line number Diff line number Diff line
@@ -22,4 +22,12 @@ package com.android.server.apphibernation;
final class GlobalLevelState {
    public String packageName;
    public boolean hibernated;

    @Override
    public String toString() {
        return "GlobalLevelState{"
                + "packageName='" + packageName + '\''
                + ", hibernated=" + hibernated
                + '}';
    }
}
+8 −0
Original line number Diff line number Diff line
@@ -22,4 +22,12 @@ package com.android.server.apphibernation;
final class UserLevelState {
    public String packageName;
    public boolean hibernated;

    @Override
    public String toString() {
        return "UserLevelState{"
                + "packageName='" + packageName + '\''
                + ", hibernated=" + hibernated
                + '}';
    }
}