diff options
| author | 2021-03-24 18:35:48 +0000 | |
|---|---|---|
| committer | 2021-03-24 18:35:48 +0000 | |
| commit | 0d1235b41136ab46b11f8581db7671af7eed892d (patch) | |
| tree | e25063e4c0dbfc61c7b7e978970311fb0edb2a8e | |
| parent | d72305b775ac22a2a2ba6a55e779329b5befee6d (diff) | |
| parent | b8b58ebd2f3254262538910b6a24a39e701ce404 (diff) | |
Merge "Remove references to BatterStatsHelper from BatteryUsageStatsProvider" into sc-dev
6 files changed, 75 insertions, 22 deletions
diff --git a/core/java/android/os/BatteryUsageStatsQuery.java b/core/java/android/os/BatteryUsageStatsQuery.java index 9518bf197fa0..85861bc1d2aa 100644 --- a/core/java/android/os/BatteryUsageStatsQuery.java +++ b/core/java/android/os/BatteryUsageStatsQuery.java @@ -60,14 +60,18 @@ public final class BatteryUsageStatsQuery implements Parcelable { */ public static final int FLAG_BATTERY_USAGE_STATS_INCLUDE_HISTORY = 2; + private static final long DEFAULT_MAX_STATS_AGE_MS = 5 * 60 * 1000; + private final int mFlags; @NonNull private final int[] mUserIds; + private final long mMaxStatsAgeMs; private BatteryUsageStatsQuery(@NonNull Builder builder) { mFlags = builder.mFlags; mUserIds = builder.mUserIds != null ? builder.mUserIds.toArray() : new int[]{UserHandle.USER_ALL}; + mMaxStatsAgeMs = builder.mMaxStatsAgeMs; } @BatteryUsageStatsFlags @@ -94,10 +98,19 @@ public final class BatteryUsageStatsQuery implements Parcelable { return (mFlags & FLAG_BATTERY_USAGE_STATS_POWER_PROFILE_MODEL) != 0; } + /** + * Returns the client's tolerance for stale battery stats. The data is allowed to be up to + * this many milliseconds out-of-date. + */ + public long getMaxStatsAge() { + return mMaxStatsAgeMs; + } + private BatteryUsageStatsQuery(Parcel in) { mFlags = in.readInt(); mUserIds = new int[in.readInt()]; in.readIntArray(mUserIds); + mMaxStatsAgeMs = in.readLong(); } @Override @@ -105,6 +118,7 @@ public final class BatteryUsageStatsQuery implements Parcelable { dest.writeInt(mFlags); dest.writeInt(mUserIds.length); dest.writeIntArray(mUserIds); + dest.writeLong(mMaxStatsAgeMs); } @Override @@ -132,6 +146,7 @@ public final class BatteryUsageStatsQuery implements Parcelable { public static final class Builder { private int mFlags; private IntArray mUserIds; + private long mMaxStatsAgeMs = DEFAULT_MAX_STATS_AGE_MS; /** * Builds a read-only BatteryUsageStatsQuery object. @@ -170,5 +185,14 @@ public final class BatteryUsageStatsQuery implements Parcelable { mFlags |= BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_POWER_PROFILE_MODEL; return this; } + + /** + * Set the client's tolerance for stale battery stats. The data may be up to + * this many milliseconds out-of-date. + */ + public Builder setMaxStatsAgeMs(long maxStatsAgeMs) { + mMaxStatsAgeMs = maxStatsAgeMs; + return this; + } } } diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index ec0a8d8ede9d..27e77bfe11dd 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -16525,6 +16525,8 @@ public class BatteryStatsImpl extends BatteryStats { // Pull the clock time. This may update the time and make a new history entry // if we had originally pulled a time before the RTC was set. getStartClockTime(); + + updateSystemServiceCallStats(); } public void dumpLocked(Context context, PrintWriter pw, int flags, int reqUid, long histStart) { diff --git a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java index 4f99c94e0dc5..f8ae0c1858f8 100644 --- a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java +++ b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java @@ -21,9 +21,7 @@ import android.hardware.SensorManager; import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; -import android.os.Bundle; import android.os.UidBatteryConsumer; -import android.os.UserHandle; import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; @@ -88,29 +86,31 @@ public class BatteryUsageStatsProvider { } /** - * Returns snapshots of battery attribution data, one per supplied query. + * Returns true if the last update was too long ago for the tolerances specified + * by the supplied queries. */ - public List<BatteryUsageStats> getBatteryUsageStats(List<BatteryUsageStatsQuery> queries) { - - // TODO(b/174186345): instead of BatteryStatsHelper, use PowerCalculators directly. - final BatteryStatsHelper batteryStatsHelper = new BatteryStatsHelper(mContext, - false /* collectBatteryBroadcast */); - batteryStatsHelper.create((Bundle) null); - final List<UserHandle> users = new ArrayList<>(); - for (int i = 0; i < queries.size(); i++) { + public boolean shouldUpdateStats(List<BatteryUsageStatsQuery> queries, + long lastUpdateTimeStampMs) { + long allowableStatsAge = Long.MAX_VALUE; + for (int i = queries.size() - 1; i >= 0; i--) { BatteryUsageStatsQuery query = queries.get(i); - for (int userId : query.getUserIds()) { - UserHandle userHandle = UserHandle.of(userId); - if (!users.contains(userHandle)) { - users.add(userHandle); - } - } + allowableStatsAge = Math.min(allowableStatsAge, query.getMaxStatsAge()); } - batteryStatsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, users); + return mStats.mClocks.elapsedRealtime() - lastUpdateTimeStampMs > allowableStatsAge; + } + + /** + * Returns snapshots of battery attribution data, one per supplied query. + */ + public List<BatteryUsageStats> getBatteryUsageStats(List<BatteryUsageStatsQuery> queries) { ArrayList<BatteryUsageStats> results = new ArrayList<>(queries.size()); - for (int i = 0; i < queries.size(); i++) { - results.add(getBatteryUsageStats(queries.get(i))); + synchronized (mStats) { + mStats.prepareForDumpLocked(); + + for (int i = 0; i < queries.size(); i++) { + results.add(getBatteryUsageStats(queries.get(i))); + } } return results; } diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsProviderTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsProviderTest.java index 0f591433a84e..d36f06ab683a 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsProviderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsProviderTest.java @@ -158,4 +158,22 @@ public class BatteryUsageStatsProviderTest { assertThat(item.time).isEqualTo(elapsedTimeMs); } + + @Test + public void shouldUpdateStats() { + Context context = InstrumentationRegistry.getContext(); + BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(context, + mStatsRule.getBatteryStats()); + + final List<BatteryUsageStatsQuery> queries = List.of( + new BatteryUsageStatsQuery.Builder().setMaxStatsAgeMs(1000).build(), + new BatteryUsageStatsQuery.Builder().setMaxStatsAgeMs(2000).build() + ); + + mStatsRule.setTime(10500, 0); + assertThat(provider.shouldUpdateStats(queries, 10000)).isFalse(); + + mStatsRule.setTime(11500, 0); + assertThat(provider.shouldUpdateStats(queries, 10000)).isTrue(); + } } diff --git a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java index e74c936af02d..5b2276ce250f 100644 --- a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java +++ b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java @@ -487,8 +487,10 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync { Slog.wtf(TAG, "Error updating external stats: ", e); } - synchronized (BatteryExternalStatsWorker.this) { - mLastCollectionTimeStamp = SystemClock.elapsedRealtime(); + if ((updateFlags & UPDATE_ALL) == UPDATE_ALL) { + synchronized (BatteryExternalStatsWorker.this) { + mLastCollectionTimeStamp = SystemClock.elapsedRealtime(); + } } } }; diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index c3f97adbd9c3..3b76021afc08 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -674,6 +674,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub public List<BatteryUsageStats> getBatteryUsageStats(List<BatteryUsageStatsQuery> queries) { mContext.enforceCallingPermission( android.Manifest.permission.BATTERY_STATS, null); + awaitCompletion(); + + if (mBatteryUsageStatsProvider.shouldUpdateStats(queries, + mWorker.getLastCollectionTimeStamp())) { + syncStats("get-stats", BatteryExternalStatsWorker.UPDATE_ALL); + } + return mBatteryUsageStatsProvider.getBatteryUsageStats(queries); } |