diff --git a/core/proto/android/server/apphibernationservice.proto b/core/proto/android/server/apphibernationservice.proto index d341c4b2f0a82..64c2a322548f3 100644 --- a/core/proto/android/server/apphibernationservice.proto +++ b/core/proto/android/server/apphibernationservice.proto @@ -39,4 +39,5 @@ message GlobalLevelHibernationStatesProto { message GlobalLevelHibernationStateProto { optional string package_name = 1; optional bool hibernated = 2; + optional int64 saved_byte = 3; } \ No newline at end of file diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index 92996241a3a66..f7ddd2922b254 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -1151,6 +1151,8 @@ public abstract class PackageManagerInternal implements PackageSettingsSnapshotP /** * Deletes the OAT artifacts of a package. + * @param packageName a specific package + * @return the number of freed bytes or -1 if there was an error in the process. */ - public abstract void deleteOatArtifactsOfPackage(String packageName); + public abstract long deleteOatArtifactsOfPackage(String packageName); } diff --git a/services/core/java/com/android/server/apphibernation/AppHibernationService.java b/services/core/java/com/android/server/apphibernation/AppHibernationService.java index 4cb2e9b5cb973..7f1402d83a0cf 100644 --- a/services/core/java/com/android/server/apphibernation/AppHibernationService.java +++ b/services/core/java/com/android/server/apphibernation/AppHibernationService.java @@ -456,7 +456,9 @@ public final class AppHibernationService extends SystemService { private void hibernatePackageGlobally(@NonNull String packageName, GlobalLevelState state) { Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "hibernatePackageGlobally"); if (mOatArtifactDeletionEnabled) { - mPackageManagerInternal.deleteOatArtifactsOfPackage(packageName); + state.savedByte = Math.max( + mPackageManagerInternal.deleteOatArtifactsOfPackage(packageName), + 0); } state.hibernated = true; Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); @@ -469,6 +471,7 @@ public final class AppHibernationService extends SystemService { private void unhibernatePackageGlobally(@NonNull String packageName, GlobalLevelState state) { Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "unhibernatePackageGlobally"); state.hibernated = false; + state.savedByte = 0; state.lastUnhibernatedMs = System.currentTimeMillis(); Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } @@ -943,6 +946,9 @@ public final class AppHibernationService extends SystemService { } private final class StatsPullAtomCallbackImpl implements StatsPullAtomCallback { + + private static final int MEGABYTE_IN_BYTES = 1000000; + @Override public int onPullAtom(int atomTag, @NonNull List data) { if (!isAppHibernationEnabled() @@ -969,12 +975,21 @@ public final class AppHibernationService extends SystemService { break; case FrameworkStatsLog.GLOBAL_HIBERNATED_APPS: int hibernatedAppCount = 0; + long storage_saved_byte = 0; synchronized (mLock) { for (GlobalLevelState state : mGlobalHibernationStates.values()) { - if (state.hibernated) hibernatedAppCount++; + if (state.hibernated) { + hibernatedAppCount++; + storage_saved_byte += state.savedByte; + } } } - data.add(FrameworkStatsLog.buildStatsEvent(atomTag, hibernatedAppCount)); + data.add( + FrameworkStatsLog.buildStatsEvent( + atomTag, + hibernatedAppCount, + storage_saved_byte / MEGABYTE_IN_BYTES) + ); break; default: return StatsManager.PULL_SKIP; diff --git a/services/core/java/com/android/server/apphibernation/GlobalLevelHibernationProto.java b/services/core/java/com/android/server/apphibernation/GlobalLevelHibernationProto.java index 79e995b038fae..018d6023f083d 100644 --- a/services/core/java/com/android/server/apphibernation/GlobalLevelHibernationProto.java +++ b/services/core/java/com/android/server/apphibernation/GlobalLevelHibernationProto.java @@ -41,6 +41,7 @@ final class GlobalLevelHibernationProto implements ProtoReadWriter