diff options
28 files changed, 200 insertions, 121 deletions
diff --git a/core/java/com/android/internal/os/LongArrayMultiStateCounter.java b/core/java/com/android/internal/os/LongArrayMultiStateCounter.java index fe616e085488..5e9c87a5154a 100644 --- a/core/java/com/android/internal/os/LongArrayMultiStateCounter.java +++ b/core/java/com/android/internal/os/LongArrayMultiStateCounter.java @@ -16,6 +16,7 @@ package com.android.internal.os; +import android.annotation.CheckResult; import android.annotation.Nullable; import android.os.Parcel; import android.os.Parcelable; @@ -196,7 +197,8 @@ public final class LongArrayMultiStateCounter implements Parcelable { /** * Populates the array with the accumulated counts for the specified state. */ - public void getCounts(long[] counts, int state) { + @CheckResult + public boolean getCounts(long[] counts, int state) { if (state < 0 || state >= mStateCount) { throw new IllegalArgumentException( "State: " + state + ", outside the range: [0-" + mStateCount + "]"); @@ -205,7 +207,7 @@ public final class LongArrayMultiStateCounter implements Parcelable { throw new IllegalArgumentException( "Invalid array length: " + counts.length + ", expected: " + mLength); } - native_getCounts(mNativeObject, counts, state); + return native_getCounts(mNativeObject, counts, state); } @Override @@ -282,7 +284,8 @@ public final class LongArrayMultiStateCounter implements Parcelable { @FastNative @RavenwoodRedirect - private static native void native_getCounts(long nativeObject, long[] counts, int state); + @CheckResult + private static native boolean native_getCounts(long nativeObject, long[] counts, int state); @FastNative @RavenwoodRedirect diff --git a/core/java/com/android/internal/os/LongArrayMultiStateCounter_ravenwood.java b/core/java/com/android/internal/os/LongArrayMultiStateCounter_ravenwood.java index 4f5f37d0640e..403e8c1be8fa 100644 --- a/core/java/com/android/internal/os/LongArrayMultiStateCounter_ravenwood.java +++ b/core/java/com/android/internal/os/LongArrayMultiStateCounter_ravenwood.java @@ -168,8 +168,20 @@ class LongArrayMultiStateCounter_ravenwood { } } - public void getValues(long[] values, int state) { - System.arraycopy(mStates[state].mCounter, 0, values, 0, mArrayLength); + public boolean getValues(long[] values, int state) { + long[] counts = mStates[state].mCounter; + boolean allZeros = true; + for (int i = 0; i < counts.length; i++) { + if (counts[i] != 0) { + allZeros = false; + break; + } + } + if (allZeros) { + return false; + } + System.arraycopy(counts, 0, values, 0, mArrayLength); + return true; } public void reset() { @@ -316,8 +328,8 @@ class LongArrayMultiStateCounter_ravenwood { getInstance(instanceId).addCounts(counts); } - public static void native_getCounts(long instanceId, long[] counts, int state) { - getInstance(instanceId).getValues(counts, state); + public static boolean native_getCounts(long instanceId, long[] counts, int state) { + return getInstance(instanceId).getValues(counts, state); } public static void native_reset(long instanceId) { diff --git a/core/jni/com_android_internal_os_LongArrayMultiStateCounter.cpp b/core/jni/com_android_internal_os_LongArrayMultiStateCounter.cpp index 8f36ecb8b01a..7d94ef85f51a 100644 --- a/core/jni/com_android_internal_os_LongArrayMultiStateCounter.cpp +++ b/core/jni/com_android_internal_os_LongArrayMultiStateCounter.cpp @@ -116,17 +116,26 @@ static void native_reset(jlong nativePtr) { counter->reset(); } -static void native_getCounts(JNIEnv *env, jclass, jlong nativePtr, jlongArray values, jint state) { +static bool native_getCounts(JNIEnv *env, jclass, jlong nativePtr, jlongArray values, jint state) { auto *counter = reinterpret_cast<LongArrayMultiStateCounter *>(nativePtr); - ScopedLongArrayRW scopedArray(env, values); auto *data = counter->getCount(state).data(); - auto size = env->GetArrayLength(values); - auto *outData = scopedArray.get(); if (data == nullptr) { - memset(outData, 0, size * sizeof(uint64_t)); - } else { - memcpy(outData, data, size * sizeof(uint64_t)); + return false; + } + auto size = env->GetArrayLength(values); + bool allZeros = true; + for (int i = 0; i < size; i++) { + if (data[i]) { + allZeros = false; + break; + } } + if (allZeros) { + return false; + } + ScopedLongArrayRW scopedArray(env, values); + memcpy(scopedArray.get(), data, size * sizeof(uint64_t)); + return true; } static jobject native_toString(JNIEnv *env, jclass, jlong nativePtr) { @@ -255,7 +264,7 @@ static const JNINativeMethod g_LongArrayMultiStateCounter_methods[] = { // @CriticalNative {"native_reset", "(J)V", (void *)native_reset}, // @FastNative - {"native_getCounts", "(J[JI)V", (void *)native_getCounts}, + {"native_getCounts", "(J[JI)Z", (void *)native_getCounts}, // @FastNative {"native_toString", "(J)Ljava/lang/String;", (void *)native_toString}, // @FastNative diff --git a/core/tests/coretests/src/com/android/internal/os/KernelSingleUidTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelSingleUidTimeReaderTest.java index 3239598eccdc..0ba2d851feb9 100644 --- a/core/tests/coretests/src/com/android/internal/os/KernelSingleUidTimeReaderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/KernelSingleUidTimeReaderTest.java @@ -23,6 +23,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import android.annotation.SuppressLint; import android.platform.test.annotations.IgnoreUnderRavenwood; import android.platform.test.ravenwood.RavenwoodRule; import android.util.SparseArray; @@ -287,6 +288,7 @@ public class KernelSingleUidTimeReaderTest { 0, lastUidCpuTimes.size()); } + @SuppressLint("CheckResult") @Test public void testAddDeltaFromBpf() { LongArrayMultiStateCounter counter = new LongArrayMultiStateCounter(2, 5); diff --git a/core/tests/coretests/src/com/android/internal/os/LongArrayMultiStateCounterTest.java b/core/tests/coretests/src/com/android/internal/os/LongArrayMultiStateCounterTest.java index 7e5d0a4c2e42..959e121aae9e 100644 --- a/core/tests/coretests/src/com/android/internal/os/LongArrayMultiStateCounterTest.java +++ b/core/tests/coretests/src/com/android/internal/os/LongArrayMultiStateCounterTest.java @@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; +import android.annotation.SuppressLint; import android.os.BadParcelableException; import android.os.Parcel; import android.platform.test.ravenwood.RavenwoodRule; @@ -176,6 +177,7 @@ public class LongArrayMultiStateCounterTest { assertCounts(newCounter, 0, new long[]{116, 232, 364, 528}); } + @SuppressLint("CheckResult") private void assertCounts(LongArrayMultiStateCounter counter, int state, long[] expected) { long[] counts = new long[expected.length]; counter.getCounts(counts, state); diff --git a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java index 1d62087428d8..2cf6b7efcb48 100644 --- a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java +++ b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java @@ -2911,19 +2911,7 @@ public class BatteryStatsImpl extends BatteryStats { return false; } - mCounter.getCounts(counts, procState); - - // Return counts only if at least one of the elements is non-zero. - for (int i = counts.length - 1; i >= 0; --i) { - if (counts[i] != 0) { - return true; - } - } - return false; - } - - public void logState(Printer pw, String prefix) { - pw.println(prefix + "mCounter=" + mCounter); + return mCounter.getCounts(counts, procState); } /** diff --git a/services/core/java/com/android/server/power/stats/processor/AmbientDisplayPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/AmbientDisplayPowerStatsProcessor.java index 5f93bdf07f47..a550f2d820a9 100644 --- a/services/core/java/com/android/server/power/stats/processor/AmbientDisplayPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/AmbientDisplayPowerStatsProcessor.java @@ -68,11 +68,15 @@ class AmbientDisplayPowerStatsProcessor extends PowerStatsProcessor { // processor. All that remains to be done is copy the estimates over. MultiStateStats.States.forEachTrackedStateCombination(deviceStateConfig, states -> { - screenStats.getDeviceStats(mTmpScreenStats, states); + if (!screenStats.getDeviceStats(mTmpScreenStats, states)) { + return; + } double power = mScreenPowerStatsLayout.getScreenDozePowerEstimate(mTmpScreenStats); - mStatsLayout.setDevicePowerEstimate(mTmpDeviceStats, power); - stats.setDeviceStats(states, mTmpDeviceStats); + if (power != 0) { + mStatsLayout.setDevicePowerEstimate(mTmpDeviceStats, power); + stats.setDeviceStats(states, mTmpDeviceStats); + } }); } } diff --git a/services/core/java/com/android/server/power/stats/processor/CpuPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/CpuPowerStatsProcessor.java index 6ce2cf738192..b67f0648be50 100644 --- a/services/core/java/com/android/server/power/stats/processor/CpuPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/CpuPowerStatsProcessor.java @@ -404,7 +404,10 @@ class CpuPowerStatsProcessor extends PowerStatsProcessor { deviceStatsIntermediates.timeByBracket = new long[powerBracketCount]; deviceStatsIntermediates.powerByBracket = new double[powerBracketCount]; - stats.getDeviceStats(mTmpDeviceStatsArray, deviceStateEstimation.stateValues); + if (!stats.getDeviceStats(mTmpDeviceStatsArray, deviceStateEstimation.stateValues)) { + continue; + } + for (int step = 0; step < cpuScalingStepCount; step++) { if (intermediates.timeByScalingStep[step] == 0) { continue; @@ -429,16 +432,19 @@ class CpuPowerStatsProcessor extends PowerStatsProcessor { } if (wakelockStats != null) { - wakelockStats.getDeviceStats(mTmpWakelockDeviceStats, - deviceStateEstimation.stateValues); - double wakelockPowerEstimate = mWakelockPowerStatsLayout.getDevicePowerEstimate( - mTmpWakelockDeviceStats); - power = Math.max(0, power - wakelockPowerEstimate); + if (wakelockStats.getDeviceStats(mTmpWakelockDeviceStats, + deviceStateEstimation.stateValues)) { + double wakelockPowerEstimate = mWakelockPowerStatsLayout.getDevicePowerEstimate( + mTmpWakelockDeviceStats); + power = Math.max(0, power - wakelockPowerEstimate); + } } - deviceStatsIntermediates.power = power; - mStatsLayout.setDevicePowerEstimate(mTmpDeviceStatsArray, power); - stats.setDeviceStats(deviceStateEstimation.stateValues, mTmpDeviceStatsArray); + if (power != 0) { + deviceStatsIntermediates.power = power; + mStatsLayout.setDevicePowerEstimate(mTmpDeviceStatsArray, power); + stats.setDeviceStats(deviceStateEstimation.stateValues, mTmpDeviceStatsArray); + } } } @@ -538,11 +544,12 @@ class CpuPowerStatsProcessor extends PowerStatsProcessor { } if (wakelockStats != null) { - wakelockStats.getUidStats(mTmpWakelockUidStats, uid, - proportionalEstimate.stateValues); - double wakelockPowerEstimate = mWakelockPowerStatsLayout.getUidPowerEstimate( - mTmpWakelockUidStats); - power = Math.max(0, power - wakelockPowerEstimate); + if (wakelockStats.getUidStats(mTmpWakelockUidStats, uid, + proportionalEstimate.stateValues)) { + double wakelockPowerEstimate = mWakelockPowerStatsLayout.getUidPowerEstimate( + mTmpWakelockUidStats); + power = Math.max(0, power - wakelockPowerEstimate); + } } if (power != 0) { diff --git a/services/core/java/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessor.java index a544daad82f1..5883505326ad 100644 --- a/services/core/java/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessor.java @@ -259,7 +259,9 @@ class MobileRadioPowerStatsProcessor extends PowerStatsProcessor { stats.forEachStateStatsKey(key -> { RxTxPowerEstimators estimators = mRxTxPowerEstimators.get(key); - stats.getStateStats(mTmpStateStatsArray, key, deviceStates); + if (!stats.getStateStats(mTmpStateStatsArray, key, deviceStates)) { + return; + } long rxTime = mStatsLayout.getStateRxTime(mTmpStateStatsArray); intermediates.rxPower += estimators.mRxPowerEstimator.calculatePower(rxTime); for (int txLevel = 0; txLevel < ModemActivityInfo.getNumTxPowerLevels(); txLevel++) { diff --git a/services/core/java/com/android/server/power/stats/processor/MultiStateStats.java b/services/core/java/com/android/server/power/stats/processor/MultiStateStats.java index 69325757c79d..0038943d7cf8 100644 --- a/services/core/java/com/android/server/power/stats/processor/MultiStateStats.java +++ b/services/core/java/com/android/server/power/stats/processor/MultiStateStats.java @@ -16,6 +16,7 @@ package com.android.server.power.stats.processor; +import android.annotation.CheckResult; import android.annotation.Nullable; import android.util.Slog; @@ -342,10 +343,12 @@ class MultiStateStats { } /** - * Returns accumulated stats for the specified composite state. + * Returns accumulated stats for the specified composite state or false if the results are + * all zeros. */ - void getStats(long[] outValues, int[] states) { - mCounter.getCounts(outValues, mFactory.getSerialState(states)); + @CheckResult + boolean getStats(long[] outValues, int[] states) { + return mCounter.getCounts(outValues, mFactory.getSerialState(states)); } /** @@ -389,15 +392,7 @@ class MultiStateStats { private void writeXmlForStates(TypedXmlSerializer serializer, int[] states, long[] values) throws IOException { - mCounter.getCounts(values, mFactory.getSerialState(states)); - boolean nonZero = false; - for (long value : values) { - if (value != 0) { - nonZero = true; - break; - } - } - if (!nonZero) { + if (!mCounter.getCounts(values, mFactory.getSerialState(states))) { return; } @@ -470,15 +465,7 @@ class MultiStateStats { StringBuilder sb = new StringBuilder(); long[] values = new long[mCounter.getArrayLength()]; States.forEachTrackedStateCombination(mFactory.mStates, states -> { - mCounter.getCounts(values, mFactory.getSerialState(states)); - boolean nonZero = false; - for (long value : values) { - if (value != 0) { - nonZero = true; - break; - } - } - if (!nonZero) { + if (!mCounter.getCounts(values, mFactory.getSerialState(states))) { return; } diff --git a/services/core/java/com/android/server/power/stats/processor/PhoneCallPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/PhoneCallPowerStatsProcessor.java index 3957ae0862dc..ad628e4632e1 100644 --- a/services/core/java/com/android/server/power/stats/processor/PhoneCallPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/PhoneCallPowerStatsProcessor.java @@ -69,12 +69,15 @@ class PhoneCallPowerStatsProcessor extends PowerStatsProcessor { // processor. All that remains to be done is copy the estimates over. MultiStateStats.States.forEachTrackedStateCombination(deviceStateConfig, states -> { - mobileRadioStats.getDeviceStats(mTmpMobileRadioDeviceStats, states); - double callPowerEstimate = - mMobileRadioStatsLayout.getDeviceCallPowerEstimate( - mTmpMobileRadioDeviceStats); - mStatsLayout.setDevicePowerEstimate(mTmpDeviceStats, callPowerEstimate); - stats.setDeviceStats(states, mTmpDeviceStats); + if (!mobileRadioStats.getDeviceStats(mTmpMobileRadioDeviceStats, states)) { + return; + } + double callPowerEstimate = mMobileRadioStatsLayout.getDeviceCallPowerEstimate( + mTmpMobileRadioDeviceStats); + if (callPowerEstimate != 0) { + mStatsLayout.setDevicePowerEstimate(mTmpDeviceStats, callPowerEstimate); + stats.setDeviceStats(states, mTmpDeviceStats); + } }); } } diff --git a/services/core/java/com/android/server/power/stats/processor/PowerComponentAggregatedPowerStats.java b/services/core/java/com/android/server/power/stats/processor/PowerComponentAggregatedPowerStats.java index f9b9da9171cb..d285a5987710 100644 --- a/services/core/java/com/android/server/power/stats/processor/PowerComponentAggregatedPowerStats.java +++ b/services/core/java/com/android/server/power/stats/processor/PowerComponentAggregatedPowerStats.java @@ -16,6 +16,7 @@ package com.android.server.power.stats.processor; +import android.annotation.CheckResult; import android.annotation.NonNull; import android.annotation.Nullable; import android.os.BatteryStats; @@ -312,6 +313,11 @@ class PowerComponentAggregatedPowerStats { return uids; } + /** + * Populates outValues with the stats for the specified states. If the stats are all 0, + * returns false, leaving outValues unchanged. + */ + @CheckResult boolean getDeviceStats(long[] outValues, int[] deviceStates) { if (deviceStates.length != mDeviceStateConfig.length) { throw new IllegalArgumentException( @@ -319,12 +325,16 @@ class PowerComponentAggregatedPowerStats { + " expected: " + mDeviceStateConfig.length); } if (mDeviceStats != null) { - mDeviceStats.getStats(outValues, deviceStates); - return true; + return mDeviceStats.getStats(outValues, deviceStates); } return false; } + /** + * Populates outValues with the stats for the specified key and device states. If the stats + * are all 0, returns false, leaving outValues unchanged. + */ + @CheckResult boolean getStateStats(long[] outValues, int key, int[] deviceStates) { if (deviceStates.length != mDeviceStateConfig.length) { throw new IllegalArgumentException( @@ -333,8 +343,7 @@ class PowerComponentAggregatedPowerStats { } MultiStateStats stateStats = mStateStats.get(key); if (stateStats != null) { - stateStats.getStats(outValues, deviceStates); - return true; + return stateStats.getStats(outValues, deviceStates); } return false; } @@ -345,6 +354,11 @@ class PowerComponentAggregatedPowerStats { } } + /** + * Populates outValues with the stats for the specified UID and UID states. If the stats are + * all 0, returns false, leaving outValues unchanged. + */ + @CheckResult boolean getUidStats(long[] outValues, int uid, int[] uidStates) { if (uidStates.length != mUidStateConfig.length) { throw new IllegalArgumentException( @@ -353,8 +367,7 @@ class PowerComponentAggregatedPowerStats { } UidStats uidStats = mUidStats.get(uid); if (uidStats != null && uidStats.stats != null) { - uidStats.stats.getStats(outValues, uidStates); - return true; + return uidStats.stats.getStats(outValues, uidStates); } return false; } @@ -578,15 +591,7 @@ class PowerComponentAggregatedPowerStats { long[] values = new long[stats.getDimensionCount()]; MultiStateStats.States[] stateInfo = stats.getStates(); MultiStateStats.States.forEachTrackedStateCombination(stateInfo, states -> { - stats.getStats(values, states); - boolean nonZero = false; - for (long value : values) { - if (value != 0) { - nonZero = true; - break; - } - } - if (!nonZero) { + if (!stats.getStats(values, states)) { return; } diff --git a/services/core/java/com/android/server/power/stats/processor/SensorPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/SensorPowerStatsProcessor.java index ba728d36d561..284e6a9fce89 100644 --- a/services/core/java/com/android/server/power/stats/processor/SensorPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/SensorPowerStatsProcessor.java @@ -298,12 +298,16 @@ class SensorPowerStatsProcessor extends PowerStatsProcessor { continue; } - if (!stats.getDeviceStats(mTmpDeviceStatsArray, estimation.stateValues)) { + double power = ((Intermediates) estimation.intermediates).power; + if (power == 0) { continue; } - mStatsLayout.setDevicePowerEstimate(mTmpDeviceStatsArray, - ((Intermediates) estimation.intermediates).power); + if (!stats.getDeviceStats(mTmpDeviceStatsArray, estimation.stateValues)) { + Arrays.fill(mTmpDeviceStatsArray, 0); + } + + mStatsLayout.setDevicePowerEstimate(mTmpDeviceStatsArray, power); stats.setDeviceStats(estimation.stateValues, mTmpDeviceStatsArray); } } diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/AggregatedPowerStatsTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/AggregatedPowerStatsTest.java index 0e73329dcfe5..978fd1af2636 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/AggregatedPowerStatsTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/AggregatedPowerStatsTest.java @@ -18,6 +18,7 @@ package com.android.server.power.stats.processor; import static com.google.common.truth.Truth.assertThat; +import android.annotation.SuppressLint; import android.os.BatteryConsumer; import android.os.PersistableBundle; import android.util.SparseArray; @@ -280,6 +281,7 @@ public class AggregatedPowerStatsTest { .isEqualTo(new long[]{250, 300}); } + @SuppressLint("CheckResult") private static long[] getDeviceStats( AggregatedPowerStats stats, int powerComponentId, int... states) { @@ -290,6 +292,7 @@ public class AggregatedPowerStatsTest { return out; } + @SuppressLint("CheckResult") private static long[] getStateStats( AggregatedPowerStats stats, int key, int... states) { PowerComponentAggregatedPowerStats powerComponentStats = @@ -299,6 +302,7 @@ public class AggregatedPowerStatsTest { return out; } + @SuppressLint("CheckResult") private static long[] getUidDeviceStats( AggregatedPowerStats stats, int powerComponentId, int uid, int... states) { diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/AmbientDisplayPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/AmbientDisplayPowerStatsProcessorTest.java index 21e615f8c740..58e9d1e26f2c 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/AmbientDisplayPowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/AmbientDisplayPowerStatsProcessorTest.java @@ -27,6 +27,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; +import android.annotation.SuppressLint; import android.hardware.power.stats.EnergyConsumerType; import android.os.BatteryConsumer; import android.os.Handler; @@ -166,6 +167,7 @@ public class AmbientDisplayPowerStatsProcessorTest { return stats.getPowerComponentStats(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY); } + @SuppressLint("CheckResult") private void assertPowerEstimate( PowerComponentAggregatedPowerStats aggregatedStats, int powerState, int screenState, double expectedPowerEstimate) { diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BasePowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BasePowerStatsProcessorTest.java index cca60339acf7..58784d7b4a25 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BasePowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BasePowerStatsProcessorTest.java @@ -34,6 +34,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.mock; +import android.annotation.SuppressLint; import android.os.BatteryConsumer; import android.os.BatteryUsageStats; import android.os.Process; @@ -68,6 +69,7 @@ public class BasePowerStatsProcessorTest { .setProcessorSupplier(() -> new BasePowerStatsProcessor(() -> 4000)); } + @SuppressLint("CheckResult") @Test public void processPowerStats() { AggregatedPowerStats aggregatedPowerStats = prepareAggregatedPowerStats(true); @@ -95,9 +97,11 @@ public class BasePowerStatsProcessorTest { stats.getUidStats(uidStats, APP_UID1, states(POWER_STATE_BATTERY, SCREEN_STATE_OTHER, PROCESS_STATE_FOREGROUND_SERVICE)); assertThat(statsLayout.getUidUsageDuration(uidStats)).isEqualTo(5000); - stats.getUidStats(uidStats, APP_UID1, + boolean nonZero = stats.getUidStats(uidStats, APP_UID1, states(POWER_STATE_BATTERY, SCREEN_STATE_OTHER, PROCESS_STATE_UNSPECIFIED)); - assertThat(statsLayout.getUidUsageDuration(uidStats)).isEqualTo(0); + if (nonZero) { + assertThat(statsLayout.getUidUsageDuration(uidStats)).isEqualTo(0); + } stats.getUidStats(uidStats, APP_UID2, states(POWER_STATE_BATTERY, SCREEN_STATE_ON, PROCESS_STATE_CACHED)); @@ -105,11 +109,14 @@ public class BasePowerStatsProcessorTest { stats.getUidStats(uidStats, APP_UID2, states(POWER_STATE_BATTERY, SCREEN_STATE_OTHER, PROCESS_STATE_CACHED)); assertThat(statsLayout.getUidUsageDuration(uidStats)).isEqualTo(8500); - stats.getUidStats(uidStats, APP_UID2, + nonZero = stats.getUidStats(uidStats, APP_UID2, states(POWER_STATE_BATTERY, SCREEN_STATE_OTHER, PROCESS_STATE_UNSPECIFIED)); - assertThat(statsLayout.getUidUsageDuration(uidStats)).isEqualTo(0); + if (nonZero) { + assertThat(statsLayout.getUidUsageDuration(uidStats)).isEqualTo(0); + } } + @SuppressLint("CheckResult") @Test public void fuelgaugeAvailable() { AggregatedPowerStats aggregatedPowerStats = prepareAggregatedPowerStats(true); @@ -138,6 +145,7 @@ public class BasePowerStatsProcessorTest { assertThat(dischargeDuration).isWithin(5).of(6000); } + @SuppressLint("CheckResult") @Test public void fuelgaugeUnavailable() { AggregatedPowerStats aggregatedPowerStats = prepareAggregatedPowerStats(false); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BinaryStatePowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BinaryStatePowerStatsProcessorTest.java index 2ff7dde3255f..e6e7f6e105b7 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BinaryStatePowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BinaryStatePowerStatsProcessorTest.java @@ -30,6 +30,7 @@ import static com.android.server.power.stats.processor.AggregatedPowerStatsConfi import static com.google.common.truth.Truth.assertThat; +import android.annotation.SuppressLint; import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.PersistableBundle; @@ -74,6 +75,7 @@ public class BinaryStatePowerStatsProcessorTest { } } + @SuppressLint("CheckResult") @Test public void powerProfileModel() { BinaryStatePowerStatsLayout statsLayout = new BinaryStatePowerStatsLayout(); @@ -138,12 +140,14 @@ public class BinaryStatePowerStatsProcessorTest { assertThat(statsLayout.getUidPowerEstimate(uidStats)) .isWithin(PRECISION).of(expectedPower2); - stats.getUidStats(uidStats, APP_UID2, - states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_CACHED)); - assertThat(statsLayout.getUidPowerEstimate(uidStats)) - .isWithin(PRECISION).of(0); + if (stats.getUidStats(uidStats, APP_UID2, + states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_CACHED))) { + assertThat(statsLayout.getUidPowerEstimate(uidStats)) + .isWithin(PRECISION).of(0); + } } + @SuppressLint("CheckResult") @Test public void energyConsumerModel() { BinaryStatePowerStatsLayout @@ -232,10 +236,11 @@ public class BinaryStatePowerStatsProcessorTest { assertThat(statsLayout.getUidPowerEstimate(uidStats)) .isWithin(PRECISION).of(expectedPower2); - stats.getUidStats(uidStats, APP_UID2, - states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_CACHED)); - assertThat(statsLayout.getUidPowerEstimate(uidStats)) - .isWithin(PRECISION).of(0); + if (stats.getUidStats(uidStats, APP_UID2, + states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_CACHED))) { + assertThat(statsLayout.getUidPowerEstimate(uidStats)) + .isWithin(PRECISION).of(0); + } } diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BluetoothPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BluetoothPowerStatsProcessorTest.java index 60131861ce89..6d7119dc1f0e 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BluetoothPowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BluetoothPowerStatsProcessorTest.java @@ -33,6 +33,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import android.annotation.SuppressLint; import android.bluetooth.BluetoothActivityEnergyInfo; import android.bluetooth.BluetoothAdapter; import android.bluetooth.UidTraffic; @@ -161,6 +162,7 @@ public class BluetoothPowerStatsProcessorTest { when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)).thenReturn(true); } + @SuppressLint("CheckResult") @Test public void powerProfileModel_mostlyDataTransfer() { // No power monitoring hardware @@ -262,6 +264,7 @@ public class BluetoothPowerStatsProcessorTest { .isWithin(PRECISION).of(expectedPower2 * 0.75); } + @SuppressLint("CheckResult") @Test public void powerProfileModel_mostlyScan() { // No power monitoring hardware @@ -361,6 +364,7 @@ public class BluetoothPowerStatsProcessorTest { .isWithin(PRECISION).of(expectedPower2 * 0.75); } + @SuppressLint("CheckResult") @Test public void consumedEnergyModel() { when(mConsumedEnergyRetriever.getVoltageMv()).thenReturn(VOLTAGE_MV); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CameraPowerStatsTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CameraPowerStatsTest.java index 23642de466a1..a95963242d8f 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CameraPowerStatsTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CameraPowerStatsTest.java @@ -33,6 +33,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; +import android.annotation.SuppressLint; import android.hardware.power.stats.EnergyConsumerResult; import android.hardware.power.stats.EnergyConsumerType; import android.os.BatteryConsumer; @@ -117,6 +118,7 @@ public class CameraPowerStatsTest { mMonotonicClock = new MonotonicClock(0, mStatsRule.getMockClock()); } + @SuppressLint("CheckResult") @Test public void energyConsumerModel() { when(mConsumedEnergyRetriever.getVoltageMv()).thenReturn(VOLTAGE_MV); @@ -211,10 +213,11 @@ public class CameraPowerStatsTest { assertThat(statsLayout.getUidPowerEstimate(uidStats)) .isWithin(PRECISION).of(expectedPower2); - stats.getUidStats(uidStats, APP_UID2, - states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_CACHED)); - assertThat(statsLayout.getUidPowerEstimate(uidStats)) - .isWithin(PRECISION).of(0); + if (stats.getUidStats(uidStats, APP_UID2, + states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_CACHED))) { + assertThat(statsLayout.getUidPowerEstimate(uidStats)) + .isWithin(PRECISION).of(0); + } } private BatteryStats.HistoryItem buildHistoryItem(int timestamp, boolean stateOn, diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CustomEnergyConsumerPowerStatsTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CustomEnergyConsumerPowerStatsTest.java index 42baba765276..a421675f1896 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CustomEnergyConsumerPowerStatsTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CustomEnergyConsumerPowerStatsTest.java @@ -33,6 +33,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; +import android.annotation.SuppressLint; import android.hardware.power.stats.EnergyConsumerAttribution; import android.hardware.power.stats.EnergyConsumerResult; import android.hardware.power.stats.EnergyConsumerType; @@ -154,6 +155,7 @@ public class CustomEnergyConsumerPowerStatsTest { .isEqualTo(6000); } + @SuppressLint("CheckResult") @Test public void processStats() throws Exception { AggregatedPowerStats aggregatedPowerStats = createAggregatedPowerStats(); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/GnssPowerStatsTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/GnssPowerStatsTest.java index c63267ec6ae7..b4f21133f621 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/GnssPowerStatsTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/GnssPowerStatsTest.java @@ -33,6 +33,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; +import android.annotation.SuppressLint; import android.hardware.power.stats.EnergyConsumerResult; import android.hardware.power.stats.EnergyConsumerType; import android.location.GnssSignalQuality; @@ -122,6 +123,7 @@ public class GnssPowerStatsTest { mHistoryItem.clear(); } + @SuppressLint("CheckResult") @Test public void powerProfileModel() { // ODPM unsupported @@ -206,12 +208,14 @@ public class GnssPowerStatsTest { assertThat(statsLayout.getUidPowerEstimate(uidStats)) .isWithin(PRECISION).of(0.51111); - stats.getUidStats(uidStats, APP_UID2, - states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_CACHED)); - assertThat(statsLayout.getUidPowerEstimate(uidStats)) - .isWithin(PRECISION).of(0); + if (stats.getUidStats(uidStats, APP_UID2, + states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_CACHED))) { + assertThat(statsLayout.getUidPowerEstimate(uidStats)) + .isWithin(PRECISION).of(0); + } } + @SuppressLint("CheckResult") @Test public void initialStateGnssOn() { // ODPM unsupported @@ -285,12 +289,14 @@ public class GnssPowerStatsTest { assertThat(statsLayout.getUidPowerEstimate(uidStats)) .isWithin(PRECISION).of(0.51111); - stats.getUidStats(uidStats, APP_UID2, - states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_CACHED)); - assertThat(statsLayout.getUidPowerEstimate(uidStats)) - .isWithin(PRECISION).of(0); + if (stats.getUidStats(uidStats, APP_UID2, + states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_CACHED))) { + assertThat(statsLayout.getUidPowerEstimate(uidStats)) + .isWithin(PRECISION).of(0); + } } + @SuppressLint("CheckResult") @Test public void energyConsumerModel() { when(mConsumedEnergyRetriever.getVoltageMv()).thenReturn(VOLTAGE_MV); @@ -386,10 +392,11 @@ public class GnssPowerStatsTest { assertThat(statsLayout.getUidPowerEstimate(uidStats)) .isWithin(PRECISION).of(expectedPower2); - stats.getUidStats(uidStats, APP_UID2, - states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_CACHED)); - assertThat(statsLayout.getUidPowerEstimate(uidStats)) - .isWithin(PRECISION).of(0); + if (stats.getUidStats(uidStats, APP_UID2, + states(POWER_STATE_OTHER, SCREEN_STATE_ON, PROCESS_STATE_CACHED))) { + assertThat(statsLayout.getUidPowerEstimate(uidStats)) + .isWithin(PRECISION).of(0); + } } private BatteryStats.HistoryItem buildHistoryItemInitialStateGpsOn(long timestamp) { diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessorTest.java index 6acd36885b1e..3dc401769e7d 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessorTest.java @@ -39,6 +39,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.annotation.Nullable; +import android.annotation.SuppressLint; import android.content.Context; import android.content.pm.PackageManager; import android.hardware.power.stats.EnergyConsumerResult; @@ -170,6 +171,7 @@ public class MobileRadioPowerStatsProcessorTest { .thenAnswer(invocation -> invocation.getArgument(0)); } + @SuppressLint("CheckResult") @Test public void powerProfileModel() { // No power monitoring hardware diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MultiStateStatsTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MultiStateStatsTest.java index 3b614bdb38ed..9abb06f338e3 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MultiStateStatsTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MultiStateStatsTest.java @@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertWithMessage; import static org.junit.Assert.assertThrows; +import android.annotation.SuppressLint; import android.os.BatteryConsumer; import androidx.test.filters.SmallTest; @@ -124,6 +125,7 @@ public class MultiStateStatsTest { assertThat(e.getMessage()).contains("40"); } + @SuppressLint("CheckResult") @Test public void multiStateStats_aggregation() { MultiStateStats.Factory factory = makeFactory(true, true, false); @@ -159,9 +161,9 @@ public class MultiStateStatsTest { // (400 - 100) * 0 + (600 - 400) * 0.5 assertThat(stats).isEqualTo(new long[]{100, 100}); - multiStateStats.getStats(stats, new int[]{1, BatteryConsumer.PROCESS_STATE_BACKGROUND, 0}); // Never been in this composite state - assertThat(stats).isEqualTo(new long[]{0, 0}); + assertThat(multiStateStats.getStats(stats, + new int[]{1, BatteryConsumer.PROCESS_STATE_BACKGROUND, 0})).isFalse(); } @Test diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PhoneCallPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PhoneCallPowerStatsProcessorTest.java index a20274fb5ded..2f742d74d8e6 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PhoneCallPowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PhoneCallPowerStatsProcessorTest.java @@ -29,6 +29,7 @@ import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.when; +import android.annotation.SuppressLint; import android.content.Context; import android.content.pm.PackageManager; import android.hardware.power.stats.EnergyConsumerType; @@ -159,6 +160,7 @@ public class PhoneCallPowerStatsProcessorTest { mStatsRule.setTestPowerProfile("power_profile_test_legacy_modem"); } + @SuppressLint("CheckResult") @Test public void copyEstimatesFromMobileRadioPowerStats() { AggregatedPowerStatsConfig config = new AggregatedPowerStatsConfig(); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/ScreenPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/ScreenPowerStatsProcessorTest.java index 185216583f1b..31456a1574d0 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/ScreenPowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/ScreenPowerStatsProcessorTest.java @@ -29,6 +29,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.when; +import android.annotation.SuppressLint; import android.hardware.power.stats.EnergyConsumerResult; import android.hardware.power.stats.EnergyConsumerType; import android.os.BatteryConsumer; @@ -278,6 +279,7 @@ public class ScreenPowerStatsProcessorTest { .of(expectedDozePowerEstimate); } + @SuppressLint("CheckResult") private void assertUidPowerEstimate( PowerComponentAggregatedPowerStats aggregatedStats, int uid, int powerState, int screenState, double expectedScreenPowerEstimate) { diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/SensorPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/SensorPowerStatsProcessorTest.java index d97260455bdd..c2f01d1fa65c 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/SensorPowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/SensorPowerStatsProcessorTest.java @@ -33,6 +33,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import android.annotation.SuppressLint; import android.hardware.Sensor; import android.hardware.SensorManager; import android.hardware.input.InputSensorInfo; @@ -91,6 +92,7 @@ public class SensorPowerStatsProcessorTest { List.of(sensor1, sensor2, sensor3)); } + @SuppressLint("CheckResult") @Test public void testPowerEstimation() { PowerComponentAggregatedPowerStats stats = createAggregatedPowerStats( diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WakelockPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WakelockPowerStatsProcessorTest.java index 8257d714a5d5..5ac7216194a4 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WakelockPowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WakelockPowerStatsProcessorTest.java @@ -31,6 +31,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.mock; +import android.annotation.SuppressLint; import android.os.BatteryConsumer; import android.os.PersistableBundle; import android.os.Process; @@ -123,6 +124,7 @@ public class WakelockPowerStatsProcessorTest { return history; } + @SuppressLint("CheckResult") private void assertAggregatedPowerStats(AggregatedPowerStats aggregatedPowerStats) { PowerComponentAggregatedPowerStats stats = aggregatedPowerStats.getPowerComponentStats(POWER_COMPONENT_WAKELOCK); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WifiPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WifiPowerStatsProcessorTest.java index bd92a84fc815..e36056a98c85 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WifiPowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WifiPowerStatsProcessorTest.java @@ -39,6 +39,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.annotation.Nullable; +import android.annotation.SuppressLint; import android.content.Context; import android.content.pm.PackageManager; import android.hardware.power.stats.EnergyConsumerResult; @@ -198,6 +199,7 @@ public class WifiPowerStatsProcessorTest { mBatteryStats = mStatsRule.getBatteryStats(); } + @SuppressLint("CheckResult") @Test public void powerProfileModel_powerController() { when(mWifiManager.isEnhancedPowerReportingSupported()).thenReturn(true); @@ -310,6 +312,7 @@ public class WifiPowerStatsProcessorTest { .isWithin(PRECISION).of(expectedPower2 * 0.75); } + @SuppressLint("CheckResult") @Test public void consumedEnergyModel_powerController() { when(mWifiManager.isEnhancedPowerReportingSupported()).thenReturn(true); @@ -424,6 +427,7 @@ public class WifiPowerStatsProcessorTest { .isWithin(PRECISION).of(expectedPower2 * 0.75); } + @SuppressLint("CheckResult") @Test public void powerProfileModel_noPowerController() { when(mWifiManager.isEnhancedPowerReportingSupported()).thenReturn(false); |