Merge "PowerStats: adjust time since boot to epoch before writing to disk" into sc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
d27ed1bd48
@@ -144,7 +144,7 @@ message StateResidencyProto {
|
|||||||
*/
|
*/
|
||||||
optional int64 total_state_entry_count = 3;
|
optional int64 total_state_entry_count = 3;
|
||||||
/**
|
/**
|
||||||
* Last time this state was entered. Time in milliseconds since boot
|
* Last time this state was entered. Walltime in milliseconds since Unix epoch.
|
||||||
*/
|
*/
|
||||||
optional int64 last_entry_timestamp_ms = 4;
|
optional int64 last_entry_timestamp_ms = 4;
|
||||||
}
|
}
|
||||||
@@ -208,7 +208,7 @@ message EnergyConsumerResultProto {
|
|||||||
/** Unique index identifying the energy consumer. */
|
/** Unique index identifying the energy consumer. */
|
||||||
optional int32 id = 1;
|
optional int32 id = 1;
|
||||||
|
|
||||||
/** Time since device boot(CLOCK_BOOTTIME) in milli-seconds */
|
/** Walltime in milliseconds since Unix epoch */
|
||||||
optional int64 timestamp_ms = 2;
|
optional int64 timestamp_ms = 2;
|
||||||
|
|
||||||
/** Accumulated energy since device boot in microwatt-seconds (uWs) */
|
/** Accumulated energy since device boot in microwatt-seconds (uWs) */
|
||||||
@@ -247,7 +247,7 @@ message EnergyMeasurementProto {
|
|||||||
*/
|
*/
|
||||||
optional int32 id = 1;
|
optional int32 id = 1;
|
||||||
|
|
||||||
/** Time since device boot(CLOCK_BOOTTIME) in milli-seconds */
|
/** Walltime in milliseconds since Unix epoch */
|
||||||
optional int64 timestamp_ms = 2;
|
optional int64 timestamp_ms = 2;
|
||||||
|
|
||||||
/** Accumulated energy since device boot in microwatt-seconds (uWs) */
|
/** Accumulated energy since device boot in microwatt-seconds (uWs) */
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package com.android.server.powerstats;
|
package com.android.server.powerstats;
|
||||||
|
|
||||||
|
import static java.lang.System.currentTimeMillis;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.hardware.power.stats.Channel;
|
import android.hardware.power.stats.Channel;
|
||||||
import android.hardware.power.stats.EnergyConsumer;
|
import android.hardware.power.stats.EnergyConsumer;
|
||||||
@@ -26,11 +28,14 @@ import android.hardware.power.stats.StateResidencyResult;
|
|||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
|
import android.os.SystemClock;
|
||||||
import android.util.AtomicFile;
|
import android.util.AtomicFile;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
import android.util.proto.ProtoInputStream;
|
import android.util.proto.ProtoInputStream;
|
||||||
import android.util.proto.ProtoOutputStream;
|
import android.util.proto.ProtoOutputStream;
|
||||||
|
|
||||||
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
|
|
||||||
import com.android.server.powerstats.PowerStatsHALWrapper.IPowerStatsHALWrapper;
|
import com.android.server.powerstats.PowerStatsHALWrapper.IPowerStatsHALWrapper;
|
||||||
import com.android.server.powerstats.ProtoStreamUtils.ChannelUtils;
|
import com.android.server.powerstats.ProtoStreamUtils.ChannelUtils;
|
||||||
import com.android.server.powerstats.ProtoStreamUtils.EnergyConsumerResultUtils;
|
import com.android.server.powerstats.ProtoStreamUtils.EnergyConsumerResultUtils;
|
||||||
@@ -61,6 +66,8 @@ public final class PowerStatsLogger extends Handler {
|
|||||||
protected static final int MSG_LOG_TO_DATA_STORAGE_LOW_FREQUENCY = 1;
|
protected static final int MSG_LOG_TO_DATA_STORAGE_LOW_FREQUENCY = 1;
|
||||||
protected static final int MSG_LOG_TO_DATA_STORAGE_HIGH_FREQUENCY = 2;
|
protected static final int MSG_LOG_TO_DATA_STORAGE_HIGH_FREQUENCY = 2;
|
||||||
|
|
||||||
|
// TODO(b/181240441): Add a listener to update the Wall clock baseline when changed
|
||||||
|
private final long mStartWallTime;
|
||||||
private final PowerStatsDataStorage mPowerStatsMeterStorage;
|
private final PowerStatsDataStorage mPowerStatsMeterStorage;
|
||||||
private final PowerStatsDataStorage mPowerStatsModelStorage;
|
private final PowerStatsDataStorage mPowerStatsModelStorage;
|
||||||
private final PowerStatsDataStorage mPowerStatsResidencyStorage;
|
private final PowerStatsDataStorage mPowerStatsResidencyStorage;
|
||||||
@@ -79,6 +86,8 @@ public final class PowerStatsLogger extends Handler {
|
|||||||
// Log power meter data.
|
// Log power meter data.
|
||||||
EnergyMeasurement[] energyMeasurements =
|
EnergyMeasurement[] energyMeasurements =
|
||||||
mPowerStatsHALWrapper.readEnergyMeter(new int[0]);
|
mPowerStatsHALWrapper.readEnergyMeter(new int[0]);
|
||||||
|
EnergyMeasurementUtils.adjustTimeSinceBootToEpoch(energyMeasurements,
|
||||||
|
mStartWallTime);
|
||||||
mPowerStatsMeterStorage.write(
|
mPowerStatsMeterStorage.write(
|
||||||
EnergyMeasurementUtils.getProtoBytes(energyMeasurements));
|
EnergyMeasurementUtils.getProtoBytes(energyMeasurements));
|
||||||
if (DEBUG) EnergyMeasurementUtils.print(energyMeasurements);
|
if (DEBUG) EnergyMeasurementUtils.print(energyMeasurements);
|
||||||
@@ -86,6 +95,8 @@ public final class PowerStatsLogger extends Handler {
|
|||||||
// Log power model data without attribution data.
|
// Log power model data without attribution data.
|
||||||
EnergyConsumerResult[] ecrNoAttribution =
|
EnergyConsumerResult[] ecrNoAttribution =
|
||||||
mPowerStatsHALWrapper.getEnergyConsumed(new int[0]);
|
mPowerStatsHALWrapper.getEnergyConsumed(new int[0]);
|
||||||
|
EnergyConsumerResultUtils.adjustTimeSinceBootToEpoch(ecrNoAttribution,
|
||||||
|
mStartWallTime);
|
||||||
mPowerStatsModelStorage.write(
|
mPowerStatsModelStorage.write(
|
||||||
EnergyConsumerResultUtils.getProtoBytes(ecrNoAttribution, false));
|
EnergyConsumerResultUtils.getProtoBytes(ecrNoAttribution, false));
|
||||||
if (DEBUG) EnergyConsumerResultUtils.print(ecrNoAttribution);
|
if (DEBUG) EnergyConsumerResultUtils.print(ecrNoAttribution);
|
||||||
@@ -97,6 +108,8 @@ public final class PowerStatsLogger extends Handler {
|
|||||||
// Log power model data with attribution data.
|
// Log power model data with attribution data.
|
||||||
EnergyConsumerResult[] ecrAttribution =
|
EnergyConsumerResult[] ecrAttribution =
|
||||||
mPowerStatsHALWrapper.getEnergyConsumed(new int[0]);
|
mPowerStatsHALWrapper.getEnergyConsumed(new int[0]);
|
||||||
|
EnergyConsumerResultUtils.adjustTimeSinceBootToEpoch(ecrAttribution,
|
||||||
|
mStartWallTime);
|
||||||
mPowerStatsModelStorage.write(
|
mPowerStatsModelStorage.write(
|
||||||
EnergyConsumerResultUtils.getProtoBytes(ecrAttribution, true));
|
EnergyConsumerResultUtils.getProtoBytes(ecrAttribution, true));
|
||||||
if (DEBUG) EnergyConsumerResultUtils.print(ecrAttribution);
|
if (DEBUG) EnergyConsumerResultUtils.print(ecrAttribution);
|
||||||
@@ -108,6 +121,8 @@ public final class PowerStatsLogger extends Handler {
|
|||||||
// Log state residency data.
|
// Log state residency data.
|
||||||
StateResidencyResult[] stateResidencyResults =
|
StateResidencyResult[] stateResidencyResults =
|
||||||
mPowerStatsHALWrapper.getStateResidency(new int[0]);
|
mPowerStatsHALWrapper.getStateResidency(new int[0]);
|
||||||
|
StateResidencyResultUtils.adjustTimeSinceBootToEpoch(stateResidencyResults,
|
||||||
|
mStartWallTime);
|
||||||
mPowerStatsResidencyStorage.write(
|
mPowerStatsResidencyStorage.write(
|
||||||
StateResidencyResultUtils.getProtoBytes(stateResidencyResults));
|
StateResidencyResultUtils.getProtoBytes(stateResidencyResults));
|
||||||
if (DEBUG) StateResidencyResultUtils.print(stateResidencyResults);
|
if (DEBUG) StateResidencyResultUtils.print(stateResidencyResults);
|
||||||
@@ -293,12 +308,19 @@ public final class PowerStatsLogger extends Handler {
|
|||||||
return mDeleteResidencyDataOnBoot;
|
return mDeleteResidencyDataOnBoot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
public long getStartWallTime() {
|
||||||
|
return mStartWallTime;
|
||||||
|
}
|
||||||
|
|
||||||
public PowerStatsLogger(Context context, File dataStoragePath,
|
public PowerStatsLogger(Context context, File dataStoragePath,
|
||||||
String meterFilename, String meterCacheFilename,
|
String meterFilename, String meterCacheFilename,
|
||||||
String modelFilename, String modelCacheFilename,
|
String modelFilename, String modelCacheFilename,
|
||||||
String residencyFilename, String residencyCacheFilename,
|
String residencyFilename, String residencyCacheFilename,
|
||||||
IPowerStatsHALWrapper powerStatsHALWrapper) {
|
IPowerStatsHALWrapper powerStatsHALWrapper) {
|
||||||
super(Looper.getMainLooper());
|
super(Looper.getMainLooper());
|
||||||
|
mStartWallTime = currentTimeMillis() - SystemClock.elapsedRealtime();
|
||||||
|
if (DEBUG) Slog.d(TAG, "mStartWallTime: " + mStartWallTime);
|
||||||
mPowerStatsHALWrapper = powerStatsHALWrapper;
|
mPowerStatsHALWrapper = powerStatsHALWrapper;
|
||||||
mDataStoragePath = dataStoragePath;
|
mDataStoragePath = dataStoragePath;
|
||||||
|
|
||||||
|
|||||||
@@ -109,6 +109,18 @@ public class ProtoStreamUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static class StateResidencyResultUtils {
|
static class StateResidencyResultUtils {
|
||||||
|
public static void adjustTimeSinceBootToEpoch(StateResidencyResult[] stateResidencyResult,
|
||||||
|
long startWallTime) {
|
||||||
|
for (int i = 0; i < stateResidencyResult.length; i++) {
|
||||||
|
final int stateLength = stateResidencyResult[i].stateResidencyData.length;
|
||||||
|
for (int j = 0; j < stateLength; j++) {
|
||||||
|
final StateResidency stateResidencyData =
|
||||||
|
stateResidencyResult[i].stateResidencyData[j];
|
||||||
|
stateResidencyData.lastEntryTimestampMs += startWallTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static byte[] getProtoBytes(StateResidencyResult[] stateResidencyResult) {
|
public static byte[] getProtoBytes(StateResidencyResult[] stateResidencyResult) {
|
||||||
ProtoOutputStream pos = new ProtoOutputStream();
|
ProtoOutputStream pos = new ProtoOutputStream();
|
||||||
packProtoMessage(stateResidencyResult, pos);
|
packProtoMessage(stateResidencyResult, pos);
|
||||||
@@ -306,6 +318,13 @@ public class ProtoStreamUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static class EnergyMeasurementUtils {
|
static class EnergyMeasurementUtils {
|
||||||
|
public static void adjustTimeSinceBootToEpoch(EnergyMeasurement[] energyMeasurement,
|
||||||
|
long startWallTime) {
|
||||||
|
for (int i = 0; i < energyMeasurement.length; i++) {
|
||||||
|
energyMeasurement[i].timestampMs += startWallTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static byte[] getProtoBytes(EnergyMeasurement[] energyMeasurement) {
|
public static byte[] getProtoBytes(EnergyMeasurement[] energyMeasurement) {
|
||||||
ProtoOutputStream pos = new ProtoOutputStream();
|
ProtoOutputStream pos = new ProtoOutputStream();
|
||||||
packProtoMessage(energyMeasurement, pos);
|
packProtoMessage(energyMeasurement, pos);
|
||||||
@@ -518,6 +537,13 @@ public class ProtoStreamUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static class EnergyConsumerResultUtils {
|
static class EnergyConsumerResultUtils {
|
||||||
|
public static void adjustTimeSinceBootToEpoch(EnergyConsumerResult[] energyConsumerResult,
|
||||||
|
long startWallTime) {
|
||||||
|
for (int i = 0; i < energyConsumerResult.length; i++) {
|
||||||
|
energyConsumerResult[i].timestampMs += startWallTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static byte[] getProtoBytes(EnergyConsumerResult[] energyConsumerResult,
|
public static byte[] getProtoBytes(EnergyConsumerResult[] energyConsumerResult,
|
||||||
boolean includeAttribution) {
|
boolean includeAttribution) {
|
||||||
ProtoOutputStream pos = new ProtoOutputStream();
|
ProtoOutputStream pos = new ProtoOutputStream();
|
||||||
|
|||||||
@@ -318,7 +318,8 @@ public class PowerStatsServiceTest {
|
|||||||
assertTrue(pssProto.energyMeasurement.length == ENERGY_METER_COUNT);
|
assertTrue(pssProto.energyMeasurement.length == ENERGY_METER_COUNT);
|
||||||
for (int i = 0; i < pssProto.energyMeasurement.length; i++) {
|
for (int i = 0; i < pssProto.energyMeasurement.length; i++) {
|
||||||
assertTrue(pssProto.energyMeasurement[i].id == i);
|
assertTrue(pssProto.energyMeasurement[i].id == i);
|
||||||
assertTrue(pssProto.energyMeasurement[i].timestampMs == i);
|
assertTrue(pssProto.energyMeasurement[i].timestampMs ==
|
||||||
|
i + mPowerStatsLogger.getStartWallTime());
|
||||||
assertTrue(pssProto.energyMeasurement[i].durationMs == i);
|
assertTrue(pssProto.energyMeasurement[i].durationMs == i);
|
||||||
assertTrue(pssProto.energyMeasurement[i].energyUws == i);
|
assertTrue(pssProto.energyMeasurement[i].energyUws == i);
|
||||||
}
|
}
|
||||||
@@ -359,7 +360,8 @@ public class PowerStatsServiceTest {
|
|||||||
assertTrue(pssProto.energyConsumerResult.length == ENERGY_CONSUMER_COUNT);
|
assertTrue(pssProto.energyConsumerResult.length == ENERGY_CONSUMER_COUNT);
|
||||||
for (int i = 0; i < pssProto.energyConsumerResult.length; i++) {
|
for (int i = 0; i < pssProto.energyConsumerResult.length; i++) {
|
||||||
assertTrue(pssProto.energyConsumerResult[i].id == i);
|
assertTrue(pssProto.energyConsumerResult[i].id == i);
|
||||||
assertTrue(pssProto.energyConsumerResult[i].timestampMs == i);
|
assertTrue(pssProto.energyConsumerResult[i].timestampMs ==
|
||||||
|
i + mPowerStatsLogger.getStartWallTime());
|
||||||
assertTrue(pssProto.energyConsumerResult[i].energyUws == i);
|
assertTrue(pssProto.energyConsumerResult[i].energyUws == i);
|
||||||
assertTrue(pssProto.energyConsumerResult[i].attribution.length
|
assertTrue(pssProto.energyConsumerResult[i].attribution.length
|
||||||
== ENERGY_CONSUMER_ATTRIBUTION_COUNT);
|
== ENERGY_CONSUMER_ATTRIBUTION_COUNT);
|
||||||
@@ -420,7 +422,8 @@ public class PowerStatsServiceTest {
|
|||||||
assertTrue(stateResidency.id == j);
|
assertTrue(stateResidency.id == j);
|
||||||
assertTrue(stateResidency.totalTimeInStateMs == j);
|
assertTrue(stateResidency.totalTimeInStateMs == j);
|
||||||
assertTrue(stateResidency.totalStateEntryCount == j);
|
assertTrue(stateResidency.totalStateEntryCount == j);
|
||||||
assertTrue(stateResidency.lastEntryTimestampMs == j);
|
assertTrue(stateResidency.lastEntryTimestampMs ==
|
||||||
|
j + mPowerStatsLogger.getStartWallTime());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user