diff options
17 files changed, 182 insertions, 78 deletions
diff --git a/core/java/android/os/AggregateBatteryConsumer.java b/core/java/android/os/AggregateBatteryConsumer.java index c5f56144c29c..67e21957839a 100644 --- a/core/java/android/os/AggregateBatteryConsumer.java +++ b/core/java/android/os/AggregateBatteryConsumer.java @@ -33,6 +33,7 @@ import java.io.PrintWriter; * * {@hide} */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public final class AggregateBatteryConsumer extends BatteryConsumer { static final int CONSUMER_TYPE_AGGREGATE = 0; diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 1a0ce702e38d..b68b94d5bf2d 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -37,6 +37,7 @@ import android.server.ServerProtoEnums; import android.service.batterystats.BatteryStatsServiceDumpHistoryProto; import android.service.batterystats.BatteryStatsServiceDumpProto; import android.telephony.CellSignalStrength; +import android.telephony.ModemActivityInfo; import android.telephony.ServiceState; import android.telephony.TelephonyManager; import android.text.format.DateFormat; @@ -83,6 +84,7 @@ import java.util.Map; * except where indicated otherwise. * @hide */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public abstract class BatteryStats { @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) @@ -463,6 +465,7 @@ public abstract class BatteryStats { /** * State for keeping track of long counting information. */ + @android.ravenwood.annotation.RavenwoodKeepWholeClass public static abstract class LongCounter { /** @@ -2724,12 +2727,6 @@ public abstract class BatteryStats { */ public abstract int getMobileRadioActiveUnknownCount(int which); - public static final int DATA_CONNECTION_OUT_OF_SERVICE = 0; - public static final int DATA_CONNECTION_EMERGENCY_SERVICE = - TelephonyManager.getAllNetworkTypes().length + 1; - public static final int DATA_CONNECTION_OTHER = DATA_CONNECTION_EMERGENCY_SERVICE + 1; - - static final String[] DATA_CONNECTION_NAMES = { "oos", "gprs", "edge", "umts", "cdma", "evdo_0", "evdo_A", "1xrtt", "hsdpa", "hsupa", "hspa", "iden", "evdo_b", "lte", @@ -2737,9 +2734,28 @@ public abstract class BatteryStats { "emngcy", "other" }; + public static final int DATA_CONNECTION_OUT_OF_SERVICE = 0; + public static final int DATA_CONNECTION_EMERGENCY_SERVICE = getEmergencyNetworkConnectionType(); + public static final int DATA_CONNECTION_OTHER = DATA_CONNECTION_EMERGENCY_SERVICE + 1; + @UnsupportedAppUsage public static final int NUM_DATA_CONNECTION_TYPES = DATA_CONNECTION_OTHER + 1; + @android.ravenwood.annotation.RavenwoodReplace + private static int getEmergencyNetworkConnectionType() { + int count = TelephonyManager.getAllNetworkTypes().length; + if (DATA_CONNECTION_NAMES.length != count + 3) { // oos, emngcy, other + throw new IllegalStateException( + "DATA_CONNECTION_NAMES length does not match network type count. " + + "Expected: " + (count + 3) + ", actual:" + DATA_CONNECTION_NAMES.length); + } + return count + 1; + } + + private static int getEmergencyNetworkConnectionType$ravenwood() { + return DATA_CONNECTION_NAMES.length - 2; + } + /** * Returns the time in microseconds that the phone has been running with * the given data connection. @@ -9015,4 +9031,44 @@ public abstract class BatteryStats { (lhs, rhs) -> Double.compare(rhs.millisecondsPerPacket, lhs.millisecondsPerPacket)); return uidMobileRadioStats; } + + @android.ravenwood.annotation.RavenwoodReplace + @VisibleForTesting + protected static boolean isLowRamDevice() { + return ActivityManager.isLowRamDeviceStatic(); + } + + protected static boolean isLowRamDevice$ravenwood() { + return false; + } + + @android.ravenwood.annotation.RavenwoodReplace + @VisibleForTesting + protected static int getCellSignalStrengthLevelCount() { + return CellSignalStrength.getNumSignalStrengthLevels(); + } + + protected static int getCellSignalStrengthLevelCount$ravenwood() { + return 5; + } + + @android.ravenwood.annotation.RavenwoodReplace + @VisibleForTesting + protected static int getModemTxPowerLevelCount() { + return ModemActivityInfo.getNumTxPowerLevels(); + } + + protected static int getModemTxPowerLevelCount$ravenwood() { + return 5; + } + + @android.ravenwood.annotation.RavenwoodReplace + @VisibleForTesting + protected static boolean isKernelStatsAvailable() { + return true; + } + + protected static boolean isKernelStatsAvailable$ravenwood() { + return false; + } } diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java index 511f4649e4d4..90d82e7ad2a4 100644 --- a/core/java/android/os/BatteryUsageStats.java +++ b/core/java/android/os/BatteryUsageStats.java @@ -56,6 +56,7 @@ import java.util.List; * * @hide */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public final class BatteryUsageStats implements Parcelable, Closeable { /** diff --git a/core/java/android/os/BatteryUsageStatsQuery.java b/core/java/android/os/BatteryUsageStatsQuery.java index 32840d4b5837..203ef47d857e 100644 --- a/core/java/android/os/BatteryUsageStatsQuery.java +++ b/core/java/android/os/BatteryUsageStatsQuery.java @@ -28,6 +28,7 @@ import java.lang.annotation.RetentionPolicy; * * @hide */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public final class BatteryUsageStatsQuery implements Parcelable { @NonNull diff --git a/core/java/android/os/PowerComponents.java b/core/java/android/os/PowerComponents.java index 9c11ad433b8f..164e2659d654 100644 --- a/core/java/android/os/PowerComponents.java +++ b/core/java/android/os/PowerComponents.java @@ -40,6 +40,7 @@ import java.io.PrintWriter; * * @hide */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass class PowerComponents { private final BatteryConsumer.BatteryConsumerData mData; diff --git a/core/java/android/os/UidBatteryConsumer.java b/core/java/android/os/UidBatteryConsumer.java index 3eea94eaf2e6..53af838cb535 100644 --- a/core/java/android/os/UidBatteryConsumer.java +++ b/core/java/android/os/UidBatteryConsumer.java @@ -37,6 +37,7 @@ import java.lang.annotation.RetentionPolicy; * * @hide */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public final class UidBatteryConsumer extends BatteryConsumer { static final int CONSUMER_TYPE_UID = 1; @@ -223,6 +224,7 @@ public final class UidBatteryConsumer extends BatteryConsumer { /** * Builder for UidBatteryConsumer. */ + @android.ravenwood.annotation.RavenwoodKeepWholeClass public static final class Builder extends BaseBuilder<Builder> { private static final String PACKAGE_NAME_UNINITIALIZED = ""; private final BatteryStats.Uid mBatteryStatsUid; diff --git a/core/java/com/android/internal/os/BatteryStatsHistory.java b/core/java/com/android/internal/os/BatteryStatsHistory.java index 1330e1681dc4..7a79e0f7cfea 100644 --- a/core/java/com/android/internal/os/BatteryStatsHistory.java +++ b/core/java/com/android/internal/os/BatteryStatsHistory.java @@ -977,11 +977,16 @@ public class BatteryStatsHistory { /** * @return true if there is more than 100MB free disk space left. */ + @android.ravenwood.annotation.RavenwoodReplace private boolean hasFreeDiskSpace() { final StatFs stats = new StatFs(mHistoryDir.getAbsolutePath()); return stats.getAvailableBytes() > MIN_FREE_SPACE; } + private boolean hasFreeDiskSpace$ravenwood() { + return true; + } + @VisibleForTesting public List<String> getFilesNames() { List<String> names = new ArrayList<>(); diff --git a/core/java/com/android/internal/os/PowerProfile.java b/core/java/com/android/internal/os/PowerProfile.java index 2298cbde10d1..ab982f5b67cf 100644 --- a/core/java/com/android/internal/os/PowerProfile.java +++ b/core/java/com/android/internal/os/PowerProfile.java @@ -50,6 +50,7 @@ import java.util.HashMap; * Customize the XML file for different devices. * [hidden] */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class PowerProfile { public static final String TAG = "PowerProfile"; @@ -321,6 +322,13 @@ public class PowerProfile { private int mCpuPowerBracketCount; @VisibleForTesting + public PowerProfile() { + synchronized (sLock) { + initLocked(); + } + } + + @VisibleForTesting @UnsupportedAppUsage public PowerProfile(Context context) { this(context, false); @@ -358,6 +366,10 @@ public class PowerProfile { if (sPowerItemMap.size() == 0 && sPowerArrayMap.size() == 0) { readPowerValuesFromXml(context, xmlId); } + initLocked(); + } + + private void initLocked() { initCpuClusters(); initCpuScalingPolicies(); initCpuPowerBrackets(); diff --git a/core/java/com/android/internal/power/ModemPowerProfile.java b/core/java/com/android/internal/power/ModemPowerProfile.java index a555ae38736e..b15c10e6ba20 100644 --- a/core/java/com/android/internal/power/ModemPowerProfile.java +++ b/core/java/com/android/internal/power/ModemPowerProfile.java @@ -39,6 +39,7 @@ import java.util.Arrays; /** * ModemPowerProfile for handling the modem element in the power_profile.xml */ +@android.ravenwood.annotation.RavenwoodKeepWholeClass public class ModemPowerProfile { private static final String TAG = "ModemPowerProfile"; 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 c9536b9b8129..533b799341c1 100644 --- a/core/tests/coretests/src/com/android/internal/os/LongArrayMultiStateCounterTest.java +++ b/core/tests/coretests/src/com/android/internal/os/LongArrayMultiStateCounterTest.java @@ -22,7 +22,6 @@ import static org.junit.Assert.assertThrows; import android.os.BadParcelableException; import android.os.Parcel; -import android.platform.test.annotations.IgnoreUnderRavenwood; import android.platform.test.ravenwood.RavenwoodRule; import androidx.test.filters.SmallTest; @@ -34,7 +33,6 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) @SmallTest -@IgnoreUnderRavenwood(blockedBy = LongArrayMultiStateCounter.class) public class LongArrayMultiStateCounterTest { @Rule public final RavenwoodRule mRavenwood = new RavenwoodRule(); diff --git a/ravenwood/ravenwood-annotation-allowed-classes.txt b/ravenwood/ravenwood-annotation-allowed-classes.txt index 491ed22ce2c8..ab2546bab246 100644 --- a/ravenwood/ravenwood-annotation-allowed-classes.txt +++ b/ravenwood/ravenwood-annotation-allowed-classes.txt @@ -9,8 +9,10 @@ com.android.internal.os.Clock com.android.internal.os.LongArrayMultiStateCounter com.android.internal.os.LongArrayMultiStateCounter$LongArrayContainer com.android.internal.os.MonotonicClock +com.android.internal.os.PowerProfile com.android.internal.os.PowerStats com.android.internal.os.PowerStats$Descriptor +com.android.internal.power.ModemPowerProfile android.util.AtomicFile android.util.DataUnit @@ -32,11 +34,16 @@ android.util.SparseSetArray android.util.TimeUtils android.util.Xml +android.os.AggregateBatteryConsumer android.os.BatteryConsumer +android.os.BatteryStats android.os.BatteryStats$HistoryItem android.os.BatteryStats$HistoryStepDetails android.os.BatteryStats$HistoryTag +android.os.BatteryStats$LongCounter android.os.BatteryStats$ProcessStateChange +android.os.BatteryUsageStats +android.os.BatteryUsageStatsQuery android.os.Binder android.os.Binder$IdentitySupplier android.os.Broadcaster @@ -54,11 +61,14 @@ android.os.MessageQueue android.os.PackageTagsList android.os.Parcel android.os.Parcelable +android.os.PowerComponents android.os.Process android.os.ServiceSpecificException android.os.SystemClock android.os.ThreadLocalWorkSource android.os.TimestampedValue +android.os.UidBatteryConsumer +android.os.UidBatteryConsumer$Builder android.os.UserHandle android.os.WorkSource @@ -117,6 +127,7 @@ android.graphics.RectF android.content.ContentProvider com.android.server.LocalServices +com.android.server.power.stats.BatteryStatsImpl com.android.internal.util.BitUtils com.android.internal.util.BitwiseInputStream 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 03f376358b77..09b19e6196a1 100644 --- a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java +++ b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java @@ -190,15 +190,11 @@ public class BatteryStatsImpl extends BatteryStats { // The maximum number of names wakelocks we will keep track of // per uid; once the limit is reached, we batch the remaining wakelocks // in to one common name. - private static final int MAX_WAKELOCKS_PER_UID; + private static final int MAX_WAKELOCKS_PER_UID = isLowRamDevice() ? 40 : 200; - static { - if (ActivityManager.isLowRamDeviceStatic()) { - MAX_WAKELOCKS_PER_UID = 40; - } else { - MAX_WAKELOCKS_PER_UID = 200; - } - } + private static final int CELL_SIGNAL_STRENGTH_LEVEL_COUNT = getCellSignalStrengthLevelCount(); + + private static final int MODEM_TX_POWER_LEVEL_COUNT = getModemTxPowerLevelCount(); // Number of transmit power states the Wifi controller can be in. private static final int NUM_WIFI_TX_LEVELS = 1; @@ -278,11 +274,9 @@ public class BatteryStatsImpl extends BatteryStats { @VisibleForTesting protected KernelSingleUidTimeReader mKernelSingleUidTimeReader; @VisibleForTesting - protected SystemServerCpuThreadReader mSystemServerCpuThreadReader = - SystemServerCpuThreadReader.create(); + protected SystemServerCpuThreadReader mSystemServerCpuThreadReader; - private final KernelMemoryBandwidthStats mKernelMemoryBandwidthStats - = new KernelMemoryBandwidthStats(); + private KernelMemoryBandwidthStats mKernelMemoryBandwidthStats; private final LongSparseArray<SamplingTimer> mKernelMemoryStats = new LongSparseArray<>(); private int[] mCpuPowerBracketMap; private final CpuPowerStatsCollector mCpuPowerStatsCollector; @@ -323,7 +317,7 @@ public class BatteryStatsImpl extends BatteryStats { private long mLastRpmStatsUpdateTimeMs = -RPM_STATS_UPDATE_FREQ_MS; /** Container for Rail Energy Data stats. */ - private final RailStats mTmpRailStats = new RailStats(); + private RailStats mTmpRailStats; /** * Estimate UID modem power usage based on their estimated mobile radio active time. @@ -1031,7 +1025,7 @@ public class BatteryStatsImpl extends BatteryStats { int mPhoneSignalStrengthBin = -1; int mPhoneSignalStrengthBinRaw = -1; final StopwatchTimer[] mPhoneSignalStrengthsTimer = - new StopwatchTimer[CellSignalStrength.getNumSignalStrengthLevels()]; + new StopwatchTimer[CELL_SIGNAL_STRENGTH_LEVEL_COUNT]; StopwatchTimer mPhoneSignalScanningTimer; @@ -1723,7 +1717,8 @@ public class BatteryStatsImpl extends BatteryStats { @VisibleForTesting public BatteryStatsImpl(Clock clock, File historyDirectory, @NonNull Handler handler, @NonNull PowerStatsUidResolver powerStatsUidResolver) { - init(clock); + mClock = clock; + initKernelStatsReaders(); mBatteryStatsConfig = new BatteryStatsConfig.Builder().build(); mHandler = handler; mPowerStatsUidResolver = powerStatsUidResolver; @@ -1748,13 +1743,19 @@ public class BatteryStatsImpl extends BatteryStats { mCpuPowerStatsCollector = null; } - private void init(Clock clock) { - mClock = clock; - mCpuUidUserSysTimeReader = new KernelCpuUidUserSysTimeReader(true, clock); - mCpuUidFreqTimeReader = new KernelCpuUidFreqTimeReader(true, clock); - mCpuUidActiveTimeReader = new KernelCpuUidActiveTimeReader(true, clock); - mCpuUidClusterTimeReader = new KernelCpuUidClusterTimeReader(true, clock); + private void initKernelStatsReaders() { + if (!isKernelStatsAvailable()) { + return; + } + + mCpuUidUserSysTimeReader = new KernelCpuUidUserSysTimeReader(true, mClock); + mCpuUidFreqTimeReader = new KernelCpuUidFreqTimeReader(true, mClock); + mCpuUidActiveTimeReader = new KernelCpuUidActiveTimeReader(true, mClock); + mCpuUidClusterTimeReader = new KernelCpuUidClusterTimeReader(true, mClock); mKernelWakelockReader = new KernelWakelockReader(); + mSystemServerCpuThreadReader = SystemServerCpuThreadReader.create(); + mKernelMemoryBandwidthStats = new KernelMemoryBandwidthStats(); + mTmpRailStats = new RailStats(); } /** @@ -5878,7 +5879,7 @@ public class BatteryStatsImpl extends BatteryStats { @GuardedBy("this") void stopAllPhoneSignalStrengthTimersLocked(int except, long elapsedRealtimeMs) { - for (int i = 0; i < CellSignalStrength.getNumSignalStrengthLevels(); i++) { + for (int i = 0; i < CELL_SIGNAL_STRENGTH_LEVEL_COUNT; i++) { if (i == except) { continue; } @@ -8450,7 +8451,7 @@ public class BatteryStatsImpl extends BatteryStats { public ControllerActivityCounterImpl getOrCreateModemControllerActivityLocked() { if (mModemControllerActivity == null) { mModemControllerActivity = new ControllerActivityCounterImpl(mBsi.mClock, - mBsi.mOnBatteryTimeBase, ModemActivityInfo.getNumTxPowerLevels()); + mBsi.mOnBatteryTimeBase, mBsi.MODEM_TX_POWER_LEVEL_COUNT); } return mModemControllerActivity; } @@ -10896,7 +10897,8 @@ public class BatteryStatsImpl extends BatteryStats { @NonNull UserInfoProvider userInfoProvider, @NonNull PowerProfile powerProfile, @NonNull CpuScalingPolicies cpuScalingPolicies, @NonNull PowerStatsUidResolver powerStatsUidResolver) { - init(clock); + mClock = clock; + initKernelStatsReaders(); mBatteryStatsConfig = config; mMonotonicClock = monotonicClock; @@ -10992,7 +10994,7 @@ public class BatteryStatsImpl extends BatteryStats { mDeviceLightIdlingTimer = new StopwatchTimer(mClock, null, -15, null, mOnBatteryTimeBase); mDeviceIdlingTimer = new StopwatchTimer(mClock, null, -12, null, mOnBatteryTimeBase); mPhoneOnTimer = new StopwatchTimer(mClock, null, -3, null, mOnBatteryTimeBase); - for (int i = 0; i < CellSignalStrength.getNumSignalStrengthLevels(); i++) { + for (int i = 0; i < CELL_SIGNAL_STRENGTH_LEVEL_COUNT; i++) { mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(mClock, null, -200 - i, null, mOnBatteryTimeBase); } @@ -11012,7 +11014,7 @@ public class BatteryStatsImpl extends BatteryStats { mBluetoothActivity = new ControllerActivityCounterImpl(mClock, mOnBatteryTimeBase, NUM_BT_TX_LEVELS); mModemActivity = new ControllerActivityCounterImpl(mClock, mOnBatteryTimeBase, - ModemActivityInfo.getNumTxPowerLevels()); + MODEM_TX_POWER_LEVEL_COUNT); mMobileRadioActiveTimer = new StopwatchTimer(mClock, null, -400, null, mOnBatteryTimeBase); mMobileRadioActivePerAppTimer = new StopwatchTimer(mClock, null, -401, null, mOnBatteryTimeBase); @@ -11611,7 +11613,7 @@ public class BatteryStatsImpl extends BatteryStats { mFlashlightOnTimer.reset(false, elapsedRealtimeUs); mCameraOnTimer.reset(false, elapsedRealtimeUs); mBluetoothScanTimer.reset(false, elapsedRealtimeUs); - for (int i = 0; i < CellSignalStrength.getNumSignalStrengthLevels(); i++) { + for (int i = 0; i < CELL_SIGNAL_STRENGTH_LEVEL_COUNT; i++) { mPhoneSignalStrengthsTimer[i].reset(false, elapsedRealtimeUs); } mPhoneSignalScanningTimer.reset(false, elapsedRealtimeUs); @@ -11834,7 +11836,7 @@ public class BatteryStatsImpl extends BatteryStats { private String[] mWifiIfaces = EmptyArray.STRING; @GuardedBy("mWifiNetworkLock") - private NetworkStats mLastWifiNetworkStats = new NetworkStats(0, -1); + private NetworkStats mLastWifiNetworkStats; private final Object mModemNetworkLock = new Object(); @@ -11842,7 +11844,7 @@ public class BatteryStatsImpl extends BatteryStats { private String[] mModemIfaces = EmptyArray.STRING; @GuardedBy("mModemNetworkLock") - private NetworkStats mLastModemNetworkStats = new NetworkStats(0, -1); + private NetworkStats mLastModemNetworkStats; @VisibleForTesting protected NetworkStats readMobileNetworkStatsLocked( @@ -11875,7 +11877,9 @@ public class BatteryStatsImpl extends BatteryStats { synchronized (mWifiNetworkLock) { final NetworkStats latestStats = readWifiNetworkStatsLocked(networkStatsManager); if (latestStats != null) { - delta = latestStats.subtract(mLastWifiNetworkStats); + delta = mLastWifiNetworkStats != null + ? latestStats.subtract(mLastWifiNetworkStats) + : latestStats.subtract(new NetworkStats(0, -1)); mLastWifiNetworkStats = latestStats; } } @@ -12248,7 +12252,9 @@ public class BatteryStatsImpl extends BatteryStats { synchronized (mModemNetworkLock) { final NetworkStats latestStats = readMobileNetworkStatsLocked(networkStatsManager); if (latestStats != null) { - delta = latestStats.subtract(mLastModemNetworkStats); + delta = latestStats.subtract(mLastModemNetworkStats != null + ? mLastModemNetworkStats + : new NetworkStats(0, -1)); mLastModemNetworkStats = latestStats; } } @@ -12301,7 +12307,7 @@ public class BatteryStatsImpl extends BatteryStats { deltaInfo.getSleepTimeMillis()); mModemActivity.getOrCreateRxTimeCounter() .increment(deltaInfo.getReceiveTimeMillis(), elapsedRealtimeMs); - for (int lvl = 0; lvl < ModemActivityInfo.getNumTxPowerLevels(); lvl++) { + for (int lvl = 0; lvl < MODEM_TX_POWER_LEVEL_COUNT; lvl++) { mModemActivity.getOrCreateTxTimeCounters()[lvl] .increment(deltaInfo.getTransmitDurationMillisAtPowerLevel(lvl), elapsedRealtimeMs); @@ -12318,8 +12324,8 @@ public class BatteryStatsImpl extends BatteryStats { mPowerProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_IDLE) + deltaInfo.getReceiveTimeMillis() * mPowerProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_RX); - for (int i = 0; i < Math.min(ModemActivityInfo.getNumTxPowerLevels(), - CellSignalStrength.getNumSignalStrengthLevels()); i++) { + for (int i = 0; i < Math.min(MODEM_TX_POWER_LEVEL_COUNT, + CELL_SIGNAL_STRENGTH_LEVEL_COUNT); i++) { energyUsed += deltaInfo.getTransmitDurationMillisAtPowerLevel(i) * mPowerProfile.getAveragePower( PowerProfile.POWER_MODEM_CONTROLLER_TX, i); @@ -12441,7 +12447,7 @@ public class BatteryStatsImpl extends BatteryStats { } if (totalTxPackets > 0 && entry.getTxPackets() > 0) { - for (int lvl = 0; lvl < ModemActivityInfo.getNumTxPowerLevels(); + for (int lvl = 0; lvl < MODEM_TX_POWER_LEVEL_COUNT; lvl++) { long txMs = entry.getTxPackets() * deltaInfo.getTransmitDurationMillisAtPowerLevel(lvl); @@ -12550,7 +12556,7 @@ public class BatteryStatsImpl extends BatteryStats { && deltaInfo.getSpecificInfoFrequencyRange(0) == ServiceState.FREQUENCY_RANGE_UNKNOWN) { // Specific info data unavailable. Proportionally smear Rx and Tx times across each RAT. - final int levelCount = CellSignalStrength.getNumSignalStrengthLevels(); + final int levelCount = CELL_SIGNAL_STRENGTH_LEVEL_COUNT; long[] perSignalStrengthActiveTimeMs = new long[levelCount]; long totalActiveTimeMs = 0; @@ -12726,13 +12732,13 @@ public class BatteryStatsImpl extends BatteryStats { return; } int levelMaxTimeSpent = 0; - for (int i = 1; i < ModemActivityInfo.getNumTxPowerLevels(); i++) { + for (int i = 1; i < MODEM_TX_POWER_LEVEL_COUNT; i++) { if (activityInfo.getTransmitDurationMillisAtPowerLevel(i) > activityInfo.getTransmitDurationMillisAtPowerLevel(levelMaxTimeSpent)) { levelMaxTimeSpent = i; } } - if (levelMaxTimeSpent == ModemActivityInfo.getNumTxPowerLevels() - 1) { + if (levelMaxTimeSpent == MODEM_TX_POWER_LEVEL_COUNT - 1) { mHistory.recordState2StartEvent(elapsedRealtimeMs, uptimeMs, HistoryItem.STATE2_CELLULAR_HIGH_TX_POWER_FLAG); } @@ -14821,12 +14827,12 @@ public class BatteryStatsImpl extends BatteryStats { timeInRatMs[i] = getPhoneDataConnectionTime(i, rawRealTimeUs, which) / 1000; } long[] timeInRxSignalStrengthLevelMs = - new long[CellSignalStrength.getNumSignalStrengthLevels()]; + new long[CELL_SIGNAL_STRENGTH_LEVEL_COUNT]; for (int i = 0; i < timeInRxSignalStrengthLevelMs.length; i++) { timeInRxSignalStrengthLevelMs[i] = getPhoneSignalStrengthTime(i, rawRealTimeUs, which) / 1000; } - long[] txTimeMs = new long[Math.min(ModemActivityInfo.getNumTxPowerLevels(), + long[] txTimeMs = new long[Math.min(MODEM_TX_POWER_LEVEL_COUNT, counter.getTxTimeCounters().length)]; long totalTxTimeMs = 0; for (int i = 0; i < txTimeMs.length; i++) { @@ -15458,7 +15464,7 @@ public class BatteryStatsImpl extends BatteryStats { public Constants(Handler handler) { super(handler); - if (ActivityManager.isLowRamDeviceStatic()) { + if (isLowRamDevice()) { MAX_HISTORY_FILES = DEFAULT_MAX_HISTORY_FILES_LOW_RAM_DEVICE; MAX_HISTORY_BUFFER = DEFAULT_MAX_HISTORY_BUFFER_LOW_RAM_DEVICE_KB * 1024; } else { @@ -15528,12 +15534,10 @@ public class BatteryStatsImpl extends BatteryStats { KEY_PROC_STATE_CHANGE_COLLECTION_DELAY_MS, DEFAULT_PROC_STATE_CHANGE_COLLECTION_DELAY_MS); MAX_HISTORY_FILES = mParser.getInt(KEY_MAX_HISTORY_FILES, - ActivityManager.isLowRamDeviceStatic() ? - DEFAULT_MAX_HISTORY_FILES_LOW_RAM_DEVICE - : DEFAULT_MAX_HISTORY_FILES); + isLowRamDevice() ? DEFAULT_MAX_HISTORY_FILES_LOW_RAM_DEVICE + : DEFAULT_MAX_HISTORY_FILES); MAX_HISTORY_BUFFER = mParser.getInt(KEY_MAX_HISTORY_BUFFER_KB, - ActivityManager.isLowRamDeviceStatic() ? - DEFAULT_MAX_HISTORY_BUFFER_LOW_RAM_DEVICE_KB + isLowRamDevice() ? DEFAULT_MAX_HISTORY_BUFFER_LOW_RAM_DEVICE_KB : DEFAULT_MAX_HISTORY_BUFFER_KB) * 1024; final String perUidModemModel = mParser.getString(KEY_PER_UID_MODEM_POWER_MODEL, @@ -16014,7 +16018,7 @@ public class BatteryStatsImpl extends BatteryStats { mDeviceLightIdlingTimer.readSummaryFromParcelLocked(in); mDeviceIdlingTimer.readSummaryFromParcelLocked(in); mPhoneOnTimer.readSummaryFromParcelLocked(in); - for (int i = 0; i < CellSignalStrength.getNumSignalStrengthLevels(); i++) { + for (int i = 0; i < CELL_SIGNAL_STRENGTH_LEVEL_COUNT; i++) { mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in); } mPhoneSignalScanningTimer.readSummaryFromParcelLocked(in); @@ -16520,7 +16524,7 @@ public class BatteryStatsImpl extends BatteryStats { mDeviceLightIdlingTimer.writeSummaryFromParcelLocked(out, nowRealtime); mDeviceIdlingTimer.writeSummaryFromParcelLocked(out, nowRealtime); mPhoneOnTimer.writeSummaryFromParcelLocked(out, nowRealtime); - for (int i = 0; i < CellSignalStrength.getNumSignalStrengthLevels(); i++) { + for (int i = 0; i < CELL_SIGNAL_STRENGTH_LEVEL_COUNT; i++) { mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, nowRealtime); } mPhoneSignalScanningTimer.writeSummaryFromParcelLocked(out, nowRealtime); @@ -17015,7 +17019,7 @@ public class BatteryStatsImpl extends BatteryStats { mDeviceIdlingTimer.logState(pr, " "); pr.println("*** Phone timer:"); mPhoneOnTimer.logState(pr, " "); - for (int i = 0; i < CellSignalStrength.getNumSignalStrengthLevels(); i++) { + for (int i = 0; i < CELL_SIGNAL_STRENGTH_LEVEL_COUNT; i++) { pr.println("*** Phone signal strength #" + i + ":"); mPhoneSignalStrengthsTimer[i].logState(pr, " "); } diff --git a/services/tests/powerstatstests/Android.bp b/services/tests/powerstatstests/Android.bp index 05e0e8f4a4f7..654d7a8de168 100644 --- a/services/tests/powerstatstests/Android.bp +++ b/services/tests/powerstatstests/Android.bp @@ -11,6 +11,7 @@ filegroup { "src/com/android/server/power/stats/MultiStateStatsTest.java", "src/com/android/server/power/stats/PowerStatsAggregatorTest.java", "src/com/android/server/power/stats/PowerStatsCollectorTest.java", + "src/com/android/server/power/stats/PowerStatsExporterTest.java", "src/com/android/server/power/stats/PowerStatsSchedulerTest.java", "src/com/android/server/power/stats/PowerStatsStoreTest.java", "src/com/android/server/power/stats/PowerStatsUidResolverTest.java", @@ -83,6 +84,9 @@ android_ravenwood_test { ], srcs: [ ":power_stats_ravenwood_tests", + + "src/com/android/server/power/stats/BatteryUsageStatsRule.java", + "src/com/android/server/power/stats/MockBatteryStatsImpl.java", "src/com/android/server/power/stats/MockClock.java", ], auto_gen_config: true, diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryChargeCalculatorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryChargeCalculatorTest.java index 4ea0805ffaa7..3f058a2348c3 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryChargeCalculatorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryChargeCalculatorTest.java @@ -37,12 +37,12 @@ public class BatteryChargeCalculatorTest { private static final double PRECISION = 0.00001; @Rule - public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule(); + public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule() + .setAveragePower(PowerProfile.POWER_BATTERY_CAPACITY, 4000.0); @Test public void testDischargeTotals() { // Nominal battery capacity should be ignored - mStatsRule.setAveragePower(PowerProfile.POWER_BATTERY_CAPACITY, 1234.0); final BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats(); @@ -84,8 +84,6 @@ public class BatteryChargeCalculatorTest { @Test public void testDischargeTotals_chargeUahUnavailable() { - mStatsRule.setAveragePower(PowerProfile.POWER_BATTERY_CAPACITY, 4000.0); - final BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats(); batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING, 100, diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java index e61dd0b41423..ca162e0b46e1 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java @@ -18,11 +18,11 @@ package com.android.server.power.stats; import static org.mockito.ArgumentMatchers.anyDouble; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.annotation.XmlRes; -import android.content.Context; import android.net.NetworkStats; import android.os.BatteryConsumer; import android.os.BatteryStats; @@ -54,12 +54,11 @@ public class BatteryUsageStatsRule implements TestRule { .powerProfileModeledOnly() .includePowerModels() .build(); - private final Context mContext; private final PowerProfile mPowerProfile; private final MockClock mMockClock = new MockClock(); private final MockBatteryStatsImpl mBatteryStats; - private final Handler mHandler; + private Handler mHandler; private BatteryUsageStats mBatteryUsageStats; private boolean mScreenOn; @@ -76,11 +75,8 @@ public class BatteryUsageStatsRule implements TestRule { } public BatteryUsageStatsRule(long currentTime, File historyDir) { - HandlerThread bgThread = new HandlerThread("bg thread"); - bgThread.start(); - mHandler = new Handler(bgThread.getLooper()); - mContext = InstrumentationRegistry.getContext(); - mPowerProfile = spy(new PowerProfile(mContext, true /* forTest */)); + mHandler = mock(Handler.class); + mPowerProfile = spy(new PowerProfile()); mMockClock.currentTime = currentTime; mBatteryStats = new MockBatteryStatsImpl(mMockClock, historyDir, mHandler); mBatteryStats.setPowerProfile(mPowerProfile); @@ -103,7 +99,7 @@ public class BatteryUsageStatsRule implements TestRule { } public BatteryUsageStatsRule setTestPowerProfile(@XmlRes int xmlId) { - mPowerProfile.forceInitForTesting(mContext, xmlId); + mPowerProfile.forceInitForTesting(InstrumentationRegistry.getContext(), xmlId); return this; } @@ -222,13 +218,17 @@ public class BatteryUsageStatsRule implements TestRule { return new Statement() { @Override public void evaluate() throws Throwable { - noteOnBattery(); + before(); base.evaluate(); } }; } - private void noteOnBattery() { + private void before() { + HandlerThread bgThread = new HandlerThread("bg thread"); + bgThread.start(); + mHandler = new Handler(bgThread.getLooper()); + mBatteryStats.setHandler(mHandler); mBatteryStats.setOnBatteryInternal(true); mBatteryStats.getOnBatteryTimeBase().setRunning(true, 0, 0); mBatteryStats.getOnBatteryScreenOffTimeBase().setRunning(!mScreenOn, 0, 0); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java b/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java index fb71ac83a8d9..78c4bac14a74 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java @@ -271,6 +271,10 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl { public void writeSyncLocked() { } + public void setHandler(Handler handler) { + mHandler = handler; + } + public static class DummyExternalStatsSync implements ExternalStatsSync { public int flags = 0; @@ -315,4 +319,3 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl { } } } - diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsExporterTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsExporterTest.java index 3c482625b038..3560a2620c8f 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsExporterTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsExporterTest.java @@ -16,8 +16,6 @@ package com.android.server.power.stats; -import static androidx.test.InstrumentationRegistry.getContext; - import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; @@ -34,6 +32,7 @@ import android.os.Message; import android.os.Parcel; import android.os.PersistableBundle; import android.os.UidBatteryConsumer; +import android.platform.test.ravenwood.RavenwoodRule; import androidx.test.runner.AndroidJUnit4; @@ -48,6 +47,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import java.io.File; +import java.io.IOException; +import java.nio.file.Files; import java.util.List; @RunWith(AndroidJUnit4.class) @@ -57,7 +58,12 @@ public class PowerStatsExporterTest { private static final int APP_UID2 = 84; private static final double TOLERANCE = 0.01; - @Rule + @Rule(order = 0) + public final RavenwoodRule mRavenwood = new RavenwoodRule.Builder() + .setProvideMainThread(true) + .build(); + + @Rule(order = 1) public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule() .setAveragePower(PowerProfile.POWER_CPU_ACTIVE, 720) .setCpuScalingPolicy(0, new int[]{0}, new int[]{100}) @@ -75,8 +81,8 @@ public class PowerStatsExporterTest { private PowerStats.Descriptor mPowerStatsDescriptor; @Before - public void setup() { - File storeDirectory = new File(getContext().getCacheDir(), getClass().getSimpleName()); + public void setup() throws IOException { + File storeDirectory = Files.createTempDirectory("PowerStatsExporterTest").toFile(); clearDirectory(storeDirectory); AggregatedPowerStatsConfig config = new AggregatedPowerStatsConfig(); |