Loading services/core/java/com/android/server/apphibernation/AppHibernationService.java +46 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading Loading @@ -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()); } } Loading Loading @@ -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); } Loading Loading @@ -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; } } } services/core/java/com/android/server/apphibernation/UserLevelState.java +8 −0 Original line number Diff line number Diff line Loading @@ -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{" Loading Loading
services/core/java/com/android/server/apphibernation/AppHibernationService.java +46 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading Loading @@ -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()); } } Loading Loading @@ -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); } Loading Loading @@ -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; } } }
services/core/java/com/android/server/apphibernation/UserLevelState.java +8 −0 Original line number Diff line number Diff line Loading @@ -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{" Loading