From ab7672d45a66613e23c7769208fc5bc62fe6b363 Mon Sep 17 00:00:00 2001 From: Adam Lesinski Date: Fri, 21 Aug 2015 14:26:10 -0700 Subject: BatteryStats: Start using cpu power from kernel This allows us to stop using approximate methods of attributing cpu frequency time across apps and to use a more precise kernel method that is aware of the time spent by a process on a given core at a given frequency. Bug:22773176 Change-Id: I3c34365fa8c73204f178a5610423901b13453d06 --- .../android/internal/os/BatteryStatsHelper.java | 2 +- .../android/internal/os/CpuPowerCalculator.java | 51 ++-------------------- 2 files changed, 5 insertions(+), 48 deletions(-) (limited to 'core/java/com') diff --git a/core/java/com/android/internal/os/BatteryStatsHelper.java b/core/java/com/android/internal/os/BatteryStatsHelper.java index f178c8c..4f4d3e0 100644 --- a/core/java/com/android/internal/os/BatteryStatsHelper.java +++ b/core/java/com/android/internal/os/BatteryStatsHelper.java @@ -338,7 +338,7 @@ public final class BatteryStatsHelper { } if (mCpuPowerCalculator == null) { - mCpuPowerCalculator = new CpuPowerCalculator(mPowerProfile); + mCpuPowerCalculator = new CpuPowerCalculator(); } mCpuPowerCalculator.reset(); diff --git a/core/java/com/android/internal/os/CpuPowerCalculator.java b/core/java/com/android/internal/os/CpuPowerCalculator.java index a3ef612..d62f7a6 100644 --- a/core/java/com/android/internal/os/CpuPowerCalculator.java +++ b/core/java/com/android/internal/os/CpuPowerCalculator.java @@ -23,54 +23,14 @@ public class CpuPowerCalculator extends PowerCalculator { private static final String TAG = "CpuPowerCalculator"; private static final boolean DEBUG = BatteryStatsHelper.DEBUG; - private final double[] mPowerCpuNormal; - - /** - * Reusable array for calculations. - */ - private final long[] mSpeedStepTimes; - - public CpuPowerCalculator(PowerProfile profile) { - final int speedSteps = profile.getNumSpeedSteps(); - mPowerCpuNormal = new double[speedSteps]; - mSpeedStepTimes = new long[speedSteps]; - for (int p = 0; p < speedSteps; p++) { - mPowerCpuNormal[p] = profile.getAveragePower(PowerProfile.POWER_CPU_ACTIVE, p); - } - } - @Override public void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs, long rawUptimeUs, int statsType) { - final int speedSteps = mSpeedStepTimes.length; - - long totalTimeAtSpeeds = 0; - for (int step = 0; step < speedSteps; step++) { - mSpeedStepTimes[step] = u.getTimeAtCpuSpeed(step, statsType); - totalTimeAtSpeeds += mSpeedStepTimes[step]; - } - totalTimeAtSpeeds = Math.max(totalTimeAtSpeeds, 1); - app.cpuTimeMs = (u.getUserCpuTimeUs(statsType) + u.getSystemCpuTimeUs(statsType)) / 1000; - if (DEBUG && app.cpuTimeMs != 0) { - Log.d(TAG, "UID " + u.getUid() + ": CPU time " + app.cpuTimeMs + " ms"); - } - - double cpuPowerMaMs = 0; - for (int step = 0; step < speedSteps; step++) { - final double ratio = (double) mSpeedStepTimes[step] / totalTimeAtSpeeds; - final double cpuSpeedStepPower = ratio * app.cpuTimeMs * mPowerCpuNormal[step]; - if (DEBUG && ratio != 0) { - Log.d(TAG, "UID " + u.getUid() + ": CPU step #" - + step + " ratio=" + BatteryStatsHelper.makemAh(ratio) + " power=" - + BatteryStatsHelper.makemAh(cpuSpeedStepPower / (60 * 60 * 1000))); - } - cpuPowerMaMs += cpuSpeedStepPower; - } - - if (DEBUG && cpuPowerMaMs != 0) { - Log.d(TAG, "UID " + u.getUid() + ": cpu total power=" - + BatteryStatsHelper.makemAh(cpuPowerMaMs / (60 * 60 * 1000))); + app.cpuPowerMah = (double) u.getCpuPowerMaUs(statsType) / (60.0 * 60.0 * 1000.0 * 1000.0); + if (DEBUG && (app.cpuTimeMs != 0 || app.cpuPowerMah != 0)) { + Log.d(TAG, "UID " + u.getUid() + ": CPU time=" + app.cpuTimeMs + " ms power=" + + BatteryStatsHelper.makemAh(app.cpuPowerMah)); } // Keep track of the package with highest drain. @@ -108,8 +68,5 @@ public class CpuPowerCalculator extends PowerCalculator { // Statistics may not have been gathered yet. app.cpuTimeMs = app.cpuFgTimeMs; } - - // Convert the CPU power to mAh - app.cpuPowerMah = cpuPowerMaMs / (60 * 60 * 1000); } } -- cgit v1.1