diff options
author | 2022-02-08 20:04:46 -0800 | |
---|---|---|
committer | 2022-02-09 06:26:59 +0000 | |
commit | 58fff8488b204c0b3fb7b746b3a37cdf6a61cb5d (patch) | |
tree | 95734267b9fd368dd5af64d8ab7125057700f3dc | |
parent | 992d488c81228986dc605d583b06b2ee57af0548 (diff) |
Remove BatteryStatsHelper and BatterySipper
These classes have been superseded by BatteryUsageStats
Bug: 217618527
Test: presubmit
Change-Id: Ia562365031048ad5b541dd08196e04e53e7cc547
30 files changed, 9 insertions, 2191 deletions
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index cd395744592b..de1dc8091b2a 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -8591,7 +8591,10 @@ public abstract class BatteryStats implements Parcelable { proto.end(sToken); } - private static boolean checkWifiOnly(Context context) { + /** + * Returns true if the device does not have data-capable telephony. + */ + public static boolean checkWifiOnly(Context context) { final TelephonyManager tm = context.getSystemService(TelephonyManager.class); if (tm == null) { return false; diff --git a/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java b/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java index d8e89b4c2637..888f830960dd 100644 --- a/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java +++ b/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java @@ -22,10 +22,6 @@ import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; -import android.os.UserHandle; -import android.util.SparseArray; - -import java.util.List; /** * Estimates power consumed by the ambient display @@ -67,29 +63,6 @@ public class AmbientDisplayPowerCalculator extends PowerCalculator { powerMah, powerModel); } - /** - * Ambient display power is the additional power the screen takes while in ambient display/ - * screen doze/ always-on display (interchangeable terms) mode. Ambient display power should - * be hidden {@link BatteryStatsHelper#shouldHideSipper(BatterySipper)}, but should not be - * included in smearing {@link BatteryStatsHelper#removeHiddenBatterySippers(List)}. - */ - @Override - public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, - long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { - final long measuredEnergyUC = batteryStats.getScreenDozeMeasuredBatteryConsumptionUC(); - final long durationMs = calculateDuration(batteryStats, rawRealtimeUs, statsType); - final int powerModel = getPowerModel(measuredEnergyUC); - final double powerMah = calculateTotalPower(powerModel, batteryStats, rawRealtimeUs, - measuredEnergyUC); - if (powerMah > 0) { - BatterySipper bs = new BatterySipper(BatterySipper.DrainType.AMBIENT_DISPLAY, null, 0); - bs.usagePowerMah = powerMah; - bs.usageTimeMs = durationMs; - bs.sumPower(); - sippers.add(bs); - } - } - private long calculateDuration(BatteryStats batteryStats, long rawRealtimeUs, int statsType) { return batteryStats.getScreenDozeTime(rawRealtimeUs, statsType) / 1000; } diff --git a/core/java/com/android/internal/os/BatteryChargeCalculator.java b/core/java/com/android/internal/os/BatteryChargeCalculator.java index 71a1463370e5..912ec8f6a6ba 100644 --- a/core/java/com/android/internal/os/BatteryChargeCalculator.java +++ b/core/java/com/android/internal/os/BatteryChargeCalculator.java @@ -20,10 +20,6 @@ import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; -import android.os.UserHandle; -import android.util.SparseArray; - -import java.util.List; /** * Estimates the battery discharge amounts. @@ -81,10 +77,4 @@ public class BatteryChargeCalculator extends PowerCalculator { BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) .setConsumedPower(dischargeMah); } - - @Override - public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, - long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { - // Not implemented. The computation is done by BatteryStatsHelper - } } diff --git a/core/java/com/android/internal/os/BatterySipper.java b/core/java/com/android/internal/os/BatterySipper.java deleted file mode 100644 index dfd561a8cc30..000000000000 --- a/core/java/com/android/internal/os/BatterySipper.java +++ /dev/null @@ -1,301 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.internal.os; - -import android.compat.annotation.UnsupportedAppUsage; -import android.os.BatteryStats.Uid; -import android.os.Build; - -import java.util.List; - -/** - * Contains power usage of an application, system service, or hardware type. - * - * @deprecated Please use BatteryStatsManager.getBatteryUsageStats instead. - */ -@Deprecated -public class BatterySipper implements Comparable<BatterySipper> { - @UnsupportedAppUsage - public int userId; - @UnsupportedAppUsage - public Uid uidObj; - @UnsupportedAppUsage - public DrainType drainType; - - /** - * Smeared power from screen usage. - * We split the screen usage power and smear them among apps, based on activity time. - * The actual screen usage power may be measured or estimated, affecting the granularity and - * accuracy of the smearing, but the smearing algorithm is essentially the same. - */ - public double screenPowerMah; - - /** - * Smeared power using proportional method. - * - * we smear power usage from hidden sippers to all apps proportionally.(except for screen usage) - * - * @see BatteryStatsHelper#shouldHideSipper(BatterySipper) - * @see BatteryStatsHelper#removeHiddenBatterySippers(List) - */ - public double proportionalSmearMah; - - /** - * Total power that adding the smeared power. - * - * @see #sumPower() - */ - public double totalSmearedPowerMah; - - /** - * Total power before smearing - */ - @UnsupportedAppUsage - public double totalPowerMah; - - /** - * Whether we should hide this sipper - * - * @see BatteryStatsHelper#shouldHideSipper(BatterySipper) - */ - public boolean shouldHide; - - /** - * Generic usage time in milliseconds. - */ - @UnsupportedAppUsage - public long usageTimeMs; - - /** - * Generic power usage in mAh. - */ - public double usagePowerMah; - - // Subsystem usage times. - public long audioTimeMs; - public long bluetoothRunningTimeMs; - public long cameraTimeMs; - @UnsupportedAppUsage - public long cpuFgTimeMs; - @UnsupportedAppUsage - public long cpuTimeMs; - public long flashlightTimeMs; - @UnsupportedAppUsage - public long gpsTimeMs; - public long videoTimeMs; - @UnsupportedAppUsage - public long wakeLockTimeMs; - @UnsupportedAppUsage - public long wifiRunningTimeMs; - - public long mobileRxPackets; - public long mobileTxPackets; - public long mobileActive; - public int mobileActiveCount; - public double mobilemspp; // milliseconds per packet - public long wifiRxPackets; - public long wifiTxPackets; - public long mobileRxBytes; - public long mobileTxBytes; - public long wifiRxBytes; - public long wifiTxBytes; - public long btRxBytes; - public long btTxBytes; - public double percent; - public double noCoveragePercent; - @UnsupportedAppUsage - public String[] mPackages; - @UnsupportedAppUsage - public String packageWithHighestDrain; - - // Measured in mAh (milli-ampere per hour). - // These are included when summed. - public double audioPowerMah; - public double bluetoothPowerMah; - public double cameraPowerMah; - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) - public double cpuPowerMah; - public double flashlightPowerMah; - public double gpsPowerMah; - public double mobileRadioPowerMah; - public double sensorPowerMah; - public double videoPowerMah; - public double wakeLockPowerMah; - public double wifiPowerMah; - public double systemServiceCpuPowerMah; - public double[] customMeasuredPowerMah; - - // Power that is re-attributed to other sippers. For example, for System Server - // this represents the power attributed to apps requesting system services. - // The value should be negative or zero. - public double powerReattributedToOtherSippersMah; - - // Do not include this sipper in results because it is included - // in an aggregate sipper. - public boolean isAggregated; - - // **************** - // This list must be kept current with atoms.proto (frameworks/base/cmds/statsd/src/atoms.proto) - // so the ordinal values (and therefore the order) must never change. - // **************** - @UnsupportedAppUsage(implicitMember = - "values()[Lcom/android/internal/os/BatterySipper$DrainType;") - public enum DrainType { - AMBIENT_DISPLAY, - @UnsupportedAppUsage - APP, - BLUETOOTH, - CAMERA, - CELL, - FLASHLIGHT, - IDLE, - MEMORY, - OVERCOUNTED, - PHONE, - SCREEN, - UNACCOUNTED, - USER, - WIFI, - } - - @UnsupportedAppUsage - public BatterySipper(DrainType drainType, Uid uid, double value) { - this.totalPowerMah = value; - this.drainType = drainType; - uidObj = uid; - } - - public void computeMobilemspp() { - long packets = mobileRxPackets + mobileTxPackets; - mobilemspp = packets > 0 ? (mobileActive / (double) packets) : 0; - } - - @Override - public int compareTo(BatterySipper other) { - // Over-counted always goes to the bottom. - if (drainType != other.drainType) { - if (drainType == DrainType.OVERCOUNTED) { - // This is "larger" - return 1; - } else if (other.drainType == DrainType.OVERCOUNTED) { - return -1; - } - } - // Return the flipped value because we want the items in descending order - return Double.compare(other.totalPowerMah, totalPowerMah); - } - - /** - * Gets a list of packages associated with the current user - */ - @UnsupportedAppUsage - public String[] getPackages() { - return mPackages; - } - - @UnsupportedAppUsage - public int getUid() { - // Bail out if the current sipper is not an App sipper. - if (uidObj == null) { - return 0; - } - return uidObj.getUid(); - } - - /** - * Add stats from other to this BatterySipper. - */ - @UnsupportedAppUsage - public void add(BatterySipper other) { - totalPowerMah += other.totalPowerMah; - usageTimeMs += other.usageTimeMs; - usagePowerMah += other.usagePowerMah; - audioTimeMs += other.audioTimeMs; - cpuTimeMs += other.cpuTimeMs; - gpsTimeMs += other.gpsTimeMs; - wifiRunningTimeMs += other.wifiRunningTimeMs; - cpuFgTimeMs += other.cpuFgTimeMs; - videoTimeMs += other.videoTimeMs; - wakeLockTimeMs += other.wakeLockTimeMs; - cameraTimeMs += other.cameraTimeMs; - flashlightTimeMs += other.flashlightTimeMs; - bluetoothRunningTimeMs += other.bluetoothRunningTimeMs; - mobileRxPackets += other.mobileRxPackets; - mobileTxPackets += other.mobileTxPackets; - mobileActive += other.mobileActive; - mobileActiveCount += other.mobileActiveCount; - wifiRxPackets += other.wifiRxPackets; - wifiTxPackets += other.wifiTxPackets; - mobileRxBytes += other.mobileRxBytes; - mobileTxBytes += other.mobileTxBytes; - wifiRxBytes += other.wifiRxBytes; - wifiTxBytes += other.wifiTxBytes; - btRxBytes += other.btRxBytes; - btTxBytes += other.btTxBytes; - audioPowerMah += other.audioPowerMah; - wifiPowerMah += other.wifiPowerMah; - gpsPowerMah += other.gpsPowerMah; - cpuPowerMah += other.cpuPowerMah; - sensorPowerMah += other.sensorPowerMah; - mobileRadioPowerMah += other.mobileRadioPowerMah; - wakeLockPowerMah += other.wakeLockPowerMah; - cameraPowerMah += other.cameraPowerMah; - flashlightPowerMah += other.flashlightPowerMah; - bluetoothPowerMah += other.bluetoothPowerMah; - screenPowerMah += other.screenPowerMah; - videoPowerMah += other.videoPowerMah; - proportionalSmearMah += other.proportionalSmearMah; - totalSmearedPowerMah += other.totalSmearedPowerMah; - systemServiceCpuPowerMah += other.systemServiceCpuPowerMah; - if (other.customMeasuredPowerMah != null) { - if (customMeasuredPowerMah == null) { - customMeasuredPowerMah = new double[other.customMeasuredPowerMah.length]; - } - if (customMeasuredPowerMah.length == other.customMeasuredPowerMah.length) { - // This should always be true. - for (int idx = 0; idx < other.customMeasuredPowerMah.length; idx++) { - customMeasuredPowerMah[idx] += other.customMeasuredPowerMah[idx]; - } - } - } - powerReattributedToOtherSippersMah += other.powerReattributedToOtherSippersMah; - } - - /** - * Sum all the powers and store the value into `value`. - * Also sum the {@code smearedTotalPowerMah} by adding smeared powerMah. - * - * @return the sum of all the power in this BatterySipper. - */ - public double sumPower() { - totalPowerMah = usagePowerMah + wifiPowerMah + gpsPowerMah + cpuPowerMah + - sensorPowerMah + mobileRadioPowerMah + wakeLockPowerMah + cameraPowerMah + - flashlightPowerMah + bluetoothPowerMah + audioPowerMah + videoPowerMah - + systemServiceCpuPowerMah; - if (customMeasuredPowerMah != null) { - for (int idx = 0; idx < customMeasuredPowerMah.length; idx++) { - totalPowerMah += customMeasuredPowerMah[idx]; - } - } - - // powerAttributedToOtherSippersMah is negative or zero - totalPowerMah = totalPowerMah + powerReattributedToOtherSippersMah; - - totalSmearedPowerMah = totalPowerMah + screenPowerMah + proportionalSmearMah; - - return totalPowerMah; - } -} diff --git a/core/java/com/android/internal/os/BatteryStatsHelper.java b/core/java/com/android/internal/os/BatteryStatsHelper.java deleted file mode 100644 index 7fb1d6cea6e5..000000000000 --- a/core/java/com/android/internal/os/BatteryStatsHelper.java +++ /dev/null @@ -1,703 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.os; - -import android.compat.annotation.UnsupportedAppUsage; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.PackageManager; -import android.content.res.Resources; -import android.hardware.SensorManager; -import android.os.BatteryStats; -import android.os.BatteryStats.Uid; -import android.os.Build; -import android.os.Bundle; -import android.os.MemoryFile; -import android.os.Parcel; -import android.os.ParcelFileDescriptor; -import android.os.Process; -import android.os.RemoteException; -import android.os.SELinux; -import android.os.ServiceManager; -import android.os.SystemClock; -import android.os.UserHandle; -import android.telephony.TelephonyManager; -import android.util.ArrayMap; -import android.util.Log; -import android.util.SparseArray; - -import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.app.IBatteryStats; -import com.android.internal.os.BatterySipper.DrainType; -import com.android.internal.util.ArrayUtils; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * A helper class for retrieving the power usage information for all applications and services. - * - * The caller must initialize this class as soon as activity object is ready to use (for example, in - * onAttach() for Fragment), call create() in onCreate() and call destroy() in onDestroy(). - * - * @deprecated Please use BatteryStatsManager.getBatteryUsageStats instead. - */ -@Deprecated -public class BatteryStatsHelper { - private static final boolean DEBUG = false; - - private static final String TAG = BatteryStatsHelper.class.getSimpleName(); - - private static BatteryStats sStatsXfer; - private static Intent sBatteryBroadcastXfer; - private static ArrayMap<File, BatteryStats> sFileXfer = new ArrayMap<>(); - - final private Context mContext; - final private boolean mCollectBatteryBroadcast; - final private boolean mWifiOnly; - - private List<PowerCalculator> mPowerCalculators; - - @UnsupportedAppUsage - private IBatteryStats mBatteryInfo; - private BatteryStats mStats; - private Intent mBatteryBroadcast; - @UnsupportedAppUsage - private PowerProfile mPowerProfile; - - private String[] mSystemPackageArray; - private String[] mServicepackageArray; - private PackageManager mPackageManager; - - /** - * List of apps using power. - */ - @UnsupportedAppUsage - private final List<BatterySipper> mUsageList = new ArrayList<>(); - - private final List<BatterySipper> mMobilemsppList = new ArrayList<>(); - - private int mStatsType = BatteryStats.STATS_SINCE_CHARGED; - - long mRawRealtimeUs; - long mRawUptimeUs; - long mBatteryRealtimeUs; - long mBatteryUptimeUs; - long mBatteryTimeRemainingUs; - long mChargeTimeRemainingUs; - - private long mStatsPeriod = 0; - - // The largest entry by power. - private double mMaxPower = 1; - - // The largest real entry by power (not undercounted or overcounted). - private double mMaxRealPower = 1; - - // Total computed power. - private double mComputedPower; - private double mTotalPower; - private double mMinDrainedPower; - private double mMaxDrainedPower; - - public static boolean checkWifiOnly(Context context) { - final TelephonyManager tm = context.getSystemService(TelephonyManager.class); - if (tm == null) { - return false; - } - return !tm.isDataCapable(); - } - - @UnsupportedAppUsage - public BatteryStatsHelper(Context context) { - this(context, true); - } - - @UnsupportedAppUsage - public BatteryStatsHelper(Context context, boolean collectBatteryBroadcast) { - this(context, collectBatteryBroadcast, checkWifiOnly(context)); - } - - @UnsupportedAppUsage - public BatteryStatsHelper(Context context, boolean collectBatteryBroadcast, boolean wifiOnly) { - mContext = context; - mCollectBatteryBroadcast = collectBatteryBroadcast; - mWifiOnly = wifiOnly; - mPackageManager = context.getPackageManager(); - - final Resources resources = context.getResources(); - mSystemPackageArray = resources.getStringArray( - com.android.internal.R.array.config_batteryPackageTypeSystem); - mServicepackageArray = resources.getStringArray( - com.android.internal.R.array.config_batteryPackageTypeService); - } - - public void storeStatsHistoryInFile(String fname) { - synchronized (sFileXfer) { - File path = makeFilePath(mContext, fname); - sFileXfer.put(path, this.getStats()); - FileOutputStream fout = null; - try { - fout = new FileOutputStream(path); - Parcel hist = Parcel.obtain(); - getStats().writeToParcelWithoutUids(hist, 0); - byte[] histData = hist.marshall(); - fout.write(histData); - } catch (IOException e) { - Log.w(TAG, "Unable to write history to file", e); - } finally { - if (fout != null) { - try { - fout.close(); - } catch (IOException e) { - } - } - } - } - } - - public static BatteryStats statsFromFile(Context context, String fname) { - synchronized (sFileXfer) { - File path = makeFilePath(context, fname); - BatteryStats stats = sFileXfer.get(path); - if (stats != null) { - return stats; - } - FileInputStream fin = null; - try { - fin = new FileInputStream(path); - byte[] data = readFully(fin); - Parcel parcel = Parcel.obtain(); - parcel.unmarshall(data, 0, data.length); - parcel.setDataPosition(0); - return com.android.internal.os.BatteryStatsImpl.CREATOR.createFromParcel(parcel); - } catch (IOException e) { - Log.w(TAG, "Unable to read history to file", e); - } finally { - if (fin != null) { - try { - fin.close(); - } catch (IOException e) { - } - } - } - } - return getStats(IBatteryStats.Stub.asInterface( - ServiceManager.getService(BatteryStats.SERVICE_NAME)), true); - } - - @UnsupportedAppUsage - public static void dropFile(Context context, String fname) { - makeFilePath(context, fname).delete(); - } - - private static File makeFilePath(Context context, String fname) { - return new File(context.getFilesDir(), fname); - } - - /** Clears the current stats and forces recreating for future use. */ - @UnsupportedAppUsage - public void clearStats() { - mStats = null; - } - - @UnsupportedAppUsage - public BatteryStats getStats() { - return getStats(true /* updateAll */); - } - - /** Retrieves stats from BatteryService, optionally getting updated numbers */ - public BatteryStats getStats(boolean updateAll) { - if (mStats == null) { - load(updateAll); - } - return mStats; - } - - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) - public Intent getBatteryBroadcast() { - if (mBatteryBroadcast == null && mCollectBatteryBroadcast) { - load(); - } - return mBatteryBroadcast; - } - - public PowerProfile getPowerProfile() { - return mPowerProfile; - } - - public void create(BatteryStats stats) { - mPowerProfile = new PowerProfile(mContext); - mStats = stats; - } - - @UnsupportedAppUsage - public void create(Bundle icicle) { - if (icicle != null) { - mStats = sStatsXfer; - mBatteryBroadcast = sBatteryBroadcastXfer; - } - mBatteryInfo = IBatteryStats.Stub.asInterface( - ServiceManager.getService(BatteryStats.SERVICE_NAME)); - mPowerProfile = new PowerProfile(mContext); - } - - @UnsupportedAppUsage - public void storeState() { - sStatsXfer = mStats; - sBatteryBroadcastXfer = mBatteryBroadcast; - } - - /** - * Refreshes the power usage list. - */ - @UnsupportedAppUsage - public void refreshStats(int statsType, int asUser) { - SparseArray<UserHandle> users = new SparseArray<>(1); - users.put(asUser, new UserHandle(asUser)); - refreshStats(statsType, users); - } - - /** - * Refreshes the power usage list. - */ - @UnsupportedAppUsage - public void refreshStats(int statsType, List<UserHandle> asUsers) { - final int n = asUsers.size(); - SparseArray<UserHandle> users = new SparseArray<>(n); - for (int i = 0; i < n; ++i) { - UserHandle userHandle = asUsers.get(i); - users.put(userHandle.getIdentifier(), userHandle); - } - refreshStats(statsType, users); - } - - /** - * Refreshes the power usage list. - */ - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) - public void refreshStats(int statsType, SparseArray<UserHandle> asUsers) { - refreshStats(statsType, asUsers, SystemClock.elapsedRealtime() * 1000, - SystemClock.uptimeMillis() * 1000); - } - - public void refreshStats(int statsType, SparseArray<UserHandle> asUsers, long rawRealtimeUs, - long rawUptimeUs) { - if (statsType != BatteryStats.STATS_SINCE_CHARGED) { - Log.w(TAG, "refreshStats called for statsType " + statsType + " but only " - + "STATS_SINCE_CHARGED is supported. Using STATS_SINCE_CHARGED instead."); - } - - // Initialize mStats if necessary. - getStats(); - - mMaxPower = 0; - mMaxRealPower = 0; - mComputedPower = 0; - mTotalPower = 0; - - mUsageList.clear(); - mMobilemsppList.clear(); - - if (mStats == null) { - return; - } - - if (mPowerCalculators == null) { - mPowerCalculators = new ArrayList<>(); - - // Power calculators are applied in the order of registration - mPowerCalculators.add(new CpuPowerCalculator(mPowerProfile)); - mPowerCalculators.add(new MemoryPowerCalculator(mPowerProfile)); - mPowerCalculators.add(new WakelockPowerCalculator(mPowerProfile)); - if (!mWifiOnly) { - mPowerCalculators.add(new MobileRadioPowerCalculator(mPowerProfile)); - } - mPowerCalculators.add(new WifiPowerCalculator(mPowerProfile)); - mPowerCalculators.add(new BluetoothPowerCalculator(mPowerProfile)); - mPowerCalculators.add(new SensorPowerCalculator( - mContext.getSystemService(SensorManager.class))); - mPowerCalculators.add(new GnssPowerCalculator(mPowerProfile)); - mPowerCalculators.add(new CameraPowerCalculator(mPowerProfile)); - mPowerCalculators.add(new FlashlightPowerCalculator(mPowerProfile)); - mPowerCalculators.add(new MediaPowerCalculator(mPowerProfile)); - mPowerCalculators.add(new PhonePowerCalculator(mPowerProfile)); - mPowerCalculators.add(new ScreenPowerCalculator(mPowerProfile)); - mPowerCalculators.add(new AmbientDisplayPowerCalculator(mPowerProfile)); - mPowerCalculators.add(new SystemServicePowerCalculator(mPowerProfile)); - mPowerCalculators.add(new IdlePowerCalculator(mPowerProfile)); - mPowerCalculators.add(new CustomMeasuredPowerCalculator(mPowerProfile)); - - mPowerCalculators.add(new UserPowerCalculator()); - } - - for (int i = 0, size = mPowerCalculators.size(); i < size; i++) { - mPowerCalculators.get(i).reset(); - } - - mStatsType = statsType; - mRawUptimeUs = rawUptimeUs; - mRawRealtimeUs = rawRealtimeUs; - mBatteryUptimeUs = mStats.getBatteryUptime(rawUptimeUs); - mBatteryRealtimeUs = mStats.getBatteryRealtime(rawRealtimeUs); - mBatteryTimeRemainingUs = mStats.computeBatteryTimeRemaining(rawRealtimeUs); - mChargeTimeRemainingUs = mStats.computeChargeTimeRemaining(rawRealtimeUs); - mStatsPeriod = mStats.computeBatteryRealtime(rawRealtimeUs, mStatsType); - - if (DEBUG) { - Log.d(TAG, "Raw time: realtime=" + (rawRealtimeUs / 1000) + " uptime=" - + (rawUptimeUs / 1000)); - Log.d(TAG, "Battery time: realtime=" + (mBatteryRealtimeUs / 1000) + " uptime=" - + (mBatteryUptimeUs / 1000)); - Log.d(TAG, "Battery type time: realtime=" + (mStatsPeriod / 1000) + " uptime=" - + (mStats.computeBatteryUptime(rawRealtimeUs, mStatsType) / 1000)); - } - mMinDrainedPower = (mStats.getLowDischargeAmountSinceCharge() - * mPowerProfile.getBatteryCapacity()) / 100; - mMaxDrainedPower = (mStats.getHighDischargeAmountSinceCharge() - * mPowerProfile.getBatteryCapacity()) / 100; - - // Create list of (almost all) sippers, calculate their usage, and put them in mUsageList. - processAppUsage(asUsers); - - Collections.sort(mUsageList); - - Collections.sort(mMobilemsppList, - (lhs, rhs) -> Double.compare(rhs.mobilemspp, lhs.mobilemspp)); - - // At this point, we've sorted the list so we are guaranteed the max values are at the top. - // We have only added real powers so far. - if (!mUsageList.isEmpty()) { - mMaxRealPower = mMaxPower = mUsageList.get(0).totalPowerMah; - final int usageListCount = mUsageList.size(); - for (int i = 0; i < usageListCount; i++) { - mComputedPower += mUsageList.get(i).totalPowerMah; - } - } - - if (DEBUG) { - Log.d(TAG, "Accuracy: total computed=" + BatteryStats.formatCharge(mComputedPower) - + ", min discharge=" + BatteryStats.formatCharge(mMinDrainedPower) - + ", max discharge=" + BatteryStats.formatCharge(mMaxDrainedPower)); - } - - mTotalPower = mComputedPower; - if (mStats.getLowDischargeAmountSinceCharge() > 1) { - if (mMinDrainedPower > mComputedPower) { - double amount = mMinDrainedPower - mComputedPower; - mTotalPower = mMinDrainedPower; - BatterySipper bs = new BatterySipper(DrainType.UNACCOUNTED, null, amount); - - // Insert the BatterySipper in its sorted position. - int index = Collections.binarySearch(mUsageList, bs); - if (index < 0) { - index = -(index + 1); - } - mUsageList.add(index, bs); - mMaxPower = Math.max(mMaxPower, amount); - } else if (mMaxDrainedPower < mComputedPower) { - double amount = mComputedPower - mMaxDrainedPower; - - // Insert the BatterySipper in its sorted position. - BatterySipper bs = new BatterySipper(DrainType.OVERCOUNTED, null, amount); - int index = Collections.binarySearch(mUsageList, bs); - if (index < 0) { - index = -(index + 1); - } - mUsageList.add(index, bs); - mMaxPower = Math.max(mMaxPower, amount); - } - } - - // Smear it! - final double hiddenPowerMah = removeHiddenBatterySippers(mUsageList); - final double totalRemainingPower = getTotalPower() - hiddenPowerMah; - if (Math.abs(totalRemainingPower) > 1e-3) { - for (int i = 0, size = mUsageList.size(); i < size; i++) { - final BatterySipper sipper = mUsageList.get(i); - if (!sipper.shouldHide) { - sipper.proportionalSmearMah = hiddenPowerMah - * ((sipper.totalPowerMah + sipper.screenPowerMah) - / totalRemainingPower); - sipper.sumPower(); - } - } - } - } - - private void processAppUsage(SparseArray<UserHandle> asUsers) { - final SparseArray<? extends Uid> uidStats = mStats.getUidStats(); - - final ArrayList<BatterySipper> sippers = new ArrayList<>(uidStats.size()); - - for (int iu = 0, size = uidStats.size(); iu < size; iu++) { - final Uid u = uidStats.valueAt(iu); - sippers.add(new BatterySipper(DrainType.APP, u, 0)); - } - - for (int i = 0, size = mPowerCalculators.size(); i < size; i++) { - final PowerCalculator calculator = mPowerCalculators.get(i); - calculator.calculate(sippers, mStats, mRawRealtimeUs, mRawUptimeUs, mStatsType, - asUsers); - } - - for (int i = sippers.size() - 1; i >= 0; i--) { - final BatterySipper sipper = sippers.get(i); - final double totalPower = sipper.sumPower(); - if (DEBUG && totalPower != 0) { - Log.d(TAG, String.format("UID %d: total power=%s", sipper.getUid(), - BatteryStats.formatCharge(totalPower))); - } - - // Add the sipper to the list if it is consuming power. - if (totalPower != 0 || sipper.getUid() == 0) { - if (sipper.drainType == DrainType.APP) { - sipper.computeMobilemspp(); - if (sipper.mobilemspp != 0) { - mMobilemsppList.add(sipper); - } - } - - if (!sipper.isAggregated) { - mUsageList.add(sipper); - } - } - } - } - - @UnsupportedAppUsage - public List<BatterySipper> getUsageList() { - return mUsageList; - } - - public List<BatterySipper> getMobilemsppList() { - return mMobilemsppList; - } - - public long getStatsPeriod() { - return mStatsPeriod; - } - - public int getStatsType() { - return mStatsType; - } - - @UnsupportedAppUsage - public double getMaxPower() { - return mMaxPower; - } - - public double getMaxRealPower() { - return mMaxRealPower; - } - - @UnsupportedAppUsage - public double getTotalPower() { - return mTotalPower; - } - - public double getComputedPower() { - return mComputedPower; - } - - public double getMinDrainedPower() { - return mMinDrainedPower; - } - - public double getMaxDrainedPower() { - return mMaxDrainedPower; - } - - public static byte[] readFully(FileInputStream stream) throws java.io.IOException { - return readFully(stream, stream.available()); - } - - public static byte[] readFully(FileInputStream stream, int avail) throws java.io.IOException { - int pos = 0; - byte[] data = new byte[avail]; - while (true) { - int amt = stream.read(data, pos, data.length - pos); - //Log.i("foo", "Read " + amt + " bytes at " + pos - // + " of avail " + data.length); - if (amt <= 0) { - //Log.i("foo", "**** FINISHED READING: pos=" + pos - // + " len=" + data.length); - return data; - } - pos += amt; - avail = stream.available(); - if (avail > data.length - pos) { - byte[] newData = new byte[pos + avail]; - System.arraycopy(data, 0, newData, 0, pos); - data = newData; - } - } - } - - /** - * Mark the {@link BatterySipper} that we should hide. - * - * @param sippers sipper list that need to check and remove - * @return the total power of the hidden items of {@link BatterySipper} - * for proportional smearing - */ - public double removeHiddenBatterySippers(List<BatterySipper> sippers) { - double proportionalSmearPowerMah = 0; - for (int i = sippers.size() - 1; i >= 0; i--) { - final BatterySipper sipper = sippers.get(i); - sipper.shouldHide = shouldHideSipper(sipper); - if (sipper.shouldHide) { - if (sipper.drainType != DrainType.OVERCOUNTED - && sipper.drainType != DrainType.SCREEN - && sipper.drainType != DrainType.AMBIENT_DISPLAY - && sipper.drainType != DrainType.UNACCOUNTED - && sipper.drainType != DrainType.BLUETOOTH - && sipper.drainType != DrainType.WIFI - && sipper.drainType != DrainType.IDLE) { - // Don't add it if it is overcounted, unaccounted or screen - proportionalSmearPowerMah += sipper.totalPowerMah; - } - } - } - return proportionalSmearPowerMah; - } - - /** - * Check whether we should hide the battery sipper. - */ - public boolean shouldHideSipper(BatterySipper sipper) { - final DrainType drainType = sipper.drainType; - - return drainType == DrainType.IDLE - || drainType == DrainType.CELL - || drainType == DrainType.SCREEN - || drainType == DrainType.AMBIENT_DISPLAY - || drainType == DrainType.UNACCOUNTED - || drainType == DrainType.OVERCOUNTED - || isTypeService(sipper) - || isTypeSystem(sipper); - } - - /** - * Check whether {@code sipper} is type service - */ - public boolean isTypeService(BatterySipper sipper) { - final String[] packages = mPackageManager.getPackagesForUid(sipper.getUid()); - if (packages == null) { - return false; - } - - for (String packageName : packages) { - if (ArrayUtils.contains(mServicepackageArray, packageName)) { - return true; - } - } - - return false; - } - - /** - * Check whether {@code sipper} is type system - */ - public boolean isTypeSystem(BatterySipper sipper) { - final int uid = sipper.uidObj == null ? -1 : sipper.getUid(); - sipper.mPackages = mPackageManager.getPackagesForUid(uid); - // Classify all the sippers to type system if the range of uid is 0...FIRST_APPLICATION_UID - if (uid >= Process.ROOT_UID && uid < Process.FIRST_APPLICATION_UID) { - return true; - } else if (sipper.mPackages != null) { - for (final String packageName : sipper.mPackages) { - if (ArrayUtils.contains(mSystemPackageArray, packageName)) { - return true; - } - } - } - - return false; - } - - public long convertUsToMs(long timeUs) { - return timeUs / 1000; - } - - public long convertMsToUs(long timeMs) { - return timeMs * 1000; - } - - @VisibleForTesting - public void setPackageManager(PackageManager packageManager) { - mPackageManager = packageManager; - } - - @VisibleForTesting - public void setSystemPackageArray(String[] array) { - mSystemPackageArray = array; - } - - @VisibleForTesting - public void setServicePackageArray(String[] array) { - mServicepackageArray = array; - } - - @UnsupportedAppUsage - private void load() { - load(true); - } - - private void load(boolean updateAll) { - if (mBatteryInfo == null) { - return; - } - mStats = getStats(mBatteryInfo, updateAll); - if (mCollectBatteryBroadcast) { - mBatteryBroadcast = mContext.registerReceiver(null, - new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); - } - } - - private static BatteryStatsImpl getStats(IBatteryStats service, boolean updateAll) { - try { - ParcelFileDescriptor pfd = service.getStatisticsStream(updateAll); - if (pfd != null) { - if (false) { - Log.d(TAG, "selinux context: " - + SELinux.getFileContext(pfd.getFileDescriptor())); - } - try (FileInputStream fis = new ParcelFileDescriptor.AutoCloseInputStream(pfd)) { - byte[] data = readFully(fis, MemoryFile.getSize(pfd.getFileDescriptor())); - Parcel parcel = Parcel.obtain(); - parcel.unmarshall(data, 0, data.length); - parcel.setDataPosition(0); - BatteryStatsImpl stats = com.android.internal.os.BatteryStatsImpl.CREATOR - .createFromParcel(parcel); - return stats; - } catch (IOException e) { - Log.w(TAG, "Unable to read statistics stream", e); - } - } - } catch (RemoteException e) { - Log.w(TAG, "RemoteException:", e); - } - return new BatteryStatsImpl(); - } -} diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 5ba45c9b8bc3..70b96392b0e5 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -9211,7 +9211,7 @@ public class BatteryStatsImpl extends BatteryStats { * Gets the minimum of the uid's foreground activity time and its PROCESS_STATE_TOP time * since last marked. Also sets the mark time for both these timers. * - * @see BatteryStatsHelper#getProcessForegroundTimeMs + * @see CpuPowerCalculator * * @param doCalc if true, then calculate the minimum; else don't bother and return 0. Either * way, the mark is set. diff --git a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java index e4d5fb7a3ede..a1c1917fd83e 100644 --- a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java +++ b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java @@ -73,7 +73,7 @@ public class BatteryUsageStatsProvider { mPowerCalculators.add(new CpuPowerCalculator(mPowerProfile)); mPowerCalculators.add(new MemoryPowerCalculator(mPowerProfile)); mPowerCalculators.add(new WakelockPowerCalculator(mPowerProfile)); - if (!BatteryStatsHelper.checkWifiOnly(mContext)) { + if (!BatteryStats.checkWifiOnly(mContext)) { mPowerCalculators.add(new MobileRadioPowerCalculator(mPowerProfile)); } mPowerCalculators.add(new WifiPowerCalculator(mPowerProfile)); diff --git a/core/java/com/android/internal/os/BluetoothPowerCalculator.java b/core/java/com/android/internal/os/BluetoothPowerCalculator.java index e0eeb8990710..2ebf689e2c7f 100644 --- a/core/java/com/android/internal/os/BluetoothPowerCalculator.java +++ b/core/java/com/android/internal/os/BluetoothPowerCalculator.java @@ -21,14 +21,11 @@ import android.os.BatteryStats; import android.os.BatteryStats.ControllerActivityCounter; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; -import android.os.Process; import android.os.UidBatteryConsumer; -import android.os.UserHandle; import android.util.Log; import android.util.SparseArray; import java.util.Arrays; -import java.util.List; public class BluetoothPowerCalculator extends PowerCalculator { private static final String TAG = "BluetoothPowerCalc"; @@ -159,73 +156,6 @@ public class BluetoothPowerCalculator extends PowerCalculator { } } - @Override - public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, - long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { - if (!mHasBluetoothPowerController || !batteryStats.hasBluetoothActivityReporting()) { - return; - } - - PowerAndDuration powerAndDuration = new PowerAndDuration(); - - for (int i = sippers.size() - 1; i >= 0; i--) { - final BatterySipper app = sippers.get(i); - if (app.drainType == BatterySipper.DrainType.APP) { - calculateApp(app, app.uidObj, statsType, powerAndDuration); - } - } - - BatterySipper bs = new BatterySipper(BatterySipper.DrainType.BLUETOOTH, null, 0); - final long measuredChargeUC = batteryStats.getBluetoothMeasuredBatteryConsumptionUC(); - final int powerModel = getPowerModel(measuredChargeUC); - final ControllerActivityCounter activityCounter = - batteryStats.getBluetoothControllerActivity(); - calculatePowerAndDuration(null, powerModel, measuredChargeUC, activityCounter, false, - powerAndDuration); - - // Subtract what the apps used, but clamp to 0. - final double powerMah = Math.max(0, - powerAndDuration.powerMah - powerAndDuration.totalPowerMah); - final long durationMs = Math.max(0, - powerAndDuration.durationMs - powerAndDuration.totalDurationMs); - if (DEBUG && powerMah != 0) { - Log.d(TAG, "Bluetooth active: time=" + (durationMs) - + " power=" + BatteryStats.formatCharge(powerMah)); - } - - bs.bluetoothPowerMah = powerMah; - bs.bluetoothRunningTimeMs = durationMs; - - for (int i = sippers.size() - 1; i >= 0; i--) { - BatterySipper app = sippers.get(i); - if (app.getUid() == Process.BLUETOOTH_UID) { - if (DEBUG) Log.d(TAG, "Bluetooth adding sipper " + app + ": cpu=" + app.cpuTimeMs); - app.isAggregated = true; - bs.add(app); - } - } - if (bs.sumPower() > 0) { - sippers.add(bs); - } - } - - private void calculateApp(BatterySipper app, BatteryStats.Uid u, int statsType, - PowerAndDuration powerAndDuration) { - final long measuredChargeUC = u.getBluetoothMeasuredBatteryConsumptionUC(); - final int powerModel = getPowerModel(measuredChargeUC); - final ControllerActivityCounter activityCounter = u.getBluetoothControllerActivity(); - calculatePowerAndDuration(u, powerModel, measuredChargeUC, activityCounter, - false, powerAndDuration); - - app.bluetoothRunningTimeMs = powerAndDuration.durationMs; - app.bluetoothPowerMah = powerAndDuration.powerMah; - app.btRxBytes = u.getNetworkActivityBytes(BatteryStats.NETWORK_BT_RX_DATA, statsType); - app.btTxBytes = u.getNetworkActivityBytes(BatteryStats.NETWORK_BT_TX_DATA, statsType); - - powerAndDuration.totalDurationMs += powerAndDuration.durationMs; - powerAndDuration.totalPowerMah += powerAndDuration.powerMah; - } - /** Returns bluetooth power usage based on the best data available. */ private void calculatePowerAndDuration(@Nullable BatteryStats.Uid uid, @BatteryConsumer.PowerModel int powerModel, diff --git a/core/java/com/android/internal/os/CameraPowerCalculator.java b/core/java/com/android/internal/os/CameraPowerCalculator.java index 7bccab5fc665..d0749e02abdd 100644 --- a/core/java/com/android/internal/os/CameraPowerCalculator.java +++ b/core/java/com/android/internal/os/CameraPowerCalculator.java @@ -69,14 +69,4 @@ public class CameraPowerCalculator extends PowerCalculator { app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_CAMERA, durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_CAMERA, powerMah); } - - @Override - protected void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs, - long rawUptimeUs, int statsType) { - final long durationMs = mPowerEstimator.calculateDuration(u.getCameraTurnedOnTimer(), - rawRealtimeUs, statsType); - final double powerMah = mPowerEstimator.calculatePower(durationMs); - app.cameraTimeMs = durationMs; - app.cameraPowerMah = powerMah; - } } diff --git a/core/java/com/android/internal/os/CpuPowerCalculator.java b/core/java/com/android/internal/os/CpuPowerCalculator.java index db229c082b40..1fc2baf040b6 100644 --- a/core/java/com/android/internal/os/CpuPowerCalculator.java +++ b/core/java/com/android/internal/os/CpuPowerCalculator.java @@ -20,13 +20,11 @@ import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; import android.os.UidBatteryConsumer; -import android.os.UserHandle; import android.util.ArrayMap; import android.util.Log; import android.util.SparseArray; import java.util.Arrays; -import java.util.List; public class CpuPowerCalculator extends PowerCalculator { private static final String TAG = "CpuPowerCalculator"; @@ -217,29 +215,6 @@ public class CpuPowerCalculator extends PowerCalculator { } } - @Override - public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, - long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { - Result result = new Result(); - for (int i = sippers.size() - 1; i >= 0; i--) { - final BatterySipper app = sippers.get(i); - if (app.drainType == BatterySipper.DrainType.APP) { - calculateApp(app, app.uidObj, statsType, result); - } - } - } - - private void calculateApp(BatterySipper app, BatteryStats.Uid u, int statsType, Result result) { - final long consumptionUC = u.getCpuMeasuredBatteryConsumptionUC(); - final int powerModel = getPowerModel(consumptionUC); - calculatePowerAndDuration(u, powerModel, consumptionUC, statsType, result); - - app.cpuPowerMah = result.powerMah; - app.cpuTimeMs = result.durationMs; - app.cpuFgTimeMs = result.durationFgMs; - app.packageWithHighestDrain = result.packageWithHighestDrain; - } - private void calculatePowerAndDuration(BatteryStats.Uid u, @BatteryConsumer.PowerModel int powerModel, long consumptionUC, int statsType, Result result) { diff --git a/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java b/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java index 4cb7ef114094..cbbb52621111 100644 --- a/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java +++ b/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java @@ -102,16 +102,6 @@ public class CustomMeasuredPowerCalculator extends PowerCalculator { return newTotalPowerMah; } - @Override - protected void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs, - long rawUptimeUs, int statsType) { - updateCustomMeasuredPowerMah(app, u.getCustomConsumerMeasuredBatteryConsumptionUC()); - } - - private void updateCustomMeasuredPowerMah(BatterySipper sipper, long[] measuredChargeUC) { - sipper.customMeasuredPowerMah = calculateMeasuredEnergiesMah(measuredChargeUC); - } - private double[] calculateMeasuredEnergiesMah(long[] measuredChargeUC) { if (measuredChargeUC == null) { return null; diff --git a/core/java/com/android/internal/os/FlashlightPowerCalculator.java b/core/java/com/android/internal/os/FlashlightPowerCalculator.java index 7d3f9625aa4e..ce3e7b9c7484 100644 --- a/core/java/com/android/internal/os/FlashlightPowerCalculator.java +++ b/core/java/com/android/internal/os/FlashlightPowerCalculator.java @@ -66,14 +66,4 @@ public class FlashlightPowerCalculator extends PowerCalculator { app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, powerMah); } - - @Override - protected void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs, - long rawUptimeUs, int statsType) { - final long durationMs = mPowerEstimator.calculateDuration(u.getFlashlightTurnedOnTimer(), - rawRealtimeUs, statsType); - final double powerMah = mPowerEstimator.calculatePower(durationMs); - app.flashlightTimeMs = durationMs; - app.flashlightPowerMah = powerMah; - } } diff --git a/core/java/com/android/internal/os/GnssPowerCalculator.java b/core/java/com/android/internal/os/GnssPowerCalculator.java index a836ddb444f4..0f783062f3e7 100644 --- a/core/java/com/android/internal/os/GnssPowerCalculator.java +++ b/core/java/com/android/internal/os/GnssPowerCalculator.java @@ -21,11 +21,8 @@ import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; import android.os.UidBatteryConsumer; -import android.os.UserHandle; import android.util.SparseArray; -import java.util.List; - /** * Estimates the amount of power consumed by the GNSS (e.g. GPS). */ @@ -100,41 +97,6 @@ public class GnssPowerCalculator extends PowerCalculator { return powerMah; } - @Override - public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, - long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { - double averageGnssPowerMa = getAverageGnssPower(batteryStats, rawRealtimeUs, statsType); - for (int i = sippers.size() - 1; i >= 0; i--) { - final BatterySipper app = sippers.get(i); - if (app.drainType == BatterySipper.DrainType.APP) { - final long consumptionUC = - app.uidObj.getGnssMeasuredBatteryConsumptionUC(); - final int powerModel = getPowerModel(consumptionUC); - calculateApp(app, app.uidObj, powerModel, rawRealtimeUs, averageGnssPowerMa, - consumptionUC); - } - } - } - - private void calculateApp(BatterySipper app, BatteryStats.Uid u, - @BatteryConsumer.PowerModel int powerModel, long rawRealtimeUs, - double averageGnssPowerMa, long measuredChargeUC) { - final long durationMs = computeDuration(u, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED); - - final double powerMah; - switch (powerModel) { - case BatteryConsumer.POWER_MODEL_MEASURED_ENERGY: - powerMah = uCtoMah(measuredChargeUC); - break; - case BatteryConsumer.POWER_MODEL_POWER_PROFILE: - default: - powerMah = computePower(durationMs, averageGnssPowerMa); - } - - app.gpsTimeMs = durationMs; - app.gpsPowerMah = powerMah; - } - private long computeDuration(BatteryStats.Uid u, long rawRealtimeUs, int statsType) { final SparseArray<? extends BatteryStats.Uid.Sensor> sensorStats = u.getSensorStats(); final BatteryStats.Uid.Sensor sensor = sensorStats.get(BatteryStats.Uid.Sensor.GPS); diff --git a/core/java/com/android/internal/os/IdlePowerCalculator.java b/core/java/com/android/internal/os/IdlePowerCalculator.java index 43be041f262a..5b2052e9edaa 100644 --- a/core/java/com/android/internal/os/IdlePowerCalculator.java +++ b/core/java/com/android/internal/os/IdlePowerCalculator.java @@ -20,11 +20,7 @@ import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; -import android.os.UserHandle; import android.util.Log; -import android.util.SparseArray; - -import java.util.List; /** * Estimates the amount of power consumed when the device is idle. @@ -64,20 +60,6 @@ public class IdlePowerCalculator extends PowerCalculator { } } - @Override - public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, - long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { - calculatePowerAndDuration(batteryStats, rawRealtimeUs, rawUptimeUs, statsType); - - if (mPowerMah != 0) { - BatterySipper bs = new BatterySipper(BatterySipper.DrainType.IDLE, null, 0); - bs.usagePowerMah = mPowerMah; - bs.usageTimeMs = mDurationMs; - bs.sumPower(); - sippers.add(bs); - } - } - /** * Calculates the baseline power usage for the device when it is in suspend and idle. * The device is drawing POWER_CPU_SUSPEND power at its lowest power state. diff --git a/core/java/com/android/internal/os/MediaPowerCalculator.java b/core/java/com/android/internal/os/MediaPowerCalculator.java deleted file mode 100644 index fff96dacf84b..000000000000 --- a/core/java/com/android/internal/os/MediaPowerCalculator.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.internal.os; - -import android.os.BatteryConsumer; -import android.os.BatteryStats; - -/** - * A {@link PowerCalculator} to calculate power consumed by audio and video hardware. - * - * Also see {@link PowerProfile#POWER_AUDIO} and {@link PowerProfile#POWER_VIDEO}. - */ -public class MediaPowerCalculator extends PowerCalculator { - private static final int MS_IN_HR = 1000 * 60 * 60; - private final double mAudioAveragePowerMa; - private final double mVideoAveragePowerMa; - - public MediaPowerCalculator(PowerProfile profile) { - mAudioAveragePowerMa = profile.getAveragePower(PowerProfile.POWER_AUDIO); - mVideoAveragePowerMa = profile.getAveragePower(PowerProfile.POWER_VIDEO); - } - - @Override - public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { - return powerComponent == BatteryConsumer.POWER_COMPONENT_VIDEO - || powerComponent == BatteryConsumer.POWER_COMPONENT_AUDIO; - } - - @Override - protected void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs, - long rawUptimeUs, int statsType) { - // Calculate audio power usage, an estimate based on the average power routed to different - // components like speaker, bluetooth, usb-c, earphone, etc. - final BatteryStats.Timer audioTimer = u.getAudioTurnedOnTimer(); - if (audioTimer == null) { - app.audioTimeMs = 0; - app.audioPowerMah = 0; - } else { - final long totalTime = audioTimer.getTotalTimeLocked(rawRealtimeUs, statsType) / 1000; - app.audioTimeMs = totalTime; - app.audioPowerMah = (totalTime * mAudioAveragePowerMa) / MS_IN_HR; - } - - // Calculate video power usage. - final BatteryStats.Timer videoTimer = u.getVideoTurnedOnTimer(); - if (videoTimer == null) { - app.videoTimeMs = 0; - app.videoPowerMah = 0; - } else { - final long totalTime = videoTimer.getTotalTimeLocked(rawRealtimeUs, statsType) / 1000; - app.videoTimeMs = totalTime; - app.videoPowerMah = (totalTime * mVideoAveragePowerMa) / MS_IN_HR; - } - } -} diff --git a/core/java/com/android/internal/os/MemoryPowerCalculator.java b/core/java/com/android/internal/os/MemoryPowerCalculator.java index 0440a588a093..0d3040cc7f92 100644 --- a/core/java/com/android/internal/os/MemoryPowerCalculator.java +++ b/core/java/com/android/internal/os/MemoryPowerCalculator.java @@ -4,11 +4,7 @@ import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; -import android.os.UserHandle; import android.util.LongSparseArray; -import android.util.SparseArray; - -import java.util.List; public class MemoryPowerCalculator extends PowerCalculator { public static final String TAG = "MemoryPowerCalculator"; @@ -41,20 +37,6 @@ public class MemoryPowerCalculator extends PowerCalculator { .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MEMORY, powerMah); } - @Override - public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, - long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { - final long durationMs = calculateDuration(batteryStats, rawRealtimeUs, statsType); - final double powerMah = calculatePower(batteryStats, rawRealtimeUs, statsType); - BatterySipper memory = new BatterySipper(BatterySipper.DrainType.MEMORY, null, 0); - memory.usageTimeMs = durationMs; - memory.usagePowerMah = powerMah; - memory.sumPower(); - if (memory.totalPowerMah > 0) { - sippers.add(memory); - } - } - private long calculateDuration(BatteryStats batteryStats, long rawRealtimeUs, int statsType) { long usageDurationMs = 0; LongSparseArray<? extends BatteryStats.Timer> timers = batteryStats.getKernelMemoryStats(); diff --git a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java index 5d0bd104267c..f4624de289be 100644 --- a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java +++ b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java @@ -20,13 +20,10 @@ import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; import android.os.UidBatteryConsumer; -import android.os.UserHandle; import android.telephony.CellSignalStrength; import android.util.Log; import android.util.SparseArray; -import java.util.List; - public class MobileRadioPowerCalculator extends PowerCalculator { private static final String TAG = "MobRadioPowerCalculator"; private static final boolean DEBUG = PowerCalculator.DEBUG; @@ -170,65 +167,6 @@ public class MobileRadioPowerCalculator extends PowerCalculator { } } - @Override - public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, - long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { - PowerAndDuration total = new PowerAndDuration(); - for (int i = sippers.size() - 1; i >= 0; i--) { - final BatterySipper app = sippers.get(i); - if (app.drainType == BatterySipper.DrainType.APP) { - final BatteryStats.Uid u = app.uidObj; - calculateApp(app, u, statsType, total); - } - } - - BatterySipper radio = new BatterySipper(BatterySipper.DrainType.CELL, null, 0); - final long consumptionUC = batteryStats.getMobileRadioMeasuredBatteryConsumptionUC(); - final int powerModel = getPowerModel(consumptionUC); - calculateRemaining(total, powerModel, batteryStats, rawRealtimeUs, consumptionUC); - if (total.remainingPowerMah != 0) { - if (total.signalDurationMs != 0) { - radio.noCoveragePercent = - total.noCoverageDurationMs * 100.0 / total.signalDurationMs; - } - radio.mobileActive = total.durationMs; - radio.mobileActiveCount = batteryStats.getMobileRadioActiveUnknownCount(statsType); - radio.mobileRadioPowerMah = total.remainingPowerMah; - radio.sumPower(); - } - if (radio.totalPowerMah > 0) { - sippers.add(radio); - } - } - - private void calculateApp(BatterySipper app, BatteryStats.Uid u, int statsType, - PowerAndDuration total) { - app.mobileActive = calculateDuration(u, statsType); - - final long consumptionUC = u.getMobileRadioMeasuredBatteryConsumptionUC(); - final int powerModel = getPowerModel(consumptionUC); - app.mobileRadioPowerMah = calculatePower(u, powerModel, app.mobileActive, consumptionUC); - total.totalAppDurationMs += app.mobileActive; - - // Add cost of mobile traffic. - app.mobileRxPackets = u.getNetworkActivityPackets(BatteryStats.NETWORK_MOBILE_RX_DATA, - statsType); - app.mobileTxPackets = u.getNetworkActivityPackets(BatteryStats.NETWORK_MOBILE_TX_DATA, - statsType); - app.mobileActiveCount = u.getMobileRadioActiveCount(statsType); - app.mobileRxBytes = u.getNetworkActivityBytes(BatteryStats.NETWORK_MOBILE_RX_DATA, - statsType); - app.mobileTxBytes = u.getNetworkActivityBytes(BatteryStats.NETWORK_MOBILE_TX_DATA, - statsType); - - if (DEBUG && app.mobileRadioPowerMah != 0) { - Log.d(TAG, "UID " + u.getUid() + ": mobile packets " - + (app.mobileRxPackets + app.mobileTxPackets) - + " active time " + app.mobileActive - + " power=" + BatteryStats.formatCharge(app.mobileRadioPowerMah)); - } - } - private long calculateDuration(BatteryStats.Uid u, int statsType) { return u.getMobileRadioActiveTime(statsType) / 1000; } diff --git a/core/java/com/android/internal/os/PhonePowerCalculator.java b/core/java/com/android/internal/os/PhonePowerCalculator.java index 73103148a945..cb893defab14 100644 --- a/core/java/com/android/internal/os/PhonePowerCalculator.java +++ b/core/java/com/android/internal/os/PhonePowerCalculator.java @@ -20,10 +20,6 @@ import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; -import android.os.UserHandle; -import android.util.SparseArray; - -import java.util.List; /** * Estimates power consumed by telephony. @@ -54,18 +50,4 @@ public class PhonePowerCalculator extends PowerCalculator { .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_PHONE, phoneOnTimeMs); } } - - @Override - public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, - long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { - final long phoneOnTimeMs = batteryStats.getPhoneOnTime(rawRealtimeUs, statsType) / 1000; - final double phoneOnPower = mPowerEstimator.calculatePower(phoneOnTimeMs); - if (phoneOnPower != 0) { - BatterySipper bs = new BatterySipper(BatterySipper.DrainType.PHONE, null, 0); - bs.usagePowerMah = phoneOnPower; - bs.usageTimeMs = phoneOnTimeMs; - bs.sumPower(); - sippers.add(bs); - } - } } diff --git a/core/java/com/android/internal/os/PowerCalculator.java b/core/java/com/android/internal/os/PowerCalculator.java index fa7acf22bd90..ec785b8ac502 100644 --- a/core/java/com/android/internal/os/PowerCalculator.java +++ b/core/java/com/android/internal/os/PowerCalculator.java @@ -21,11 +21,9 @@ import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; import android.os.UidBatteryConsumer; -import android.os.UserHandle; import android.util.SparseArray; import java.io.PrintWriter; -import java.util.List; /** * Calculates power use of a device subsystem for an app. @@ -42,34 +40,6 @@ public abstract class PowerCalculator { public abstract boolean isPowerComponentSupported( @BatteryConsumer.PowerComponent int powerComponent); - - /** - * Attributes the total amount of power used by this subsystem to various consumers such - * as apps. - * - * @param sippers A list of battery sippers that contains battery attribution data. - * The calculator may modify the list. - * @param batteryStats The recorded battery stats. - * @param rawRealtimeUs The raw system realtime in microseconds. - * @param rawUptimeUs The raw system uptime in microseconds. - * @param statsType The type of stats. As of {@link android.os.Build.VERSION_CODES#Q}, this - * can only be {@link BatteryStats#STATS_SINCE_CHARGED}, since - * {@link BatteryStats#STATS_CURRENT} and - * {@link BatteryStats#STATS_SINCE_UNPLUGGED} are deprecated. - * @param asUsers An array of users for which the attribution is requested. It may - * contain {@link UserHandle#USER_ALL} to indicate that the attribution - * should be performed for all users. - */ - public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, - long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { - for (int i = sippers.size() - 1; i >= 0; i--) { - final BatterySipper app = sippers.get(i); - if (app.drainType == BatterySipper.DrainType.APP) { - calculateApp(app, app.uidObj, rawRealtimeUs, rawUptimeUs, statsType); - } - } - } - /** * Attributes the total amount of power used by this subsystem to various consumers such * as apps. @@ -94,21 +64,6 @@ public abstract class PowerCalculator { /** * Calculate the amount of power an app used for this subsystem. - * @param app The BatterySipper that represents the power use of an app. - * @param u The recorded stats for the app. - * @param rawRealtimeUs The raw system realtime in microseconds. - * @param rawUptimeUs The raw system uptime in microseconds. - * @param statsType The type of stats. As of {@link android.os.Build.VERSION_CODES#Q}, this can - * only be {@link BatteryStats#STATS_SINCE_CHARGED}, since - * {@link BatteryStats#STATS_CURRENT} and - * {@link BatteryStats#STATS_SINCE_UNPLUGGED} are deprecated. - */ - protected void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs, - long rawUptimeUs, int statsType) { - } - - /** - * Calculate the amount of power an app used for this subsystem. * @param app The UidBatteryConsumer.Builder that represents the power use of an app. * @param u The recorded stats for the app. * @param rawRealtimeUs The raw system realtime in microseconds. diff --git a/core/java/com/android/internal/os/ScreenPowerCalculator.java b/core/java/com/android/internal/os/ScreenPowerCalculator.java index aa902d7ec781..67d3d6e7bede 100644 --- a/core/java/com/android/internal/os/ScreenPowerCalculator.java +++ b/core/java/com/android/internal/os/ScreenPowerCalculator.java @@ -24,7 +24,6 @@ import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; import android.os.UidBatteryConsumer; -import android.os.UserHandle; import android.text.format.DateUtils; import android.util.Slog; import android.util.SparseArray; @@ -32,8 +31,6 @@ import android.util.SparseLongArray; import com.android.internal.annotations.VisibleForTesting; -import java.util.List; - /** * Estimates power consumed by the screen(s) */ @@ -125,48 +122,6 @@ public class ScreenPowerCalculator extends PowerCalculator { } /** - * Screen power is the additional power the screen takes while the device is running. - */ - @Override - public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, - long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { - final PowerAndDuration totalPowerAndDuration = new PowerAndDuration(); - final long consumptionUC = batteryStats.getScreenOnMeasuredBatteryConsumptionUC(); - final int powerModel = getPowerModel(consumptionUC); - calculateTotalDurationAndPower(totalPowerAndDuration, powerModel, batteryStats, - rawRealtimeUs, statsType, consumptionUC); - if (totalPowerAndDuration.powerMah == 0) { - return; - } - - // First deal with the SCREEN BatterySipper (since we need this for smearing over apps). - final BatterySipper bs = new BatterySipper(BatterySipper.DrainType.SCREEN, null, 0); - bs.usagePowerMah = totalPowerAndDuration.powerMah; - bs.usageTimeMs = totalPowerAndDuration.durationMs; - bs.sumPower(); - sippers.add(bs); - - // Now deal with each app's BatterySipper. The results are stored in the screenPowerMah - // field, which is considered smeared, but the method depends on the data source. - switch (powerModel) { - case BatteryConsumer.POWER_MODEL_MEASURED_ENERGY: - final PowerAndDuration appPowerAndDuration = new PowerAndDuration(); - for (int i = sippers.size() - 1; i >= 0; i--) { - final BatterySipper app = sippers.get(i); - if (app.drainType == BatterySipper.DrainType.APP) { - calculateAppUsingMeasuredEnergy(appPowerAndDuration, app.uidObj, - rawRealtimeUs); - app.screenPowerMah = appPowerAndDuration.powerMah; - } - } - break; - case BatteryConsumer.POWER_MODEL_POWER_PROFILE: - default: - smearScreenBatterySipper(sippers, bs, rawRealtimeUs); - } - } - - /** * Stores duration and power information in totalPowerAndDuration. */ private void calculateTotalDurationAndPower(PowerAndDuration totalPowerAndDuration, @@ -228,37 +183,8 @@ public class ScreenPowerCalculator extends PowerCalculator { } /** - * Smear the screen on power usage among {@code sippers}, based on ratio of foreground activity - * time, and store this in the {@link BatterySipper#screenPowerMah} field. - */ - @VisibleForTesting - public void smearScreenBatterySipper(List<BatterySipper> sippers, BatterySipper screenSipper, - long rawRealtimeUs) { - long totalActivityTimeMs = 0; - final SparseLongArray activityTimeArray = new SparseLongArray(); - for (int i = sippers.size() - 1; i >= 0; i--) { - final BatteryStats.Uid uid = sippers.get(i).uidObj; - if (uid != null) { - final long timeMs = getProcessForegroundTimeMs(uid, rawRealtimeUs); - activityTimeArray.put(uid.getUid(), timeMs); - totalActivityTimeMs += timeMs; - } - } - - if (screenSipper != null && totalActivityTimeMs >= MIN_ACTIVE_TIME_FOR_SMEARING) { - final double totalScreenPowerMah = screenSipper.totalPowerMah; - for (int i = sippers.size() - 1; i >= 0; i--) { - final BatterySipper sipper = sippers.get(i); - sipper.screenPowerMah = totalScreenPowerMah - * activityTimeArray.get(sipper.getUid(), 0) - / totalActivityTimeMs; - } - } - } - - /** - * Smear the screen on power usage among {@code sippers}, based on ratio of foreground activity - * time, and store this in the {@link BatterySipper#screenPowerMah} field. + * Smear the screen on power usage among {@code UidBatteryConsumers}, based on ratio of + * foreground activity time. */ private void smearScreenBatteryDrain( SparseArray<UidBatteryConsumer.Builder> uidBatteryConsumerBuilders, diff --git a/core/java/com/android/internal/os/SensorPowerCalculator.java b/core/java/com/android/internal/os/SensorPowerCalculator.java index 495a6d9aae50..4a9c91d14c4c 100644 --- a/core/java/com/android/internal/os/SensorPowerCalculator.java +++ b/core/java/com/android/internal/os/SensorPowerCalculator.java @@ -72,12 +72,6 @@ public class SensorPowerCalculator extends PowerCalculator { return powerMah; } - @Override - protected void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs, - long rawUptimeUs, int statsType) { - app.sensorPowerMah = calculatePowerMah(u, rawRealtimeUs, statsType); - } - private long calculateDuration(BatteryStats.Uid u, long rawRealtimeUs, int statsType) { long durationMs = 0; final SparseArray<? extends BatteryStats.Uid.Sensor> sensorStats = u.getSensorStats(); diff --git a/core/java/com/android/internal/os/SystemServicePowerCalculator.java b/core/java/com/android/internal/os/SystemServicePowerCalculator.java index d7872badd0a2..3a3df87f94af 100644 --- a/core/java/com/android/internal/os/SystemServicePowerCalculator.java +++ b/core/java/com/android/internal/os/SystemServicePowerCalculator.java @@ -22,12 +22,9 @@ import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; import android.os.Process; import android.os.UidBatteryConsumer; -import android.os.UserHandle; import android.util.Log; import android.util.SparseArray; -import java.util.List; - /** * Estimates the amount of power consumed by the System Server handling requests from * a given app. @@ -121,55 +118,6 @@ public class SystemServicePowerCalculator extends PowerCalculator { systemServicePowerMah); } - @Override - public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, - long rawRealtimeUs, long rawUptimeUs, int statsType, - SparseArray<UserHandle> asUsers) { - final BatteryStats.Uid systemUid = batteryStats.getUidStats().get(Process.SYSTEM_UID); - if (systemUid == null) { - return; - } - - final long consumptionUC = systemUid.getCpuMeasuredBatteryConsumptionUC(); - double systemServicePowerMah; - if (getPowerModel(consumptionUC) == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) { - systemServicePowerMah = calculatePowerUsingMeasuredConsumption(batteryStats, - systemUid, consumptionUC); - } else { - systemServicePowerMah = calculatePowerUsingPowerProfile(batteryStats); - } - - BatterySipper systemServerSipper = null; - for (int i = sippers.size() - 1; i >= 0; i--) { - final BatterySipper app = sippers.get(i); - if (app.drainType == BatterySipper.DrainType.APP) { - if (app.getUid() == Process.SYSTEM_UID) { - systemServerSipper = app; - break; - } - } - } - - if (systemServerSipper != null) { - systemServicePowerMah = Math.min(systemServicePowerMah, systemServerSipper.sumPower()); - - // The system server power needs to be adjusted because part of it got - // distributed to applications - systemServerSipper.powerReattributedToOtherSippersMah = -systemServicePowerMah; - } - - for (int i = sippers.size() - 1; i >= 0; i--) { - final BatterySipper app = sippers.get(i); - if (app.drainType == BatterySipper.DrainType.APP) { - if (app != systemServerSipper) { - final BatteryStats.Uid uid = app.uidObj; - app.systemServiceCpuPowerMah = - systemServicePowerMah * uid.getProportionalSystemServiceUsage(); - } - } - } - } - private double calculatePowerUsingMeasuredConsumption(BatteryStats batteryStats, BatteryStats.Uid systemUid, long consumptionUC) { // Use the PowerProfile based model to estimate the ratio between the power consumed diff --git a/core/java/com/android/internal/os/UserPowerCalculator.java b/core/java/com/android/internal/os/UserPowerCalculator.java index b590bf77283b..22cff6e2435a 100644 --- a/core/java/com/android/internal/os/UserPowerCalculator.java +++ b/core/java/com/android/internal/os/UserPowerCalculator.java @@ -27,8 +27,6 @@ import android.util.SparseArray; import com.android.internal.util.ArrayUtils; -import java.util.List; - /** * Computes power consumed by Users */ @@ -65,40 +63,4 @@ public class UserPowerCalculator extends PowerCalculator { } } } - - @Override - public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, - long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { - final boolean forAllUsers = (asUsers.get(UserHandle.USER_ALL) != null); - if (forAllUsers) { - return; - } - - SparseArray<BatterySipper> userSippers = new SparseArray<>(); - - for (int i = sippers.size() - 1; i >= 0; i--) { - BatterySipper sipper = sippers.get(i); - final int uid = sipper.getUid(); - final int userId = UserHandle.getUserId(uid); - if (asUsers.get(userId) == null - && UserHandle.getAppId(uid) >= Process.FIRST_APPLICATION_UID) { - // We are told to just report this user's apps as one accumulated entry. - BatterySipper userSipper = userSippers.get(userId); - if (userSipper == null) { - userSipper = new BatterySipper(BatterySipper.DrainType.USER, null, 0); - userSipper.userId = userId; - userSippers.put(userId, userSipper); - } - userSipper.add(sipper); - sipper.isAggregated = true; - } - } - - for (int i = 0; i < userSippers.size(); i++) { - BatterySipper sipper = userSippers.valueAt(i); - if (sipper.sumPower() > 0) { - sippers.add(sipper); - } - } - } } diff --git a/core/java/com/android/internal/os/WakelockPowerCalculator.java b/core/java/com/android/internal/os/WakelockPowerCalculator.java index 53d6335bc23e..0251e1ccc885 100644 --- a/core/java/com/android/internal/os/WakelockPowerCalculator.java +++ b/core/java/com/android/internal/os/WakelockPowerCalculator.java @@ -21,13 +21,10 @@ import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; import android.os.Process; import android.os.UidBatteryConsumer; -import android.os.UserHandle; import android.util.ArrayMap; import android.util.Log; import android.util.SparseArray; -import java.util.List; - public class WakelockPowerCalculator extends PowerCalculator { private static final String TAG = "WakelockPowerCalculator"; private static final boolean DEBUG = PowerCalculator.DEBUG; @@ -105,42 +102,6 @@ public class WakelockPowerCalculator extends PowerCalculator { appPowerMah); } - @Override - public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, - long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { - final PowerAndDuration result = new PowerAndDuration(); - BatterySipper osSipper = null; - double osPowerMah = 0; - long osDurationMs = 0; - long totalAppDurationMs = 0; - for (int i = sippers.size() - 1; i >= 0; i--) { - final BatterySipper app = sippers.get(i); - if (app.drainType == BatterySipper.DrainType.APP) { - calculateApp(result, app.uidObj, rawRealtimeUs, statsType); - app.wakeLockTimeMs = result.durationMs; - app.wakeLockPowerMah = result.powerMah; - totalAppDurationMs += result.durationMs; - - if (app.getUid() == Process.ROOT_UID) { - osSipper = app; - osPowerMah = result.powerMah; - osDurationMs = result.durationMs; - } - } - } - - // The device has probably been awake for longer than the screen on - // time and application wake lock time would account for. Assign - // this remainder to the OS, if possible. - if (osSipper != null) { - calculateRemaining(result, batteryStats, rawRealtimeUs, rawUptimeUs, statsType, - osPowerMah, osDurationMs, totalAppDurationMs); - osSipper.wakeLockTimeMs = result.durationMs; - osSipper.wakeLockPowerMah = result.powerMah; - osSipper.sumPower(); - } - } - private void calculateApp(PowerAndDuration result, BatteryStats.Uid u, long rawRealtimeUs, int statsType) { long wakeLockTimeUs = 0; diff --git a/core/java/com/android/internal/os/WifiPowerCalculator.java b/core/java/com/android/internal/os/WifiPowerCalculator.java index b1935cdc07b9..8c3fb86331b2 100644 --- a/core/java/com/android/internal/os/WifiPowerCalculator.java +++ b/core/java/com/android/internal/os/WifiPowerCalculator.java @@ -19,14 +19,11 @@ import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; -import android.os.Process; import android.os.UidBatteryConsumer; -import android.os.UserHandle; import android.util.Log; import android.util.SparseArray; import java.util.Arrays; -import java.util.List; /** * WiFi power calculator for when BatteryStats supports energy reporting @@ -156,62 +153,6 @@ public class WifiPowerCalculator extends PowerCalculator { totalAppPowerMah, powerModel); } - /** - * We do per-app blaming of WiFi activity. If energy info is reported from the controller, - * then only the WiFi process gets blamed here since we normalize power calculations and - * assign all the power drain to apps. If energy info is not reported, we attribute the - * difference between total running time of WiFi for all apps and the actual running time - * of WiFi to the WiFi subsystem. - */ - @Override - public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, - long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { - - final BatterySipper bs = new BatterySipper(BatterySipper.DrainType.WIFI, null, 0); - - long totalAppDurationMs = 0; - double totalAppPowerMah = 0; - final PowerDurationAndTraffic powerDurationAndTraffic = new PowerDurationAndTraffic(); - for (int i = sippers.size() - 1; i >= 0; i--) { - final BatterySipper app = sippers.get(i); - if (app.drainType == BatterySipper.DrainType.APP) { - final long consumptionUC = - app.uidObj.getWifiMeasuredBatteryConsumptionUC(); - final int powerModel = getPowerModel(consumptionUC); - calculateApp(powerDurationAndTraffic, app.uidObj, powerModel, rawRealtimeUs, - statsType, batteryStats.hasWifiActivityReporting(), consumptionUC); - - totalAppDurationMs += powerDurationAndTraffic.durationMs; - totalAppPowerMah += powerDurationAndTraffic.powerMah; - - app.wifiPowerMah = powerDurationAndTraffic.powerMah; - app.wifiRunningTimeMs = powerDurationAndTraffic.durationMs; - app.wifiRxBytes = powerDurationAndTraffic.wifiRxBytes; - app.wifiRxPackets = powerDurationAndTraffic.wifiRxPackets; - app.wifiTxBytes = powerDurationAndTraffic.wifiTxBytes; - app.wifiTxPackets = powerDurationAndTraffic.wifiTxPackets; - if (app.getUid() == Process.WIFI_UID) { - if (DEBUG) Log.d(TAG, "WiFi adding sipper " + app + ": cpu=" + app.cpuTimeMs); - app.isAggregated = true; - bs.add(app); - } - } - } - - final long consumptionUC = batteryStats.getWifiMeasuredBatteryConsumptionUC(); - final int powerModel = getPowerModel(consumptionUC); - calculateRemaining(powerDurationAndTraffic, powerModel, batteryStats, rawRealtimeUs, - statsType, batteryStats.hasWifiActivityReporting(), totalAppDurationMs, - totalAppPowerMah, consumptionUC); - - bs.wifiRunningTimeMs += powerDurationAndTraffic.durationMs; - bs.wifiPowerMah += powerDurationAndTraffic.powerMah; - - if (bs.sumPower() > 0) { - sippers.add(bs); - } - } - private void calculateApp(PowerDurationAndTraffic powerDurationAndTraffic, BatteryStats.Uid u, @BatteryConsumer.PowerModel int powerModel, long rawRealtimeUs, int statsType, boolean hasWifiActivityReporting, diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsHelperTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsHelperTest.java deleted file mode 100644 index 260b65a8b463..000000000000 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsHelperTest.java +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package com.android.internal.os; - -import static android.os.BatteryStats.Uid.PROCESS_STATE_TOP; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyLong; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.RETURNS_DEEP_STUBS; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.when; - -import android.content.Context; -import android.content.pm.PackageManager; -import android.os.BatteryStats; -import android.os.Process; -import android.text.format.DateUtils; - -import androidx.test.InstrumentationRegistry; -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import junit.framework.TestCase; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.util.ArrayList; -import java.util.List; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class BatteryStatsHelperTest extends TestCase { - private static final long TIME_FOREGROUND_ACTIVITY_ZERO = 0; - private static final long TIME_FOREGROUND_ACTIVITY = 100 * DateUtils.MINUTE_IN_MILLIS * 1000; - private static final long TIME_STATE_FOREGROUND_MS = 10 * DateUtils.MINUTE_IN_MILLIS; - private static final long TIME_STATE_FOREGROUND_US = TIME_STATE_FOREGROUND_MS * 1000; - - private static final int UID = 123456; - private static final double BATTERY_SCREEN_USAGE = 300; - private static final double BATTERY_SYSTEM_USAGE = 600; - private static final double BATTERY_WIFI_USAGE = 200; - private static final double BATTERY_IDLE_USAGE = 600; - private static final double BATTERY_BLUETOOTH_USAGE = 300; - private static final double BATTERY_OVERACCOUNTED_USAGE = 500; - private static final double BATTERY_UNACCOUNTED_USAGE = 700; - private static final double BATTERY_APP_USAGE = 100; - private static final double TOTAL_BATTERY_USAGE = 1000; - private static final double PRECISION = 0.001; - - @Mock - private BatteryStats.Uid mUid; - @Mock - private BatterySipper mWifiBatterySipper; - @Mock - private BatterySipper mBluetoothBatterySipper; - @Mock - private BatterySipper mIdleBatterySipper; - @Mock - private BatterySipper mNormalBatterySipper; - @Mock - private BatterySipper mScreenBatterySipper; - @Mock - private BatterySipper mOvercountedBatterySipper; - @Mock - private BatterySipper mUnaccountedBatterySipper; - @Mock - private BatterySipper mSystemBatterySipper; - @Mock - private BatterySipper mCellBatterySipper; - @Mock - private PackageManager mPackageManager; - - private BatteryStatsHelper mBatteryStatsHelper; - private Context mContext; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - - mNormalBatterySipper.drainType = BatterySipper.DrainType.APP; - mNormalBatterySipper.totalPowerMah = TOTAL_BATTERY_USAGE; - when(mNormalBatterySipper.getUid()).thenReturn(UID); - mNormalBatterySipper.uidObj = mUid; - - - mScreenBatterySipper.drainType = BatterySipper.DrainType.SCREEN; - mScreenBatterySipper.totalPowerMah = BATTERY_SCREEN_USAGE; - - mSystemBatterySipper.drainType = BatterySipper.DrainType.APP; - mSystemBatterySipper.totalPowerMah = BATTERY_SYSTEM_USAGE; - mSystemBatterySipper.uidObj = mUid; - when(mSystemBatterySipper.getUid()).thenReturn(Process.SYSTEM_UID); - - mOvercountedBatterySipper.drainType = BatterySipper.DrainType.OVERCOUNTED; - mOvercountedBatterySipper.totalPowerMah = BATTERY_OVERACCOUNTED_USAGE; - - mUnaccountedBatterySipper.drainType = BatterySipper.DrainType.UNACCOUNTED; - mUnaccountedBatterySipper.totalPowerMah = BATTERY_UNACCOUNTED_USAGE; - - mWifiBatterySipper.drainType = BatterySipper.DrainType.WIFI; - mWifiBatterySipper.totalPowerMah = BATTERY_WIFI_USAGE; - - mBluetoothBatterySipper.drainType = BatterySipper.DrainType.BLUETOOTH; - mBluetoothBatterySipper.totalPowerMah = BATTERY_BLUETOOTH_USAGE; - - mIdleBatterySipper.drainType = BatterySipper.DrainType.IDLE; - mIdleBatterySipper.totalPowerMah = BATTERY_IDLE_USAGE; - - mContext = InstrumentationRegistry.getContext(); - mBatteryStatsHelper = spy(new BatteryStatsHelper(mContext)); - mBatteryStatsHelper.setPackageManager(mPackageManager); - } - - @Test - public void testShouldHideSipper_TypeUnAccounted_ReturnTrue() { - mNormalBatterySipper.drainType = BatterySipper.DrainType.UNACCOUNTED; - assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isTrue(); - } - - @Test - public void testShouldHideSipper_TypeOverAccounted_ReturnTrue() { - mNormalBatterySipper.drainType = BatterySipper.DrainType.OVERCOUNTED; - assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isTrue(); - } - - @Test - public void testShouldHideSipper_TypeIdle_ReturnTrue() { - mNormalBatterySipper.drainType = BatterySipper.DrainType.IDLE; - assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isTrue(); - } - - @Test - public void testShouldHideSipper_TypeCell_ReturnTrue() { - mNormalBatterySipper.drainType = BatterySipper.DrainType.CELL; - assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isTrue(); - } - - @Test - public void testShouldHideSipper_TypeScreen_ReturnTrue() { - mNormalBatterySipper.drainType = BatterySipper.DrainType.SCREEN; - assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isTrue(); - } - - @Test - public void testShouldHideSipper_TypeSystem_ReturnTrue() { - mNormalBatterySipper.drainType = BatterySipper.DrainType.APP; - when(mNormalBatterySipper.getUid()).thenReturn(Process.ROOT_UID); - assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isTrue(); - } - - @Test - public void testShouldHideSipper_UidNormal_ReturnFalse() { - mNormalBatterySipper.drainType = BatterySipper.DrainType.APP; - assertThat(mBatteryStatsHelper.shouldHideSipper(mNormalBatterySipper)).isFalse(); - } - - @Test - public void testRemoveHiddenBatterySippers_ContainsHiddenSippers_RemoveAndReturnValue() { - final List<BatterySipper> sippers = new ArrayList<>(); - sippers.add(mNormalBatterySipper); - sippers.add(mScreenBatterySipper); - sippers.add(mSystemBatterySipper); - sippers.add(mOvercountedBatterySipper); - sippers.add(mUnaccountedBatterySipper); - sippers.add(mWifiBatterySipper); - sippers.add(mBluetoothBatterySipper); - sippers.add(mIdleBatterySipper); - doReturn(true).when(mBatteryStatsHelper).isTypeSystem(mSystemBatterySipper); - - final double totalUsage = mBatteryStatsHelper.removeHiddenBatterySippers(sippers); - - assertThat(mNormalBatterySipper.shouldHide).isFalse(); - assertThat(mScreenBatterySipper.shouldHide).isTrue(); - assertThat(mSystemBatterySipper.shouldHide).isTrue(); - assertThat(mOvercountedBatterySipper.shouldHide).isTrue(); - assertThat(mUnaccountedBatterySipper.shouldHide).isTrue(); - assertThat(totalUsage).isWithin(PRECISION).of(BATTERY_SYSTEM_USAGE); - } - - @Test - public void testSmearScreenBatterySipper() { - final ScreenPowerCalculator spc = spy(ScreenPowerCalculator.class); - final BatterySipper sipperNull = createTestSmearBatterySipper(TIME_FOREGROUND_ACTIVITY_ZERO, - BATTERY_APP_USAGE, 0 /* uid */, true /* isUidNull */, spc); - final BatterySipper sipperBg = createTestSmearBatterySipper(TIME_FOREGROUND_ACTIVITY_ZERO, - BATTERY_APP_USAGE, 1 /* uid */, false /* isUidNull */, spc); - final BatterySipper sipperFg = createTestSmearBatterySipper(TIME_FOREGROUND_ACTIVITY, - BATTERY_APP_USAGE, 2 /* uid */, false /* isUidNull */, spc); - - final List<BatterySipper> sippers = new ArrayList<>(); - sippers.add(sipperNull); - sippers.add(sipperBg); - sippers.add(sipperFg); - - spc.smearScreenBatterySipper(sippers, mScreenBatterySipper, 0); - - assertThat(sipperNull.screenPowerMah).isWithin(PRECISION).of(0); - assertThat(sipperBg.screenPowerMah).isWithin(PRECISION).of(0); - assertThat(sipperFg.screenPowerMah).isWithin(PRECISION).of(BATTERY_SCREEN_USAGE); - } - - @Test - public void testIsTypeSystem_systemPackage_returnTrue() { - final String[] systemPackages = {"com.android.system"}; - mBatteryStatsHelper.setSystemPackageArray(systemPackages); - doReturn(UID).when(mNormalBatterySipper).getUid(); - doReturn(systemPackages).when(mPackageManager).getPackagesForUid(UID); - - assertThat(mBatteryStatsHelper.isTypeSystem(mNormalBatterySipper)).isTrue(); - } - - @Test - public void testIsTypeService_servicePackage_returnTrue() { - final String[] servicePackages = {"com.android.service"}; - mBatteryStatsHelper.setServicePackageArray(servicePackages); - doReturn(UID).when(mNormalBatterySipper).getUid(); - doReturn(servicePackages).when(mPackageManager).getPackagesForUid(UID); - - assertThat(mBatteryStatsHelper.isTypeService(mNormalBatterySipper)).isTrue(); - } - - @Test - public void testGetProcessForegroundTimeMs_largerActivityTime_returnMinTime() { - final ScreenPowerCalculator spc = spy(ScreenPowerCalculator.class); - doReturn(TIME_STATE_FOREGROUND_US + 500).when(spc) - .getForegroundActivityTotalTimeUs(eq(mUid), anyLong()); - doReturn(TIME_STATE_FOREGROUND_US).when(mUid).getProcessStateTime(eq(PROCESS_STATE_TOP), - anyLong(), anyInt()); - - final long time = spc.getProcessForegroundTimeMs(mUid, 1000); - - assertThat(time).isEqualTo(TIME_STATE_FOREGROUND_MS); - } - - private BatterySipper createTestSmearBatterySipper(long activityTime, double totalPowerMah, - int uidCode, boolean isUidNull, ScreenPowerCalculator spc) { - final BatterySipper sipper = mock(BatterySipper.class); - sipper.drainType = BatterySipper.DrainType.APP; - sipper.totalPowerMah = totalPowerMah; - doReturn(uidCode).when(sipper).getUid(); - if (!isUidNull) { - final BatteryStats.Uid uid = mock(BatteryStats.Uid.class, RETURNS_DEEP_STUBS); - doReturn(activityTime).when(spc).getProcessForegroundTimeMs(eq(uid), anyLong()); - doReturn(uidCode).when(uid).getUid(); - sipper.uidObj = uid; - } - - return sipper; - } - -} diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java index 92c2d43ea2a3..ace39fb74b8f 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java @@ -30,7 +30,6 @@ import org.junit.runners.Suite; BatteryStatsCounterTest.class, BatteryStatsDualTimerTest.class, BatteryStatsDurationTimerTest.class, - BatteryStatsHelperTest.class, BatteryStatsHistoryIteratorTest.class, BatteryStatsHistoryTest.class, BatteryStatsImplTest.class, @@ -69,7 +68,6 @@ import org.junit.runners.Suite; LongSamplingCounterTest.class, LongSamplingCounterArrayTest.class, MobileRadioPowerCalculatorTest.class, - PowerCalculatorTest.class, PowerProfileTest.class, ScreenPowerCalculatorTest.class, SensorPowerCalculatorTest.class, diff --git a/core/tests/coretests/src/com/android/internal/os/PowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/PowerCalculatorTest.java deleted file mode 100644 index 4bd5724ed9ea..000000000000 --- a/core/tests/coretests/src/com/android/internal/os/PowerCalculatorTest.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package com.android.internal.os; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import android.os.BatteryStats; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import junit.framework.TestCase; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.util.List; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class PowerCalculatorTest extends TestCase { - private static final long US_IN_HR = 1000L * 1000L * 60L * 60L; - - @Mock - private PowerProfile mPowerProfile; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - } - - /** Test {@link MediaPowerCalculator#calculateApp} */ - @Test - public void testMediaPowerCalculator() { - when(mPowerProfile.getAveragePower(PowerProfile.POWER_AUDIO)).thenReturn(12.0); - when(mPowerProfile.getAveragePower(PowerProfile.POWER_VIDEO)).thenReturn(25.0); - - BatteryStats.Uid u = mock(BatteryStats.Uid.class); - BatteryStats.Timer audioTimer = mock(BatteryStats.Timer.class); - when(u.getAudioTurnedOnTimer()).thenReturn(audioTimer); - when(audioTimer.getTotalTimeLocked(2L * US_IN_HR, 0)).thenReturn(2L * US_IN_HR); - BatteryStats.Timer videoTimer = mock(BatteryStats.Timer.class); - when(u.getVideoTurnedOnTimer()).thenReturn(videoTimer); - when(videoTimer.getTotalTimeLocked(2L * US_IN_HR, 0)).thenReturn(1L * US_IN_HR); - - MediaPowerCalculator mediaPowerCalculator = new MediaPowerCalculator(mPowerProfile); - BatterySipper app = new BatterySipper(BatterySipper.DrainType.APP, u, 0); - - mediaPowerCalculator.calculate(List.of(app), null, 2L * US_IN_HR, 2L * US_IN_HR, 0, null); - assertEquals(49.0, app.sumPower()); - } -} diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 2f7249ea5d84..91822ac353ab 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -79,7 +79,6 @@ import android.util.StatsEvent; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IBatteryStats; import com.android.internal.os.BackgroundThread; -import com.android.internal.os.BatteryStatsHelper; import com.android.internal.os.BatteryStatsImpl; import com.android.internal.os.BatteryUsageStatsProvider; import com.android.internal.os.BatteryUsageStatsStore; @@ -2488,7 +2487,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub final long ident = Binder.clearCallingIdentity(); try { - if (BatteryStatsHelper.checkWifiOnly(mContext)) { + if (BatteryStats.checkWifiOnly(mContext)) { flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY; } awaitCompletion(); diff --git a/tests/BatteryStatsPerfTest/src/com/android/internal/os/BatteryStatsHelperPerfTest.java b/tests/BatteryStatsPerfTest/src/com/android/internal/os/BatteryStatsHelperPerfTest.java deleted file mode 100644 index 6266cda204b0..000000000000 --- a/tests/BatteryStatsPerfTest/src/com/android/internal/os/BatteryStatsHelperPerfTest.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.os; - -import static com.google.common.truth.Truth.assertThat; - -import android.content.Context; -import android.os.BatteryStats; -import android.os.Bundle; -import android.os.UserHandle; -import android.perftests.utils.BenchmarkState; -import android.perftests.utils.PerfStatusReporter; - -import androidx.test.InstrumentationRegistry; -import androidx.test.filters.LargeTest; -import androidx.test.runner.AndroidJUnit4; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.List; - -@RunWith(AndroidJUnit4.class) -@LargeTest -public class BatteryStatsHelperPerfTest { - - @Rule - public final PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); - - /** - * Measures the performance of {@link BatteryStatsHelper#getStats()}, which triggers - * a battery stats sync on every iteration. - */ - @Test - public void testGetStats_forceUpdate() { - final Context context = InstrumentationRegistry.getContext(); - final BatteryStatsHelper statsHelper = new BatteryStatsHelper(context, - true /* collectBatteryBroadcast */); - statsHelper.create((Bundle) null); - statsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, UserHandle.myUserId()); - - final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { - state.pauseTiming(); - statsHelper.clearStats(); - state.resumeTiming(); - - statsHelper.getStats(); - - assertThat(statsHelper.getUsageList()).isNotEmpty(); - } - } - - /** - * Measures performance of the {@link BatteryStatsHelper#getStats(boolean)}, which does - * not trigger a sync and just returns current values. - */ - @Test - public void testGetStats_cached() { - final Context context = InstrumentationRegistry.getContext(); - final BatteryStatsHelper statsHelper = new BatteryStatsHelper(context, - true /* collectBatteryBroadcast */); - statsHelper.create((Bundle) null); - statsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, UserHandle.myUserId()); - - final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { - state.pauseTiming(); - statsHelper.clearStats(); - state.resumeTiming(); - - statsHelper.getStats(false /* forceUpdate */); - - assertThat(statsHelper.getUsageList()).isNotEmpty(); - } - } - - @Test - public void testPowerCalculation() { - final Context context = InstrumentationRegistry.getContext(); - final BatteryStatsHelper statsHelper = new BatteryStatsHelper(context, - true /* collectBatteryBroadcast */); - statsHelper.create((Bundle) null); - statsHelper.getStats(); - - final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { - // This will use the cached BatteryStatsObject - statsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, UserHandle.myUserId()); - - assertThat(statsHelper.getUsageList()).isNotEmpty(); - } - } - - @Test - public void testEndToEnd() { - final Context context = InstrumentationRegistry.getContext(); - final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - while (state.keepRunning()) { - final BatteryStatsHelper statsHelper = new BatteryStatsHelper(context, - true /* collectBatteryBroadcast */); - statsHelper.create((Bundle) null); - statsHelper.clearStats(); - statsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, UserHandle.myUserId()); - - state.pauseTiming(); - - List<BatterySipper> usageList = statsHelper.getUsageList(); - double power = 0; - for (int i = 0; i < usageList.size(); i++) { - BatterySipper sipper = usageList.get(i); - power += sipper.sumPower(); - } - - assertThat(power).isGreaterThan(0.0); - - state.resumeTiming(); - } - } -} |