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

Commit 20778ffd authored by Zhen Zhang's avatar Zhen Zhang Committed by Automerger Merge Worker
Browse files

Merge "Log user level App Hibernation related atoms" into sc-dev am: f7857d0b

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14274121

Change-Id: Ifc895bcf57a8c189a761b11c13c9d30554d5eabd
parents 7f1103f3 f7857d0b
Loading
Loading
Loading
Loading
+46 −0
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@ import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityThread;
import android.app.IActivityManager;
import android.app.StatsManager;
import android.app.StatsManager.StatsPullAtomCallback;
import android.app.usage.UsageEvents;
import android.app.usage.UsageStatsManagerInternal;
import android.app.usage.UsageStatsManagerInternal.UsageEventListener;
@@ -46,6 +48,7 @@ import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.UserInfo;
import android.os.Binder;
import android.os.Environment;
import android.os.RemoteException;
@@ -62,10 +65,12 @@ import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
import android.util.SparseArray;
import android.util.StatsEvent;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.FrameworkStatsLog;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.LocalServices;
import com.android.server.SystemService;
@@ -177,6 +182,12 @@ public final class AppHibernationService extends SystemService {
                    NAMESPACE_APP_HIBERNATION,
                    ActivityThread.currentApplication().getMainExecutor(),
                    this::onDeviceConfigChanged);
            getContext().getSystemService(StatsManager.class)
                    .setPullAtomCallback(
                            FrameworkStatsLog.USER_LEVEL_HIBERNATED_APPS,
                            /* metadata */ null, // use default PullAtomMetadata values
                            mBackgroundExecutor,
                            new StatsPullAtomCallbackImpl());
        }
    }

@@ -272,6 +283,16 @@ public final class AppHibernationService extends SystemService {
            } else {
                unhibernatePackageForUser(packageName, userId, pkgState);
            }
            final UserLevelState stateSnapshot = new UserLevelState(pkgState);
            final int userIdSnapshot = userId;
            mBackgroundExecutor.execute(() -> {
                FrameworkStatsLog.write(
                        FrameworkStatsLog.USER_LEVEL_HIBERNATION_STATE_CHANGED,
                        stateSnapshot.packageName,
                        userIdSnapshot,
                        stateSnapshot.hibernated,
                        stateSnapshot.lastUnhibernatedMs);
            });
            List<UserLevelState> states = new ArrayList<>(mUserStates.get(userId).values());
            mUserDiskStores.get(userId).scheduleWriteHibernationStates(states);
        }
@@ -910,4 +931,29 @@ public final class AppHibernationService extends SystemService {
                    com.android.internal.R.bool.config_hibernationDeletesOatArtifactsEnabled);
        }
    }

    private final class StatsPullAtomCallbackImpl implements StatsPullAtomCallback {
        @Override
        public int onPullAtom(int atomTag, @NonNull List<StatsEvent> data) {
            if (atomTag != FrameworkStatsLog.USER_LEVEL_HIBERNATED_APPS) {
                return StatsManager.PULL_SKIP;
            }
            if (isAppHibernationEnabled()) {
                List<UserInfo> userInfos = mUserManager.getAliveUsers();
                final int numUsers = userInfos.size();
                for (int i = 0; i < numUsers; ++i) {
                    final int userId = userInfos.get(i).id;
                    if (mUserManager.isUserUnlockingOrUnlocked(userId)) {
                        data.add(
                                FrameworkStatsLog.buildStatsEvent(
                                        atomTag,
                                        getHibernatingPackagesForUser(userId).size(),
                                        userId)
                        );
                    }
                }
            }
            return StatsManager.PULL_SUCCESS;
        }
    }
}
+8 −0
Original line number Diff line number Diff line
@@ -31,6 +31,14 @@ final class UserLevelState {
    @CurrentTimeMillisLong
    public long lastUnhibernatedMs;

    UserLevelState() {}

    UserLevelState(UserLevelState state) {
        packageName = state.packageName;
        hibernated = state.hibernated;
        lastUnhibernatedMs = state.lastUnhibernatedMs;
    }

    @Override
    public String toString() {
        return "UserLevelState{"