summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorBlake Kragten <kragtenb@google.com>2019-01-28 10:54:13 -0800
committerBlake Kragten <kragtenb@google.com>2019-02-13 13:23:37 -0800
commitcb308d9c61feaf44975025db84522b234f690258 (patch)
treecf5435409e5f11904de2f383f84d329faf14c225 /core/java/android
parent7b8b2c3e4abb94042bb2ee580e96bb21d0b573b2 (diff)
Power Monitor Addition framworks base:
Frameworks Base section of power monitor addition. Since IPowerStats does not have a java interface, we needed to make a native interface into the code. I followed how the LowPowerStats collection is being done. Native code is located in com_android_server_am_BatteryStatsService.cpp. We are calling the getEnergyData to get all rails energy data that has been collecting from boot. This energy data is collected in uWs (microWatt seconds). After the rail data is collected at each update in the RailStats class, the wifi and cellular total energy values will contain the energy that all rails associated with the specific subsystem will have. We update and collect the energy data using battery stats and propagate it to telephony metrics. When we collect the total energy for an update we need to zero out the energy data so it can be accumulated correctly. 1/31: Added modemRailEnergy and wifiRailEnergy to Volta historian. Bug: 115929961 Test: adb shell dumpsys activity service TelephonyDebugService --metrics Results Examples: Energy consumed by modem (mAh): 2.41 Energy Rails consumed by modem (mAh): 2.76 Dumpsys historian results: +4m23s712ms (2) 100 cc511a18 modemRailChargemAh=0.34 wifiRailChargemAh=1.17 +wifi_scan stats=0:"dump" +10m24s089ms (2) 100 c4511a18 modemRailChargemAh=0.71 wifiRailChargemAh=1.77 stats=0:"write" +11m24s228ms (3) 100 c4511a19 volt=4315 charge=3988 modemRailChargemAh=0.77 wifiRailChargemAh=1.94 wifi_signal_strength=2 stats=0:"battery-state" Change-Id: I97521a03204968079e61f3de86640d4f1a580255
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/os/BatteryStats.java65
-rw-r--r--core/java/android/os/connectivity/WifiBatteryStats.java13
2 files changed, 74 insertions, 4 deletions
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index ab6dd7c07b42..b7e65b9151b9 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -46,6 +46,7 @@ import com.android.internal.os.BatteryStatsHelper;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -262,6 +263,7 @@ public abstract class BatteryStats implements Parcelable {
private static final long BYTES_PER_KB = 1024;
private static final long BYTES_PER_MB = 1048576; // 1024^2
private static final long BYTES_PER_GB = 1073741824; //1024^3
+ public static final double MILLISECONDS_IN_HOUR = 3600 * 1000;
private static final String VERSION_DATA = "vers";
private static final String UID_DATA = "uid";
@@ -482,6 +484,13 @@ public abstract class BatteryStats implements Parcelable {
* yield a value of 0 if the device doesn't support power calculations.
*/
public abstract LongCounter getPowerCounter();
+
+ /**
+ * @return a non-null {@link LongCounter} representing total power monitored on the rails
+ * in mAms (miliamps-milliseconds). The counter may always yield a value of 0 if the device
+ * doesn't support power rail monitoring.
+ */
+ public abstract LongCounter getMonitoredRailChargeConsumedMaMs();
}
/**
@@ -1526,6 +1535,9 @@ public abstract class BatteryStats implements Parcelable {
// The charge of the battery in micro-Ampere-hours.
public int batteryChargeUAh;
+ public double modemRailChargeMah;
+ public double wifiRailChargeMah;
+
// Constants from SCREEN_BRIGHTNESS_*
public static final int STATE_BRIGHTNESS_SHIFT = 0;
public static final int STATE_BRIGHTNESS_MASK = 0x7;
@@ -1738,6 +1750,8 @@ public abstract class BatteryStats implements Parcelable {
| ((((int)batteryVoltage)<<16)&0xffff0000);
dest.writeInt(bat);
dest.writeInt(batteryChargeUAh);
+ dest.writeDouble(modemRailChargeMah);
+ dest.writeDouble(wifiRailChargeMah);
dest.writeInt(states);
dest.writeInt(states2);
if (wakelockTag != null) {
@@ -1767,6 +1781,8 @@ public abstract class BatteryStats implements Parcelable {
batteryTemperature = (short)(bat2&0xffff);
batteryVoltage = (char)((bat2>>16)&0xffff);
batteryChargeUAh = src.readInt();
+ modemRailChargeMah = src.readDouble();
+ wifiRailChargeMah = src.readDouble();
states = src.readInt();
states2 = src.readInt();
if ((bat&0x10000000) != 0) {
@@ -1807,6 +1823,8 @@ public abstract class BatteryStats implements Parcelable {
batteryTemperature = 0;
batteryVoltage = 0;
batteryChargeUAh = 0;
+ modemRailChargeMah = 0;
+ wifiRailChargeMah = 0;
states = 0;
states2 = 0;
wakelockTag = null;
@@ -1835,6 +1853,8 @@ public abstract class BatteryStats implements Parcelable {
batteryTemperature = o.batteryTemperature;
batteryVoltage = o.batteryVoltage;
batteryChargeUAh = o.batteryChargeUAh;
+ modemRailChargeMah = o.modemRailChargeMah;
+ wifiRailChargeMah = o.wifiRailChargeMah;
states = o.states;
states2 = o.states2;
if (o.wakelockTag != null) {
@@ -1867,6 +1887,8 @@ public abstract class BatteryStats implements Parcelable {
&& batteryTemperature == o.batteryTemperature
&& batteryVoltage == o.batteryVoltage
&& batteryChargeUAh == o.batteryChargeUAh
+ && modemRailChargeMah == o.modemRailChargeMah
+ && wifiRailChargeMah == o.wifiRailChargeMah
&& states == o.states
&& states2 == o.states2
&& currentTime == o.currentTime;
@@ -3311,7 +3333,8 @@ public abstract class BatteryStats implements Parcelable {
if (counter.getIdleTimeCounter().getCountLocked(which) != 0
|| counter.getRxTimeCounter().getCountLocked(which) != 0
- || counter.getPowerCounter().getCountLocked(which) != 0) {
+ || counter.getPowerCounter().getCountLocked(which) != 0
+ || counter.getMonitoredRailChargeConsumedMaMs().getCountLocked(which) != 0) {
return true;
}
@@ -3345,7 +3368,10 @@ public abstract class BatteryStats implements Parcelable {
pw.print(",");
pw.print(counter.getRxTimeCounter().getCountLocked(which));
pw.print(",");
- pw.print(counter.getPowerCounter().getCountLocked(which) / (1000 * 60 * 60));
+ pw.print(counter.getPowerCounter().getCountLocked(which) / (MILLISECONDS_IN_HOUR));
+ pw.print(",");
+ pw.print(counter.getMonitoredRailChargeConsumedMaMs().getCountLocked(which)
+ / (MILLISECONDS_IN_HOUR));
for (LongCounter c : counter.getTxTimeCounters()) {
pw.print(",");
pw.print(c.getCountLocked(which));
@@ -3370,7 +3396,10 @@ public abstract class BatteryStats implements Parcelable {
proto.write(ControllerActivityProto.RX_DURATION_MS,
counter.getRxTimeCounter().getCountLocked(which));
proto.write(ControllerActivityProto.POWER_MAH,
- counter.getPowerCounter().getCountLocked(which) / (1000 * 60 * 60));
+ counter.getPowerCounter().getCountLocked(which) / (MILLISECONDS_IN_HOUR));
+ proto.write(ControllerActivityProto.MONITORED_RAIL_CHARGE_MAH,
+ counter.getMonitoredRailChargeConsumedMaMs().getCountLocked(which)
+ / (MILLISECONDS_IN_HOUR));
long tToken;
LongCounter[] txCounters = counter.getTxTimeCounters();
@@ -3400,6 +3429,8 @@ public abstract class BatteryStats implements Parcelable {
final long idleTimeMs = counter.getIdleTimeCounter().getCountLocked(which);
final long rxTimeMs = counter.getRxTimeCounter().getCountLocked(which);
final long powerDrainMaMs = counter.getPowerCounter().getCountLocked(which);
+ final long monitoredRailChargeConsumedMaMs =
+ counter.getMonitoredRailChargeConsumedMaMs().getCountLocked(which);
// Battery real time
final long totalControllerActivityTimeMs
= computeBatteryRealtime(SystemClock.elapsedRealtime() * 1000, which) / 1000;
@@ -3522,10 +3553,22 @@ public abstract class BatteryStats implements Parcelable {
sb.append(" ");
sb.append(controllerName);
sb.append(" Battery drain: ").append(
- BatteryStatsHelper.makemAh(powerDrainMaMs / (double) (1000*60*60)));
+ BatteryStatsHelper.makemAh(powerDrainMaMs / MILLISECONDS_IN_HOUR));
sb.append("mAh");
pw.println(sb.toString());
}
+
+ if (monitoredRailChargeConsumedMaMs > 0) {
+ sb.setLength(0);
+ sb.append(prefix);
+ sb.append(" ");
+ sb.append(controllerName);
+ sb.append(" Monitored rail energy drain: ").append(
+ new DecimalFormat("#.##").format(
+ monitoredRailChargeConsumedMaMs / MILLISECONDS_IN_HOUR));
+ sb.append(" mAh");
+ pw.println(sb.toString());
+ }
}
/**
@@ -6103,6 +6146,8 @@ public abstract class BatteryStats implements Parcelable {
int oldTemp = -1;
int oldVolt = -1;
int oldChargeMAh = -1;
+ double oldModemRailChargeMah = -1;
+ double oldWifiRailChargeMah = -1;
long lastTime = -1;
void reset() {
@@ -6114,6 +6159,8 @@ public abstract class BatteryStats implements Parcelable {
oldTemp = -1;
oldVolt = -1;
oldChargeMAh = -1;
+ oldModemRailChargeMah = -1;
+ oldWifiRailChargeMah = -1;
}
public void printNextItem(PrintWriter pw, HistoryItem rec, long baseTime, boolean checkin,
@@ -6299,6 +6346,16 @@ public abstract class BatteryStats implements Parcelable {
item.append(checkin ? ",Bcc=" : " charge=");
item.append(oldChargeMAh);
}
+ if (oldModemRailChargeMah != rec.modemRailChargeMah) {
+ oldModemRailChargeMah = rec.modemRailChargeMah;
+ item.append(checkin ? ",Mrc=" : " modemRailChargemAh=");
+ item.append(new DecimalFormat("#.##").format(oldModemRailChargeMah));
+ }
+ if (oldWifiRailChargeMah != rec.wifiRailChargeMah) {
+ oldWifiRailChargeMah = rec.wifiRailChargeMah;
+ item.append(checkin ? ",Wrc=" : " wifiRailChargemAh=");
+ item.append(new DecimalFormat("#.##").format(oldWifiRailChargeMah));
+ }
printBitDescriptions(item, oldState, rec.states, rec.wakelockTag,
HISTORY_STATE_DESCRIPTIONS, !checkin);
printBitDescriptions(item, oldState2, rec.states2, null,
diff --git a/core/java/android/os/connectivity/WifiBatteryStats.java b/core/java/android/os/connectivity/WifiBatteryStats.java
index e5341eeeb17b..3639c71ae3b5 100644
--- a/core/java/android/os/connectivity/WifiBatteryStats.java
+++ b/core/java/android/os/connectivity/WifiBatteryStats.java
@@ -44,6 +44,7 @@ public final class WifiBatteryStats implements Parcelable {
private long[] mTimeInStateMs;
private long[] mTimeInSupplicantStateMs;
private long[] mTimeInRxSignalStrengthLevelMs;
+ private long mMonitoredRailChargeConsumedMaMs;
public static final Parcelable.Creator<WifiBatteryStats> CREATOR = new
Parcelable.Creator<WifiBatteryStats>() {
@@ -77,6 +78,7 @@ public final class WifiBatteryStats implements Parcelable {
out.writeLongArray(mTimeInStateMs);
out.writeLongArray(mTimeInRxSignalStrengthLevelMs);
out.writeLongArray(mTimeInSupplicantStateMs);
+ out.writeLong(mMonitoredRailChargeConsumedMaMs);
}
public void readFromParcel(Parcel in) {
@@ -96,6 +98,7 @@ public final class WifiBatteryStats implements Parcelable {
in.readLongArray(mTimeInStateMs);
in.readLongArray(mTimeInRxSignalStrengthLevelMs);
in.readLongArray(mTimeInSupplicantStateMs);
+ mMonitoredRailChargeConsumedMaMs = in.readLong();
}
public long getLoggingDurationMs() {
@@ -162,6 +165,10 @@ public final class WifiBatteryStats implements Parcelable {
return mTimeInSupplicantStateMs;
}
+ public long getMonitoredRailChargeConsumedMaMs() {
+ return mMonitoredRailChargeConsumedMaMs;
+ }
+
public void setLoggingDurationMs(long t) {
mLoggingDurationMs = t;
return;
@@ -245,6 +252,11 @@ public final class WifiBatteryStats implements Parcelable {
return;
}
+ public void setMonitoredRailChargeConsumedMaMs(long monitoredRailEnergyConsumedMaMs) {
+ mMonitoredRailChargeConsumedMaMs = monitoredRailEnergyConsumedMaMs;
+ return;
+ }
+
public int describeContents() {
return 0;
}
@@ -274,6 +286,7 @@ public final class WifiBatteryStats implements Parcelable {
Arrays.fill(mTimeInRxSignalStrengthLevelMs, 0);
mTimeInSupplicantStateMs = new long[BatteryStats.NUM_WIFI_SUPPL_STATES];
Arrays.fill(mTimeInSupplicantStateMs, 0);
+ mMonitoredRailChargeConsumedMaMs = 0;
return;
}
} \ No newline at end of file