Fix PowerStatsService dumpsys and include PowerStatsLogger info

Bug: 283326935
Test: manual (`adb shell dumpsys powerstats`)
Change-Id: I267e05ae7cc7f9eb4859f81d3180ad5258201d57
Merged-In: I267e05ae7cc7f9eb4859f81d3180ad5258201d57
(cherry picked from commit 0971a0c3fa)
This commit is contained in:
Michael Wachenschwanz
2023-07-19 19:59:06 -07:00
parent e43400a9b1
commit 16b3e381b1
3 changed files with 90 additions and 7 deletions

View File

@@ -17,6 +17,7 @@
package com.android.server.powerstats;
import android.content.Context;
import android.util.IndentingPrintWriter;
import android.util.Slog;
import com.android.internal.util.FileRotator;
@@ -27,6 +28,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.util.Date;
import java.util.concurrent.locks.ReentrantLock;
/**
@@ -266,4 +268,51 @@ public class PowerStatsDataStorage {
mLock.unlock();
}
}
/**
* Dump stats about stored data.
*/
public void dump(IndentingPrintWriter ipw) {
mLock.lock();
try {
final int versionDot = mDataStorageFilename.lastIndexOf('.');
final String beforeVersionDot = mDataStorageFilename.substring(0, versionDot);
final File[] files = mDataStorageDir.listFiles();
int number = 0;
int dataSize = 0;
long earliestLogEpochTime = Long.MAX_VALUE;
for (int i = 0; i < files.length; i++) {
// Check that the stems before the version match.
final File file = files[i];
final String fileName = file.getName();
if (files[i].getName().startsWith(beforeVersionDot)) {
number++;
dataSize += file.length();
final int firstTimeChar = fileName.lastIndexOf('.') + 1;
final int endChar = fileName.lastIndexOf('-');
try {
final Long startTime =
Long.parseLong(fileName.substring(firstTimeChar, endChar));
if (startTime != null && startTime < earliestLogEpochTime) {
earliestLogEpochTime = startTime;
}
} catch (NumberFormatException nfe) {
Slog.e(TAG,
"Failed to extract start time from file : " + fileName, nfe);
}
}
}
if (earliestLogEpochTime != Long.MAX_VALUE) {
ipw.println("Earliest data time : " + new Date(earliestLogEpochTime));
} else {
ipw.println("Failed to parse earliest data time!!!");
}
ipw.println("# files : " + number);
ipw.println("Total data size (B) : " + dataSize);
} finally {
mLock.unlock();
}
}
}

View File

@@ -30,6 +30,7 @@ import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;
import android.util.AtomicFile;
import android.util.IndentingPrintWriter;
import android.util.Slog;
import android.util.proto.ProtoInputStream;
import android.util.proto.ProtoOutputStream;
@@ -354,4 +355,23 @@ public final class PowerStatsLogger extends Handler {
updateCacheFile(residencyCacheFilename, powerEntityBytes);
}
}
/**
* Dump stats about stored data.
*/
public void dump(IndentingPrintWriter ipw) {
ipw.println("PowerStats Meter Data:");
ipw.increaseIndent();
mPowerStatsMeterStorage.dump(ipw);
ipw.decreaseIndent();
ipw.println("PowerStats Model Data:");
ipw.increaseIndent();
mPowerStatsModelStorage.dump(ipw);
ipw.decreaseIndent();
ipw.println("PowerStats State Residency Data:");
ipw.increaseIndent();
mPowerStatsResidencyStorage.dump(ipw);
ipw.decreaseIndent();
}
}

View File

@@ -31,6 +31,7 @@ import android.os.HandlerThread;
import android.os.Looper;
import android.os.UserHandle;
import android.power.PowerStatsInternal;
import android.util.IndentingPrintWriter;
import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
@@ -176,18 +177,31 @@ public class PowerStatsService extends SystemService {
} else if ("residency".equals(args[1])) {
mPowerStatsLogger.writeResidencyDataToFile(fd);
}
} else if (args.length == 0) {
pw.println("PowerStatsService dumpsys: available PowerEntities");
} else {
IndentingPrintWriter ipw = new IndentingPrintWriter(pw);
ipw.println("PowerStatsService dumpsys: available PowerEntities");
PowerEntity[] powerEntity = getPowerStatsHal().getPowerEntityInfo();
PowerEntityUtils.dumpsys(powerEntity, pw);
ipw.increaseIndent();
PowerEntityUtils.dumpsys(powerEntity, ipw);
ipw.decreaseIndent();
pw.println("PowerStatsService dumpsys: available Channels");
ipw.println("PowerStatsService dumpsys: available Channels");
Channel[] channel = getPowerStatsHal().getEnergyMeterInfo();
ChannelUtils.dumpsys(channel, pw);
ipw.increaseIndent();
ChannelUtils.dumpsys(channel, ipw);
ipw.decreaseIndent();
pw.println("PowerStatsService dumpsys: available EnergyConsumers");
ipw.println("PowerStatsService dumpsys: available EnergyConsumers");
EnergyConsumer[] energyConsumer = getPowerStatsHal().getEnergyConsumerInfo();
EnergyConsumerUtils.dumpsys(energyConsumer, pw);
ipw.increaseIndent();
EnergyConsumerUtils.dumpsys(energyConsumer, ipw);
ipw.decreaseIndent();
ipw.println("PowerStatsService dumpsys: PowerStatsLogger stats");
ipw.increaseIndent();
mPowerStatsLogger.dump(ipw);
ipw.decreaseIndent();
}
}
}