summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Hui Yu <huiyu@google.com> 2018-05-22 14:01:22 -0700
committer Hui Yu <huiyu@google.com> 2018-05-23 11:46:50 -0700
commit57f6932f29bfed9d42743c1a99a47779184dc7c5 (patch)
tree3e328fbcffd874eb0ea20fa0bb21f423812d6880
parentfab8e71697c3ab47ad3e53864b22542a9a34fa2f (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.java7
-rw-r--r--core/java/com/android/internal/os/SensorPowerCalculator.java36
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;
+ }
}