Loading core/java/android/os/BatteryStats.java +188 −0 Original line number Diff line number Diff line Loading @@ -592,6 +592,86 @@ public abstract class BatteryStats implements Parcelable { } } /** * Optional detailed information that can go into a history step. This is typically * generated each time the battery level changes. */ public final static class HistoryStepDetails { // Time (in 1/100 second) spent in user space and the kernel since the last step. public int userTime; public int systemTime; // Top three apps using CPU in the last step, with times in 1/100 second. public int appCpuUid1; public int appCpuUTime1; public int appCpuSTime1; public int appCpuUid2; public int appCpuUTime2; public int appCpuSTime2; public int appCpuUid3; public int appCpuUTime3; public int appCpuSTime3; // Information from /proc/stat public int statUserTime; public int statSystemTime; public int statIOWaitTime; public int statIrqTime; public int statSoftIrqTime; public int statIdlTime; public HistoryStepDetails() { clear(); } public void clear() { userTime = systemTime = 0; appCpuUid1 = appCpuUid2 = appCpuUid3 = -1; appCpuUTime1 = appCpuSTime1 = appCpuUTime2 = appCpuSTime2 = appCpuUTime3 = appCpuSTime3 = 0; } public void writeToParcel(Parcel out) { out.writeInt(userTime); out.writeInt(systemTime); out.writeInt(appCpuUid1); out.writeInt(appCpuUTime1); out.writeInt(appCpuSTime1); out.writeInt(appCpuUid2); out.writeInt(appCpuUTime2); out.writeInt(appCpuSTime2); out.writeInt(appCpuUid3); out.writeInt(appCpuUTime3); out.writeInt(appCpuSTime3); out.writeInt(statUserTime); out.writeInt(statSystemTime); out.writeInt(statIOWaitTime); out.writeInt(statIrqTime); out.writeInt(statSoftIrqTime); out.writeInt(statIdlTime); } public void readFromParcel(Parcel in) { userTime = in.readInt(); systemTime = in.readInt(); appCpuUid1 = in.readInt(); appCpuUTime1 = in.readInt(); appCpuSTime1 = in.readInt(); appCpuUid2 = in.readInt(); appCpuUTime2 = in.readInt(); appCpuSTime2 = in.readInt(); appCpuUid3 = in.readInt(); appCpuUTime3 = in.readInt(); appCpuSTime3 = in.readInt(); statUserTime = in.readInt(); statSystemTime = in.readInt(); statIOWaitTime = in.readInt(); statIrqTime = in.readInt(); statSoftIrqTime = in.readInt(); statIdlTime = in.readInt(); } } public final static class HistoryItem implements Parcelable { public HistoryItem next; Loading Loading @@ -687,6 +767,9 @@ public abstract class BatteryStats implements Parcelable { // Kernel wakeup reason at this point. public HistoryTag wakeReasonTag; // Non-null when there is more detailed information at this step. public HistoryStepDetails stepDetails; public static final int EVENT_FLAG_START = 0x8000; public static final int EVENT_FLAG_FINISH = 0x4000; Loading Loading @@ -3692,10 +3775,115 @@ public abstract class BatteryStats implements Parcelable { } } pw.println(); if (rec.stepDetails != null) { if (!checkin) { pw.print(" Details: cpu="); pw.print(rec.stepDetails.userTime); pw.print("u+"); pw.print(rec.stepDetails.systemTime); pw.print("s"); if (rec.stepDetails.appCpuUid1 >= 0) { pw.print(" ("); printStepCpuUidDetails(pw, rec.stepDetails.appCpuUid1, rec.stepDetails.appCpuUTime1, rec.stepDetails.appCpuSTime1); if (rec.stepDetails.appCpuUid2 >= 0) { pw.print(", "); printStepCpuUidDetails(pw, rec.stepDetails.appCpuUid2, rec.stepDetails.appCpuUTime2, rec.stepDetails.appCpuSTime2); } if (rec.stepDetails.appCpuUid3 >= 0) { pw.print(", "); printStepCpuUidDetails(pw, rec.stepDetails.appCpuUid3, rec.stepDetails.appCpuUTime3, rec.stepDetails.appCpuSTime3); } pw.print(')'); } pw.println(); pw.print(" /proc/stat="); pw.print(rec.stepDetails.statUserTime); pw.print(" usr, "); pw.print(rec.stepDetails.statSystemTime); pw.print(" sys, "); pw.print(rec.stepDetails.statIOWaitTime); pw.print(" io, "); pw.print(rec.stepDetails.statIrqTime); pw.print(" irq, "); pw.print(rec.stepDetails.statSoftIrqTime); pw.print(" sirq, "); pw.print(rec.stepDetails.statIdlTime); pw.print(" idle"); int totalRun = rec.stepDetails.statUserTime + rec.stepDetails.statSystemTime + rec.stepDetails.statIOWaitTime + rec.stepDetails.statIrqTime + rec.stepDetails.statSoftIrqTime; int total = totalRun + rec.stepDetails.statIdlTime; if (total > 0) { pw.print(" ("); float perc = ((float)totalRun) / ((float)total) * 100; pw.print(String.format("%.1f%%", perc)); pw.print(" of "); StringBuilder sb = new StringBuilder(64); formatTimeMsNoSpace(sb, total*10); pw.print(sb); pw.print(")"); } pw.println(); } else { pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(','); pw.print(HISTORY_DATA); pw.print(",0,Dcpu="); pw.print(rec.stepDetails.userTime); pw.print(":"); pw.print(rec.stepDetails.systemTime); if (rec.stepDetails.appCpuUid1 >= 0) { printStepCpuUidCheckinDetails(pw, rec.stepDetails.appCpuUid1, rec.stepDetails.appCpuUTime1, rec.stepDetails.appCpuSTime1); if (rec.stepDetails.appCpuUid2 >= 0) { printStepCpuUidCheckinDetails(pw, rec.stepDetails.appCpuUid2, rec.stepDetails.appCpuUTime2, rec.stepDetails.appCpuSTime2); } if (rec.stepDetails.appCpuUid3 >= 0) { printStepCpuUidCheckinDetails(pw, rec.stepDetails.appCpuUid3, rec.stepDetails.appCpuUTime3, rec.stepDetails.appCpuSTime3); } } pw.println(); pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(','); pw.print(HISTORY_DATA); pw.print(",0,Dpst="); pw.print(rec.stepDetails.statUserTime); pw.print(','); pw.print(rec.stepDetails.statSystemTime); pw.print(','); pw.print(rec.stepDetails.statIOWaitTime); pw.print(','); pw.print(rec.stepDetails.statIrqTime); pw.print(','); pw.print(rec.stepDetails.statSoftIrqTime); pw.print(','); pw.print(rec.stepDetails.statIdlTime); pw.println(); } } oldState = rec.states; oldState2 = rec.states2; } } private void printStepCpuUidDetails(PrintWriter pw, int uid, int utime, int stime) { UserHandle.formatUid(pw, uid); pw.print("="); pw.print(utime); pw.print("u+"); pw.print(stime); pw.print("s"); } private void printStepCpuUidCheckinDetails(PrintWriter pw, int uid, int utime, int stime) { pw.print('/'); pw.print(uid); pw.print(":"); pw.print(utime); pw.print(":"); pw.print(stime); } } private void printSizeValue(PrintWriter pw, long size) { Loading core/java/com/android/internal/os/BatteryStatsImpl.java +235 −33 File changed.Preview size limit exceeded, changes collapsed. Show changes core/java/com/android/internal/os/ProcessCpuTracker.java +52 −25 Original line number Diff line number Diff line Loading @@ -152,6 +152,7 @@ public class ProcessCpuTracker { private int mRelIrqTime; private int mRelSoftIrqTime; private int mRelIdleTime; private boolean mRelStatsAreGood; private int[] mCurPids; private int[] mCurThreadPids; Loading Loading @@ -285,10 +286,9 @@ public class ProcessCpuTracker { public void update() { if (DEBUG) Slog.v(TAG, "Update: " + this); mLastSampleTime = mCurrentSampleTime; mCurrentSampleTime = SystemClock.uptimeMillis(); mLastSampleRealTime = mCurrentSampleRealTime; mCurrentSampleRealTime = SystemClock.elapsedRealtime(); final long nowUptime = SystemClock.uptimeMillis(); final long nowRealtime = SystemClock.elapsedRealtime(); final long[] sysCpu = mSystemCpuData; if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, Loading @@ -304,12 +304,18 @@ public class ProcessCpuTracker { final long irqtime = sysCpu[5]; final long softirqtime = sysCpu[6]; // This code is trying to avoid issues with idle time going backwards, // but currently it gets into situations where it triggers most of the time. :( if (true || (usertime >= mBaseUserTime && systemtime >= mBaseSystemTime && iowaittime >= mBaseIoWaitTime && irqtime >= mBaseIrqTime && softirqtime >= mBaseSoftIrqTime && idletime >= mBaseIdleTime)) { mRelUserTime = (int)(usertime - mBaseUserTime); mRelSystemTime = (int)(systemtime - mBaseSystemTime); mRelIoWaitTime = (int)(iowaittime - mBaseIoWaitTime); mRelIrqTime = (int)(irqtime - mBaseIrqTime); mRelSoftIrqTime = (int)(softirqtime - mBaseSoftIrqTime); mRelIdleTime = (int)(idletime - mBaseIdleTime); mRelStatsAreGood = true; if (DEBUG) { Slog.i("Load", "Total U:" + sysCpu[0] + " N:" + sysCpu[1] Loading @@ -326,8 +332,25 @@ public class ProcessCpuTracker { mBaseIrqTime = irqtime; mBaseSoftIrqTime = softirqtime; mBaseIdleTime = idletime; } else { mRelUserTime = 0; mRelSystemTime = 0; mRelIoWaitTime = 0; mRelIrqTime = 0; mRelSoftIrqTime = 0; mRelIdleTime = 0; mRelStatsAreGood = false; Slog.w(TAG, "/proc/stats has gone backwards; skipping CPU update"); return; } } mLastSampleTime = mCurrentSampleTime; mCurrentSampleTime = nowUptime; mLastSampleRealTime = mCurrentSampleRealTime; mCurrentSampleRealTime = nowRealtime; final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads(); try { mCurPids = collectStats("/proc", -1, mFirst, mCurPids, mProcStats); Loading Loading @@ -647,6 +670,10 @@ public class ProcessCpuTracker { return mRelIdleTime; } final public boolean hasGoodLastStats() { return mRelStatsAreGood; } final public float getTotalCpuPercent() { int denom = mRelUserTime+mRelSystemTime+mRelIrqTime+mRelIdleTime; if (denom <= 0) { Loading services/core/java/com/android/server/BatteryService.java +18 −0 Original line number Diff line number Diff line Loading @@ -626,6 +626,22 @@ public final class BatteryService extends SystemService { pw.println(" voltage: " + mBatteryProps.batteryVoltage); pw.println(" temperature: " + mBatteryProps.batteryTemperature); pw.println(" technology: " + mBatteryProps.batteryTechnology); } else if ("unplug".equals(args[0])) { if (!mUpdatesStopped) { mLastBatteryProps.set(mBatteryProps); } mBatteryProps.chargerAcOnline = false; mBatteryProps.chargerUsbOnline = false; mBatteryProps.chargerWirelessOnline = false; long ident = Binder.clearCallingIdentity(); try { mUpdatesStopped = true; processValuesLocked(false); } finally { Binder.restoreCallingIdentity(ident); } } else if (args.length == 3 && "set".equals(args[0])) { String key = args[1]; String value = args[2]; Loading Loading @@ -662,6 +678,7 @@ public final class BatteryService extends SystemService { } catch (NumberFormatException ex) { pw.println("Bad value: " + value); } } else if (args.length == 1 && "reset".equals(args[0])) { long ident = Binder.clearCallingIdentity(); try { Loading @@ -676,6 +693,7 @@ public final class BatteryService extends SystemService { } else { pw.println("Dump current battery state, or:"); pw.println(" set [ac|usb|wireless|status|level|invalid] <value>"); pw.println(" unplug"); pw.println(" reset"); } } Loading services/core/java/com/android/server/am/ActivityManagerService.java +44 −33 Original line number Diff line number Diff line Loading @@ -2256,8 +2256,9 @@ public final class ActivityManagerService extends ActivityManagerNative if (MONITOR_CPU_USAGE && mLastCpuTime.get() < (now-MONITOR_CPU_MIN_TIME)) { mLastCpuTime.set(now); haveNewCpuStats = true; mProcessCpuTracker.update(); if (mProcessCpuTracker.hasGoodLastStats()) { haveNewCpuStats = true; //Slog.i(TAG, mProcessCpu.printCurrentState()); //Slog.i(TAG, "Total CPU usage: " // + mProcessCpu.getTotalCpuPercent() + "%"); Loading @@ -2283,14 +2284,17 @@ public final class ActivityManagerService extends ActivityManagerNative (softIrq * 100) / total); } } } long[] cpuSpeedTimes = mProcessCpuTracker.getLastCpuSpeedTimes(); final BatteryStatsImpl bstats = mBatteryStatsService.getActiveStatistics(); synchronized(bstats) { synchronized(mPidsSelfLocked) { if (haveNewCpuStats) { if (mOnBattery) { int perc = bstats.startAddingCpuLocked(); final int perc = bstats.startAddingCpuLocked(); if (perc >= 0) { int remainUTime = 0; int remainSTime = 0; int totalUTime = 0; int totalSTime = 0; final int N = mProcessCpuTracker.countStats(); Loading @@ -2302,8 +2306,10 @@ public final class ActivityManagerService extends ActivityManagerNative ProcessRecord pr = mPidsSelfLocked.get(st.pid); int otherUTime = (st.rel_utime*perc)/100; int otherSTime = (st.rel_stime*perc)/100; totalUTime += otherUTime; totalSTime += otherSTime; remainUTime += otherUTime; remainSTime += otherSTime; totalUTime += st.rel_utime; totalSTime += st.rel_stime; if (pr != null) { BatteryStatsImpl.Uid.Proc ps = pr.curProcBatteryStats; if (ps == null || !ps.isActive()) { Loading @@ -2311,8 +2317,7 @@ public final class ActivityManagerService extends ActivityManagerNative pr.info.uid, pr.processName); } ps.addCpuTimeLocked(st.rel_utime - otherUTime, st.rel_stime-otherSTime); ps.addSpeedStepTimes(cpuSpeedTimes); st.rel_stime - otherSTime, cpuSpeedTimes); pr.curCpuTime += (st.rel_utime+st.rel_stime) * 10; } else { BatteryStatsImpl.Uid.Proc ps = st.batteryStats; Loading @@ -2321,12 +2326,18 @@ public final class ActivityManagerService extends ActivityManagerNative bstats.mapUid(st.uid), st.name); } ps.addCpuTimeLocked(st.rel_utime - otherUTime, st.rel_stime-otherSTime); ps.addSpeedStepTimes(cpuSpeedTimes); } } bstats.finishAddingCpuLocked(perc, totalUTime, totalSTime, cpuSpeedTimes); st.rel_stime - otherSTime, cpuSpeedTimes); } } final int userTime = mProcessCpuTracker.getLastUserTime(); final int systemTime = mProcessCpuTracker.getLastSystemTime(); final int iowaitTime = mProcessCpuTracker.getLastIoWaitTime(); final int irqTime = mProcessCpuTracker.getLastIrqTime(); final int softIrqTime = mProcessCpuTracker.getLastSoftIrqTime(); final int idleTime = mProcessCpuTracker.getLastIdleTime(); bstats.finishAddingCpuLocked(perc, remainUTime, remainSTime, totalUTime, totalSTime, userTime, systemTime, iowaitTime, irqTime, softIrqTime, idleTime, cpuSpeedTimes); } } } Loading Loading
core/java/android/os/BatteryStats.java +188 −0 Original line number Diff line number Diff line Loading @@ -592,6 +592,86 @@ public abstract class BatteryStats implements Parcelable { } } /** * Optional detailed information that can go into a history step. This is typically * generated each time the battery level changes. */ public final static class HistoryStepDetails { // Time (in 1/100 second) spent in user space and the kernel since the last step. public int userTime; public int systemTime; // Top three apps using CPU in the last step, with times in 1/100 second. public int appCpuUid1; public int appCpuUTime1; public int appCpuSTime1; public int appCpuUid2; public int appCpuUTime2; public int appCpuSTime2; public int appCpuUid3; public int appCpuUTime3; public int appCpuSTime3; // Information from /proc/stat public int statUserTime; public int statSystemTime; public int statIOWaitTime; public int statIrqTime; public int statSoftIrqTime; public int statIdlTime; public HistoryStepDetails() { clear(); } public void clear() { userTime = systemTime = 0; appCpuUid1 = appCpuUid2 = appCpuUid3 = -1; appCpuUTime1 = appCpuSTime1 = appCpuUTime2 = appCpuSTime2 = appCpuUTime3 = appCpuSTime3 = 0; } public void writeToParcel(Parcel out) { out.writeInt(userTime); out.writeInt(systemTime); out.writeInt(appCpuUid1); out.writeInt(appCpuUTime1); out.writeInt(appCpuSTime1); out.writeInt(appCpuUid2); out.writeInt(appCpuUTime2); out.writeInt(appCpuSTime2); out.writeInt(appCpuUid3); out.writeInt(appCpuUTime3); out.writeInt(appCpuSTime3); out.writeInt(statUserTime); out.writeInt(statSystemTime); out.writeInt(statIOWaitTime); out.writeInt(statIrqTime); out.writeInt(statSoftIrqTime); out.writeInt(statIdlTime); } public void readFromParcel(Parcel in) { userTime = in.readInt(); systemTime = in.readInt(); appCpuUid1 = in.readInt(); appCpuUTime1 = in.readInt(); appCpuSTime1 = in.readInt(); appCpuUid2 = in.readInt(); appCpuUTime2 = in.readInt(); appCpuSTime2 = in.readInt(); appCpuUid3 = in.readInt(); appCpuUTime3 = in.readInt(); appCpuSTime3 = in.readInt(); statUserTime = in.readInt(); statSystemTime = in.readInt(); statIOWaitTime = in.readInt(); statIrqTime = in.readInt(); statSoftIrqTime = in.readInt(); statIdlTime = in.readInt(); } } public final static class HistoryItem implements Parcelable { public HistoryItem next; Loading Loading @@ -687,6 +767,9 @@ public abstract class BatteryStats implements Parcelable { // Kernel wakeup reason at this point. public HistoryTag wakeReasonTag; // Non-null when there is more detailed information at this step. public HistoryStepDetails stepDetails; public static final int EVENT_FLAG_START = 0x8000; public static final int EVENT_FLAG_FINISH = 0x4000; Loading Loading @@ -3692,10 +3775,115 @@ public abstract class BatteryStats implements Parcelable { } } pw.println(); if (rec.stepDetails != null) { if (!checkin) { pw.print(" Details: cpu="); pw.print(rec.stepDetails.userTime); pw.print("u+"); pw.print(rec.stepDetails.systemTime); pw.print("s"); if (rec.stepDetails.appCpuUid1 >= 0) { pw.print(" ("); printStepCpuUidDetails(pw, rec.stepDetails.appCpuUid1, rec.stepDetails.appCpuUTime1, rec.stepDetails.appCpuSTime1); if (rec.stepDetails.appCpuUid2 >= 0) { pw.print(", "); printStepCpuUidDetails(pw, rec.stepDetails.appCpuUid2, rec.stepDetails.appCpuUTime2, rec.stepDetails.appCpuSTime2); } if (rec.stepDetails.appCpuUid3 >= 0) { pw.print(", "); printStepCpuUidDetails(pw, rec.stepDetails.appCpuUid3, rec.stepDetails.appCpuUTime3, rec.stepDetails.appCpuSTime3); } pw.print(')'); } pw.println(); pw.print(" /proc/stat="); pw.print(rec.stepDetails.statUserTime); pw.print(" usr, "); pw.print(rec.stepDetails.statSystemTime); pw.print(" sys, "); pw.print(rec.stepDetails.statIOWaitTime); pw.print(" io, "); pw.print(rec.stepDetails.statIrqTime); pw.print(" irq, "); pw.print(rec.stepDetails.statSoftIrqTime); pw.print(" sirq, "); pw.print(rec.stepDetails.statIdlTime); pw.print(" idle"); int totalRun = rec.stepDetails.statUserTime + rec.stepDetails.statSystemTime + rec.stepDetails.statIOWaitTime + rec.stepDetails.statIrqTime + rec.stepDetails.statSoftIrqTime; int total = totalRun + rec.stepDetails.statIdlTime; if (total > 0) { pw.print(" ("); float perc = ((float)totalRun) / ((float)total) * 100; pw.print(String.format("%.1f%%", perc)); pw.print(" of "); StringBuilder sb = new StringBuilder(64); formatTimeMsNoSpace(sb, total*10); pw.print(sb); pw.print(")"); } pw.println(); } else { pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(','); pw.print(HISTORY_DATA); pw.print(",0,Dcpu="); pw.print(rec.stepDetails.userTime); pw.print(":"); pw.print(rec.stepDetails.systemTime); if (rec.stepDetails.appCpuUid1 >= 0) { printStepCpuUidCheckinDetails(pw, rec.stepDetails.appCpuUid1, rec.stepDetails.appCpuUTime1, rec.stepDetails.appCpuSTime1); if (rec.stepDetails.appCpuUid2 >= 0) { printStepCpuUidCheckinDetails(pw, rec.stepDetails.appCpuUid2, rec.stepDetails.appCpuUTime2, rec.stepDetails.appCpuSTime2); } if (rec.stepDetails.appCpuUid3 >= 0) { printStepCpuUidCheckinDetails(pw, rec.stepDetails.appCpuUid3, rec.stepDetails.appCpuUTime3, rec.stepDetails.appCpuSTime3); } } pw.println(); pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(','); pw.print(HISTORY_DATA); pw.print(",0,Dpst="); pw.print(rec.stepDetails.statUserTime); pw.print(','); pw.print(rec.stepDetails.statSystemTime); pw.print(','); pw.print(rec.stepDetails.statIOWaitTime); pw.print(','); pw.print(rec.stepDetails.statIrqTime); pw.print(','); pw.print(rec.stepDetails.statSoftIrqTime); pw.print(','); pw.print(rec.stepDetails.statIdlTime); pw.println(); } } oldState = rec.states; oldState2 = rec.states2; } } private void printStepCpuUidDetails(PrintWriter pw, int uid, int utime, int stime) { UserHandle.formatUid(pw, uid); pw.print("="); pw.print(utime); pw.print("u+"); pw.print(stime); pw.print("s"); } private void printStepCpuUidCheckinDetails(PrintWriter pw, int uid, int utime, int stime) { pw.print('/'); pw.print(uid); pw.print(":"); pw.print(utime); pw.print(":"); pw.print(stime); } } private void printSizeValue(PrintWriter pw, long size) { Loading
core/java/com/android/internal/os/BatteryStatsImpl.java +235 −33 File changed.Preview size limit exceeded, changes collapsed. Show changes
core/java/com/android/internal/os/ProcessCpuTracker.java +52 −25 Original line number Diff line number Diff line Loading @@ -152,6 +152,7 @@ public class ProcessCpuTracker { private int mRelIrqTime; private int mRelSoftIrqTime; private int mRelIdleTime; private boolean mRelStatsAreGood; private int[] mCurPids; private int[] mCurThreadPids; Loading Loading @@ -285,10 +286,9 @@ public class ProcessCpuTracker { public void update() { if (DEBUG) Slog.v(TAG, "Update: " + this); mLastSampleTime = mCurrentSampleTime; mCurrentSampleTime = SystemClock.uptimeMillis(); mLastSampleRealTime = mCurrentSampleRealTime; mCurrentSampleRealTime = SystemClock.elapsedRealtime(); final long nowUptime = SystemClock.uptimeMillis(); final long nowRealtime = SystemClock.elapsedRealtime(); final long[] sysCpu = mSystemCpuData; if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, Loading @@ -304,12 +304,18 @@ public class ProcessCpuTracker { final long irqtime = sysCpu[5]; final long softirqtime = sysCpu[6]; // This code is trying to avoid issues with idle time going backwards, // but currently it gets into situations where it triggers most of the time. :( if (true || (usertime >= mBaseUserTime && systemtime >= mBaseSystemTime && iowaittime >= mBaseIoWaitTime && irqtime >= mBaseIrqTime && softirqtime >= mBaseSoftIrqTime && idletime >= mBaseIdleTime)) { mRelUserTime = (int)(usertime - mBaseUserTime); mRelSystemTime = (int)(systemtime - mBaseSystemTime); mRelIoWaitTime = (int)(iowaittime - mBaseIoWaitTime); mRelIrqTime = (int)(irqtime - mBaseIrqTime); mRelSoftIrqTime = (int)(softirqtime - mBaseSoftIrqTime); mRelIdleTime = (int)(idletime - mBaseIdleTime); mRelStatsAreGood = true; if (DEBUG) { Slog.i("Load", "Total U:" + sysCpu[0] + " N:" + sysCpu[1] Loading @@ -326,8 +332,25 @@ public class ProcessCpuTracker { mBaseIrqTime = irqtime; mBaseSoftIrqTime = softirqtime; mBaseIdleTime = idletime; } else { mRelUserTime = 0; mRelSystemTime = 0; mRelIoWaitTime = 0; mRelIrqTime = 0; mRelSoftIrqTime = 0; mRelIdleTime = 0; mRelStatsAreGood = false; Slog.w(TAG, "/proc/stats has gone backwards; skipping CPU update"); return; } } mLastSampleTime = mCurrentSampleTime; mCurrentSampleTime = nowUptime; mLastSampleRealTime = mCurrentSampleRealTime; mCurrentSampleRealTime = nowRealtime; final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads(); try { mCurPids = collectStats("/proc", -1, mFirst, mCurPids, mProcStats); Loading Loading @@ -647,6 +670,10 @@ public class ProcessCpuTracker { return mRelIdleTime; } final public boolean hasGoodLastStats() { return mRelStatsAreGood; } final public float getTotalCpuPercent() { int denom = mRelUserTime+mRelSystemTime+mRelIrqTime+mRelIdleTime; if (denom <= 0) { Loading
services/core/java/com/android/server/BatteryService.java +18 −0 Original line number Diff line number Diff line Loading @@ -626,6 +626,22 @@ public final class BatteryService extends SystemService { pw.println(" voltage: " + mBatteryProps.batteryVoltage); pw.println(" temperature: " + mBatteryProps.batteryTemperature); pw.println(" technology: " + mBatteryProps.batteryTechnology); } else if ("unplug".equals(args[0])) { if (!mUpdatesStopped) { mLastBatteryProps.set(mBatteryProps); } mBatteryProps.chargerAcOnline = false; mBatteryProps.chargerUsbOnline = false; mBatteryProps.chargerWirelessOnline = false; long ident = Binder.clearCallingIdentity(); try { mUpdatesStopped = true; processValuesLocked(false); } finally { Binder.restoreCallingIdentity(ident); } } else if (args.length == 3 && "set".equals(args[0])) { String key = args[1]; String value = args[2]; Loading Loading @@ -662,6 +678,7 @@ public final class BatteryService extends SystemService { } catch (NumberFormatException ex) { pw.println("Bad value: " + value); } } else if (args.length == 1 && "reset".equals(args[0])) { long ident = Binder.clearCallingIdentity(); try { Loading @@ -676,6 +693,7 @@ public final class BatteryService extends SystemService { } else { pw.println("Dump current battery state, or:"); pw.println(" set [ac|usb|wireless|status|level|invalid] <value>"); pw.println(" unplug"); pw.println(" reset"); } } Loading
services/core/java/com/android/server/am/ActivityManagerService.java +44 −33 Original line number Diff line number Diff line Loading @@ -2256,8 +2256,9 @@ public final class ActivityManagerService extends ActivityManagerNative if (MONITOR_CPU_USAGE && mLastCpuTime.get() < (now-MONITOR_CPU_MIN_TIME)) { mLastCpuTime.set(now); haveNewCpuStats = true; mProcessCpuTracker.update(); if (mProcessCpuTracker.hasGoodLastStats()) { haveNewCpuStats = true; //Slog.i(TAG, mProcessCpu.printCurrentState()); //Slog.i(TAG, "Total CPU usage: " // + mProcessCpu.getTotalCpuPercent() + "%"); Loading @@ -2283,14 +2284,17 @@ public final class ActivityManagerService extends ActivityManagerNative (softIrq * 100) / total); } } } long[] cpuSpeedTimes = mProcessCpuTracker.getLastCpuSpeedTimes(); final BatteryStatsImpl bstats = mBatteryStatsService.getActiveStatistics(); synchronized(bstats) { synchronized(mPidsSelfLocked) { if (haveNewCpuStats) { if (mOnBattery) { int perc = bstats.startAddingCpuLocked(); final int perc = bstats.startAddingCpuLocked(); if (perc >= 0) { int remainUTime = 0; int remainSTime = 0; int totalUTime = 0; int totalSTime = 0; final int N = mProcessCpuTracker.countStats(); Loading @@ -2302,8 +2306,10 @@ public final class ActivityManagerService extends ActivityManagerNative ProcessRecord pr = mPidsSelfLocked.get(st.pid); int otherUTime = (st.rel_utime*perc)/100; int otherSTime = (st.rel_stime*perc)/100; totalUTime += otherUTime; totalSTime += otherSTime; remainUTime += otherUTime; remainSTime += otherSTime; totalUTime += st.rel_utime; totalSTime += st.rel_stime; if (pr != null) { BatteryStatsImpl.Uid.Proc ps = pr.curProcBatteryStats; if (ps == null || !ps.isActive()) { Loading @@ -2311,8 +2317,7 @@ public final class ActivityManagerService extends ActivityManagerNative pr.info.uid, pr.processName); } ps.addCpuTimeLocked(st.rel_utime - otherUTime, st.rel_stime-otherSTime); ps.addSpeedStepTimes(cpuSpeedTimes); st.rel_stime - otherSTime, cpuSpeedTimes); pr.curCpuTime += (st.rel_utime+st.rel_stime) * 10; } else { BatteryStatsImpl.Uid.Proc ps = st.batteryStats; Loading @@ -2321,12 +2326,18 @@ public final class ActivityManagerService extends ActivityManagerNative bstats.mapUid(st.uid), st.name); } ps.addCpuTimeLocked(st.rel_utime - otherUTime, st.rel_stime-otherSTime); ps.addSpeedStepTimes(cpuSpeedTimes); } } bstats.finishAddingCpuLocked(perc, totalUTime, totalSTime, cpuSpeedTimes); st.rel_stime - otherSTime, cpuSpeedTimes); } } final int userTime = mProcessCpuTracker.getLastUserTime(); final int systemTime = mProcessCpuTracker.getLastSystemTime(); final int iowaitTime = mProcessCpuTracker.getLastIoWaitTime(); final int irqTime = mProcessCpuTracker.getLastIrqTime(); final int softIrqTime = mProcessCpuTracker.getLastSoftIrqTime(); final int idleTime = mProcessCpuTracker.getLastIdleTime(); bstats.finishAddingCpuLocked(perc, remainUTime, remainSTime, totalUTime, totalSTime, userTime, systemTime, iowaitTime, irqTime, softIrqTime, idleTime, cpuSpeedTimes); } } } Loading