diff options
| author | 2018-05-22 14:01:22 -0700 | |
|---|---|---|
| committer | 2018-05-23 11:46:50 -0700 | |
| commit | 57f6932f29bfed9d42743c1a99a47779184dc7c5 (patch) | |
| tree | 3e328fbcffd874eb0ea20fa0bb21f423812d6880 | |
| parent | fab8e71697c3ab47ad3e53864b22542a9a34fa2f (diff) | |
Fix per app GPS power usage.
After GPS power profile changed from a single value "gps.on" to a
"gps.signalqualitybased" array, we use the time gps stays in each
signal level to calculate the average gps power usage.
Bug: 79379255
Test: adb shell dumpsys batterystats, looking for "gps=" in per app
power usage section.
Change-Id: I93d17d5bd25324cc9f36a7a5502b088a44184621
| -rw-r--r-- | core/java/com/android/internal/os/BatteryStatsHelper.java | 7 | ||||
| -rw-r--r-- | core/java/com/android/internal/os/SensorPowerCalculator.java | 36 |
2 files changed, 34 insertions, 9 deletions
diff --git a/core/java/com/android/internal/os/BatteryStatsHelper.java b/core/java/com/android/internal/os/BatteryStatsHelper.java index b49aaced83a3..a6b29c5f8ce8 100644 --- a/core/java/com/android/internal/os/BatteryStatsHelper.java +++ b/core/java/com/android/internal/os/BatteryStatsHelper.java @@ -409,10 +409,9 @@ public class BatteryStatsHelper { } mBluetoothPowerCalculator.reset(); - if (mSensorPowerCalculator == null) { - mSensorPowerCalculator = new SensorPowerCalculator(mPowerProfile, - (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE)); - } + mSensorPowerCalculator = new SensorPowerCalculator(mPowerProfile, + (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE), + mStats, rawRealtimeUs, statsType); mSensorPowerCalculator.reset(); if (mCameraPowerCalculator == null) { diff --git a/core/java/com/android/internal/os/SensorPowerCalculator.java b/core/java/com/android/internal/os/SensorPowerCalculator.java index c98639b1d548..04cb49a48c26 100644 --- a/core/java/com/android/internal/os/SensorPowerCalculator.java +++ b/core/java/com/android/internal/os/SensorPowerCalculator.java @@ -20,20 +20,23 @@ import android.hardware.SensorManager; import android.os.BatteryStats; import android.util.SparseArray; +import com.android.internal.location.gnssmetrics.GnssMetrics; + import java.util.List; public class SensorPowerCalculator extends PowerCalculator { private final List<Sensor> mSensors; - private final double mGpsPowerOn; + private final double mGpsPower; - public SensorPowerCalculator(PowerProfile profile, SensorManager sensorManager) { + public SensorPowerCalculator(PowerProfile profile, SensorManager sensorManager, + BatteryStats stats, long rawRealtimeUs, int statsType) { mSensors = sensorManager.getSensorList(Sensor.TYPE_ALL); - mGpsPowerOn = profile.getAveragePower(PowerProfile.POWER_GPS_ON); + mGpsPower = getAverageGpsPower(profile, stats, rawRealtimeUs, statsType); } @Override public void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs, - long rawUptimeUs, int statsType) { + long rawUptimeUs, int statsType) { // Process Sensor usage final SparseArray<? extends BatteryStats.Uid.Sensor> sensorStats = u.getSensorStats(); final int NSE = sensorStats.size(); @@ -42,10 +45,11 @@ public class SensorPowerCalculator extends PowerCalculator { final int sensorHandle = sensorStats.keyAt(ise); final BatteryStats.Timer timer = sensor.getSensorTime(); final long sensorTime = timer.getTotalTimeLocked(rawRealtimeUs, statsType) / 1000; + switch (sensorHandle) { case BatteryStats.Uid.Sensor.GPS: app.gpsTimeMs = sensorTime; - app.gpsPowerMah = (app.gpsTimeMs * mGpsPowerOn) / (1000*60*60); + app.gpsPowerMah = (app.gpsTimeMs * mGpsPower) / (1000*60*60); break; default: final int sensorsCount = mSensors.size(); @@ -60,4 +64,26 @@ public class SensorPowerCalculator extends PowerCalculator { } } } + + private double getAverageGpsPower(PowerProfile profile, BatteryStats stats, long rawRealtimeUs, + int statsType) { + double averagePower = + profile.getAveragePowerOrDefault(PowerProfile.POWER_GPS_ON, -1); + if (averagePower != -1) { + return averagePower; + } + averagePower = 0; + long totalTime = 0; + double totalPower = 0; + for (int i = 0; i < GnssMetrics.NUM_GPS_SIGNAL_QUALITY_LEVELS; i++) { + long timePerLevel = stats.getGpsSignalQualityTime(i, rawRealtimeUs, statsType); + totalTime += timePerLevel; + totalPower += profile.getAveragePower(PowerProfile.POWER_GPS_SIGNAL_QUALITY_BASED, i) + * timePerLevel; + } + if (totalTime != 0) { + averagePower = totalPower / totalTime; + } + return averagePower; + } } |